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)));
32 return text::trim(text::to_WideChar(CP_OEMCP,
33 std::string(name, name+20)));
37 template<class READER>
39 read(READER &reader, Vertex &v)
41 unsigned int pos=reader.getPos();
47 reader.get(v.weight0);
48 reader.get(v.edge_flag);
49 assert(reader.getPos()-pos==38);
54 template<class READER>
56 read(READER &reader, Material &m)
58 unsigned int pos=reader.getPos();
59 reader.get(m.diffuse);
60 reader.get(m.shinness);
61 reader.get(m.specular);
62 reader.get(m.ambient);
63 reader.get(m.toon_index);
65 reader.get(m.vertex_count);
66 text::copyStringAndFillZero(m.texture, reader.getString(20));
67 assert(reader.getPos()-pos==70);
71 template<class READER>
73 read(READER &reader, Bone &b)
75 unsigned int pos=reader.getPos();
76 text::copyStringAndFillZero(b.name, reader.getString(20));
77 reader.get(b.parent_index);
78 reader.get(b.tail_index);
79 b.type=static_cast<BONE_TYPE>(reader.getUchar());
80 reader.get(b.ik_index);
82 assert(reader.getPos()-pos==39);
85 // 11+2xIK_COUNT bytes
86 template<class READER>
88 read(READER &reader, IK &ik)
92 reader.get(ik.target);
93 reader.get(ik.length);
94 reader.get(ik.iterations);
95 reader.get(ik.weight);
97 for(unsigned short j=0; j<ik.length; ++j){
98 ik.children.push_back(reader.getUshort());
102 // 25+12xMORPH_COUNT bytes
103 template<class READER>
105 read(READER &reader, Morph &m)
108 text::copyStringAndFillZero(m.name, reader.getString(20));
109 reader.get(m.vertex_count);
110 m.type=static_cast<MORPH_TYPE>(reader.getUchar());
111 // 12 x vertex_count bytes
112 for(unsigned short i=0; i<m.vertex_count; ++i){
113 m.indices.push_back(reader.getUint());
114 m.pos_list.push_back(Vector3());
115 reader.get(m.pos_list.back());
120 template<class READER>
122 read(READER &reader, RigidBody &r)
124 unsigned int pos=reader.getPos();
125 text::copyStringAndFillZero(r.name, reader.getString(20));
126 reader.get(r.boneIndex);
128 reader.get(r.target);
129 r.shapeType=static_cast<SHAPE_TYPE>(reader.getUchar());
133 reader.get(r.position);
134 reader.get(r.rotation);
135 reader.get(r.weight);
136 reader.get(r.linearDamping);
137 reader.get(r.angularDamping);
138 reader.get(r.restitution);
139 reader.get<float>(r.friction);
140 r.processType=static_cast<PROCESS_TYPE>(reader.getUchar());
141 assert(reader.getPos()-pos==83);
145 template<class READER>
147 read(READER &reader, Constraint &c)
149 unsigned int base_pos=reader.getPos();
150 text::copyStringAndFillZero(c.name, reader.getString(20));
151 reader.get(c.rigidA);
152 reader.get(c.rigidB);
155 reader.get(c.constraintPosMin);
156 reader.get(c.constraintPosMax);
157 reader.get(c.constraintRotMin);
158 reader.get(c.constraintRotMax);
159 reader.get(c.springPos);
160 reader.get(c.springRot);
161 assert(reader.getPos()-base_pos==124);
167 binary::IReader &reader_;
170 Impl(IO &io, binary::IReader &reader)
171 : io_(io), reader_(reader)
179 if(!parseVertices()){
185 if(!parseMaterials()){
197 if(!parseFaceList()){
200 if(!parseBoneNameList()){
203 if(!parseBoneList()){
210 ////////////////////////////////////////////////////////////
212 ////////////////////////////////////////////////////////////
214 ////////////////////////////////////////////////////////////
215 if(reader_.getChar()){
216 if(!parseEnglishName()){
219 if(!parseEnglishBone()){
222 if(!parseEnglishMorph()){
225 if(!parseEnglishBoneList()){
234 ////////////////////////////////////////////////////////////
235 if(!parseToonTextures()){
243 ////////////////////////////////////////////////////////////
247 if(!parseConstraint()){
252 assert(reader_.isEnd());
258 bool parseConstraint()
260 unsigned int count=reader_.getUint();
261 for(unsigned int i=0; i<count; ++i){
262 io_.constraints.push_back(Constraint());
263 read(reader_, io_.constraints.back());
270 unsigned int count=reader_.getUint();
271 for(unsigned int i=0; i<count; ++i){
272 io_.rigidbodies.push_back(RigidBody());
273 read(reader_, io_.rigidbodies.back());
278 bool parseToonTextures()
280 for(size_t i=0; i<10; ++i){
281 reader_.getString(100);
286 bool parseEnglishBoneList()
288 for(size_t i=0; i<io_.bone_name_list.size(); ++i){
289 std::string english=reader_.getString(50);
294 bool parseEnglishMorph()
296 int count=io_.morph_list.size()-1;
297 for(int i=0; i<count; ++i){
298 text::copyStringAndFillZero(
299 io_.morph_list[i].english_name, reader_.getString(20));
304 bool parseEnglishBone()
306 for(size_t i=0; i<io_.bones.size(); ++i){
307 text::copyStringAndFillZero(
308 io_.bones[i].english_name, reader_.getString(20));
313 bool parseEnglishName()
315 text::copyStringAndFillZero(io_.english_model_name,
316 reader_.getString(20));
317 text::copyStringAndFillZero(io_.english_comment,
318 reader_.getString(256));
324 unsigned int count=reader_.getUint();
325 for(unsigned int i=0; i<count; ++i){
326 unsigned short bone=reader_.getUshort();
327 unsigned char disp=reader_.getUchar();
328 io_.bone_list.push_back(std::make_pair(bone, disp));
333 bool parseBoneNameList()
335 unsigned int count=reader_.getUchar();
336 for(unsigned int i=0; i<count; ++i){
337 io_.bone_name_list.push_back(reader_.getString(50));
344 unsigned int count=reader_.getUchar();
345 for(unsigned int i=0; i<count; ++i){
346 io_.face_list.push_back(reader_.getUshort());
353 unsigned int count=reader_.getUshort();
354 for(unsigned int i=0; i<count; ++i){
355 io_.morph_list.push_back(Morph());
356 read(reader_, io_.morph_list.back());
363 unsigned int count=reader_.getUshort();
364 for(unsigned int i=0; i<count; ++i){
365 io_.ik_list.push_back(IK());
366 read(reader_, io_.ik_list.back());
373 unsigned int count=reader_.getUshort();
374 for(unsigned int i=0; i<count; ++i){
375 io_.bones.push_back(Bone());
376 read(reader_, io_.bones.back());
381 bool parseMaterials()
383 unsigned int count=reader_.getUint();
384 for(unsigned int i=0; i<count; ++i){
385 io_.materials.push_back(new Material());
386 read(reader_, *io_.materials.back());
393 unsigned int count=reader_.getUint();
394 for(unsigned int i=0; i<count; ++i){
395 io_.indices.push_back(reader_.getUshort());
402 unsigned int count=reader_.getUint();
403 for(unsigned int i=0; i<count; ++i){
404 io_.vertices.push_back(Vertex());
405 read(reader_, io_.vertices.back());
412 if(reader_.getString(3)!="Pmd"){
413 //std::cout << "invalid pmd" << std::endl;
416 reader_.get(io_.version);
417 if(io_.version!=1.0){
418 std::cout << "invalid vesion: " << io_.version <<std::endl;
421 text::copyStringAndFillZero(io_.name, reader_.getString(20));
422 text::copyStringAndFillZero(io_.comment, reader_.getString(256));
429 ///////////////////////////////////////////////////////////////////////////////
431 ///////////////////////////////////////////////////////////////////////////////
438 for(size_t i=0; i<materials.size(); ++i){
444 bool IO::read(binary::IReader &input)
446 Impl impl(*this, input);
451 ////////////////////////////////////////////////////////////
453 ////////////////////////////////////////////////////////////
454 if(!morph_list.empty()){
456 assert(morph_list[0].type==MORPH_BASE);
458 Morph &base=morph_list[0];
459 for(size_t i=0; i<base.vertex_count; ++i){
460 assert(vertices[base.indices[i]].pos==base.pos_list[i]);
463 for(size_t i=1; i<morph_list.size(); ++i){
464 Morph &m=morph_list[i];
465 assert(m.type!=MORPH_BASE);
468 ////////////////////////////////////////////////////////////
470 ////////////////////////////////////////////////////////////
471 for(size_t i=0; i<bones.size(); ++i){
473 if(bone.parent_index!=0xFFFF){
474 bone.parent=&bones[bone.parent_index];
475 bone.parent->children.push_back(&bone);
477 if(bone.tail_index!=0xFFFF){
478 bone.tail=bones[bone.tail_index].pos;
486 bool IO::read(const char *path)
488 std::vector<char> all;
489 binary::readAll(path, all);
493 binary::MemoryReader reader(&all[0], all.size());
498 bool IO::read(const wchar_t *path)
500 std::vector<char> all;
501 binary::readAll(path, all);
502 std::cerr << all.size() << "bytes" << std::endl;
506 binary::MemoryReader reader(&all[0], all.size());
510 bool IO::write(binary::IWriter &w)
513 w.writeValue<float>(version);
515 w.write(comment, 256);
518 w.writeValue<DWORD>(vertices.size());
519 for(size_t i=0; i<vertices.size(); ++i){
520 Vertex &v=vertices[i];
521 w.writeValue<float>(v.pos.x);
522 w.writeValue<float>(v.pos.y);
523 w.writeValue<float>(v.pos.z);
524 w.writeValue<float>(v.normal.x);
525 w.writeValue<float>(v.normal.y);
526 w.writeValue<float>(v.normal.z);
527 w.writeValue<float>(v.uv.x);
528 w.writeValue<float>(v.uv.y);
529 w.writeValue<WORD>(v.bone0);
530 w.writeValue<WORD>(v.bone1);
531 w.writeValue<BYTE>(v.weight0);
532 w.writeValue<BYTE>(v.edge_flag);
536 w.writeValue<DWORD>(indices.size());
537 w.writeArray<WORD>(&indices[0], indices.size());
540 w.writeValue<DWORD>(materials.size());
541 for(size_t i=0; i<materials.size(); ++i){
542 Material &m=*materials[i];
543 w.writeValue<float>(m.diffuse.r);
544 w.writeValue<float>(m.diffuse.g);
545 w.writeValue<float>(m.diffuse.b);
546 w.writeValue<float>(m.diffuse.a);
547 w.writeValue<float>(m.shinness);
548 w.writeValue<float>(m.specular.r);
549 w.writeValue<float>(m.specular.g);
550 w.writeValue<float>(m.specular.b);
551 w.writeValue<float>(m.ambient.r);
552 w.writeValue<float>(m.ambient.g);
553 w.writeValue<float>(m.ambient.b);
554 w.writeValue<BYTE>(m.toon_index);
555 w.writeValue<BYTE>(m.flag);
556 w.writeValue<DWORD>(m.vertex_count);
557 w.writeArray<char>(m.texture, 20);
561 w.writeValue<WORD>(bones.size());
562 for(size_t i=0; i<bones.size(); ++i){
564 w.writeArray<char>(b.name, 20);
565 w.writeValue<WORD>(b.parent_index);
566 w.writeValue<WORD>(b.tail_index);
567 w.writeValue<BYTE>(b.type);
568 w.writeValue<WORD>(b.ik_index);
569 w.writeValue<float>(b.pos.x);
570 w.writeValue<float>(b.pos.y);
571 w.writeValue<float>(b.pos.z);
575 w.writeValue<WORD>(ik_list.size());
576 for(size_t i=0; i<ik_list.size(); ++i){
578 w.writeValue<WORD>(ik.index);
579 w.writeValue<WORD>(ik.target);
580 w.writeValue<BYTE>(ik.length);
581 w.writeValue<WORD>(ik.iterations);
582 w.writeValue<float>(ik.weight);
583 WORD parent_index=bones[ik.target].parent_index;
584 for(size_t j=0; j<ik.length;
585 ++j, parent_index=bones[parent_index].parent_index){
586 w.writeValue<WORD>(parent_index);
591 w.writeValue<WORD>(morph_list.size());
592 for(size_t i=0; i<morph_list.size(); ++i){
593 Morph &m=morph_list[i];
594 w.writeArray<char>(m.name, 20);
595 w.writeValue<DWORD>(m.indices.size());
596 w.writeValue<BYTE>(m.type);
597 for(size_t j=0; j<m.indices.size(); ++j){
598 w.writeValue<DWORD>(m.indices[j]);
599 Vector3 &pos=m.pos_list[j];
600 w.writeValue<float>(pos.x);
601 w.writeValue<float>(pos.y);
602 w.writeValue<float>(pos.z);
607 w.writeValue<BYTE>(face_list.size());
608 w.writeArray<WORD>(&face_list[0], face_list.size());
611 w.writeValue<BYTE>(bone_name_list.size());
612 for(size_t i=0; i<bone_name_list.size(); ++i){
614 sprintf(buf, "%s\r", bone_name_list[i].c_str());
615 w.writeArray<char>(buf, 50);
619 w.writeValue<DWORD>(bone_list.size());
620 for(size_t i=0; i<bone_list.size(); ++i){
621 w.writeValue<WORD>(bone_list[i].first);
622 w.writeValue<BYTE>(bone_list[i].second);
630 bool IO::write(const char *path)
632 binary::FileWriter w(path);
636 const Vector2* IO::getUV(int index)const
638 return &vertices[index].uv;