1 /**********************************************************************
2  *
3  * MilkShape 3D Model Import/Export API
4  *
5  * Jan 27 2007, Mete Ciragan, chUmbaLum sOft
6  *
7  **********************************************************************/
8 
9 #ifndef __MSLIB_H__
10 #define __MSLIB_H__
11 
12 
13 
14 #ifdef MSLIB_EXPORTS
15 #define MSLIB_API __declspec(dllexport)
16 #else
17 #define MSLIB_API __declspec(dllimport)
18 #endif /* MSLIB_EXPORTS */
19 
20 
21 
22 #ifdef WIN32
23 #include <pshpack1.h>
24 #endif /* WIN32 */
25 
26 
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif /* __cplusplus */
31 
32 
33 
34 /**********************************************************************
35  *
36  * Constants
37  *
38  **********************************************************************/
39 
40 #define MS_MAX_NAME             32
41 #define MS_MAX_PATH             256
42 
43 #define MAX_VERTICES	65534
44 #define MAX_TRIANGLES	65534
45 #define MAX_GROUPS		255
46 #define MAX_MATERIALS	128
47 #define MAX_JOINTS		128
48 
49 
50 
51 /**********************************************************************
52  *
53  * Types
54  *
55  **********************************************************************/
56 
57 #ifndef byte
58 typedef unsigned char byte;
59 #endif /* byte */
60 
61 #ifndef word
62 typedef unsigned short word;
63 #endif /* word */
64 
65 typedef float   msVec4[4];
66 typedef float   msVec3[3];
67 typedef float   msVec2[2];
68 
69 /* msFlag */
70 typedef enum {
71     eSelected = 1, eSelected2 = 2, eHidden = 4, eDirty = 8, eAveraged = 16, eKeepVertex = 32, eSphereMap = 0x80, eHasAlpha = 0x40
72 } msFlag;
73 
74 
75 
76 /*
77 !!!
78 !!! Do not use direct structs access like vertex->nFlags. Use msVertex_GetFlags(vertex) instead. This makes sure,
79 !!! that your plugin stays compatible with future versions of MilkShape 3D.
80 !!!
81 */
82 
83 
84 
85 /* msVertex: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
86 typedef struct msVertex
87 {
88     byte        nFlags;
89     msVec3      Vertex;
90     float       u, v;
91     char        nBoneIndex;
92 } msVertex;
93 
94 /* msVertexEx: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
95 typedef struct msVertexEx
96 {
97 	char		nBoneIndices[3];
98 	byte		nBoneWeights[3];
99 	unsigned int nExtra;
100 } msVertexEx;
101 
102 /* msTriangle: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
103 typedef struct msTriangle
104 {
105     word        nFlags;
106     word        nVertexIndices[3];
107     word        nNormalIndices[3];
108     msVec3      Normal;
109     byte        nSmoothingGroup;
110 } msTriangle;
111 
112 /* msTriangleEx: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
113 typedef struct msTriangleEx
114 {
115 	msVec3		Normals[3];
116 	msVec2		TexCoords[3];
117 } msTriangleEx;
118 
119 /* msMesh: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
120 typedef struct msMesh
121 {
122     byte        nFlags;
123     char        szName[MS_MAX_NAME];
124     char        nMaterialIndex;
125 
126     word        nNumVertices;
127     word        nNumAllocedVertices;
128     msVertex*   pVertices;
129 
130     word        nNumNormals;
131     word        nNumAllocedNormals;
132     msVec3*     pNormals;
133 
134     word        nNumTriangles;
135     word        nNumAllocedTriangles;
136     msTriangle* pTriangles;
137 
138 	char*       pszComment;
139 	msVertexEx *pVertexExs;
140 	msTriangleEx *pTriangleExs;
141 } msMesh;
142 
143 /* msMaterial: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
144 typedef struct msMaterial
145 {
146     int         nFlags;
147     char        szName[MS_MAX_NAME];
148     msVec4      Ambient;
149     msVec4      Diffuse;
150     msVec4      Specular;
151     msVec4      Emissive;
152     float       fShininess;
153     float       fTransparency;
154     char        szDiffuseTexture[MS_MAX_PATH];
155     char        szAlphaTexture[MS_MAX_PATH];
156     int         nName;
157 	char*       pszComment;
158 } msMaterial;
159 
160 /* msPositionKey */
161 typedef struct msPositionKey
162 {
163     float       fTime;
164     msVec3      Position;
165 } msPositionKey;
166 
167 /* msRotationKey */
168 typedef struct msRotationKey
169 {
170     float   fTime;
171     msVec3  Rotation;
172 } msRotationKey;
173 
174 /* msBone: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
175 typedef struct msBone
176 {
177     int             nFlags;
178     char            szName[MS_MAX_NAME];
179     char            szParentName[MS_MAX_NAME];
180     msVec3          Position;
181     msVec3          Rotation;
182 
183     int             nNumPositionKeys;
184     int             nNumAllocedPositionKeys;
185     msPositionKey*  pPositionKeys;
186 
187     int             nNumRotationKeys;
188     int             nNumAllocedRotationKeys;
189     msRotationKey*  pRotationKeys;
190 	char*			pszComment;
191 } msBone;
192 
193 /* msModel: used internally only, DO NOT USE DIRECTLY, USE API INSTEAD */
194 typedef struct msModel
195 {
196     int         nNumMeshes;
197     int         nNumAllocedMeshes;
198     msMesh*     pMeshes;
199 
200     int         nNumMaterials;
201     int         nNumAllocedMaterials;
202     msMaterial* pMaterials;
203 
204     int         nNumBones;
205     int         nNumAllocedBones;
206     msBone*     pBones;
207 
208     int         nFrame;
209     int         nTotalFrames;
210 
211     msVec3      Position;
212     msVec3      Rotation;
213 
214 	msVec3		CameraPosition;
215 	msVec2		CameraRotationXY;
216 
217 	char*       pszComment;
218 } msModel;
219 
220 
221 
222 /**********************************************************************
223  *
224  * MilkShape 3D Interface
225  *
226  **********************************************************************/
227 
228 /**********************************************************************
229  * msModel
230  **********************************************************************/
231 
232 MSLIB_API void          msModel_Destroy (msModel *pModel);
233 
234 MSLIB_API int           msModel_GetMeshCount (msModel *pModel);
235 MSLIB_API int           msModel_AddMesh (msModel *pModel);
236 MSLIB_API msMesh*       msModel_GetMeshAt (msModel *pModel, int nIndex);
237 MSLIB_API int           msModel_FindMeshByName (msModel *pModel, const char *szName);
238 
239 MSLIB_API int           msModel_GetMaterialCount (msModel *pModel);
240 MSLIB_API int           msModel_AddMaterial (msModel *pModel);
241 MSLIB_API msMaterial*   msModel_GetMaterialAt (msModel *pModel, int nIndex);
242 MSLIB_API int           msModel_FindMaterialByName (msModel *pModel, const char *szName);
243 
244 MSLIB_API int           msModel_GetBoneCount (msModel *pModel);
245 MSLIB_API int           msModel_AddBone (msModel *pModel);
246 MSLIB_API msBone*       msModel_GetBoneAt (msModel *pModel, int nIndex);
247 MSLIB_API int           msModel_FindBoneByName (msModel *pModel, const char *szName);
248 
249 MSLIB_API int           msModel_SetFrame (msModel *pModel, int nFrame);
250 MSLIB_API int           msModel_GetFrame (msModel *pModel);
251 MSLIB_API int           msModel_SetTotalFrames (msModel *pModel, int nTotalFrames);
252 MSLIB_API int           msModel_GetTotalFrames (msModel *pModel);
253 MSLIB_API void          msModel_SetPosition (msModel *pModel, msVec3 Position);
254 MSLIB_API void          msModel_GetPosition (msModel *pModel, msVec3 Position);
255 MSLIB_API void          msModel_SetRotation (msModel *pModel, msVec3 Rotation);
256 MSLIB_API void          msModel_GetRotation (msModel *pModel, msVec3 Rotation);
257 MSLIB_API void          msModel_SetCamera (msModel *pModel, msVec3 Position, msVec2 RotationXY);
258 MSLIB_API void          msModel_GetCamera (msModel *pModel, msVec3 Position, msVec2 RotationXY);
259 MSLIB_API void          msModel_SetComment (msModel *pModel, const char *pszComment);
260 MSLIB_API int           msModel_GetComment (msModel *pModel, char *pszComment, int nMaxCommentLength);
261 
262 /**********************************************************************
263  * msMesh
264  **********************************************************************/
265 
266 MSLIB_API void          msMesh_Destroy (msMesh *pMesh);
267 MSLIB_API void          msMesh_SetFlags (msMesh *pMesh, byte nFlags);
268 MSLIB_API byte          msMesh_GetFlags (msMesh *pMesh);
269 MSLIB_API void          msMesh_SetName (msMesh *pMesh, const char *szName);
270 MSLIB_API void          msMesh_GetName (msMesh *pMesh, char *szName, int nMaxLength);
271 MSLIB_API void          msMesh_SetMaterialIndex (msMesh *pMesh, int nIndex);
272 MSLIB_API int           msMesh_GetMaterialIndex (msMesh *pMesh);
273 
274 MSLIB_API int           msMesh_GetVertexCount (msMesh *pMesh);
275 MSLIB_API int           msMesh_AddVertex (msMesh *pMesh);
276 MSLIB_API msVertex*     msMesh_GetVertexAt (msMesh *pMesh, int nIndex);
277 MSLIB_API msVertexEx*   msMesh_GetVertexExAt (msMesh *pMesh, int nIndex);
278 MSLIB_API msVertex*     msMesh_GetInterpolatedVertexAt (msMesh *pMesh, int nIndex); // NOT YET IMPLEMENTED
279 
280 MSLIB_API int           msMesh_GetTriangleCount (msMesh *pMesh);
281 MSLIB_API int           msMesh_AddTriangle (msMesh *pMesh);
282 MSLIB_API msTriangle*   msMesh_GetTriangleAt (msMesh *pMesh, int nIndex);
283 MSLIB_API msTriangleEx* msMesh_GetTriangleExAt (msMesh *pMesh, int nIndex);
284 
285 MSLIB_API int           msMesh_GetVertexNormalCount (msMesh *pMesh);
286 MSLIB_API int           msMesh_AddVertexNormal (msMesh *pMesh);
287 MSLIB_API void          msMesh_SetVertexNormalAt (msMesh *pMesh, int nIndex, msVec3 Normal);
288 MSLIB_API void          msMesh_GetVertexNormalAt (msMesh *pMesh, int nIndex, msVec3 Normal);
289 MSLIB_API void          msMesh_GetInterpolatedVertexNormalAt (msMesh *pMesh, int nIndex, msVec3 Normal); // NOT YET IMPLEMENTED
290 MSLIB_API void          msMesh_SetComment (msMesh *pMesh, const char *pszComment);
291 MSLIB_API int           msMesh_GetComment (msMesh *pMesh, char *pszComment, int nMaxCommentLength);
292 
293 /**********************************************************************
294  * msTriangle
295  **********************************************************************/
296 
297 MSLIB_API void          msTriangle_SetFlags (msTriangle* pTriangle, word nFlags);
298 MSLIB_API word          msTriangle_GetFlags (msTriangle* pTriangle);
299 MSLIB_API void          msTriangle_SetVertexIndices (msTriangle *pTriangle, word nIndices[]);
300 MSLIB_API void          msTriangle_GetVertexIndices (msTriangle *pTriangle, word nIndices[]);
301 MSLIB_API void          msTriangle_SetNormalIndices (msTriangle *pTriangle, word nNormalIndices[]);
302 MSLIB_API void          msTriangle_GetNormalIndices (msTriangle *pTriangle, word nNormalIndices[]);
303 MSLIB_API void          msTriangle_SetSmoothingGroup (msTriangle *pTriangle, byte nSmoothingGroup);
304 MSLIB_API byte          msTriangle_GetSmoothingGroup (msTriangle *pTriangle);
305 
306 /**********************************************************************
307  * msTriangleEx
308  **********************************************************************/
309 MSLIB_API void          msTriangleEx_SetNormal (msTriangleEx *pTriangle, int nIndex, msVec3 Normal);
310 MSLIB_API void          msTriangleEx_GetNormal (msTriangleEx *pTriangle, int nIndex, msVec3 Normal);
311 MSLIB_API void          msTriangleEx_SetTexCoord (msTriangleEx *pTriangle, int nIndex, msVec2 TexCoord);
312 MSLIB_API void          msTriangleEx_GetTexCoord (msTriangleEx *pTriangle, int nIndex, msVec2 TexCoord);
313 
314 /**********************************************************************
315  * msVertex
316  **********************************************************************/
317 
318 MSLIB_API void          msVertex_SetFlags (msVertex* pVertex, byte nFlags);
319 MSLIB_API byte          msVertex_GetFlags (msVertex* pVertex);
320 MSLIB_API void          msVertex_SetVertex (msVertex* pVertex, msVec3 Vertex);
321 MSLIB_API void          msVertex_GetVertex (msVertex* pVertex, msVec3 Vertex);
322 MSLIB_API void          msVertex_SetTexCoords (msVertex* pVertex, msVec2 st);
323 MSLIB_API void          msVertex_GetTexCoords (msVertex* pVertex, msVec2 st);
324 MSLIB_API int           msVertex_SetBoneIndex (msVertex* pVertex, int nBoneIndex);
325 MSLIB_API int           msVertex_GetBoneIndex (msVertex* pVertex);
326 
327 /**********************************************************************
328  * msVertexEx
329  **********************************************************************/
330 
331 MSLIB_API int           msVertexEx_SetBoneIndices (msVertexEx* pVertex, int nIndex, int nBoneIndex);
332 MSLIB_API int           msVertexEx_GetBoneIndices (msVertexEx* pVertex, int nIndex);
333 MSLIB_API int           msVertexEx_SetBoneWeights (msVertexEx* pVertex, int nIndex, int nWeight);
334 MSLIB_API int           msVertexEx_GetBoneWeights (msVertexEx* pVertex, int nIndex);
335 MSLIB_API unsigned int  msVertexEx_SetExtra (msVertexEx* pVertex, int nIndex, unsigned int nExtra);
336 MSLIB_API unsigned int  msVertexEx_GetExtra (msVertexEx* pVertex, int nIndex);
337 
338 /**********************************************************************
339  * msMaterial
340  **********************************************************************/
341 
342 MSLIB_API void          msMaterial_SetFlags (msMaterial *pMaterial, int nFlags);
343 MSLIB_API int           msMaterial_GetFlags (msMaterial *pMaterial);
344 MSLIB_API void          msMaterial_SetName (msMaterial *pMaterial, const char *szName);
345 MSLIB_API void          msMaterial_GetName (msMaterial *pMaterial, char *szName, int nMaxLength);
346 MSLIB_API void          msMaterial_SetAmbient (msMaterial *pMaterial, msVec4 Ambient);
347 MSLIB_API void          msMaterial_GetAmbient (msMaterial *pMaterial, msVec4 Ambient);
348 MSLIB_API void          msMaterial_SetDiffuse (msMaterial *pMaterial, msVec4 Diffuse);
349 MSLIB_API void          msMaterial_GetDiffuse (msMaterial *pMaterial, msVec4 Diffuse);
350 MSLIB_API void          msMaterial_SetSpecular (msMaterial *pMaterial, msVec4 Specular);
351 MSLIB_API void          msMaterial_GetSpecular (msMaterial *pMaterial, msVec4 Specular);
352 MSLIB_API void          msMaterial_SetEmissive (msMaterial *pMaterial, msVec4 Emissive);
353 MSLIB_API void          msMaterial_GetEmissive (msMaterial *pMaterial, msVec4 Emissive);
354 MSLIB_API void          msMaterial_SetShininess (msMaterial *pMaterial, float fShininess);
355 MSLIB_API float         msMaterial_GetShininess (msMaterial *pMaterial);
356 MSLIB_API void          msMaterial_SetTransparency (msMaterial *pMaterial, float fTransparency);
357 MSLIB_API float         msMaterial_GetTransparency (msMaterial *pMaterial);
358 MSLIB_API void          msMaterial_SetDiffuseTexture (msMaterial *pMaterial, const char *szDiffuseTexture);
359 MSLIB_API void          msMaterial_GetDiffuseTexture (msMaterial *pMaterial, char *szDiffuseTexture, int nMaxLength);
360 MSLIB_API void          msMaterial_SetAlphaTexture (msMaterial *pMaterial, const char *szAlphaTexture);
361 MSLIB_API void          msMaterial_GetAlphaTexture (msMaterial *pMaterial, char *szAlphaTexture, int nMaxLength);
362 MSLIB_API void          msMaterial_SetComment (msMaterial *pMaterial, const char *pszComment);
363 MSLIB_API int           msMaterial_GetComment (msMaterial *pMaterial, char *pszComment, int nMaxCommentLength);
364 
365 /**********************************************************************
366  * msBone
367  **********************************************************************/
368 
369 MSLIB_API void          msBone_Destroy (msBone *pBone);
370 MSLIB_API void          msBone_SetFlags (msBone *pBone, int nFlags);
371 MSLIB_API int           msBone_GetFlags (msBone *pBone);
372 MSLIB_API void          msBone_SetName (msBone *pBone, const char *szName);
373 MSLIB_API void          msBone_GetName (msBone *pBone, char *szName, int nMaxLength);
374 MSLIB_API void          msBone_SetParentName (msBone *pBone, const char *szParentName);
375 MSLIB_API void          msBone_GetParentName (msBone *pBone, char *szParentName, int nMaxLength);
376 MSLIB_API void          msBone_SetPosition (msBone *pBone, msVec3 Position);
377 MSLIB_API void          msBone_GetPosition (msBone *pBone, msVec3 Position);
378 MSLIB_API void          msBone_GetInterpolatedPosition (msBone *pBone, msVec3 Position); // NOT YET IMPLEMENTED
379 MSLIB_API void          msBone_SetRotation (msBone *pBone, msVec3 Rotation);
380 MSLIB_API void          msBone_GetRotation (msBone *pBone, msVec3 Rotation);
381 MSLIB_API void          msBone_GetInterpolatedRotation (msBone *pBone, msVec3 Rotation); // NOT YET IMPLEMENTED
382 
383 MSLIB_API int           msBone_GetPositionKeyCount (msBone *pBone);
384 MSLIB_API int           msBone_AddPositionKey (msBone *pBone, float fTime, msVec3 Position);
385 MSLIB_API msPositionKey* msBone_GetPositionKeyAt (msBone *pBone, int nIndex);
386 
387 MSLIB_API int           msBone_GetRotationKeyCount (msBone *pBone);
388 MSLIB_API int           msBone_AddRotationKey (msBone *pBone, float fTime, msVec3 Rotation);
389 MSLIB_API msRotationKey* msBone_GetRotationKeyAt (msBone *pBone, int nIndex);
390 MSLIB_API void          msBone_SetComment (msBone *pBone, const char *pszComment);
391 MSLIB_API int           msBone_GetComment (msBone *pBone, char *pszComment, int nMaxCommentLength);
392 
393 
394 
395 #ifdef __cplusplus
396 }
397 #endif /* __cplusplus */
398 
399 
400 
401 #ifdef WIN32
402 #include <poppack.h>
403 #endif /* WIN32 */
404 
405 
406 
407 #endif /* __MSLIB_H__ */