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