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
- {
- return text::trim(text::to_WideChar(CP_OEMCP,
- std::string(texture, texture+20)));
- }
+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
{
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
Morph::getName()const
{
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
+ 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<class READER>
void
if(!parseFaceList()){
return false;
}
- if(!parseBoneNameList()){
+ if(!parseBoneGroupList()){
return false;
}
if(!parseBoneList()){
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; 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;
}
bool parseEnglishName()
{
- text::copyStringAndFillZero(io_.english_model_name,
+ text::copyStringAndFillZero(io_.english_name,
reader_.getString(20));
text::copyStringAndFillZero(io_.english_comment,
reader_.getString(256));
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;
}
////////////////////////////////////////////////////////////
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=Vector3(0, 0, 0);
+ }
+ else{
bone.tail=bones[bone.tail_index].pos;
}
}
w.writeArray<WORD>(&face_list[0], face_list.size());
}
- // bone naem list
+ // bone name 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
w.writeValue<BYTE>(bone_display_list[i].second);
}
+ ////////////////////////////////////////////////////////////
// extend
+ ////////////////////////////////////////////////////////////
+ w.writeValue<char>(0x01);
- return true;
-}
+ ////////////////////////////////////////////////////////////
+ // english names
+ ////////////////////////////////////////////////////////////
+ w.writeArray<char>(english_name, 20);
+ w.writeArray<char>(english_comment, 256);
-bool IO::write(const char *path)
-{
- binary::FileWriter w(path);
- return write(w);
-}
+ for(size_t i=0; i<bones.size(); ++i){
+ w.writeArray<char>(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.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;
}
+
} // namespace
} // namespace