1/*
2Open Asset Import Library (assimp)
3----------------------------------------------------------------------
4
5Copyright (c) 2006-2017, assimp team
6
7All rights reserved.
8
9Redistribution and use of this software in source and binary forms,
10with or without modification, are permitted provided that the
11following conditions are met:
12
13* Redistributions of source code must retain the above
14 copyright notice, this list of conditions and the
15 following disclaimer.
16
17* Redistributions in binary form must reproduce the above
18 copyright notice, this list of conditions and the
19 following disclaimer in the documentation and/or other
20 materials provided with the distribution.
21
22* Neither the name of the assimp team, nor the names of its
23 contributors may be used to endorse or promote products
24 derived from this software without specific prior
25 written permission of the assimp team.
26
27THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
39----------------------------------------------------------------------
40*/
41
42/** @file Defines the helper data structures for importing MDC files
43
44**********************************************************************
45File format specification:
46http://themdcfile.planetwolfenstein.gamespy.com/MDC_File_Format.pdf
47**********************************************************************
48
49*/
50#ifndef AI_MDCFILEHELPER_H_INC
51#define AI_MDCFILEHELPER_H_INC
52
53#include <assimp/types.h>
54#include <assimp/mesh.h>
55#include <assimp/anim.h>
56
57#include <assimp/Compiler/pushpack1.h>
58#include <stdint.h>
59
60namespace Assimp {
61namespace MDC {
62
63
64// to make it easier for us, we test the magic word against both "endianesses"
65#define AI_MDC_MAGIC_NUMBER_BE AI_MAKE_MAGIC("CPDI")
66#define AI_MDC_MAGIC_NUMBER_LE AI_MAKE_MAGIC("IDPC")
67
68// common limitations
69#define AI_MDC_VERSION 2
70#define AI_MDC_MAXQPATH 64
71#define AI_MDC_MAX_BONES 128
72
73#define AI_MDC_CVERT_BIAS 127.0f
74#define AI_MDC_DELTA_SCALING 4.0f
75#define AI_MDC_BASE_SCALING (1.0f / 64.0f)
76
77
78// ---------------------------------------------------------------------------
79/** \brief Data structure for a MDC file's main header
80 */
81struct Header
82{
83 uint32_t ulIdent ;
84 uint32_t ulVersion ;
85 char ucName [ AI_MDC_MAXQPATH ] ;
86 uint32_t ulFlags ;
87 uint32_t ulNumFrames ;
88 uint32_t ulNumTags ;
89 uint32_t ulNumSurfaces ;
90 uint32_t ulNumSkins ;
91 uint32_t ulOffsetBorderFrames ;
92 uint32_t ulOffsetTagNames ;
93 uint32_t ulOffsetTagFrames ;
94 uint32_t ulOffsetSurfaces ;
95 uint32_t ulOffsetEnd ;
96} PACK_STRUCT ;
97
98
99// ---------------------------------------------------------------------------
100/** \brief Data structure for a MDC file's surface header
101 */
102struct Surface
103{
104 uint32_t ulIdent ;
105 char ucName [ AI_MDC_MAXQPATH ] ;
106 uint32_t ulFlags ;
107 uint32_t ulNumCompFrames ;
108 uint32_t ulNumBaseFrames ;
109 uint32_t ulNumShaders ;
110 uint32_t ulNumVertices ;
111 uint32_t ulNumTriangles ;
112 uint32_t ulOffsetTriangles ;
113 uint32_t ulOffsetShaders ;
114 uint32_t ulOffsetTexCoords ;
115 uint32_t ulOffsetBaseVerts ;
116 uint32_t ulOffsetCompVerts ;
117 uint32_t ulOffsetFrameBaseFrames ;
118 uint32_t ulOffsetFrameCompFrames ;
119 uint32_t ulOffsetEnd;
120 Surface()
121 : ulIdent(),
122 ulFlags(),
123 ulNumCompFrames(),
124 ulNumBaseFrames(),
125 ulNumShaders(),
126 ulNumVertices(),
127 ulNumTriangles(),
128 ulOffsetTriangles(),
129 ulOffsetShaders(),
130 ulOffsetTexCoords(),
131 ulOffsetBaseVerts(),
132 ulOffsetCompVerts(),
133 ulOffsetFrameBaseFrames(),
134 ulOffsetFrameCompFrames(),
135 ulOffsetEnd()
136 {
137 ucName[AI_MDC_MAXQPATH-1] = '\0';
138 }
139} PACK_STRUCT;
140
141// ---------------------------------------------------------------------------
142/** \brief Data structure for a MDC frame
143 */
144struct Frame
145{
146 //! bounding box minimum coords
147 aiVector3D bboxMin ;
148
149 //! bounding box maximum coords
150 aiVector3D bboxMax ;
151
152 //! local origin of the frame
153 aiVector3D localOrigin ;
154
155 //! radius of the BB
156 float radius ;
157
158 //! Name of the frame
159 char name [ 16 ] ;
160} /*PACK_STRUCT*/;
161
162// ---------------------------------------------------------------------------
163/** \brief Data structure for a MDC triangle
164 */
165struct Triangle
166{
167 uint32_t aiIndices[3];
168} PACK_STRUCT;
169
170// ---------------------------------------------------------------------------
171/** \brief Data structure for a MDC texture coordinate
172 */
173struct TexturCoord
174{
175 float u,v;
176} PACK_STRUCT;
177
178// ---------------------------------------------------------------------------
179/** \brief Data structure for a MDC base vertex
180 */
181struct BaseVertex
182{
183 int16_t x,y,z;
184 uint16_t normal;
185} PACK_STRUCT;
186
187// ---------------------------------------------------------------------------
188/** \brief Data structure for a MDC compressed vertex
189 */
190struct CompressedVertex
191{
192 uint8_t xd,yd,zd,nd;
193} PACK_STRUCT;
194
195
196// ---------------------------------------------------------------------------
197/** \brief Data structure for a MDC shader
198 */
199struct Shader
200{
201 char ucName [ AI_MDC_MAXQPATH ] ;
202 uint32_t ulPath;
203
204} PACK_STRUCT;
205
206#include <assimp/Compiler/poppack1.h>
207
208
209// ---------------------------------------------------------------------------
210/** Build a floating point vertex from the compressed data in MDC files
211 */
212void BuildVertex(const Frame& frame,
213 const BaseVertex& bvert,
214 const CompressedVertex& cvert,
215 aiVector3D& vXYZOut,
216 aiVector3D& vNorOut);
217}}
218
219#endif // !! AI_MDCFILEHELPER_H_INC
220