]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/picomodel.h
portability fixes
[xonotic/netradiant.git] / libs / picomodel.h
1 /* -----------------------------------------------------------------------------
2
3 PicoModel Library 
4
5 Copyright (c) 2002, Randy Reddig & seaw0lf
6 All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without modification,
9 are permitted provided that the following conditions are met:
10
11 Redistributions of source code must retain the above copyright notice, this list
12 of conditions and the following disclaimer.
13
14 Redistributions in binary form must reproduce the above copyright notice, this
15 list of conditions and the following disclaimer in the documentation and/or
16 other materials provided with the distribution.
17
18 Neither the names of the copyright holders nor the names of its contributors may
19 be used to endorse or promote products derived from this software without
20 specific prior written permission. 
21
22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
23 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
26 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
29 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
33 ----------------------------------------------------------------------------- */
34
35
36
37 /* marker */
38 #ifndef PICOMODEL_H
39 #define PICOMODEL_H
40
41 #ifdef __cplusplus
42 extern "C"
43 {
44 #endif
45
46 #include <stddef.h>
47
48
49
50 /* version */
51 #define PICOMODEL_VERSION               "0.8.20"
52
53
54 /* constants */
55 #define PICO_GROW_SHADERS               16
56 #define PICO_GROW_SURFACES              16
57 #define PICO_GROW_VERTEXES              1024
58 #define PICO_GROW_INDEXES               1024
59 #define PICO_GROW_ARRAYS                8
60 #define PICO_GROW_FACES                 256
61 #define PICO_MAX_SPECIAL                8
62 #define PICO_MAX_DEFAULT_EXTS   4               /* max default extensions per module */
63
64
65 /* types */
66 typedef unsigned char                   picoByte_t;
67 typedef float                                   picoVec_t;
68 typedef float                                   picoVec2_t[ 2 ];
69 typedef float                                   picoVec3_t[ 3 ];
70 typedef float                                   picoVec4_t[ 4 ];
71 typedef picoByte_t                      picoColor_t[ 4 ];
72 typedef int                                             picoIndex_t;
73
74 typedef enum
75 {
76         PICO_BAD,
77         PICO_TRIANGLES,
78         PICO_PATCH
79 }
80 picoSurfaceType_t;
81
82 typedef enum
83 {
84         PICO_NORMAL,
85         PICO_VERBOSE,
86         PICO_WARNING,
87         PICO_ERROR,
88         PICO_FATAL
89 }
90 picoPrintLevel_t;
91
92 typedef struct picoSurface_s    picoSurface_t;
93 typedef struct picoShader_s             picoShader_t;
94 typedef struct picoModel_s              picoModel_t;
95 typedef struct picoModule_s             picoModule_t;
96
97 struct picoSurface_s
98 {
99         void                                            *data;
100         
101         picoModel_t                                     *model;         /* owner model */
102         
103         picoSurfaceType_t                       type;
104         char                                            *name;          /* sea: surface name */
105         picoShader_t                            *shader;        /* ydnar: changed to ptr */
106         
107         int                                                     numVertexes, maxVertexes;
108         picoVec3_t                                      *xyz;
109         picoVec3_t                                      *normal;
110         picoIndex_t                                     *smoothingGroup;
111         
112         int                                                     numSTArrays, maxSTArrays;
113         picoVec2_t                                      **st;
114         
115         int                                                     numColorArrays, maxColorArrays;
116         picoColor_t                                     **color;
117         
118         int                                                     numIndexes, maxIndexes;
119         picoIndex_t                                     *index;
120
121         int                                                     numFaceNormals, maxFaceNormals;
122         picoVec3_t                                      *faceNormal;
123
124         int                                                     special[ PICO_MAX_SPECIAL ];
125 };
126
127
128 /* seaw0lf */
129 struct picoShader_s
130 {
131         picoModel_t                                     *model;                 /* owner model */
132
133         char                                            *name;                  /* shader name */
134         char                                            *mapName;               /* shader file name (name of diffuse texturemap) */
135         picoColor_t                                     ambientColor;   /* ambient color of mesh (rgba) */
136         picoColor_t                                     diffuseColor;   /* diffuse color of mesh (rgba) */
137         picoColor_t                                     specularColor;  /* specular color of mesh (rgba) */
138         float                                           transparency;   /* transparency (0..1; 1 = 100% transparent) */
139         float                                           shininess;              /* shininess (0..128; 128 = 100% shiny) */
140 };
141
142 struct picoModel_s
143 {
144         void                                            *data;
145         char                                            *name;                  /* model name */
146         char                                            *fileName;              /* sea: model file name */
147         int                                                     frameNum;               /* sea: renamed to frameNum */
148         int                                                     numFrames;              /* sea: number of frames */
149         picoVec3_t                                      mins;
150         picoVec3_t                                      maxs;
151
152         int                                                     numShaders, maxShaders;
153         picoShader_t                            **shader;
154         
155         int                                                     numSurfaces, maxSurfaces;
156         picoSurface_t                           **surface;
157         
158         const picoModule_t                      *module;                /* sea */
159 };
160
161
162 /* seaw0lf */
163 /* return codes used by the validation callbacks; pmv is short */
164 /* for 'pico module validation'. everything >PICO_PMV_OK means */
165 /* that there was an error. */
166 enum
167 {
168         PICO_PMV_OK,                    /* file valid */
169         PICO_PMV_ERROR,                 /* file not valid */
170         PICO_PMV_ERROR_IDENT,   /* unknown file magic (aka ident) */
171         PICO_PMV_ERROR_VERSION, /* unsupported file version */
172         PICO_PMV_ERROR_SIZE,    /* file size error */
173         PICO_PMV_ERROR_MEMORY,  /* out of memory error */
174 };
175
176 /* convenience (makes it easy to add new params to the callbacks) */
177 #define PM_PARAMS_CANLOAD \
178         char *fileName, const void *buffer, int bufSize
179
180 #define PM_PARAMS_LOAD \
181         char *fileName, int frameNum, const void *buffer, int bufSize
182
183 #define PM_PARAMS_CANSAVE \
184         void
185
186 #define PM_PARAMS_SAVE \
187         char *fileName, picoModel_t *model
188
189 /* pico file format module structure */
190 struct picoModule_s
191 {
192         char                                    *version;                                                               /* internal module version (e.g. '1.5-b2') */
193
194         char                                    *displayName;                                                   /* string used to display in guis, etc. */
195         char                                    *authorName;                                                    /* author name (eg. 'My Real Name') */
196         char                                    *copyright;                                                             /* copyright year and holder (eg. '2002 My Company') */
197
198         char                                    *defaultExts[ PICO_MAX_DEFAULT_EXTS ];  /* default file extensions used by this file type */
199         int                                             (*canload)( PM_PARAMS_CANLOAD );                /* checks whether module can load given file (returns PMVR_*) */
200         picoModel_t                             *(*load)( PM_PARAMS_LOAD );                             /* parses model file data */
201         int                                             (*cansave)( PM_PARAMS_CANSAVE );                /* checks whether module can save (returns 1 or 0 and might spit out a message) */
202         int                                             (*save)( PM_PARAMS_SAVE );                              /* saves a pico model in module's native model format */
203 };
204
205
206
207 /* general functions */
208 int                                                     PicoInit( void );
209 void                                            PicoShutdown( void );
210 int                                                     PicoError( void );
211
212 void                                            PicoSetMallocFunc( void *(*func)( size_t ) );
213 void                                            PicoSetFreeFunc( void (*func)( void* ) );
214 void                                            PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) );
215 void                                            PicoSetFreeFileFunc( void (*func)( void* ) );
216 void                                            PicoSetPrintFunc( void (*func)( int, const char* ) );
217
218 const picoModule_t                      **PicoModuleList( int *numModules );
219
220 picoModel_t                                     *PicoLoadModel( char *name, int frameNum );
221
222 typedef size_t (*PicoInputStreamReadFunc)(void* inputStream, unsigned char* buffer, size_t length);
223 picoModel_t* PicoModuleLoadModelStream( const picoModule_t* module, void* inputStream, PicoInputStreamReadFunc inputStreamRead, size_t streamLength, int frameNum );
224
225 /* model functions */
226 picoModel_t                                     *PicoNewModel( void );
227 void                                            PicoFreeModel( picoModel_t *model );
228 int                                                     PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces );
229
230
231 /* shader functions */
232 picoShader_t                            *PicoNewShader( picoModel_t *model );
233 void                                            PicoFreeShader( picoShader_t *shader );
234 picoShader_t                            *PicoFindShader( picoModel_t *model, char *name, int caseSensitive );
235
236
237 /* surface functions */
238 picoSurface_t                           *PicoNewSurface( picoModel_t *model );
239 void                                            PicoFreeSurface( picoSurface_t *surface );
240 picoSurface_t                           *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive );
241 int                                                     PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals );
242
243
244 /* setter functions */
245 void                                            PicoSetModelName( picoModel_t *model, char *name );
246 void                                            PicoSetModelFileName( picoModel_t *model, char *fileName );
247 void                                            PicoSetModelFrameNum( picoModel_t *model, int frameNum );
248 void                                            PicoSetModelNumFrames( picoModel_t *model, int numFrames );
249 void                                            PicoSetModelData( picoModel_t *model, void *data );
250
251 void                                            PicoSetShaderName( picoShader_t *shader, char *name );
252 void                                            PicoSetShaderMapName( picoShader_t *shader, char *mapName );
253 void                                            PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color );
254 void                                            PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color );
255 void                                            PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color );
256 void                                            PicoSetShaderTransparency( picoShader_t *shader, float value );
257 void                                            PicoSetShaderShininess( picoShader_t *shader, float value );
258
259 void                                            PicoSetSurfaceData( picoSurface_t *surface, void *data );
260 void                                            PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type );
261 void                                            PicoSetSurfaceName( picoSurface_t *surface, char *name );
262 void                                            PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader );
263 void                                            PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz );
264 void                                            PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
265 void                                            PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st );
266 void                                            PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color );
267 void                                            PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index );
268 void                                            PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count );
269 void                                            PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
270 void                                            PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special );
271 void                                            PicoSetSurfaceSmoothingGroup( picoSurface_t *surface, int num, picoIndex_t smoothingGroup );
272
273
274 /* getter functions */
275 char                                            *PicoGetModelName( picoModel_t *model );
276 char                                            *PicoGetModelFileName( picoModel_t *model );
277 int                                                     PicoGetModelFrameNum( picoModel_t *model );
278 int                                                     PicoGetModelNumFrames( picoModel_t *model );
279 void                                            *PicoGetModelData( picoModel_t *model );
280 int                                             PicoGetModelNumShaders( picoModel_t *model );
281 picoShader_t                            *PicoGetModelShader( picoModel_t *model, int num );     /* sea */
282 int                                                     PicoGetModelNumSurfaces( picoModel_t *model );
283 picoSurface_t                           *PicoGetModelSurface( picoModel_t *model, int num );
284 int                                             PicoGetModelTotalVertexes( picoModel_t *model );
285 int                                             PicoGetModelTotalIndexes( picoModel_t *model );
286
287 char                                            *PicoGetShaderName( picoShader_t *shader );
288 char                                            *PicoGetShaderMapName( picoShader_t *shader );
289 picoByte_t                                      *PicoGetShaderAmbientColor( picoShader_t *shader );
290 picoByte_t                                      *PicoGetShaderDiffuseColor( picoShader_t *shader );
291 picoByte_t                                      *PicoGetShaderSpecularColor( picoShader_t *shader );
292 float                                           PicoGetShaderTransparency( picoShader_t *shader );
293 float                                           PicoGetShaderShininess( picoShader_t *shader );
294
295 void                                            *PicoGetSurfaceData( picoSurface_t *surface );
296 char                                            *PicoGetSurfaceName( picoSurface_t *surface );          /* sea */
297 picoSurfaceType_t                       PicoGetSurfaceType( picoSurface_t *surface );
298 char                                            *PicoGetSurfaceName( picoSurface_t *surface );
299 picoShader_t                            *PicoGetSurfaceShader( picoSurface_t *surface );        /* sea */
300
301 int                                                     PicoGetSurfaceNumVertexes( picoSurface_t *surface );
302 picoVec_t                                       *PicoGetSurfaceXYZ( picoSurface_t *surface, int num );
303 picoVec_t                                       *PicoGetSurfaceNormal( picoSurface_t *surface, int num );
304 picoVec_t                                       *PicoGetSurfaceST( picoSurface_t *surface, int array, int num );
305 picoByte_t                                      *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num );
306 int                                                     PicoGetSurfaceNumIndexes( picoSurface_t *surface );
307 picoIndex_t                                     PicoGetSurfaceIndex( picoSurface_t *surface, int num );
308 picoIndex_t                                     *PicoGetSurfaceIndexes( picoSurface_t *surface, int num );
309 picoVec_t                                       *PicoGetFaceNormal( picoSurface_t *surface, int num );
310 int                                                     PicoGetSurfaceSpecial( picoSurface_t *surface, int num );
311
312
313 /* hashtable related functions */
314 typedef struct picoVertexCombinationData_s
315 {
316         picoVec3_t      xyz, normal;
317         picoVec2_t      st;
318         picoColor_t     color;
319 } picoVertexCombinationData_t;
320
321 typedef struct picoVertexCombinationHash_s
322 {
323         picoVertexCombinationData_t     vcd;
324         picoIndex_t                                     index;
325
326         void                                            *data;
327
328         struct picoVertexCombinationHash_s      *next;
329 } picoVertexCombinationHash_t;
330
331 int                                                     PicoGetHashTableSize( void );
332 unsigned int                            PicoVertexCoordGenerateHash( picoVec3_t xyz );
333 picoVertexCombinationHash_t     **PicoNewVertexCombinationHashTable( void );
334 void                                            PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable );
335 picoVertexCombinationHash_t     *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color );
336 picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index );
337
338 /* specialized functions */
339 int                                                     PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color, picoIndex_t smoothingGroup );
340 void                                            PicoFixSurfaceNormals( picoSurface_t *surface );
341 int                                                     PicoRemapModel( picoModel_t *model, char *remapFile );
342
343
344 void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader, picoIndex_t* smoothingGroup);
345
346 /* end marker */
347 #ifdef __cplusplus
348 }
349 #endif
350
351 #endif