1 /* -----------------------------------------------------------------------------
5 Copyright (c) 2002, Randy Reddig & seaw0lf
8 Redistribution and use in source and binary forms, with or without modification,
9 are permitted provided that the following conditions are met:
11 Redistributions of source code must retain the above copyright notice, this list
12 of conditions and the following disclaimer.
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.
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.
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.
33 ----------------------------------------------------------------------------- */
49 #define PICOMODEL_VERSION "0.8.20"
53 #define PICO_GROW_SHADERS 16
54 #define PICO_GROW_SURFACES 16
55 #define PICO_GROW_VERTEXES 1024
56 #define PICO_GROW_INDEXES 1024
57 #define PICO_GROW_ARRAYS 8
58 #define PICO_GROW_FACES 256
59 #define PICO_MAX_SPECIAL 8
60 #define PICO_MAX_DEFAULT_EXTS 4 /* max default extensions per module */
64 typedef unsigned char picoByte_t;
65 typedef float picoVec_t;
66 typedef float picoVec2_t[ 2 ];
67 typedef float picoVec3_t[ 3 ];
68 typedef float picoVec4_t[ 4 ];
69 typedef picoByte_t picoColor_t[ 4 ];
70 typedef int picoIndex_t;
90 typedef struct picoSurface_s picoSurface_t;
91 typedef struct picoShader_s picoShader_t;
92 typedef struct picoModel_s picoModel_t;
93 typedef struct picoModule_s picoModule_t;
99 picoModel_t *model; /* owner model */
101 picoSurfaceType_t type;
102 char *name; /* sea: surface name */
103 picoShader_t *shader; /* ydnar: changed to ptr */
105 int numVertexes, maxVertexes;
109 int numSTArrays, maxSTArrays;
112 int numColorArrays, maxColorArrays;
115 int numIndexes, maxIndexes;
118 int numFaceNormals, maxFaceNormals;
119 picoVec3_t *faceNormal;
121 int special[ PICO_MAX_SPECIAL ];
128 picoModel_t *model; /* owner model */
130 char *name; /* shader name */
131 char *mapName; /* shader file name (name of diffuse texturemap) */
132 picoColor_t ambientColor; /* ambient color of mesh (rgba) */
133 picoColor_t diffuseColor; /* diffuse color of mesh (rgba) */
134 picoColor_t specularColor; /* specular color of mesh (rgba) */
135 float transparency; /* transparency (0..1; 1 = 100% transparent) */
136 float shininess; /* shininess (0..128; 128 = 100% shiny) */
142 char *name; /* model name */
143 char *fileName; /* sea: model file name */
144 int frameNum; /* sea: renamed to frameNum */
145 int numFrames; /* sea: number of frames */
149 int numShaders, maxShaders;
150 picoShader_t **shader;
152 int numSurfaces, maxSurfaces;
153 picoSurface_t **surface;
155 const picoModule_t *module; /* sea */
160 /* return codes used by the validation callbacks; pmv is short */
161 /* for 'pico module validation'. everything >PICO_PMV_OK means */
162 /* that there was an error. */
165 PICO_PMV_OK, /* file valid */
166 PICO_PMV_ERROR, /* file not valid */
167 PICO_PMV_ERROR_IDENT, /* unknown file magic (aka ident) */
168 PICO_PMV_ERROR_VERSION, /* unsupported file version */
169 PICO_PMV_ERROR_SIZE, /* file size error */
170 PICO_PMV_ERROR_MEMORY, /* out of memory error */
173 /* convenience (makes it easy to add new params to the callbacks) */
174 #define PM_PARAMS_CANLOAD \
175 char *fileName, const void *buffer, int bufSize
177 #define PM_PARAMS_LOAD \
178 char *fileName, int frameNum, const void *buffer, int bufSize
180 #define PM_PARAMS_CANSAVE \
183 #define PM_PARAMS_SAVE \
184 char *fileName, picoModel_t *model
186 /* pico file format module structure */
189 char *version; /* internal module version (e.g. '1.5-b2') */
191 char *displayName; /* string used to display in guis, etc. */
192 char *authorName; /* author name (eg. 'My Real Name') */
193 char *copyright; /* copyright year and holder (eg. '2002 My Company') */
195 char *defaultExts[ PICO_MAX_DEFAULT_EXTS ]; /* default file extensions used by this file type */
196 int (*canload)( PM_PARAMS_CANLOAD ); /* checks whether module can load given file (returns PMVR_*) */
197 picoModel_t *(*load)( PM_PARAMS_LOAD ); /* parses model file data */
198 int (*cansave)( PM_PARAMS_CANSAVE ); /* checks whether module can save (returns 1 or 0 and might spit out a message) */
199 int (*save)( PM_PARAMS_SAVE ); /* saves a pico model in module's native model format */
204 /* general functions */
205 int PicoInit( void );
206 void PicoShutdown( void );
207 int PicoError( void );
209 void PicoSetMallocFunc( void *(*func)( size_t ) );
210 void PicoSetFreeFunc( void (*func)( void* ) );
211 void PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) );
212 void PicoSetFreeFileFunc( void (*func)( void* ) );
213 void PicoSetPrintFunc( void (*func)( int, const char* ) );
215 const picoModule_t **PicoModuleList( int *numModules );
217 picoModel_t *PicoLoadModel( char *name, int frameNum );
220 /* model functions */
221 picoModel_t *PicoNewModel( void );
222 void PicoFreeModel( picoModel_t *model );
223 int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces );
226 /* shader functions */
227 picoShader_t *PicoNewShader( picoModel_t *model );
228 void PicoFreeShader( picoShader_t *shader );
229 picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive );
232 /* surface functions */
233 picoSurface_t *PicoNewSurface( picoModel_t *model );
234 void PicoFreeSurface( picoSurface_t *surface );
235 picoSurface_t *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive );
236 int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals );
239 /* setter functions */
240 void PicoSetModelName( picoModel_t *model, char *name );
241 void PicoSetModelFileName( picoModel_t *model, char *fileName );
242 void PicoSetModelFrameNum( picoModel_t *model, int frameNum );
243 void PicoSetModelNumFrames( picoModel_t *model, int numFrames );
244 void PicoSetModelData( picoModel_t *model, void *data );
246 void PicoSetShaderName( picoShader_t *shader, char *name );
247 void PicoSetShaderMapName( picoShader_t *shader, char *mapName );
248 void PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color );
249 void PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color );
250 void PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color );
251 void PicoSetShaderTransparency( picoShader_t *shader, float value );
252 void PicoSetShaderShininess( picoShader_t *shader, float value );
254 void PicoSetSurfaceData( picoSurface_t *surface, void *data );
255 void PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type );
256 void PicoSetSurfaceName( picoSurface_t *surface, char *name );
257 void PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader );
258 void PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz );
259 void PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
260 void PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st );
261 void PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color );
262 void PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index );
263 void PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count );
264 void PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
265 void PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special );
268 /* getter functions */
269 char *PicoGetModelName( picoModel_t *model );
270 char *PicoGetModelFileName( picoModel_t *model );
271 int PicoGetModelFrameNum( picoModel_t *model );
272 int PicoGetModelNumFrames( picoModel_t *model );
273 void *PicoGetModelData( picoModel_t *model );
274 int PicoGetModelNumShaders( picoModel_t *model );
275 picoShader_t *PicoGetModelShader( picoModel_t *model, int num ); /* sea */
276 int PicoGetModelNumSurfaces( picoModel_t *model );
277 picoSurface_t *PicoGetModelSurface( picoModel_t *model, int num );
278 int PicoGetModelTotalVertexes( picoModel_t *model );
279 int PicoGetModelTotalIndexes( picoModel_t *model );
281 char *PicoGetShaderName( picoShader_t *shader );
282 char *PicoGetShaderMapName( picoShader_t *shader );
283 picoByte_t *PicoGetShaderAmbientColor( picoShader_t *shader );
284 picoByte_t *PicoGetShaderDiffuseColor( picoShader_t *shader );
285 picoByte_t *PicoGetShaderSpecularColor( picoShader_t *shader );
286 float PicoGetShaderTransparency( picoShader_t *shader );
287 float PicoGetShaderShininess( picoShader_t *shader );
289 void *PicoGetSurfaceData( picoSurface_t *surface );
290 char *PicoGetSurfaceName( picoSurface_t *surface ); /* sea */
291 picoSurfaceType_t PicoGetSurfaceType( picoSurface_t *surface );
292 char *PicoGetSurfaceName( picoSurface_t *surface );
293 picoShader_t *PicoGetSurfaceShader( picoSurface_t *surface ); /* sea */
295 int PicoGetSurfaceNumVertexes( picoSurface_t *surface );
296 picoVec_t *PicoGetSurfaceXYZ( picoSurface_t *surface, int num );
297 picoVec_t *PicoGetSurfaceNormal( picoSurface_t *surface, int num );
298 picoVec_t *PicoGetSurfaceST( picoSurface_t *surface, int array, int num );
299 picoByte_t *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num );
300 int PicoGetSurfaceNumIndexes( picoSurface_t *surface );
301 picoIndex_t PicoGetSurfaceIndex( picoSurface_t *surface, int num );
302 picoIndex_t *PicoGetSurfaceIndexes( picoSurface_t *surface, int num );
303 picoVec_t *PicoGetFaceNormal( picoSurface_t *surface, int num );
304 int PicoGetSurfaceSpecial( picoSurface_t *surface, int num );
307 /* hashtable related functions */
308 typedef struct picoVertexCombinationData_s
310 picoVec3_t xyz, normal;
313 } picoVertexCombinationData_t;
315 typedef struct picoVertexCombinationHash_s
317 picoVertexCombinationData_t vcd;
322 struct picoVertexCombinationHash_s *next;
323 } picoVertexCombinationHash_t;
325 int PicoGetHashTableSize( void );
326 unsigned int PicoVertexCoordGenerateHash( picoVec3_t xyz );
327 picoVertexCombinationHash_t **PicoNewVertexCombinationHashTable( void );
328 void PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable );
329 picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color );
330 picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index );
332 /* specialized functions */
333 int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color );
334 void PicoFixSurfaceNormals( picoSurface_t *surface );
335 int PicoRemapModel( picoModel_t *model, char *remapFile );
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 );