9 Material::getTexture()const
11 return text::trim(text::to_WideChar(CP_OEMCP,
12 std::string(texture, texture+20)));
18 return text::trim(text::to_WideChar(CP_OEMCP,
19 std::string(name, name+20)));
25 return text::trim(text::to_WideChar(CP_OEMCP,
26 std::string(name, name+20)));
30 Morph::append(int index, float x, float y, float z)
32 indices.push_back(index);
33 pos_list.push_back(Vector3(x, y, z));
39 return text::trim(text::to_WideChar(CP_OEMCP,
40 std::string(name, name+20)));
44 template<class READER>
46 read(READER &reader, Vertex &v)
48 unsigned int pos=reader.getPos();
54 reader.get(v.weight0);
55 reader.get(v.edge_flag);
56 assert(reader.getPos()-pos==38);
61 template<class READER>
63 read(READER &reader, Material &m)
65 unsigned int pos=reader.getPos();
66 reader.get(m.diffuse);
67 reader.get(m.shinness);
68 reader.get(m.specular);
69 reader.get(m.ambient);
70 reader.get(m.toon_index);
72 reader.get(m.vertex_count);
73 text::copyStringAndFillZero(m.texture, reader.getString(20));
74 assert(reader.getPos()-pos==70);
78 template<class READER>
80 read(READER &reader, Bone &b)
82 unsigned int pos=reader.getPos();
83 text::copyStringAndFillZero(b.name, reader.getString(20));
84 reader.get(b.parent_index);
85 reader.get(b.tail_index);
86 b.type=static_cast<BONE_TYPE>(reader.getUchar());
87 reader.get(b.ik_index);
89 assert(reader.getPos()-pos==39);
92 // 11+2xIK_COUNT bytes
93 template<class READER>
95 read(READER &reader, IK &ik)
99 reader.get(ik.target);
100 reader.get(ik.length);
101 reader.get(ik.iterations);
102 reader.get(ik.weight);
104 for(unsigned short j=0; j<ik.length; ++j){
105 ik.children.push_back(reader.getUshort());
109 // 25+12xMORPH_COUNT bytes
110 template<class READER>
112 read(READER &reader, Morph &m)
115 text::copyStringAndFillZero(m.name, reader.getString(20));
116 reader.get(m.vertex_count);
117 m.type=static_cast<MORPH_TYPE>(reader.getUchar());
118 // 12 x vertex_count bytes
119 for(unsigned short i=0; i<m.vertex_count; ++i){
120 m.indices.push_back(reader.getUint());
121 m.pos_list.push_back(Vector3());
122 reader.get(m.pos_list.back());
127 template<class READER>
129 read(READER &reader, RigidBody &r)
131 unsigned int pos=reader.getPos();
132 text::copyStringAndFillZero(r.name, reader.getString(20));
133 reader.get(r.boneIndex);
135 reader.get(r.target);
136 r.shapeType=static_cast<SHAPE_TYPE>(reader.getUchar());
140 reader.get(r.position);
141 reader.get(r.rotation);
142 reader.get(r.weight);
143 reader.get(r.linearDamping);
144 reader.get(r.angularDamping);
145 reader.get(r.restitution);
146 reader.get<float>(r.friction);
147 r.processType=static_cast<PROCESS_TYPE>(reader.getUchar());
148 assert(reader.getPos()-pos==83);
152 template<class READER>
154 read(READER &reader, Constraint &c)
156 unsigned int base_pos=reader.getPos();
157 text::copyStringAndFillZero(c.name, reader.getString(20));
158 reader.get(c.rigidA);
159 reader.get(c.rigidB);
162 reader.get(c.constraintPosMin);
163 reader.get(c.constraintPosMax);
164 reader.get(c.constraintRotMin);
165 reader.get(c.constraintRotMax);
166 reader.get(c.springPos);
167 reader.get(c.springRot);
168 assert(reader.getPos()-base_pos==124);
174 binary::IReader &reader_;
177 Impl(IO &io, binary::IReader &reader)
178 : io_(io), reader_(reader)
186 if(!parseVertices()){
192 if(!parseMaterials()){
204 if(!parseFaceList()){
207 if(!parseBoneNameList()){
210 if(!parseBoneList()){
217 ////////////////////////////////////////////////////////////
219 ////////////////////////////////////////////////////////////
221 ////////////////////////////////////////////////////////////
222 if(reader_.getChar()){
223 if(!parseEnglishName()){
226 if(!parseEnglishBone()){
229 if(!parseEnglishMorph()){
232 if(!parseEnglishBoneList()){
241 ////////////////////////////////////////////////////////////
242 if(!parseToonTextures()){
250 ////////////////////////////////////////////////////////////
254 if(!parseConstraint()){
259 assert(reader_.isEnd());
265 bool parseConstraint()
267 unsigned int count=reader_.getUint();
268 for(unsigned int i=0; i<count; ++i){
269 io_.constraints.push_back(Constraint());
270 read(reader_, io_.constraints.back());
277 unsigned int count=reader_.getUint();
278 for(unsigned int i=0; i<count; ++i){
279 io_.rigidbodies.push_back(RigidBody());
280 read(reader_, io_.rigidbodies.back());
285 bool parseToonTextures()
287 for(size_t i=0; i<10; ++i){
288 reader_.getString(100);
293 bool parseEnglishBoneList()
295 for(size_t i=0; i<io_.bone_display_name_list.size(); ++i){
296 text::copyStringAndFillZero(
297 io_.bone_display_name_list[i].english_name,
298 reader_.getString(50));
303 bool parseEnglishMorph()
305 int count=io_.morph_list.size()-1;
306 for(int i=0; i<count; ++i){
307 text::copyStringAndFillZero(
308 io_.morph_list[i].english_name, reader_.getString(20));
313 bool parseEnglishBone()
315 for(size_t i=0; i<io_.bones.size(); ++i){
316 text::copyStringAndFillZero(
317 io_.bones[i].english_name, reader_.getString(20));
322 bool parseEnglishName()
324 text::copyStringAndFillZero(io_.english_name,
325 reader_.getString(20));
326 text::copyStringAndFillZero(io_.english_comment,
327 reader_.getString(256));
333 unsigned int count=reader_.getUint();
334 for(unsigned int i=0; i<count; ++i){
335 unsigned short bone=reader_.getUshort();
336 unsigned char disp=reader_.getUchar();
337 io_.bone_display_list.push_back(std::make_pair(bone, disp));
342 bool parseBoneNameList()
344 unsigned int count=reader_.getUchar();
345 for(unsigned int i=0; i<count; ++i){
346 io_.bone_display_name_list.push_back(BoneDisplayName());
347 text::copyStringAndFillZero(
348 io_.bone_display_name_list.back().name,
349 reader_.getString(50));
356 unsigned int count=reader_.getUchar();
357 for(unsigned int i=0; i<count; ++i){
358 io_.face_list.push_back(reader_.getUshort());
365 unsigned int count=reader_.getUshort();
366 for(unsigned int i=0; i<count; ++i){
367 io_.morph_list.push_back(Morph());
368 read(reader_, io_.morph_list.back());
375 unsigned int count=reader_.getUshort();
376 for(unsigned int i=0; i<count; ++i){
377 io_.ik_list.push_back(IK());
378 read(reader_, io_.ik_list.back());
385 unsigned int count=reader_.getUshort();
386 for(unsigned int i=0; i<count; ++i){
387 io_.bones.push_back(Bone());
388 read(reader_, io_.bones.back());
393 bool parseMaterials()
395 unsigned int count=reader_.getUint();
396 for(unsigned int i=0; i<count; ++i){
397 io_.materials.push_back(new Material());
398 read(reader_, *io_.materials.back());
405 unsigned int count=reader_.getUint();
406 for(unsigned int i=0; i<count; ++i){
407 io_.indices.push_back(reader_.getUshort());
414 unsigned int count=reader_.getUint();
415 for(unsigned int i=0; i<count; ++i){
416 io_.vertices.push_back(Vertex());
417 read(reader_, io_.vertices.back());
424 if(reader_.getString(3)!="Pmd"){
425 //std::cout << "invalid pmd" << std::endl;
428 reader_.get(io_.version);
429 if(io_.version!=1.0){
430 std::cout << "invalid vesion: " << io_.version <<std::endl;
433 text::copyStringAndFillZero(io_.name, reader_.getString(20));
434 text::copyStringAndFillZero(io_.comment, reader_.getString(256));
441 ///////////////////////////////////////////////////////////////////////////////
443 ///////////////////////////////////////////////////////////////////////////////
450 for(size_t i=0; i<materials.size(); ++i){
456 bool IO::read(binary::IReader &input)
458 Impl impl(*this, input);
463 ////////////////////////////////////////////////////////////
465 ////////////////////////////////////////////////////////////
466 if(!morph_list.empty()){
468 assert(morph_list[0].type==MORPH_BASE);
470 Morph &base=morph_list[0];
471 for(size_t i=0; i<base.vertex_count; ++i){
472 assert(vertices[base.indices[i]].pos==base.pos_list[i]);
475 for(size_t i=1; i<morph_list.size(); ++i){
476 Morph &m=morph_list[i];
477 assert(m.type!=MORPH_BASE);
480 ////////////////////////////////////////////////////////////
482 ////////////////////////////////////////////////////////////
483 for(size_t i=0; i<bones.size(); ++i){
485 if(bone.parent_index!=0xFFFF){
486 bone.parent=&bones[bone.parent_index];
487 bone.parent->children.push_back(&bone);
489 if(bone.tail_index!=0xFFFF){
490 bone.tail=bones[bone.tail_index].pos;
498 bool IO::read(const char *path)
500 std::vector<char> all;
501 binary::readAll(path, all);
505 binary::MemoryReader reader(&all[0], all.size());
510 bool IO::read(const wchar_t *path)
512 std::vector<char> all;
513 binary::readAll(path, all);
514 std::cerr << all.size() << "bytes" << std::endl;
518 binary::MemoryReader reader(&all[0], all.size());
522 bool IO::write(binary::IWriter &w)
525 w.writeValue<float>(version);
527 w.write(comment, 256);
530 //std::cout << "vertices" << std::endl;
531 w.writeValue<DWORD>(vertices.size());
532 for(size_t i=0; i<vertices.size(); ++i){
533 Vertex &v=vertices[i];
534 w.writeValue<float>(v.pos.x);
535 w.writeValue<float>(v.pos.y);
536 w.writeValue<float>(v.pos.z);
537 w.writeValue<float>(v.normal.x);
538 w.writeValue<float>(v.normal.y);
539 w.writeValue<float>(v.normal.z);
540 w.writeValue<float>(v.uv.x);
541 w.writeValue<float>(v.uv.y);
542 w.writeValue<WORD>(v.bone0);
543 w.writeValue<WORD>(v.bone1);
544 w.writeValue<BYTE>(v.weight0);
545 w.writeValue<BYTE>(v.edge_flag);
549 //std::cout << "faces" << std::endl;
550 w.writeValue<DWORD>(indices.size());
551 if(indices.size()>0){
552 w.writeArray<WORD>(&indices[0], indices.size());
556 //std::cout << "materials" << std::endl;
557 w.writeValue<DWORD>(materials.size());
558 for(size_t i=0; i<materials.size(); ++i){
559 Material &m=*materials[i];
560 w.writeValue<float>(m.diffuse.r);
561 w.writeValue<float>(m.diffuse.g);
562 w.writeValue<float>(m.diffuse.b);
563 w.writeValue<float>(m.diffuse.a);
564 w.writeValue<float>(m.shinness);
565 w.writeValue<float>(m.specular.r);
566 w.writeValue<float>(m.specular.g);
567 w.writeValue<float>(m.specular.b);
568 w.writeValue<float>(m.ambient.r);
569 w.writeValue<float>(m.ambient.g);
570 w.writeValue<float>(m.ambient.b);
571 w.writeValue<BYTE>(m.toon_index);
572 w.writeValue<BYTE>(m.flag);
573 w.writeValue<DWORD>(m.vertex_count);
574 w.writeArray<char>(m.texture, 20);
578 //std::cout << "bones" << std::endl;
579 w.writeValue<WORD>(bones.size());
580 for(size_t i=0; i<bones.size(); ++i){
582 w.writeArray<char>(b.name, 20);
583 w.writeValue<WORD>(b.parent_index);
584 w.writeValue<WORD>(b.tail_index);
585 w.writeValue<BYTE>(b.type);
586 w.writeValue<WORD>(b.ik_index);
587 w.writeValue<float>(b.pos.x);
588 w.writeValue<float>(b.pos.y);
589 w.writeValue<float>(b.pos.z);
593 //std::cout << "ik" << std::endl;
594 w.writeValue<WORD>(ik_list.size());
595 for(size_t i=0; i<ik_list.size(); ++i){
597 w.writeValue<WORD>(ik.index);
598 w.writeValue<WORD>(ik.target);
599 w.writeValue<BYTE>(ik.length);
600 w.writeValue<WORD>(ik.iterations);
601 w.writeValue<float>(ik.weight);
602 WORD parent_index=bones[ik.target].parent_index;
603 for(size_t j=0; j<ik.length;
604 ++j, parent_index=bones[parent_index].parent_index){
605 w.writeValue<WORD>(parent_index);
610 //std::cout << "morph" << std::endl;
611 w.writeValue<WORD>(morph_list.size());
612 for(size_t i=0; i<morph_list.size(); ++i){
613 Morph &m=morph_list[i];
614 w.writeArray<char>(m.name, 20);
615 w.writeValue<DWORD>(m.indices.size());
616 w.writeValue<BYTE>(m.type);
617 for(size_t j=0; j<m.indices.size(); ++j){
618 w.writeValue<DWORD>(m.indices[j]);
619 Vector3 &pos=m.pos_list[j];
620 w.writeValue<float>(pos.x);
621 w.writeValue<float>(pos.y);
622 w.writeValue<float>(pos.z);
627 //std::cout << "face list" << std::endl;
628 w.writeValue<BYTE>(face_list.size());
629 if(face_list.size()>0){
630 w.writeArray<WORD>(&face_list[0], face_list.size());
634 //std::cout << "bone name list" << std::endl;
635 w.writeValue<BYTE>(bone_display_name_list.size());
636 for(size_t i=0; i<bone_display_name_list.size(); ++i){
638 w.writeArray<char>(bone_display_name_list[i].name, 50);
642 //std::cout << "bone list" << std::endl;
643 w.writeValue<DWORD>(bone_display_list.size());
644 for(size_t i=0; i<bone_display_list.size(); ++i){
645 w.writeValue<WORD>(bone_display_list[i].first);
646 w.writeValue<BYTE>(bone_display_list[i].second);
649 ////////////////////////////////////////////////////////////
651 ////////////////////////////////////////////////////////////
652 w.writeValue<char>(0x01);
654 ////////////////////////////////////////////////////////////
656 ////////////////////////////////////////////////////////////
657 w.writeArray<char>(english_name, 20);
658 w.writeArray<char>(english_comment, 256);
660 for(size_t i=0; i<bones.size(); ++i){
661 w.writeArray<char>(bones[i].english_name, 20);
664 for(size_t i=1; i<morph_list.size(); ++i){
665 w.writeArray<char>(morph_list[i].english_name, 20);
668 for(size_t i=0; i<bone_display_name_list.size(); ++i){
669 w.writeArray<char>(bone_display_name_list[i].english_name, 50);
672 ////////////////////////////////////////////////////////////
674 ////////////////////////////////////////////////////////////
675 for(size_t i=0; i<10; ++i){
676 w.writeArray<char>(toon_textures[i].name, 100);
682 bool IO::write(const char *path)
684 binary::FileWriter w(path);
688 const Vector2* IO::getUV(int index)const
690 return &vertices[index].uv;