OSDN Git Service

implement pmd_import bone group.
[meshio/meshio.git] / src / pmd.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 2a1c0c0..6155e13
@@ -34,12 +34,40 @@ 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, 
                                        std::string(name, name+20)));
        }
 
+std::wstring 
+       IO::getEnglishName()const
+       {
+               return text::trim(text::to_WideChar(CP_OEMCP, 
+                                       std::string(english_name, english_name+20)));
+       }
+
+std::wstring 
+       RigidBody::getName()const
+       {
+               return text::trim(text::to_WideChar(CP_OEMCP, 
+                                       std::string(name, name+20)));
+       }
+
+std::wstring 
+       Constraint::getName()const
+       {
+               return text::trim(text::to_WideChar(CP_OEMCP, 
+                                       std::string(name, name+20)));
+       }
+
 // 38bytes
 template<class READER>
        void
@@ -204,7 +232,7 @@ public:
                if(!parseFaceList()){
                        return false;
                }
-               if(!parseBoneNameList()){
+               if(!parseBoneGroupList()){
                        return false;
                }
                if(!parseBoneList()){
@@ -292,8 +320,10 @@ private:
 
        bool parseEnglishBoneList()
        {
-               for(size_t i=0; i<io_.bone_display_name_list.size(); ++i){
-                       std::string english=reader_.getString(50);
+               for(size_t i=0; i<io_.bone_group_list.size(); ++i){
+                       text::copyStringAndFillZero(
+                                       io_.bone_group_list[i].english_name, 
+                                       reader_.getString(50));
                }
                return true;
        }
@@ -319,7 +349,7 @@ private:
 
        bool parseEnglishName()
        {
-               text::copyStringAndFillZero(io_.english_model_name, 
+               text::copyStringAndFillZero(io_.english_name, 
                                reader_.getString(20));
                text::copyStringAndFillZero(io_.english_comment, 
                                reader_.getString(256));
@@ -337,11 +367,14 @@ 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(reader_.getString(50));
+                       io_.bone_group_list.push_back(BoneGroup());
+                       text::copyStringAndFillZero(
+                                       io_.bone_group_list.back().name,
+                                       reader_.getString(50));
                }
                return true;
        }
@@ -477,11 +510,12 @@ bool IO::read(binary::IReader &input)
        ////////////////////////////////////////////////////////////
        for(size_t i=0; i<bones.size(); ++i){
                Bone &bone=bones[i];
+               bone.index=i;
                if(bone.parent_index!=0xFFFF){
                        bone.parent=&bones[bone.parent_index];
                        bone.parent->children.push_back(&bone);
                }
-               if(bone.tail_index!=0xFFFF){
+               if(bone.tail_index!=0){
                        bone.tail=bones[bone.tail_index].pos;
                }
        }
@@ -627,18 +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
-               char buf[]={
-                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                       0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-               };
-               sprintf(buf, "%s", bone_display_name_list[i].c_str());
-               w.writeArray<char>(buf, 50);
+               w.writeArray<char>(bone_group_list[i].name, 50);
        }
 
        // bone list
@@ -649,7 +675,98 @@ bool IO::write(binary::IWriter &w)
                w.writeValue<BYTE>(bone_display_list[i].second);
        }
 
+       ////////////////////////////////////////////////////////////
        // extend
+       ////////////////////////////////////////////////////////////
+       w.writeValue<char>(0x01);
+
+       ////////////////////////////////////////////////////////////
+       // english names
+       ////////////////////////////////////////////////////////////
+       w.writeArray<char>(english_name, 20);
+       w.writeArray<char>(english_comment, 256);
+
+       for(size_t i=0; i<bones.size(); ++i){
+               w.writeArray<char>(bones[i].english_name, 20);
+       }
+
+       for(size_t i=1; i<morph_list.size(); ++i){
+               w.writeArray<char>(morph_list[i].english_name, 20);
+       }
+
+       for(size_t i=0; i<bone_group_list.size(); ++i){
+               w.writeArray<char>(bone_group_list[i].english_name, 50);
+       }
+
+       ////////////////////////////////////////////////////////////
+       // toon textures
+       ////////////////////////////////////////////////////////////
+       for(size_t i=0; i<10; ++i){
+               w.writeArray<char>(toon_textures[i].name, 100);
+       }
+
+       ////////////////////////////////////////////////////////////
+       // rigid bodies
+       ////////////////////////////////////////////////////////////
+       w.writeValue<DWORD>(rigidbodies.size());
+       for(size_t i=0; i<rigidbodies.size(); ++i){
+               RigidBody &rb=rigidbodies[i];
+               w.writeArray<char>(rb.name, 20);
+               w.writeValue<WORD>(rb.boneIndex);
+               w.writeValue<BYTE>(rb.group);
+               w.writeValue<WORD>(rb.target);
+               w.writeValue<BYTE>(rb.shapeType);
+               w.writeValue<float>(rb.w);
+               w.writeValue<float>(rb.h);
+               w.writeValue<float>(rb.d);
+               w.writeValue<float>(rb.position.x);
+               w.writeValue<float>(rb.position.y);
+               w.writeValue<float>(rb.position.z);
+               w.writeValue<float>(rb.rotation.x);
+               w.writeValue<float>(rb.rotation.y);
+               w.writeValue<float>(rb.rotation.z);
+               w.writeValue<float>(rb.weight);
+               w.writeValue<float>(rb.linearDamping);
+               w.writeValue<float>(rb.angularDamping);
+               w.writeValue<float>(rb.restitution);
+               w.writeValue<float>(rb.friction);
+               w.writeValue<BYTE>(rb.processType);
+       }
+
+       ////////////////////////////////////////////////////////////
+       // constraints
+       ////////////////////////////////////////////////////////////
+       w.writeValue<DWORD>(constraints.size());
+       for(size_t i=0; i<constraints.size(); ++i){
+               Constraint &c=constraints[i];
+               w.writeArray<char>(c.name, 20);
+               w.writeValue<DWORD>(c.rigidA);
+               w.writeValue<DWORD>(c.rigidB);
+               w.writeValue<float>(c.pos.x);
+               w.writeValue<float>(c.pos.y);
+               w.writeValue<float>(c.pos.z);
+               w.writeValue<float>(c.rot.x);
+               w.writeValue<float>(c.rot.y);
+               w.writeValue<float>(c.rot.z);
+               w.writeValue<float>(c.constraintPosMin.x);
+               w.writeValue<float>(c.constraintPosMin.y);
+               w.writeValue<float>(c.constraintPosMin.z);
+               w.writeValue<float>(c.constraintPosMax.x);
+               w.writeValue<float>(c.constraintPosMax.y);
+               w.writeValue<float>(c.constraintPosMax.z);
+               w.writeValue<float>(c.constraintRotMin.x);
+               w.writeValue<float>(c.constraintRotMin.y);
+               w.writeValue<float>(c.constraintRotMin.z);
+               w.writeValue<float>(c.constraintRotMax.x);
+               w.writeValue<float>(c.constraintRotMax.y);
+               w.writeValue<float>(c.constraintRotMax.z);
+               w.writeValue<float>(c.springPos.x);
+               w.writeValue<float>(c.springPos.y);
+               w.writeValue<float>(c.springPos.z);
+               w.writeValue<float>(c.springRot.x);
+               w.writeValue<float>(c.springRot.y);
+               w.writeValue<float>(c.springRot.z);
+       }
 
        return true;
 }
@@ -660,11 +777,58 @@ bool IO::write(const char *path)
        return write(w);
 }
 
+bool IO::write(const wchar_t *path)
+{
+       binary::FileWriter w(path);
+       return write(w);
+}
+
 const Vector2* IO::getUV(int index)const
 {
        return &vertices[index].uv;
 }
 
+void Bone::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
+void BoneGroup::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
+void BoneGroup::setEnglishName(const char *src)
+{
+       strncpy(english_name, src, 20);
+}
+
+void Morph::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
+void Morph::setEnglishName(const char *src)
+{
+       strncpy(english_name, src, 20);
+}
+
+void RigidBody::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
+void Constraint::setName(const char *src)
+{
+       strncpy(name, src, 20);
+}
+
+void Material::setTexture(const char *src)
+{
+       strncpy(texture, src, 20);
+}
+
+
 } // namespace
 } // namespace