OSDN Git Service

fix 2.4.
[meshio/meshio.git] / include / pmd.h
1 /**
2  * PMD\8c`\8e®
3  * MMD\82Ì\83\82\83f\83\8b\83f\81[\83^\81B\83o\83C\83i\83\8a\8c`\8e®\82Å\82Ð\82Æ\82Â\82Ì\92¸\93_\82ª\8dÅ\91å\82Q\82Â\82Ü\82Å\82Ì\83{\81[\83\93\82Ì
4  * \83E\83F\83C\83g\82ð\95Û\8e\9d\82·\82é\92P\88ê\82Ì\92¸\93_\94z\97ñ\82Æ\92¸\93_\83C\83\93\83f\83b\83N\83X\94z\97ñ\82ð\82à\82Â\81B\96Ê\82Í
5  * \8eO\8ap\8c`\82Ì\82Ý\81B
6  * \82Ü\82½\95\\8fî\83\82\81[\83t\83B\83\93\83O\8fî\95ñ\81A\95¨\97\9d\89\89\8eZ\8cü\82¯\82Ì\8d\84\91Ì\8fî\95ñ\82Æ\8dS\91©\8fî\95ñ\82È\82Ç\82ð\82à\82Â\81B
7  *
8  * \8dÀ\95W\8cn
9  * \8d\8eè Y-UP
10  *
11  * \95\
12  * clock wise ?
13  *
14  * UV\8c´\93_
15  * left top ?
16  *
17  * \96@\90ü
18  * \92¸\93_\96@\90ü\82ª\8ai\94[\8dÏ\82Ý\81B
19  *
20  * \83\81\83b\83V\83\85
21  * \8dÅ\91å\92¸\93_\90\94
22  * \8dÅ\91å\8eO\8ap\8c`\90\94
23  *
24  * \97 \96Ê\82Ì\88µ\82¢
25  * \83I\83\8a\83W\83i\83\8b\82Å\82Í\83o\83b\83N\83J\83\8a\83\93\83O\82ð\82µ\82Ä\82¢\82È\82¢\82Ì\82Å\82â\82é\8fê\8d\87\82Í\83\82\83f\83\8b\8cÂ\95Ê\82É
26  * \91Î\89\9e\82ª\95K\97v\81B
27  *
28  * \8eQ\8dl\83T\83C\83g
29  * http://blog.goo.ne.jp/torisu_tetosuki/e/209ad341d3ece2b1b4df24abf619d6e4
30  */
31
32 #ifndef MESH_IO_PMD_H_INCLUDED
33 #define MESH_IO_PMD_H_INCLUDED 
34
35 #include <ostream>
36 #include <vector>
37 #include "la.h"
38 #include "text.h"
39
40 namespace meshio {
41 namespace pmd {
42
43 typedef ::meshio::la::Vector2 Vector2;
44 typedef ::meshio::la::Vector3 Vector3;
45 typedef ::meshio::la::Vector4 Vector4;
46 typedef ::meshio::color::fRGBA fRGBA;
47 typedef ::meshio::color::fRGB fRGB;
48
49 ////////////////////////////////////////////////////////////
50 //! \92¸\93_
51 ////////////////////////////////////////////////////////////
52 struct Vertex
53 {
54         //! \8dÀ\95W
55         Vector3 pos;
56         //! \96@\90ü\83x\83N\83g\83\8b
57         Vector3 normal;
58         //! \83e\83N\83X\83`\83\83UV
59         Vector2 uv;
60         //! \83u\83\8c\83\93\83f\83B\83\93\83O\83{\81[\83\931
61         unsigned short bone0;
62         //! \83u\83\8c\83\93\83f\83B\83\93\83O\83{\81[\83\932
63         unsigned short bone1;
64         //! \83E\83F\83C\83g[0 - 100]
65         unsigned char weight0;
66         //! \94ñ\83G\83b\83W
67         unsigned char edge_flag;
68 };
69 inline std::ostream &operator<<(std::ostream &os, const Vertex &rhs)
70 {
71         os
72                 << "[Vertex"
73                 << " pos:" << rhs.pos
74                 << " normal:" << rhs.normal
75                 << " uv:" << rhs.uv
76                 << " bone0:" << rhs.bone0
77                 << " bone1:" << rhs.bone1
78                 << " weight0:" << (int)rhs.weight0
79                 << " edge_flag:" << (int)rhs.edge_flag
80                 << "]"
81                 ;
82         return os;
83 }
84
85 ////////////////////////////////////////////////////////////
86 //! \8dÞ\8e¿
87 ////////////////////////////////////////////////////////////
88 struct Material
89 {
90         //! Diffuse
91         fRGBA diffuse;
92         //! Shinness
93         float shinness;
94         //! Specular
95         fRGB specular;
96         //! Ambient
97         fRGB ambient;
98         //! \83g\83D\81[\83\93\83e\83N\83X\83`\83\83
99         unsigned char toon_index;
100         //! \97Ö\8as/\89e
101         unsigned char flag;
102         //! \96Ê\92¸\93_\90\94
103         unsigned int vertex_count;
104         //! \83e\83N\83X\83`\83\83
105         char texture[20];
106
107         std::wstring getTexture()const;
108         void setTexture(const char *src);
109 };
110 inline std::ostream &operator<<(std::ostream &os,
111                 const Material &rhs)
112 {
113         os
114                 << "[Material"
115                 << " diffuse:" << rhs.diffuse
116                 << " toon_index:" << (int)rhs.toon_index
117                 << " flag:" << (int)rhs.flag
118                 << " vertex_count:" << rhs.vertex_count
119                 << " texture:" << rhs.texture
120                 << "]"
121                 ;
122         return os;
123 }
124
125 ////////////////////////////////////////////////////////////
126 //! \83{\81[\83\93 
127 ////////////////////////////////////////////////////////////
128 //! \83{\81[\83\93\82Ì\8eí\97Þ
129 enum BONE_TYPE
130 {
131         // \89ñ\93]
132         BONE_ROTATE=0,
133         // \89ñ\93]\82Æ\88Ú\93®
134         BONE_ROTATE_MOVE,
135         // IK
136         BONE_IK,
137         // \95s\96¾
138         BONE_UNKNOWN,
139         // IK\89e\8b¿\89º
140         BONE_IK_INFLUENCED,
141         // \89ñ\93]\89e\8b¿\89º
142         BONE_ROTATE_INFLUENCED,
143         // IK\90Ú\91±\90æ
144         BONE_IK_CONNECT,
145         // \94ñ\95\\8e¦
146         BONE_INVISIBLE,
147         // \94P\82è
148         BONE_TWIST,
149         // \89ñ\93]\98A\93®
150         BONE_REVOLVE,
151 };
152 struct Bone
153 {
154         //! \96¼\91O
155         char name[20];
156         //! \90e\83{\81[\83\93
157         unsigned short parent_index;
158         //! \8eq\83{\81[\83\93
159         unsigned short tail_index;
160         //! \83{\81[\83\93\8eí\97Þ
161         BONE_TYPE type;
162         //! \89e\8b¿IK\83{\81[\83\93
163         unsigned short ik_index;
164         // \83{\81[\83\93\8dÀ\95W
165         Vector3 pos;
166         //! \89p\8cê\96¼
167         char english_name[20];
168         //! \83{\81[\83\93\8aK\91w\8d\\92z\97p
169         Bone* parent;
170         Vector3 tail;
171         std::vector<Bone*> children;
172         unsigned short index;
173
174         Bone()
175                 : parent(0)
176                 {}
177         std::wstring getName()const;
178         void setName(const char *src);
179         void setEnglishName(const char *src);
180 };
181 inline std::ostream &operator<<(std::ostream &os,
182                 const Bone &rhs)
183 {
184         os
185                 << "[Bone "
186                 << '"' << rhs.name << '"'
187                 << "]"
188                 ;
189         return os;
190 }
191
192 ////////////////////////////////////////////////////////////
193 //! IK
194 ////////////////////////////////////////////////////////////
195 struct IK
196 {
197         //! IK(IK\83^\81[\83Q\83b\83g)
198         unsigned short index;
199         //! Target(\83G\83t\83F\83N\83^\81[)
200         unsigned short target;
201         //! \83G\83t\83F\83N\83^\82É\98A\93®\82·\82é\83{\81[\83\93\90\94
202         unsigned char length;
203         //! IK\92l1\81BCCD-IK\8e\8e\8ds\89ñ\90\94
204         unsigned short iterations;
205         //! IK\92l2\81BCCD-IK\8e\8e\8ds\88ê\89ñ\95Ó\82è\82Ì\89e\8b¿\93x
206         float weight;
207         //! \83G\83t\83F\83N\83^\82É\98A\93®\82·\82é\83{\81[\83\93(\8aî\96{\93I\82É\90e\83{\81[\83\93\82É\91k\82é)
208         std::vector<unsigned short> children;
209 };
210 inline std::ostream &operator<<(std::ostream &os, const IK &rhs)
211 {
212         os
213                 << "[IK "
214                 << "]"
215                 ;
216         return os;
217 }
218
219 ////////////////////////////////////////////////////////////
220 //! \95\\8fî
221 ////////////////////////////////////////////////////////////
222 //! \95\\8fî\82Ì\8eí\97Þ
223 enum MORPH_TYPE
224 {
225         //! \83x\81[\83X\95\\8fî
226         MORPH_BASE=0,
227         //! \82Ü\82ä
228         MORPH_MAYU,
229         //! \96Ú
230         MORPH_ME,
231         //! \83\8a\83b\83v
232         MORPH_LIP,
233         //! \82»\82Ì\91¼
234         MORPH_OTHER,
235 };
236 struct Morph
237 {
238         //! \95\\8fî\96¼
239         char name[20];
240         //! \8eg\97p\82·\82é\92¸\93_\90\94
241         unsigned int vertex_count;
242         //! \95ª\97Þ
243         unsigned char type;
244         //! \92¸\93_Index
245         std::vector<unsigned int> indices;
246         //! \88Ú\93®\97Ê
247         std::vector<Vector3> pos_list;
248         //! \89p\8cê\96¼
249         char english_name[20];
250
251         void append(int index, float x, float y, float z);
252         std::wstring getName()const;
253         void setName(const char *src);
254         void setEnglishName(const char *src);
255 };
256 inline std::ostream &operator<<(std::ostream &os, const Morph &rhs)
257 {
258         os
259                 << "[Morph "
260                 << '"' << rhs.name << '"'
261                 << "]"
262                 ;
263         return os;
264 }
265
266 ////////////////////////////////////////////////////////////
267 //! \83{\81[\83\93\95\\8e¦\98g
268 ////////////////////////////////////////////////////////////
269 struct BoneGroup
270 {
271         char name[50];
272         char english_name[50];
273
274         void setName(const char *src);
275         void setEnglishName(const char *src);
276         std::wstring getName()const;
277 };
278
279 ////////////////////////////////////////////////////////////
280 //! \83g\83D\81[\83\93\83e\83N\83X\83`\83\83
281 ////////////////////////////////////////////////////////////
282 struct ToonTexture
283 {
284         char name[100];
285         std::wstring getName()const;
286         void setName(const char *src);
287 };
288
289 ////////////////////////////////////////////////////////////
290 //! \8d\84\91Ì
291 ////////////////////////////////////////////////////////////
292 //! \8c`\8fó
293 enum SHAPE_TYPE
294 {
295         //! \8b\85
296         SHAPE_SPHERE=0,
297         //! \94 
298         SHAPE_BOX,
299         //! \83J\83v\83Z\83\8b
300         SHAPE_CAPSULE,
301 };
302 //! \8d\84\91Ì\83^\83C\83v
303 enum PROCESS_TYPE
304 {
305         //! \83{\81[\83\93\82Æ\93¯\82\93®\82«
306         RIGIDBODY_KINEMATICS=0,
307         //! \95¨\97\9d\89\89\8eZ
308         RIGIDBODY_PHYSICS,
309         //! \95¨\97\9d\89\89\8eZ\8c\8b\89Ê\82ð\83{\81[\83\93\82É\94½\89f\82·\82é
310         RIGIDBODY_PHYSICS_WITH_BONE,
311 };
312
313 struct RigidBody
314 {
315         //! \8d\84\91Ì\96¼
316         char name[20];
317         //! \8aÖ\98A\83{\81[\83\93(\83{\81[\83\93\92Ç\8f]\82Æ\83{\81[\83\93\88Ê\92u\8d\87\82í\82¹\82Å\95K\97v)
318         unsigned short boneIndex;
319         //! \83O\83\8b\81[\83v
320         unsigned char group;
321         //! \94ñ\8fÕ\93Ë\83O\83\8b\81[\83v
322         unsigned short target;
323         //! \8c`\8fó
324         SHAPE_TYPE shapeType;
325         //! \83T\83C\83Y
326         float w;
327         float h;
328         float d;
329         //! \8ep\90¨
330         Vector3 position;
331         Vector3 rotation;
332         //! \8e¿\97Ê
333         float weight;
334         //! \95¨\97\9d\89\89\8eZ\83p\83\89\83\81\81[\83^(bullet)
335         float linearDamping;
336         float angularDamping;
337         float restitution;
338         float friction;
339         //! \8d\84\91Ì\83^\83C\83v
340         PROCESS_TYPE processType;
341
342         std::wstring getName()const;
343         void setName(const char *src);
344 };
345
346 //! Joint(\95¨\97\9d\89\89\8eZ\82Å\82ÌJoint\82ÆConstraint\82Í\93¯\82\88Ó\96¡)
347 struct Constraint
348 {
349         //! Joint\96¼
350         char name[20];
351         //! \90Ú\91±\8d\84\91ÌA
352         unsigned int rigidA;
353         //! \90Ú\91±\8d\84\91ÌB
354         unsigned int rigidB;
355         //! \88Ê\92u
356         Vector3 pos;
357         //! \89ñ\93]
358         Vector3 rot;
359         //! \88Ú\93®\90§\8cÀ
360         Vector3 constraintPosMin;
361         Vector3 constraintPosMax;
362         //! \89ñ\93]\90§\8cÀ
363         Vector3 constraintRotMin;
364         Vector3 constraintRotMax;
365         //! \82Î\82Ë
366         Vector3 springPos;
367         Vector3 springRot;
368
369         std::wstring getName()const;
370         void setName(const char *src);
371 };
372
373
374 ///////////////////////////////////////////////////////////////////////////////
375 // IO
376 ///////////////////////////////////////////////////////////////////////////////
377 struct IO
378 {
379         float version;
380         char name[20];
381         char comment[256];
382         std::vector<Vertex> vertices;
383         std::vector<unsigned short> indices;
384         std::vector<Material*> materials;
385         std::vector<Bone> bones;
386         std::vector<IK> ik_list;
387         std::vector<Morph> morph_list;
388         std::vector<unsigned short> face_list;
389         std::vector<BoneGroup> bone_group_list;
390         std::vector<std::pair<unsigned short, unsigned char> > bone_display_list;
391         ToonTexture toon_textures[10];
392         std::vector<RigidBody> rigidbodies;
393         std::vector<Constraint> constraints;
394
395         char english_name[20];
396         char english_comment[256];
397
398         IO();
399         ~IO();
400         bool read(binary::IReader &reader);
401         //bool read(const char *path);
402         bool read(const wchar_t *path);
403         bool write(binary::IWriter &writer);
404         bool write(const char *path);
405         bool write(const wchar_t *path);
406
407         const Vector2* getUV(int index)const;
408         std::wstring getName()const;
409         std::wstring getEnglishName()const;
410 };
411 inline std::ostream &operator<<(std::ostream &os, const IO &rhs)
412 {
413         os
414                 << "<PMD " << rhs.name << std::endl
415                 << rhs.comment << std::endl
416                 << "[vertices] " << rhs.vertices.size() << std::endl
417                 << "[indices] " << rhs.indices.size() << std::endl
418                 << "[materials] " << rhs.materials.size() << std::endl
419                 ;
420         /*
421         std::copy(rhs.materials.begin(), rhs.materials.end(), 
422                         std::ostream_iterator<Material>(os, ""));
423
424         os
425                 << "[bones] " << rhs.bones.size() << std::endl
426                 ;
427         std::copy(rhs.bones.begin(), rhs.bones.end(), 
428                         std::ostream_iterator<Bone>(os, ""));
429
430         os
431                 << "[ik] " << rhs.ik_list.size() << std::endl
432                 ;
433         std::copy(rhs.ik_list.begin(), rhs.ik_list.end(), 
434                         std::ostream_iterator<IK>(os, ""));
435
436         os
437                 << "[morph] " << rhs.morph_list.size() << std::endl
438                 ;
439         std::copy(rhs.morph_list.begin(), rhs.morph_list.end(), 
440                         std::ostream_iterator<Morph>(os, ""));
441                         */
442
443         os
444                 << ">" << std::endl
445                 ;
446         return os;
447 }
448
449
450 } // namespace pmd
451 } // namespace meshio
452
453 #endif // MESH_IO_PMD_H_INCLUDED