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){
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(std::ostream &os)
515 const Vector2* IO::getUV(int index)const
517 return &vertices[index].uv;