Revision: 48101
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=48101
Author:   aramis_acg
Date:     2012-06-19 23:24:27 +0000 (Tue, 19 Jun 2012)
Log Message:
-----------
- bf_assimp: import skinning data / deform groups. Some more file-tuning and 
fixes will follow, but feature-wise this makes anim import via assimp complete.
- bf_assimp: refactor for const-correctness and add some more assertions to 
check inputs.

Modified Paths:
--------------
    branches/soc-2012-bratwurst/source/blender/assimp/CMakeLists.txt
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h
    branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/bassimp_internal.cpp

Added Paths:
-----------
    branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.cpp
    branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.h

Modified: branches/soc-2012-bratwurst/source/blender/assimp/CMakeLists.txt
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/CMakeLists.txt    
2012-06-19 23:08:16 UTC (rev 48100)
+++ branches/soc-2012-bratwurst/source/blender/assimp/CMakeLists.txt    
2012-06-19 23:24:27 UTC (rev 48101)
@@ -72,6 +72,9 @@
 
        AnimEvaluator.cpp
        AnimEvaluator.h
+
+       SkinImporter.cpp
+       SkinImporter.h
 )
 
 if(WITH_BUILDINFO)

Modified: branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp 
2012-06-19 23:08:16 UTC (rev 48100)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.cpp 
2012-06-19 23:24:27 UTC (rev 48101)
@@ -34,6 +34,7 @@
 #include "SceneOrientation.h"
 #include "ArmatureImporter.h"
 #include "AnimationImporter.h"
+#include "SkinImporter.h"
 
 #include "bassimp_internal.h"
 
@@ -57,11 +58,11 @@
 
        using namespace Assimp;
 
-SceneImporter::SceneImporter(const char* path, bContext *C)
+SceneImporter::SceneImporter(const char* path, bContext& C)
 : path(path)
 , C(C)
 , scene()
-, out_scene(CTX_data_scene(C))
+, out_scene(CTX_data_scene(&C))
 , armature()
 {
 }
@@ -115,8 +116,7 @@
                return false;
        }
 
-       verbose("import ok");
-
+       verbose("import successful");
        scene = importer.GetScene();
        return true;
 }
@@ -150,6 +150,7 @@
 
        convert_node(*scene->mRootNode,NULL);
        convert_armature();
+       convert_skin();
        convert_animations();
 
        verbose("conversion to blender Scene ok");
@@ -195,6 +196,19 @@
 }
 
 
+void SceneImporter::convert_skin() 
+{
+       if (!has_bones || !armature)    {
+               return;
+       }
+
+       SkinImporter imp(C,*armature);
+       for (ObjectToMeshMap::const_iterator it = meshes_by_object.begin(), end 
= meshes_by_object.end(); it != end; ++it) {
+               imp.link_armature(*(*it).first,(*it).second);
+       }
+}
+
+
 void SceneImporter::convert_animations() 
 {
        for (int i = 0; i < scene->mNumAnimations; ++i)
@@ -309,6 +323,7 @@
 
        // attach meshes
        if (in_node.mNumMeshes) {
+
                // XXX join meshes on their name -- for each list of meshes we 
create a blender mesh
                std::vector<const aiMesh*> in_meshes;
                for (unsigned int i = 0, c = in_node.mNumMeshes; i < c; ++i) {
@@ -319,6 +334,9 @@
                        if(obj != NULL) {
                                objects_done.push_back(obj);
                                ++meshes;
+
+                               // store object->mesh mapping, we later need it 
to be able to assign skins
+                               meshes_by_object[obj] = in_meshes;
                        }
                }
        }
@@ -409,14 +427,14 @@
 
        // set parent (unless this is root)
        if(out_parent) {
-               util_set_parent(&anchor, out_parent ,C, true);
+               util_set_parent(&anchor, out_parent ,&C, true);
        }
 
        for (ObjectVector::iterator it = objects_done.begin(), end = 
objects_done.end() - 1; it != end; ++it) {
                Object& obj = **it;
 
                set_identity_transform(obj);
-               util_set_parent(&obj,&anchor,C,true);
+               util_set_parent(&obj,&anchor,&C,true);
        }
 
        // recursively convert child nodes

Modified: branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h   
2012-06-19 23:08:16 UTC (rev 48100)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SceneImporter.h   
2012-06-19 23:24:27 UTC (rev 48101)
@@ -20,7 +20,7 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file SceneExporter.h
+/** \file SceneImporter.h
  *  \ingroup assimp
  */
 
@@ -41,7 +41,7 @@
 private:
 
        const char* path;
-       bContext *C;
+       bContext& C;
        Scene* out_scene;
 
        Assimp::Importer importer;
@@ -66,6 +66,10 @@
        typedef std::map<const aiNode*, Object*> NodeToObjectMap;
        NodeToObjectMap objects_by_node;
 
+       typedef std::vector<const aiMesh*> MeshVector;
+       typedef std::map<Object*, MeshVector> ObjectToMeshMap;
+       ObjectToMeshMap meshes_by_object;
+
 private:
 
        unsigned int get_assimp_flags() const;
@@ -73,6 +77,7 @@
        void convert_materials();
        void convert_animations();
        void convert_armature();
+       void convert_skin();
 
        void convert_node(const aiNode& in_node, Object* out_parent);
        void convert_node_transform(const aiNode& node_in, Object& out_obj) 
const;
@@ -89,7 +94,7 @@
 
 public:
 
-       SceneImporter(const char* path, bContext *C);
+       SceneImporter(const char* path, bContext& C);
        ~SceneImporter();
        
        bool import();

Added: branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.cpp          
                (rev 0)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.cpp  
2012-06-19 23:24:27 UTC (rev 48101)
@@ -0,0 +1,125 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Gessler
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/assimp/MeshImporter.cpp
+ *  \ingroup assimp
+ */
+
+#include <cassert>
+#include <set>
+
+#include "SkinImporter.h"
+#include "bassimp_internal.h"
+
+extern "C" {
+#      include "BKE_object.h"
+#      include "DNA_armature_types.h"
+#      include "DNA_modifier_types.h"
+#      include "ED_mesh.h"
+#      include "ED_object.h"
+#      include "BKE_action.h"
+#      include "BLI_listbase.h"
+#      include "BLI_math.h"
+}
+
+namespace bassimp {
+
+SkinImporter::SkinImporter(bContext& C, const Object& ob_armature)
+: C(C)
+, bmain(*CTX_data_main(&C))
+, scene(*CTX_data_scene(&C))
+, ob_armature(ob_armature)
+, armature(*static_cast<bArmature*>(ob_armature.data))
+{
+       
+}
+
+
+SkinImporter::~SkinImporter()
+{
+
+}
+
+
+void SkinImporter::link_armature(Object& ob, const std::vector<const aiMesh*>& 
meshes)
+{
+       ModifierData* const md = ED_object_modifier_add(NULL, &bmain, &scene, 
&ob, NULL, eModifierType_Armature);
+       ArmatureModifierData *amd = (ArmatureModifierData *)md;
+       amd->object = const_cast<Object*>(&ob_armature);
+
+       //copy_m4_m4(ob->obmat, bind_shape_matrix);
+       //BKE_object_apply_mat4(ob, ob->obmat, 0, 0);
+
+       util_set_parent(&ob, const_cast<Object*>(&ob_armature), &C, true);
+       amd->deformflag = ARM_DEF_VGROUP;
+
+       // create all vertex groups that we need
+       std::vector<const aiBone*> groups;
+       std::set<std::string> groups_set;
+       unsigned int count = 0;
+
+       for (std::vector<const aiMesh*>::const_iterator it = meshes.begin(); it 
!= meshes.end(); ++it) {
+               const aiMesh& m = **it;
+               for (unsigned int i = 0; i < m.mNumBones; ++i) {
+                       const aiBone& b = *m.mBones[i];
+
+                       std::set<std::string>::const_iterator it = 
groups_set.find(b.mName.C_Str());
+                       if (it == groups_set.end()) {
+                               groups.push_back(&b);
+                       }
+               }
+       }
+
+       for (std::vector<const aiBone*>::const_iterator it = groups.begin(); it 
!= groups.end(); ++it) {
+               ED_vgroup_add_name(&ob, (*it)->mName.C_Str());
+       }
+
+       unsigned int vert_offset = 0;
+       for (std::vector<const aiMesh*>::const_iterator it = meshes.begin(); it 
!= meshes.end(); ++it) {
+               const aiMesh& m = **it;
+               for (unsigned int i = 0; i < m.mNumBones; ++i) {
+                       const aiBone& b = *m.mBones[i];
+
+                       unsigned int index = groups.size();
+                       for (std::vector<const aiBone*>::const_iterator it = 
groups.begin(); it != groups.end(); ++it) {
+                               if (*it == &b) {
+                                       index = std::distance<std::vector<const 
aiBone*>::const_iterator>(groups.begin(),it);
+                                       break;
+                               }
+                       }
+
+                       assert(index <= groups.size());
+                       bDeformGroup& def = 
*static_cast<bDeformGroup*>(BLI_findlink(&ob.defbase, index));
+
+                       for (unsigned int j = 0; j < b.mNumWeights; ++j) {
+                               const aiVertexWeight& v = b.mWeights[j];
+
+                               ED_vgroup_vert_add(&ob, &def, v.mVertexId + 
vert_offset, v.mWeight, WEIGHT_REPLACE);
+                       }
+               }
+
+               vert_offset += m.mNumVertices;
+       }
+}
+
+}
+

Added: branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.h
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.h            
                (rev 0)
+++ branches/soc-2012-bratwurst/source/blender/assimp/SkinImporter.h    
2012-06-19 23:24:27 UTC (rev 48101)
@@ -0,0 +1,58 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Alexander Gessler.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file SkinImporter.h
+ *  \ingroup assimp
+ */
+
+#ifndef INCLUDED_SKIN_IMPORTER_H
+#define INCLUDED_SKIN_IMPORTER_H
+
+#include  "bassimp_shared.h"
+
+
+namespace bassimp {
+
+class SkinImporter
+{
+private:
+
+       bContext& C;
+       Main& bmain;
+       Scene& scene;
+
+       const Object& ob_armature;
+       const bArmature& armature;
+
+public:
+
+       SkinImporter(bContext& C, const Object& ob_armature);
+       ~SkinImporter();
+
+public:
+
+       void link_armature(Object& obj, const std::vector<const aiMesh*>& 
meshes);
+};
+
+}
+
+#endif 

Modified: branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp
===================================================================
--- branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp       
2012-06-19 23:08:16 UTC (rev 48100)
+++ branches/soc-2012-bratwurst/source/blender/assimp/bassimp.cpp       
2012-06-19 23:24:27 UTC (rev 48101)
@@ -24,6 +24,7 @@
  *  \ingroup assimp
  */
 

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to