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 const char *fileName, const void *buffer, int bufSize 179 180 #define PM_PARAMS_LOAD \ 181 const char *fileName, int frameNum, const void *buffer, int bufSize 182 183 #define PM_PARAMS_CANSAVE \ 184 void 185 186 #define PM_PARAMS_SAVE \ 187 const 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 )( const 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( const 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, const char *fileName ); 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, const char *name ); 246 void PicoSetModelFileName( picoModel_t *model, const 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, const 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, const char *name, picoIndex_t* smoothingGroup ); 345 346 /* end marker */ 347 #ifdef __cplusplus 348 } 349 #endif 350 351 #endif 352