+ w.write("Pmd", 3);
+ w.writeValue<float>(version);
+ w.write(name, 20);
+ w.write(comment, 256);
+
+ // vertices
+ //std::cout << "vertices" << std::endl;
+ w.writeValue<DWORD>(vertices.size());
+ for(size_t i=0; i<vertices.size(); ++i){
+ Vertex &v=vertices[i];
+ w.writeValue<float>(v.pos.x);
+ w.writeValue<float>(v.pos.y);
+ w.writeValue<float>(v.pos.z);
+ w.writeValue<float>(v.normal.x);
+ w.writeValue<float>(v.normal.y);
+ w.writeValue<float>(v.normal.z);
+ w.writeValue<float>(v.uv.x);
+ w.writeValue<float>(v.uv.y);
+ w.writeValue<WORD>(v.bone0);
+ w.writeValue<WORD>(v.bone1);
+ w.writeValue<BYTE>(v.weight0);
+ w.writeValue<BYTE>(v.edge_flag);
+ }
+
+ // faces
+ //std::cout << "faces" << std::endl;
+ w.writeValue<DWORD>(indices.size());
+ if(indices.size()>0){
+ w.writeArray<WORD>(&indices[0], indices.size());
+ }
+
+ // materials
+ //std::cout << "materials" << std::endl;
+ w.writeValue<DWORD>(materials.size());
+ for(size_t i=0; i<materials.size(); ++i){
+ Material &m=*materials[i];
+ w.writeValue<float>(m.diffuse.r);
+ w.writeValue<float>(m.diffuse.g);
+ w.writeValue<float>(m.diffuse.b);
+ w.writeValue<float>(m.diffuse.a);
+ w.writeValue<float>(m.shinness);
+ w.writeValue<float>(m.specular.r);
+ w.writeValue<float>(m.specular.g);
+ w.writeValue<float>(m.specular.b);
+ w.writeValue<float>(m.ambient.r);
+ w.writeValue<float>(m.ambient.g);
+ w.writeValue<float>(m.ambient.b);
+ w.writeValue<BYTE>(m.toon_index);
+ w.writeValue<BYTE>(m.flag);
+ w.writeValue<DWORD>(m.vertex_count);
+ w.writeArray<char>(m.texture, 20);
+ }
+
+ // bones
+ //std::cout << "bones" << std::endl;
+ w.writeValue<WORD>(bones.size());
+ for(size_t i=0; i<bones.size(); ++i){
+ Bone &b=bones[i];
+ w.writeArray<char>(b.name, 20);
+ w.writeValue<WORD>(b.parent_index);
+ w.writeValue<WORD>(b.tail_index);
+ w.writeValue<BYTE>(b.type);
+ w.writeValue<WORD>(b.ik_index);
+ w.writeValue<float>(b.pos.x);
+ w.writeValue<float>(b.pos.y);
+ w.writeValue<float>(b.pos.z);
+ }
+
+ // ik
+ //std::cout << "ik" << std::endl;
+ w.writeValue<WORD>(ik_list.size());
+ for(size_t i=0; i<ik_list.size(); ++i){
+ IK &ik=ik_list[i];
+ w.writeValue<WORD>(ik.index);
+ w.writeValue<WORD>(ik.target);
+ w.writeValue<BYTE>(ik.length);
+ w.writeValue<WORD>(ik.iterations);
+ w.writeValue<float>(ik.weight);
+ WORD parent_index=bones[ik.target].parent_index;
+ for(size_t j=0; j<ik.length;
+ ++j, parent_index=bones[parent_index].parent_index){
+ w.writeValue<WORD>(parent_index);
+ }
+ }
+
+ // morph
+ //std::cout << "morph" << std::endl;
+ w.writeValue<WORD>(morph_list.size());
+ for(size_t i=0; i<morph_list.size(); ++i){
+ Morph &m=morph_list[i];
+ w.writeArray<char>(m.name, 20);
+ w.writeValue<DWORD>(m.indices.size());
+ w.writeValue<BYTE>(m.type);
+ for(size_t j=0; j<m.indices.size(); ++j){
+ w.writeValue<DWORD>(m.indices[j]);
+ Vector3 &pos=m.pos_list[j];
+ w.writeValue<float>(pos.x);
+ w.writeValue<float>(pos.y);
+ w.writeValue<float>(pos.z);
+ }
+ }
+
+ // face list
+ //std::cout << "face list" << std::endl;
+ w.writeValue<BYTE>(face_list.size());
+ if(face_list.size()>0){
+ w.writeArray<WORD>(&face_list[0], face_list.size());
+ }
+
+ // bone name list
+ //std::cout << "bone name list" << std::endl;
+ w.writeValue<BYTE>(bone_group_list.size());
+ for(size_t i=0; i<bone_group_list.size(); ++i){
+ // 50bytes
+ w.writeArray<char>(bone_group_list[i].name, 50);
+ }
+
+ // bone list
+ //std::cout << "bone list" << std::endl;
+ w.writeValue<DWORD>(bone_display_list.size());
+ for(size_t i=0; i<bone_display_list.size(); ++i){
+ w.writeValue<WORD>(bone_display_list[i].first);
+ w.writeValue<BYTE>(bone_display_list[i].second);
+ }