OSDN Git Service

implement pmd_import bone group.
authorousttrue <ousttrue@gmail.com>
Sat, 3 Jul 2010 10:02:56 +0000 (19:02 +0900)
committerousttrue <ousttrue@gmail.com>
Sat, 3 Jul 2010 10:07:41 +0000 (19:07 +0900)
include/pmd.h
src/pmd.cpp
swig/blender/bl24.py
swig/blender/bl25.py
swig/blender/pmd_import.py
swig/pmd.i
swig/setup.py

index f4f8ac7..2f60e00 100644 (file)
@@ -265,13 +265,14 @@ inline std::ostream &operator<<(std::ostream &os, const Morph &rhs)
 ////////////////////////////////////////////////////////////
 //! \83{\81[\83\93\95\\8e¦\98g
 ////////////////////////////////////////////////////////////
-struct BoneDisplayName
+struct BoneGroup
 {
        char name[50];
        char english_name[50];
 
        void setName(const char *src);
        void setEnglishName(const char *src);
+       std::wstring getName()const;
 };
 
 ////////////////////////////////////////////////////////////
@@ -382,7 +383,7 @@ struct IO
        std::vector<IK> ik_list;
        std::vector<Morph> morph_list;
        std::vector<unsigned short> face_list;
-       std::vector<BoneDisplayName> bone_display_name_list;
+       std::vector<BoneGroup> bone_group_list;
        std::vector<std::pair<unsigned short, unsigned char> > bone_display_list;
        ToonTexture toon_textures[10];
        std::vector<RigidBody> rigidbodies;
index 2f11d0f..6155e13 100755 (executable)
@@ -34,6 +34,13 @@ void
        }
 
 std::wstring 
+       BoneGroup::getName()const
+       {
+               return text::trim(text::to_WideChar(CP_OEMCP, 
+                                       std::string(name, name+50)));
+       }
+
+std::wstring 
        IO::getName()const
        {
                return text::trim(text::to_WideChar(CP_OEMCP, 
@@ -225,7 +232,7 @@ public:
                if(!parseFaceList()){
                        return false;
                }
-               if(!parseBoneNameList()){
+               if(!parseBoneGroupList()){
                        return false;
                }
                if(!parseBoneList()){
@@ -313,9 +320,9 @@ private:
 
        bool parseEnglishBoneList()
        {
-               for(size_t i=0; i<io_.bone_display_name_list.size(); ++i){
+               for(size_t i=0; i<io_.bone_group_list.size(); ++i){
                        text::copyStringAndFillZero(
-                                       io_.bone_display_name_list[i].english_name, 
+                                       io_.bone_group_list[i].english_name, 
                                        reader_.getString(50));
                }
                return true;
@@ -360,13 +367,13 @@ private:
                return true;
        }
 
-       bool parseBoneNameList()
+       bool parseBoneGroupList()
        {
                unsigned int count=reader_.getUchar();
                for(unsigned int i=0; i<count; ++i){
-                       io_.bone_display_name_list.push_back(BoneDisplayName());
+                       io_.bone_group_list.push_back(BoneGroup());
                        text::copyStringAndFillZero(
-                                       io_.bone_display_name_list.back().name,
+                                       io_.bone_group_list.back().name,
                                        reader_.getString(50));
                }
                return true;
@@ -654,10 +661,10 @@ bool IO::write(binary::IWriter &w)
 
        // bone naem list
        //std::cout << "bone name list" << std::endl;
-       w.writeValue<BYTE>(bone_display_name_list.size());
-       for(size_t i=0; i<bone_display_name_list.size(); ++i){
+       w.writeValue<BYTE>(bone_group_list.size());
+       for(size_t i=0; i<bone_group_list.size(); ++i){
                // 50bytes
-               w.writeArray<char>(bone_display_name_list[i].name, 50);
+               w.writeArray<char>(bone_group_list[i].name, 50);
        }
 
        // bone list
@@ -687,8 +694,8 @@ bool IO::write(binary::IWriter &w)
                w.writeArray<char>(morph_list[i].english_name, 20);
        }
 
-       for(size_t i=0; i<bone_display_name_list.size(); ++i){
-               w.writeArray<char>(bone_display_name_list[i].english_name, 50);
+       for(size_t i=0; i<bone_group_list.size(); ++i){
+               w.writeArray<char>(bone_group_list[i].english_name, 50);
        }
 
        ////////////////////////////////////////////////////////////
@@ -786,12 +793,12 @@ void Bone::setName(const char *src)
        strncpy(name, src, 20);
 }
 
-void BoneDisplayName::setName(const char *src)
+void BoneGroup::setName(const char *src)
 {
        strncpy(name, src, 20);
 }
 
-void BoneDisplayName::setEnglishName(const char *src)
+void BoneGroup::setEnglishName(const char *src)
 {
        strncpy(english_name, src, 20);
 }
index 3ef3dab..17af23b 100755 (executable)
@@ -53,9 +53,12 @@ def message(msg):
 def enterEditMode():
     Blender.Window.EditMode(1)
 
-def exitEditMode():
+def enterObjectMode():
     Blender.Window.EditMode(0)
 
+def enterPoseMode():
+    Blender.Window.PoseMode(1)
+
 def createVector(x, y, z):
     return Mathutils.Vector(x, y, z)
 
@@ -257,6 +260,18 @@ class object:
             indices.append(index)
         return indices
 
+    @staticmethod
+    def createBoneGroup(o, name, color_set='DEFAULT'):
+        # create group
+        object.activate(o)
+        enterPoseMode()
+        bpy.ops.pose.group_add()
+        # set name
+        pose=object.getPose(o)
+        g=pose.active_bone_group
+        g.name=name
+        g.color_set=color_set
+
 
 class modifier:
     @staticmethod
@@ -302,7 +317,10 @@ class texture:
     @staticmethod
     @to_internal_encoding
     def create(path):
-        image = Blender.Image.Load(path)
+        try:
+            image = Blender.Image.Load(path)
+        except IOError:
+            image = None
         texture = Blender.Texture.New(path)
         texture.type = Blender.Texture.Types.IMAGE
         texture.image = image
index c297838..2389b80 100755 (executable)
@@ -34,9 +34,12 @@ def message(msg):
 def enterEditMode():
     bpy.ops.object.mode_set(mode='EDIT', toggle=False)
 
-def exitEditMode():
+def enterObjectMode():
     bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
 
+def enterPoseMode():
+    bpy.ops.object.mode_set(mode='POSE', toggle=False)
+
 def createVector(x, y, z):
     return mathutils.Vector([x, y, z])
 
@@ -224,6 +227,18 @@ class object:
         o.add_vertex_to_group(index, 
                     o.vertex_groups[name], weight, 'ADD')
 
+    @staticmethod
+    def createBoneGroup(o, name, color_set='DEFAULT'):
+        # create group
+        object.activate(o)
+        enterPoseMode()
+        bpy.ops.pose.group_add()
+        # set name
+        pose=object.getPose(o)
+        g=pose.active_bone_group
+        g.name=name
+        g.color_set=color_set
+
 
 class modifier:
     @staticmethod
@@ -388,14 +403,14 @@ class mesh:
     def vertsDelete(mesh, remove_vertices):
         enterEditMode()
         bpy.ops.mesh.select_all(action='DESELECT')
-        exitEditMode()
+        enterObjectMode()
 
         for i in remove_vertices:
             mesh.verts[i].selected=True
 
         enterEditMode()
         bpy.ops.mesh.delete(type='VERT')
-        exitEditMode()
+        enterObjectMode()
 
     @staticmethod
     def setSmooth(mesh, smoothing):
@@ -408,7 +423,7 @@ class mesh:
         object.activate(mesh_object)
         enterEditMode()
         bpy.ops.mesh.normals_make_consistent()
-        exitEditMode()
+        enterObjectMode()
 
     @staticmethod
     def flipNormals(mesh):
@@ -478,7 +493,8 @@ class armature:
 
         armature_object.x_ray=True
         armature.draw_names=True
-        armature.drawtype='OCTAHEDRAL'
+        #armature.drawtype='OCTAHEDRAL'
+        armature.drawtype='STICK'
         armature.deform_envelope=False
         armature.deform_vertexgroups=True
         armature.x_axis_mirror=True
index 2b2c056..eb6506a 100755 (executable)
@@ -29,6 +29,7 @@ This script imports a pmd into Blender for editing.
 1.4 20100623: fix constraint name.
 1.5 20100626: refactoring.
 1.6 20100629: sphere map.
+1.7 20100703: implement bone group.
 """
 
 MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
@@ -338,14 +339,15 @@ def __build(armature, b, p, parent):
 
 
 def __importArmature(scene, l):
-    # build bone
     armature, armature_object=bl.armature.create()
+
+    # build bone
     bl.armature.makeEditable(armature_object)
     for b in l.bones:
         if not b.parent:
             __build(armature, b, None, None)
     bl.armature.update(armature)
-    bl.exitEditMode()
+    bl.enterObjectMode()
 
     # IK constraint
     pose = bl.object.getPose(armature_object)
@@ -371,7 +373,35 @@ def __importArmature(scene, l):
 
     bl.armature.makeEditable(armature_object)
     bl.armature.update(armature)
-    bl.exitEditMode()
+    bl.enterObjectMode()
+
+    if isBlender24():
+        pass
+    else:
+        # create bone group
+        for i, g in enumerate(l.bone_group_list):
+            name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+            if not name:
+                name=g.getName()
+            bl.object.createBoneGroup(armature_object, name, "THEME%02d" % (i+1))
+
+        # assign bone to group
+        for b_index, g_index in l.bone_display_list:
+            # bone
+            b=l.bones[b_index]
+            bone_name=englishmap.getEnglishBoneName(b.getName())
+            if not bone_name:
+                bone_name=b.getName()
+            # group
+            g=l.bone_group_list[g_index-1]
+            group_name=englishmap.getEnglishBoneGroupName(g.getName().strip())
+            if not group_name:
+                group_name=g.getName()
+
+            # assign
+            pose.bones[bone_name].bone_group=pose.bone_groups[group_name]
+
+        bl.enterObjectMode()
 
     return armature_object
         
index d2325f8..5e0686a 100644 (file)
@@ -14,6 +14,7 @@ using namespace pmd;
 %include "std_vector.i"
 %include "std_wstring.i"
 %include "std_string.i"
+%include "std_pair.i"
 %include "../include/color.h"
 %include "../include/la.h"
 %include "../include/pmd.h"
@@ -29,6 +30,9 @@ using namespace pmd;
 %template(UshortVector) std::vector<unsigned short>;
 %template(Vector3Vector) std::vector<meshio::pmd::Vector3>;
 %template(PBoneVector) std::vector<meshio::pmd::Bone*>;
+%template(BoneGroupVector) std::vector<meshio::pmd::BoneGroup>;
+%template(DisplayPair) std::pair<unsigned short, unsigned char>;
+%template(BoneDisplayVector) std::vector<std::pair<unsigned short, unsigned char> >;
 
 ///////////////////////////////////////////////////////////////////////////////
 // meshio::pmd::IO::each_vertex
@@ -119,10 +123,10 @@ void addBoneDisplay(unsigned short bone_index, unsigned char display_index)
             std::make_pair(bone_index, display_index));
 }
 
-meshio::pmd::BoneDisplayName *addBoneDisplayName()
+meshio::pmd::BoneGroup *addBoneGroup()
 {
-    $self->bone_display_name_list.push_back(meshio::pmd::BoneDisplayName());
-    return &($self->bone_display_name_list.back());
+    $self->bone_group_list.push_back(meshio::pmd::BoneGroup());
+    return &($self->bone_group_list.back());
 }
 
 meshio::pmd::ToonTexture *getToonTexture(int index)
index 78146dc..b5b6277 100644 (file)
@@ -64,7 +64,7 @@ else:
 for i in range(len(ext_modules)+1):
     try:
         setup(name="meshio",
-                version='0.13',
+                version='0.14',
                 description='polygon mesh io utilities',
                 author='ousttrue',
                 author_email='ousttrue@gmail.com',