OSDN Git Service

pmd. sort material order.
[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 };
109 inline std::ostream &operator<<(std::ostream &os,
110                 const Material &rhs)
111 {
112         os
113                 << "[Material"
114                 << " diffuse:" << rhs.diffuse
115                 << " toon_index:" << (int)rhs.toon_index
116                 << " flag:" << (int)rhs.flag
117                 << " vertex_count:" << rhs.vertex_count
118                 << " texture:" << rhs.texture
119                 << "]"
120                 ;
121         return os;
122 }
123
124 ////////////////////////////////////////////////////////////
125 //! \83{\81[\83\93 
126 ////////////////////////////////////////////////////////////
127 //! \83{\81[\83\93\82Ì\8eí\97Þ
128 enum BONE_TYPE
129 {
130         // \89ñ\93]
131         BONE_ROTATE=0,
132         // \89ñ\93]\82Æ\88Ú\93®
133         BONE_ROTATE_MOVE,
134         // IK
135         BONE_IK,
136         // \95s\96¾
137         BONE_UNKNOWN,
138         // IK\89e\8b¿\89º
139         BONE_IK_INFLUENCED,
140         // \89ñ\93]\89e\8b¿\89º
141         BONE_ROTATE_INFLUENCED,
142         // IK\90Ú\91±\90æ
143         BONE_IK_CONNECT,
144         // \94ñ\95\\8e¦
145         BONE_INVISIBLE,
146         // \94P\82è
147         BONE_TWIST,
148         // \89ñ\93]\98A\93®
149         BONE_REVOLVE,
150 };
151 struct Bone
152 {
153         //! \96¼\91O
154         char name[20];
155         //! \90e\83{\81[\83\93
156         unsigned short parent_index;
157         //! \8eq\83{\81[\83\93
158         unsigned short tail_index;
159         //! \83{\81[\83\93\8eí\97Þ
160         BONE_TYPE type;
161         //! \89e\8b¿IK\83{\81[\83\93
162         unsigned short ik_index;
163         // \83{\81[\83\93\8dÀ\95W
164         Vector3 pos;
165         //! \89p\8cê\96¼
166         char english_name[20];
167         //! \83{\81[\83\93\8aK\91w\8d\\92z\97p
168         Bone* parent;
169         Vector3 tail;
170         std::vector<Bone*> children;
171         unsigned short index;
172
173         Bone()
174                 : parent(0)
175                 {}
176         std::wstring getName()const;
177         void setName(const char *src);
178 };
179 inline std::ostream &operator<<(std::ostream &os,
180                 const Bone &rhs)
181 {
182         os
183                 << "[Bone "
184                 << '"' << rhs.name << '"'
185                 << "]"
186                 ;
187         return os;
188 }
189
190 ////////////////////////////////////////////////////////////
191 //! IK
192 ////////////////////////////////////////////////////////////
193 struct IK
194 {
195         //! IK(IK\83^\81[\83Q\83b\83g)
196         unsigned short index;
197         //! Target(\83G\83t\83F\83N\83^\81[)
198         unsigned short target;
199         //! \83G\83t\83F\83N\83^\82É\98A\93®\82·\82é\83{\81[\83\93\90\94
200         unsigned char length;
201         //! IK\92l1\81BCCD-IK\8e\8e\8ds\89ñ\90\94
202         unsigned short iterations;
203         //! IK\92l2\81BCCD-IK\8e\8e\8ds\88ê\89ñ\95Ó\82è\82Ì\89e\8b¿\93x
204         float weight;
205         //! \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é)
206         std::vector<unsigned short> children;
207 };
208 inline std::ostream &operator<<(std::ostream &os, const IK &rhs)
209 {
210         os
211                 << "[IK "
212                 << "]"
213                 ;
214         return os;
215 }
216
217 ////////////////////////////////////////////////////////////
218 //! \95\\8fî
219 ////////////////////////////////////////////////////////////
220 //! \95\\8fî\82Ì\8eí\97Þ
221 enum MORPH_TYPE
222 {
223         //! \83x\81[\83X\95\\8fî
224         MORPH_BASE=0,
225         //! \82Ü\82ä
226         MORPH_MAYU,
227         //! \96Ú
228         MORPH_ME,
229         //! \83\8a\83b\83v
230         MORPH_LIP,
231         //! \82»\82Ì\91¼
232         MORPH_OTHER,
233 };
234 struct Morph
235 {
236         //! \95\\8fî\96¼
237         char name[20];
238         //! \8eg\97p\82·\82é\92¸\93_\90\94
239         unsigned int vertex_count;
240         //! \95ª\97Þ
241         unsigned char type;
242         //! \92¸\93_Index
243         std::vector<unsigned int> indices;
244         //! \88Ú\93®\97Ê
245         std::vector<Vector3> pos_list;
246         //! \89p\8cê\96¼
247         char english_name[20];
248
249         void append(int index, float x, float y, float z);
250         std::wstring getName()const;
251         void setName(const char *src);
252         void setEnglishName(const char *src);
253 };
254 inline std::ostream &operator<<(std::ostream &os, const Morph &rhs)
255 {
256         os
257                 << "[Morph "
258                 << '"' << rhs.name << '"'
259                 << "]"
260                 ;
261         return os;
262 }
263
264 ////////////////////////////////////////////////////////////
265 //! \83{\81[\83\93\95\\8e¦\98g
266 ////////////////////////////////////////////////////////////
267 struct BoneDisplayName
268 {
269         char name[50];
270         char english_name[50];
271
272         void setName(const char *src);
273         void setEnglishName(const char *src);
274 };
275
276 ////////////////////////////////////////////////////////////
277 //! \83g\83D\81[\83\93\83e\83N\83X\83`\83\83
278 ////////////////////////////////////////////////////////////
279 struct ToonTexture
280 {
281         char name[100];
282 };
283
284 ////////////////////////////////////////////////////////////
285 //! \8d\84\91Ì
286 ////////////////////////////////////////////////////////////
287 //! \8c`\8fó
288 enum SHAPE_TYPE
289 {
290         //! \8b\85
291         SHAPE_SPHERE=0,
292         //! \94 
293         SHAPE_BOX,
294         //! \83J\83v\83Z\83\8b
295         SHAPE_CAPSULE,
296 };
297 //! \8d\84\91Ì\83^\83C\83v
298 enum PROCESS_TYPE
299 {
300         //! \83{\81[\83\93\82Æ\93¯\82\93®\82«
301         RIGIDBODY_KINEMATICS=0,
302         //! \95¨\97\9d\89\89\8eZ
303         RIGIDBODY_PHYSICS,
304         //! \95¨\97\9d\89\89\8eZ\8c\8b\89Ê\82ð\83{\81[\83\93\82É\94½\89f\82·\82é
305         RIGIDBODY_PHYSICS_WITH_BONE,
306 };
307
308 struct RigidBody
309 {
310         //! \8d\84\91Ì\96¼
311         char name[20];
312         //! \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)
313         unsigned short boneIndex;
314         //! \83O\83\8b\81[\83v
315         unsigned char group;
316         //! \94ñ\8fÕ\93Ë\83O\83\8b\81[\83v
317         unsigned short target;
318         //! \8c`\8fó
319         SHAPE_TYPE shapeType;
320         //! \83T\83C\83Y
321         float w;
322         float h;
323         float d;
324         //! \8ep\90¨
325         Vector3 position;
326         Vector3 rotation;
327         //! \8e¿\97Ê
328         float weight;
329         //! \95¨\97\9d\89\89\8eZ\83p\83\89\83\81\81[\83^(bullet)
330         float linearDamping;
331         float angularDamping;
332         float restitution;
333         float friction;
334         //! \8d\84\91Ì\83^\83C\83v
335         PROCESS_TYPE processType;
336
337         std::wstring getName()const;
338         void setName(const char *src);
339 };
340
341 //! Joint(\95¨\97\9d\89\89\8eZ\82Å\82ÌJoint\82ÆConstraint\82Í\93¯\82\88Ó\96¡)
342 struct Constraint
343 {
344         //! Joint\96¼
345         char name[20];
346         //! \90Ú\91±\8d\84\91ÌA
347         unsigned int rigidA;
348         //! \90Ú\91±\8d\84\91ÌB
349         unsigned int rigidB;
350         //! \88Ê\92u
351         Vector3 pos;
352         //! \89ñ\93]
353         Vector3 rot;
354         //! \88Ú\93®\90§\8cÀ
355         Vector3 constraintPosMin;
356         Vector3 constraintPosMax;
357         //! \89ñ\93]\90§\8cÀ
358         Vector3 constraintRotMin;
359         Vector3 constraintRotMax;
360         //! \82Î\82Ë
361         Vector3 springPos;
362         Vector3 springRot;
363
364         std::wstring getName()const;
365         void setName(const char *src);
366 };
367
368
369 ///////////////////////////////////////////////////////////////////////////////
370 // IO
371 ///////////////////////////////////////////////////////////////////////////////
372 struct IO
373 {
374         float version;
375         char name[20];
376         char comment[256];
377         std::vector<Vertex> vertices;
378         std::vector<unsigned short> indices;
379         std::vector<Material*> materials;
380         std::vector<Bone> bones;
381         std::vector<IK> ik_list;
382         std::vector<Morph> morph_list;
383         std::vector<unsigned short> face_list;
384         std::vector<BoneDisplayName> bone_display_name_list;
385         std::vector<std::pair<unsigned short, unsigned char> > bone_display_list;
386         ToonTexture toon_textures[10];
387         std::vector<RigidBody> rigidbodies;
388         std::vector<Constraint> constraints;
389
390         char english_name[20];
391         char english_comment[256];
392
393         IO();
394         ~IO();
395         bool read(binary::IReader &reader);
396         //bool read(const char *path);
397         bool read(const wchar_t *path);
398         bool write(binary::IWriter &writer);
399         bool write(const char *path);
400         bool write(const wchar_t *path);
401
402         const Vector2* getUV(int index)const;
403         std::wstring getName()const;
404         std::wstring getEnglishName()const;
405 };
406 inline std::ostream &operator<<(std::ostream &os, const IO &rhs)
407 {
408         os
409                 << "<PMD " << rhs.name << std::endl
410                 << rhs.comment << std::endl
411                 << "[vertices] " << rhs.vertices.size() << std::endl
412                 << "[indices] " << rhs.indices.size() << std::endl
413                 << "[materials] " << rhs.materials.size() << std::endl
414                 ;
415         /*
416         std::copy(rhs.materials.begin(), rhs.materials.end(), 
417                         std::ostream_iterator<Material>(os, ""));
418
419         os
420                 << "[bones] " << rhs.bones.size() << std::endl
421                 ;
422         std::copy(rhs.bones.begin(), rhs.bones.end(), 
423                         std::ostream_iterator<Bone>(os, ""));
424
425         os
426                 << "[ik] " << rhs.ik_list.size() << std::endl
427                 ;
428         std::copy(rhs.ik_list.begin(), rhs.ik_list.end(), 
429                         std::ostream_iterator<IK>(os, ""));
430
431         os
432                 << "[morph] " << rhs.morph_list.size() << std::endl
433                 ;
434         std::copy(rhs.morph_list.begin(), rhs.morph_list.end(), 
435                         std::ostream_iterator<Morph>(os, ""));
436                         */
437
438         os
439                 << ">" << std::endl
440                 ;
441         return os;
442 }
443
444
445 } // namespace pmd
446 } // namespace meshio
447
448 #endif // MESH_IO_PMD_H_INCLUDED