OSDN Git Service

refactoring.
[meshio/meshio.git] / src / pmd.cpp
index 95e6610..9a88bd3 100644 (file)
@@ -26,6 +26,13 @@ std::wstring
                                        std::string(name, name+20)));
        }
 
+void
+       Morph::append(int index, float x, float y, float z)
+       {
+               indices.push_back(index);
+               pos_list.push_back(Vector3(x, y, z));
+       }
+
 std::wstring 
        IO::getName()const
        {
@@ -285,8 +292,10 @@ private:
 
        bool parseEnglishBoneList()
        {
-               for(size_t i=0; i<io_.bone_name_list.size(); ++i){
-                       std::string english=reader_.getString(50);
+               for(size_t i=0; i<io_.bone_display_name_list.size(); ++i){
+                       text::copyStringAndFillZero(
+                                       io_.bone_display_name_list[i].english_name, 
+                                       reader_.getString(50));
                }
                return true;
        }
@@ -312,7 +321,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));
@@ -325,7 +334,7 @@ private:
                for(unsigned int i=0; i<count; ++i){
                        unsigned short bone=reader_.getUshort();
                        unsigned char disp=reader_.getUchar();
-                       io_.bone_list.push_back(std::make_pair(bone, disp));
+                       io_.bone_display_list.push_back(std::make_pair(bone, disp));
                }
                return true;
        }
@@ -334,7 +343,10 @@ private:
        {
                unsigned int count=reader_.getUchar();
                for(unsigned int i=0; i<count; ++i){
-                       io_.bone_name_list.push_back(reader_.getString(50));
+                       io_.bone_display_name_list.push_back(BoneDisplayName());
+                       text::copyStringAndFillZero(
+                                       io_.bone_display_name_list.back().name,
+                                       reader_.getString(50));
                }
                return true;
        }
@@ -470,11 +482,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;
                }
        }
@@ -515,6 +528,7 @@ bool IO::write(binary::IWriter &w)
        w.write(comment, 256);
 
        // vertices
+       //std::cout << "vertices" << std::endl;
        w.writeValue<DWORD>(vertices.size());
        for(size_t i=0; i<vertices.size(); ++i){
                Vertex &v=vertices[i];
@@ -533,10 +547,14 @@ bool IO::write(binary::IWriter &w)
        }
 
        // faces
+       //std::cout << "faces" << std::endl;
        w.writeValue<DWORD>(indices.size());
-       w.writeArray<WORD>(&indices[0], indices.size());
+       if(indices.size()>0){
+               w.writeArray<WORD>(&indices[0], indices.size());
+       }
 
        // materials
+       //std::cout << "materials" << std::endl;
        w.writeValue<DWORD>(materials.size());
        for(size_t i=0; i<materials.size(); ++i){
                Material &m=*materials[i];
@@ -558,6 +576,7 @@ bool IO::write(binary::IWriter &w)
        }
 
        // bones
+       //std::cout << "bones" << std::endl;
        w.writeValue<WORD>(bones.size());
        for(size_t i=0; i<bones.size(); ++i){
                Bone &b=bones[i];
@@ -572,6 +591,7 @@ bool IO::write(binary::IWriter &w)
        }
 
        // ik
+       //std::cout << "ik" << std::endl;
        w.writeValue<WORD>(ik_list.size());
        for(size_t i=0; i<ik_list.size(); ++i){
                IK &ik=ik_list[i];
@@ -588,6 +608,7 @@ bool IO::write(binary::IWriter &w)
        }
 
        // morph
+       //std::cout << "morph" << std::endl;
        w.writeValue<WORD>(morph_list.size());
        for(size_t i=0; i<morph_list.size(); ++i){
                Morph &m=morph_list[i];
@@ -604,25 +625,57 @@ bool IO::write(binary::IWriter &w)
        }
 
        // face list
+       //std::cout << "face list" << std::endl;
        w.writeValue<BYTE>(face_list.size());
-       w.writeArray<WORD>(&face_list[0], face_list.size());
+       if(face_list.size()>0){
+               w.writeArray<WORD>(&face_list[0], face_list.size());
+       }
 
        // bone naem list
-       w.writeValue<BYTE>(bone_name_list.size());
-       for(size_t i=0; i<bone_name_list.size(); ++i){
-               char buf[50];
-               sprintf(buf, "%s\r", bone_name_list[i].c_str());
-               w.writeArray<char>(buf, 50);
+       //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){
+               // 50bytes
+               w.writeArray<char>(bone_display_name_list[i].name, 50);
        }
 
        // bone list
-       w.writeValue<DWORD>(bone_list.size());
-       for(size_t i=0; i<bone_list.size(); ++i){
-               w.writeValue<WORD>(bone_list[i].first);
-               w.writeValue<BYTE>(bone_list[i].second);
+       //std::cout << "bone list" << std::endl;
+       w.writeValue<DWORD>(bone_display_list.size());
+       for(size_t i=0; i<bone_display_list.size(); ++i){
+               w.writeValue<WORD>(bone_display_list[i].first);
+               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_display_name_list.size(); ++i){
+               w.writeArray<char>(bone_display_name_list[i].english_name, 50);
+       }
+
+       ////////////////////////////////////////////////////////////
+       // toon textures
+       ////////////////////////////////////////////////////////////
+       for(size_t i=0; i<10; ++i){
+               w.writeArray<char>(toon_textures[i].name, 100);
+       }
 
        return true;
 }