X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=src%2Fpmd.cpp;h=c5ac48f056a4c5aaae3c52edd55bd3a55c12abe5;hb=4b7b856e70fe8047f985e2598020032d0d87a672;hp=b4041cbb9cb0a569d0b791a7b05fe0c3de9c46cd;hpb=a3813178bbde16fe13657172e73ab0926a018ba4;p=meshio%2Fmeshio.git diff --git a/src/pmd.cpp b/src/pmd.cpp old mode 100644 new mode 100755 index b4041cb..c5ac48f --- a/src/pmd.cpp +++ b/src/pmd.cpp @@ -5,34 +5,187 @@ namespace meshio { namespace pmd { +// IO +bool IO::write(const char *path) +{ + binary::FileWriter w(path); + return write(w); +} + +bool IO::write(const wchar_t *path) +{ + binary::FileWriter w(path); + return write(w); +} + std::wstring - Material::getTexture()const +IO::getName()const +{ + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(name, name+20))); +} + +std::wstring +IO::getComment()const +{ + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(comment, comment+256))); +} + +std::wstring +IO::getEnglishName()const +{ + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(english_name, english_name+20))); +} + +std::wstring +IO::getEnglishComment()const +{ + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(english_comment, english_comment+256))); +} + +const Vector2* IO::getUV(int index)const +{ + return &vertices[index].uv; +} + +void IO::setName(const char *src) +{ + strncpy(name, src, 20); +} + +void IO::setComment(const char *src) +{ + strncpy(comment, src, 256); +} + +void IO::setEnglishName(const char *src) +{ + strncpy(english_name, src, 20); +} + +void IO::setEnglishComment(const char *src) +{ + strncpy(english_comment, src, 256); +} + + +// Material +std::wstring +Material::getTexture()const +{ + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(texture, texture+20))); +} + +void Material::setTexture(const char *src) +{ + strncpy(texture, src, 20); +} + +// Bone +std::wstring + Bone::getName()const { return text::trim(text::to_WideChar(CP_OEMCP, - std::string(texture, texture+20))); + std::string(name, name+20))); } +void Bone::setName(const char *src) +{ + strncpy(name, src, 20); +} + +void Bone::setEnglishName(const char *src) +{ + strncpy(english_name, src, 20); +} + +// Morph std::wstring - Bone::getName()const + Morph::getName()const { return text::trim(text::to_WideChar(CP_OEMCP, 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)); + } + +void Morph::setName(const char *src) +{ + strncpy(name, src, 20); +} + +void Morph::setEnglishName(const char *src) +{ + strncpy(english_name, src, 20); +} + +// BoneGroup std::wstring - Morph::getName()const + BoneGroup::getName()const + { + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(name, name+50))); + } + +void BoneGroup::setName(const char *src) +{ + strncpy(name, src, 50); +} + +void BoneGroup::setEnglishName(const char *src) +{ + strncpy(english_name, src, 50); +} + +// RigidBody +std::wstring + RigidBody::getName()const { return text::trim(text::to_WideChar(CP_OEMCP, std::string(name, name+20))); } +void RigidBody::setName(const char *src) +{ + strncpy(name, src, 20); +} + +// Constraint std::wstring - IO::getName()const + Constraint::getName()const { return text::trim(text::to_WideChar(CP_OEMCP, std::string(name, name+20))); } +void Constraint::setName(const char *src) +{ + strncpy(name, src, 20); +} + +// ToonTexture +std::wstring + ToonTexture::getName()const + { + return text::trim(text::to_WideChar(CP_OEMCP, + std::string(name, name+100))); + } + +void ToonTexture::setName(const char *src) +{ + strncpy(name, src, 100); +} + + // 38bytes template void @@ -197,7 +350,7 @@ public: if(!parseFaceList()){ return false; } - if(!parseBoneNameList()){ + if(!parseBoneGroupList()){ return false; } if(!parseBoneList()){ @@ -278,15 +431,19 @@ private: bool parseToonTextures() { for(size_t i=0; i<10; ++i){ - reader_.getString(100); + text::copyStringAndFillZero( + io_.toon_textures[i].name, + reader_.getString(100)); } return true; } bool parseEnglishBoneList() { - for(size_t i=0; ichildren.push_back(&bone); } - if(bone.tail_index!=0xFFFF){ + if(bone.tail_index==0){ + bone.tail=Vector3(0, 0, 0); + } + else{ bone.tail=bones[bone.tail_index].pos; } } @@ -618,39 +782,120 @@ bool IO::write(binary::IWriter &w) w.writeArray(&face_list[0], face_list.size()); } - // bone naem list + // bone name list //std::cout << "bone name list" << std::endl; - w.writeValue(bone_name_list.size()); - for(size_t i=0; i(buf, 50); + w.writeValue(bone_group_list.size()); + for(size_t i=0; i(bone_group_list[i].name, 50); } // bone list //std::cout << "bone list" << std::endl; - w.writeValue(bone_list.size()); - for(size_t i=0; i(bone_list[i].first); - w.writeValue(bone_list[i].second); + w.writeValue(bone_display_list.size()); + for(size_t i=0; i(bone_display_list[i].first); + w.writeValue(bone_display_list[i].second); } + //////////////////////////////////////////////////////////// // extend + //////////////////////////////////////////////////////////// + w.writeValue(0x01); - return true; -} + //////////////////////////////////////////////////////////// + // english names + //////////////////////////////////////////////////////////// + w.writeArray(english_name, 20); + w.writeArray(english_comment, 256); -bool IO::write(const char *path) -{ - binary::FileWriter w(path); - return write(w); -} + for(size_t i=0; i(bones[i].english_name, 20); + } -const Vector2* IO::getUV(int index)const -{ - return &vertices[index].uv; + // skip base + for(size_t i=1; i(morph_list[i].english_name, 20); + } + + for(size_t i=0; i(bone_group_list[i].english_name, 50); + } + + //////////////////////////////////////////////////////////// + // toon textures + //////////////////////////////////////////////////////////// + for(size_t i=0; i<10; ++i){ + w.writeArray(toon_textures[i].name, 100); + } + + //////////////////////////////////////////////////////////// + // rigid bodies + //////////////////////////////////////////////////////////// + w.writeValue(rigidbodies.size()); + for(size_t i=0; i(rb.name, 20); + w.writeValue(rb.boneIndex); + w.writeValue(rb.group); + w.writeValue(rb.target); + w.writeValue(rb.shapeType); + w.writeValue(rb.w); + w.writeValue(rb.h); + w.writeValue(rb.d); + w.writeValue(rb.position.x); + w.writeValue(rb.position.y); + w.writeValue(rb.position.z); + w.writeValue(rb.rotation.x); + w.writeValue(rb.rotation.y); + w.writeValue(rb.rotation.z); + w.writeValue(rb.weight); + w.writeValue(rb.linearDamping); + w.writeValue(rb.angularDamping); + w.writeValue(rb.restitution); + w.writeValue(rb.friction); + w.writeValue(rb.processType); + } + + //////////////////////////////////////////////////////////// + // constraints + //////////////////////////////////////////////////////////// + w.writeValue(constraints.size()); + for(size_t i=0; i(c.name, 20); + w.writeValue(c.rigidA); + w.writeValue(c.rigidB); + w.writeValue(c.pos.x); + w.writeValue(c.pos.y); + w.writeValue(c.pos.z); + w.writeValue(c.rot.x); + w.writeValue(c.rot.y); + w.writeValue(c.rot.z); + w.writeValue(c.constraintPosMin.x); + w.writeValue(c.constraintPosMin.y); + w.writeValue(c.constraintPosMin.z); + w.writeValue(c.constraintPosMax.x); + w.writeValue(c.constraintPosMax.y); + w.writeValue(c.constraintPosMax.z); + w.writeValue(c.constraintRotMin.x); + w.writeValue(c.constraintRotMin.y); + w.writeValue(c.constraintRotMin.z); + w.writeValue(c.constraintRotMax.x); + w.writeValue(c.constraintRotMax.y); + w.writeValue(c.constraintRotMax.z); + w.writeValue(c.springPos.x); + w.writeValue(c.springPos.y); + w.writeValue(c.springPos.z); + w.writeValue(c.springRot.x); + w.writeValue(c.springRot.y); + w.writeValue(c.springRot.z); + } + + return true; } + } // namespace } // namespace