]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel.h
eol style
[xonotic/netradiant.git] / libs / picomodel.h
index 8642527a5519ee86098ca6565ee94ebe51ca59a3..1912b4cbf5128ea4962bb6ba8700b5d2119a4433 100644 (file)
-/* -----------------------------------------------------------------------------\r
-\r
-PicoModel Library \r
-\r
-Copyright (c) 2002, Randy Reddig & seaw0lf\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification,\r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list\r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the names of the copyright holders nor the names of its contributors may\r
-be used to endorse or promote products derived from this software without\r
-specific prior written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND\r
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\r
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR\r
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
-\r
------------------------------------------------------------------------------ */\r
-\r
-\r
-\r
-/* marker */\r
-#ifndef PICOMODEL_H\r
-#define PICOMODEL_H\r
-\r
-#ifdef __cplusplus\r
-extern "C"\r
-{\r
-#endif\r
-\r
-\r
-\r
-/* version */\r
-#define PICOMODEL_VERSION              "0.8.20"\r
-\r
-\r
-/* constants */\r
-#define PICO_GROW_SHADERS              16\r
-#define PICO_GROW_SURFACES             16\r
-#define PICO_GROW_VERTEXES             1024\r
-#define PICO_GROW_INDEXES              1024\r
-#define PICO_GROW_ARRAYS               8\r
-#define PICO_GROW_FACES                        256\r
-#define PICO_MAX_SPECIAL               8\r
-#define PICO_MAX_DEFAULT_EXTS  4               /* max default extensions per module */\r
-\r
-\r
-/* types */\r
-typedef unsigned char                  picoByte_t;\r
-typedef float                                  picoVec_t;\r
-typedef float                                  picoVec2_t[ 2 ];\r
-typedef float                                  picoVec3_t[ 3 ];\r
-typedef float                                  picoVec4_t[ 4 ];\r
-typedef picoByte_t                     picoColor_t[ 4 ];\r
-typedef int                                            picoIndex_t;\r
-\r
-typedef enum\r
-{\r
-       PICO_BAD,\r
-       PICO_TRIANGLES,\r
-       PICO_PATCH\r
-}\r
-picoSurfaceType_t;\r
-\r
-typedef enum\r
-{\r
-       PICO_NORMAL,\r
-       PICO_VERBOSE,\r
-       PICO_WARNING,\r
-       PICO_ERROR,\r
-       PICO_FATAL\r
-}\r
-picoPrintLevel_t;\r
-\r
-typedef struct picoSurface_s   picoSurface_t;\r
-typedef struct picoShader_s            picoShader_t;\r
-typedef struct picoModel_s             picoModel_t;\r
-typedef struct picoModule_s            picoModule_t;\r
-\r
-struct picoSurface_s\r
-{\r
-       void                                            *data;\r
-       \r
-       picoModel_t                                     *model;         /* owner model */\r
-       \r
-       picoSurfaceType_t                       type;\r
-       char                                            *name;          /* sea: surface name */\r
-       picoShader_t                            *shader;        /* ydnar: changed to ptr */\r
-       \r
-       int                                                     numVertexes, maxVertexes;\r
-       picoVec3_t                                      *xyz;\r
-       picoVec3_t                                      *normal;\r
-       \r
-       int                                                     numSTArrays, maxSTArrays;\r
-       picoVec2_t                                      **st;\r
-       \r
-       int                                                     numColorArrays, maxColorArrays;\r
-       picoColor_t                                     **color;\r
-       \r
-       int                                                     numIndexes, maxIndexes;\r
-       picoIndex_t                                     *index;\r
-\r
-       int                                                     numFaceNormals, maxFaceNormals;\r
-       picoVec3_t                                      *faceNormal;\r
-\r
-       int                                                     special[ PICO_MAX_SPECIAL ];\r
-};\r
-\r
-\r
-/* seaw0lf */\r
-struct picoShader_s\r
-{\r
-       picoModel_t                                     *model;                 /* owner model */\r
-\r
-       char                                            *name;                  /* shader name */\r
-       char                                            *mapName;               /* shader file name (name of diffuse texturemap) */\r
-       picoColor_t                                     ambientColor;   /* ambient color of mesh (rgba) */\r
-       picoColor_t                                     diffuseColor;   /* diffuse color of mesh (rgba) */\r
-       picoColor_t                                     specularColor;  /* specular color of mesh (rgba) */\r
-       float                                           transparency;   /* transparency (0..1; 1 = 100% transparent) */\r
-       float                                           shininess;              /* shininess (0..128; 128 = 100% shiny) */\r
-};\r
-\r
-struct picoModel_s\r
-{\r
-       void                                            *data;\r
-       char                                            *name;                  /* model name */\r
-       char                                            *fileName;              /* sea: model file name */\r
-       int                                                     frameNum;               /* sea: renamed to frameNum */\r
-       int                                                     numFrames;              /* sea: number of frames */\r
-       picoVec3_t                                      mins;\r
-       picoVec3_t                                      maxs;\r
-\r
-       int                                                     numShaders, maxShaders;\r
-       picoShader_t                            **shader;\r
-       \r
-       int                                                     numSurfaces, maxSurfaces;\r
-       picoSurface_t                           **surface;\r
-       \r
-       const picoModule_t                      *module;                /* sea */\r
-};\r
-\r
-\r
-/* seaw0lf */\r
-/* return codes used by the validation callbacks; pmv is short */\r
-/* for 'pico module validation'. everything >PICO_PMV_OK means */\r
-/* that there was an error. */\r
-enum\r
-{\r
-       PICO_PMV_OK,                    /* file valid */\r
-       PICO_PMV_ERROR,                 /* file not valid */\r
-       PICO_PMV_ERROR_IDENT,   /* unknown file magic (aka ident) */\r
-       PICO_PMV_ERROR_VERSION, /* unsupported file version */\r
-       PICO_PMV_ERROR_SIZE,    /* file size error */\r
-       PICO_PMV_ERROR_MEMORY,  /* out of memory error */\r
-};\r
-\r
-/* convenience (makes it easy to add new params to the callbacks) */\r
-#define PM_PARAMS_CANLOAD \\r
-       char *fileName, const void *buffer, int bufSize\r
-\r
-#define PM_PARAMS_LOAD \\r
-       char *fileName, int frameNum, const void *buffer, int bufSize\r
-\r
-#define PM_PARAMS_CANSAVE \\r
-       void\r
-\r
-#define PM_PARAMS_SAVE \\r
-       char *fileName, picoModel_t *model\r
-\r
-/* pico file format module structure */\r
-struct picoModule_s\r
-{\r
-       char                                    *version;                                                               /* internal module version (e.g. '1.5-b2') */\r
-\r
-       char                                    *displayName;                                                   /* string used to display in guis, etc. */\r
-       char                                    *authorName;                                                    /* author name (eg. 'My Real Name') */\r
-       char                                    *copyright;                                                             /* copyright year and holder (eg. '2002 My Company') */\r
-\r
-       char                                    *defaultExts[ PICO_MAX_DEFAULT_EXTS ];  /* default file extensions used by this file type */\r
-       int                                             (*canload)( PM_PARAMS_CANLOAD );                /* checks whether module can load given file (returns PMVR_*) */\r
-       picoModel_t                             *(*load)( PM_PARAMS_LOAD );                             /* parses model file data */\r
-       int                                             (*cansave)( PM_PARAMS_CANSAVE );                /* checks whether module can save (returns 1 or 0 and might spit out a message) */\r
-       int                                             (*save)( PM_PARAMS_SAVE );                              /* saves a pico model in module's native model format */\r
-};\r
-\r
-\r
-\r
-/* general functions */\r
-int                                                    PicoInit( void );\r
-void                                           PicoShutdown( void );\r
-int                                                    PicoError( void );\r
-\r
-void                                           PicoSetMallocFunc( void *(*func)( size_t ) );\r
-void                                           PicoSetFreeFunc( void (*func)( void* ) );\r
-void                                           PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) );\r
-void                                           PicoSetFreeFileFunc( void (*func)( void* ) );\r
-void                                           PicoSetPrintFunc( void (*func)( int, const char* ) );\r
-\r
-const picoModule_t                     **PicoModuleList( int *numModules );\r
-\r
-picoModel_t                                    *PicoLoadModel( char *name, int frameNum );\r
-\r
-\r
-/* model functions */\r
-picoModel_t                                    *PicoNewModel( void );\r
-void                                           PicoFreeModel( picoModel_t *model );\r
-int                                                    PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces );\r
-\r
-\r
-/* shader functions */\r
-picoShader_t                           *PicoNewShader( picoModel_t *model );\r
-void                                           PicoFreeShader( picoShader_t *shader );\r
-picoShader_t                           *PicoFindShader( picoModel_t *model, char *name, int caseSensitive );\r
-\r
-\r
-/* surface functions */\r
-picoSurface_t                          *PicoNewSurface( picoModel_t *model );\r
-void                                           PicoFreeSurface( picoSurface_t *surface );\r
-picoSurface_t                          *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive );\r
-int                                                    PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals );\r
-\r
-\r
-/* setter functions */\r
-void                                           PicoSetModelName( picoModel_t *model, char *name );\r
-void                                           PicoSetModelFileName( picoModel_t *model, char *fileName );\r
-void                                           PicoSetModelFrameNum( picoModel_t *model, int frameNum );\r
-void                                           PicoSetModelNumFrames( picoModel_t *model, int numFrames );\r
-void                                           PicoSetModelData( picoModel_t *model, void *data );\r
-\r
-void                                           PicoSetShaderName( picoShader_t *shader, char *name );\r
-void                                           PicoSetShaderMapName( picoShader_t *shader, char *mapName );\r
-void                                           PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color );\r
-void                                           PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color );\r
-void                                           PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color );\r
-void                                           PicoSetShaderTransparency( picoShader_t *shader, float value );\r
-void                                           PicoSetShaderShininess( picoShader_t *shader, float value );\r
-\r
-void                                           PicoSetSurfaceData( picoSurface_t *surface, void *data );\r
-void                                           PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type );\r
-void                                           PicoSetSurfaceName( picoSurface_t *surface, char *name );\r
-void                                           PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader );\r
-void                                           PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz );\r
-void                                           PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );\r
-void                                           PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st );\r
-void                                           PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color );\r
-void                                           PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index );\r
-void                                           PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count );\r
-void                                           PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );\r
-void                                           PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special );\r
-\r
-\r
-/* getter functions */\r
-char                                           *PicoGetModelName( picoModel_t *model );\r
-char                                           *PicoGetModelFileName( picoModel_t *model );\r
-int                                                    PicoGetModelFrameNum( picoModel_t *model );\r
-int                                                    PicoGetModelNumFrames( picoModel_t *model );\r
-void                                           *PicoGetModelData( picoModel_t *model );\r
-int                                            PicoGetModelNumShaders( picoModel_t *model );\r
-picoShader_t                           *PicoGetModelShader( picoModel_t *model, int num );     /* sea */\r
-int                                                    PicoGetModelNumSurfaces( picoModel_t *model );\r
-picoSurface_t                          *PicoGetModelSurface( picoModel_t *model, int num );\r
-int                                            PicoGetModelTotalVertexes( picoModel_t *model );\r
-int                                            PicoGetModelTotalIndexes( picoModel_t *model );\r
-\r
-char                                           *PicoGetShaderName( picoShader_t *shader );\r
-char                                           *PicoGetShaderMapName( picoShader_t *shader );\r
-picoByte_t                                     *PicoGetShaderAmbientColor( picoShader_t *shader );\r
-picoByte_t                                     *PicoGetShaderDiffuseColor( picoShader_t *shader );\r
-picoByte_t                                     *PicoGetShaderSpecularColor( picoShader_t *shader );\r
-float                                          PicoGetShaderTransparency( picoShader_t *shader );\r
-float                                          PicoGetShaderShininess( picoShader_t *shader );\r
-\r
-void                                           *PicoGetSurfaceData( picoSurface_t *surface );\r
-char                                           *PicoGetSurfaceName( picoSurface_t *surface );          /* sea */\r
-picoSurfaceType_t                      PicoGetSurfaceType( picoSurface_t *surface );\r
-char                                           *PicoGetSurfaceName( picoSurface_t *surface );\r
-picoShader_t                           *PicoGetSurfaceShader( picoSurface_t *surface );        /* sea */\r
-\r
-int                                                    PicoGetSurfaceNumVertexes( picoSurface_t *surface );\r
-picoVec_t                                      *PicoGetSurfaceXYZ( picoSurface_t *surface, int num );\r
-picoVec_t                                      *PicoGetSurfaceNormal( picoSurface_t *surface, int num );\r
-picoVec_t                                      *PicoGetSurfaceST( picoSurface_t *surface, int array, int num );\r
-picoByte_t                                     *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num );\r
-int                                                    PicoGetSurfaceNumIndexes( picoSurface_t *surface );\r
-picoIndex_t                                    PicoGetSurfaceIndex( picoSurface_t *surface, int num );\r
-picoIndex_t                                    *PicoGetSurfaceIndexes( picoSurface_t *surface, int num );\r
-picoVec_t                                      *PicoGetFaceNormal( picoSurface_t *surface, int num );\r
-int                                                    PicoGetSurfaceSpecial( picoSurface_t *surface, int num );\r
-\r
-\r
-/* hashtable related functions */\r
-typedef struct picoVertexCombinationData_s\r
-{\r
-       picoVec3_t      xyz, normal;\r
-       picoVec2_t      st;\r
-       picoColor_t     color;\r
-} picoVertexCombinationData_t;\r
-\r
-typedef struct picoVertexCombinationHash_s\r
-{\r
-       picoVertexCombinationData_t     vcd;\r
-       picoIndex_t                                     index;\r
-\r
-       void                                            *data;\r
-\r
-       struct picoVertexCombinationHash_s      *next;\r
-} picoVertexCombinationHash_t;\r
-\r
-int                                                    PicoGetHashTableSize( void );\r
-unsigned int                           PicoVertexCoordGenerateHash( picoVec3_t xyz );\r
-picoVertexCombinationHash_t    **PicoNewVertexCombinationHashTable( void );\r
-void                                           PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable );\r
-picoVertexCombinationHash_t    *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color );\r
-picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index );\r
-\r
-/* specialized functions */\r
-int                                                    PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color );\r
-void                                           PicoFixSurfaceNormals( picoSurface_t *surface );\r
-int                                                    PicoRemapModel( picoModel_t *model, char *remapFile );\r
-\r
-\r
-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
-\r
-/* end marker */\r
-#ifdef __cplusplus\r
-}\r
-#endif\r
-\r
-#endif\r
+/* -----------------------------------------------------------------------------
+
+PicoModel Library 
+
+Copyright (c) 2002, Randy Reddig & seaw0lf
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+Redistributions of source code must retain the above copyright notice, this list
+of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright notice, this
+list of conditions and the following disclaimer in the documentation and/or
+other materials provided with the distribution.
+
+Neither the names of the copyright holders nor the names of its contributors may
+be used to endorse or promote products derived from this software without
+specific prior written permission. 
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------------- */
+
+
+
+/* marker */
+#ifndef PICOMODEL_H
+#define PICOMODEL_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+
+/* version */
+#define PICOMODEL_VERSION              "0.8.20"
+
+
+/* constants */
+#define PICO_GROW_SHADERS              16
+#define PICO_GROW_SURFACES             16
+#define PICO_GROW_VERTEXES             1024
+#define PICO_GROW_INDEXES              1024
+#define PICO_GROW_ARRAYS               8
+#define PICO_GROW_FACES                        256
+#define PICO_MAX_SPECIAL               8
+#define PICO_MAX_DEFAULT_EXTS  4               /* max default extensions per module */
+
+
+/* types */
+typedef unsigned char                  picoByte_t;
+typedef float                                  picoVec_t;
+typedef float                                  picoVec2_t[ 2 ];
+typedef float                                  picoVec3_t[ 3 ];
+typedef float                                  picoVec4_t[ 4 ];
+typedef picoByte_t                     picoColor_t[ 4 ];
+typedef int                                            picoIndex_t;
+
+typedef enum
+{
+       PICO_BAD,
+       PICO_TRIANGLES,
+       PICO_PATCH
+}
+picoSurfaceType_t;
+
+typedef enum
+{
+       PICO_NORMAL,
+       PICO_VERBOSE,
+       PICO_WARNING,
+       PICO_ERROR,
+       PICO_FATAL
+}
+picoPrintLevel_t;
+
+typedef struct picoSurface_s   picoSurface_t;
+typedef struct picoShader_s            picoShader_t;
+typedef struct picoModel_s             picoModel_t;
+typedef struct picoModule_s            picoModule_t;
+
+struct picoSurface_s
+{
+       void                                            *data;
+       
+       picoModel_t                                     *model;         /* owner model */
+       
+       picoSurfaceType_t                       type;
+       char                                            *name;          /* sea: surface name */
+       picoShader_t                            *shader;        /* ydnar: changed to ptr */
+       
+       int                                                     numVertexes, maxVertexes;
+       picoVec3_t                                      *xyz;
+       picoVec3_t                                      *normal;
+       
+       int                                                     numSTArrays, maxSTArrays;
+       picoVec2_t                                      **st;
+       
+       int                                                     numColorArrays, maxColorArrays;
+       picoColor_t                                     **color;
+       
+       int                                                     numIndexes, maxIndexes;
+       picoIndex_t                                     *index;
+
+       int                                                     numFaceNormals, maxFaceNormals;
+       picoVec3_t                                      *faceNormal;
+
+       int                                                     special[ PICO_MAX_SPECIAL ];
+};
+
+
+/* seaw0lf */
+struct picoShader_s
+{
+       picoModel_t                                     *model;                 /* owner model */
+
+       char                                            *name;                  /* shader name */
+       char                                            *mapName;               /* shader file name (name of diffuse texturemap) */
+       picoColor_t                                     ambientColor;   /* ambient color of mesh (rgba) */
+       picoColor_t                                     diffuseColor;   /* diffuse color of mesh (rgba) */
+       picoColor_t                                     specularColor;  /* specular color of mesh (rgba) */
+       float                                           transparency;   /* transparency (0..1; 1 = 100% transparent) */
+       float                                           shininess;              /* shininess (0..128; 128 = 100% shiny) */
+};
+
+struct picoModel_s
+{
+       void                                            *data;
+       char                                            *name;                  /* model name */
+       char                                            *fileName;              /* sea: model file name */
+       int                                                     frameNum;               /* sea: renamed to frameNum */
+       int                                                     numFrames;              /* sea: number of frames */
+       picoVec3_t                                      mins;
+       picoVec3_t                                      maxs;
+
+       int                                                     numShaders, maxShaders;
+       picoShader_t                            **shader;
+       
+       int                                                     numSurfaces, maxSurfaces;
+       picoSurface_t                           **surface;
+       
+       const picoModule_t                      *module;                /* sea */
+};
+
+
+/* seaw0lf */
+/* return codes used by the validation callbacks; pmv is short */
+/* for 'pico module validation'. everything >PICO_PMV_OK means */
+/* that there was an error. */
+enum
+{
+       PICO_PMV_OK,                    /* file valid */
+       PICO_PMV_ERROR,                 /* file not valid */
+       PICO_PMV_ERROR_IDENT,   /* unknown file magic (aka ident) */
+       PICO_PMV_ERROR_VERSION, /* unsupported file version */
+       PICO_PMV_ERROR_SIZE,    /* file size error */
+       PICO_PMV_ERROR_MEMORY,  /* out of memory error */
+};
+
+/* convenience (makes it easy to add new params to the callbacks) */
+#define PM_PARAMS_CANLOAD \
+       char *fileName, const void *buffer, int bufSize
+
+#define PM_PARAMS_LOAD \
+       char *fileName, int frameNum, const void *buffer, int bufSize
+
+#define PM_PARAMS_CANSAVE \
+       void
+
+#define PM_PARAMS_SAVE \
+       char *fileName, picoModel_t *model
+
+/* pico file format module structure */
+struct picoModule_s
+{
+       char                                    *version;                                                               /* internal module version (e.g. '1.5-b2') */
+
+       char                                    *displayName;                                                   /* string used to display in guis, etc. */
+       char                                    *authorName;                                                    /* author name (eg. 'My Real Name') */
+       char                                    *copyright;                                                             /* copyright year and holder (eg. '2002 My Company') */
+
+       char                                    *defaultExts[ PICO_MAX_DEFAULT_EXTS ];  /* default file extensions used by this file type */
+       int                                             (*canload)( PM_PARAMS_CANLOAD );                /* checks whether module can load given file (returns PMVR_*) */
+       picoModel_t                             *(*load)( PM_PARAMS_LOAD );                             /* parses model file data */
+       int                                             (*cansave)( PM_PARAMS_CANSAVE );                /* checks whether module can save (returns 1 or 0 and might spit out a message) */
+       int                                             (*save)( PM_PARAMS_SAVE );                              /* saves a pico model in module's native model format */
+};
+
+
+
+/* general functions */
+int                                                    PicoInit( void );
+void                                           PicoShutdown( void );
+int                                                    PicoError( void );
+
+void                                           PicoSetMallocFunc( void *(*func)( size_t ) );
+void                                           PicoSetFreeFunc( void (*func)( void* ) );
+void                                           PicoSetLoadFileFunc( void (*func)( char*, unsigned char**, int* ) );
+void                                           PicoSetFreeFileFunc( void (*func)( void* ) );
+void                                           PicoSetPrintFunc( void (*func)( int, const char* ) );
+
+const picoModule_t                     **PicoModuleList( int *numModules );
+
+picoModel_t                                    *PicoLoadModel( char *name, int frameNum );
+
+
+/* model functions */
+picoModel_t                                    *PicoNewModel( void );
+void                                           PicoFreeModel( picoModel_t *model );
+int                                                    PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces );
+
+
+/* shader functions */
+picoShader_t                           *PicoNewShader( picoModel_t *model );
+void                                           PicoFreeShader( picoShader_t *shader );
+picoShader_t                           *PicoFindShader( picoModel_t *model, char *name, int caseSensitive );
+
+
+/* surface functions */
+picoSurface_t                          *PicoNewSurface( picoModel_t *model );
+void                                           PicoFreeSurface( picoSurface_t *surface );
+picoSurface_t                          *PicoFindSurface( picoModel_t *model, char *name, int caseSensitive );
+int                                                    PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals );
+
+
+/* setter functions */
+void                                           PicoSetModelName( picoModel_t *model, char *name );
+void                                           PicoSetModelFileName( picoModel_t *model, char *fileName );
+void                                           PicoSetModelFrameNum( picoModel_t *model, int frameNum );
+void                                           PicoSetModelNumFrames( picoModel_t *model, int numFrames );
+void                                           PicoSetModelData( picoModel_t *model, void *data );
+
+void                                           PicoSetShaderName( picoShader_t *shader, char *name );
+void                                           PicoSetShaderMapName( picoShader_t *shader, char *mapName );
+void                                           PicoSetShaderAmbientColor( picoShader_t *shader, picoColor_t color );
+void                                           PicoSetShaderDiffuseColor( picoShader_t *shader, picoColor_t color );
+void                                           PicoSetShaderSpecularColor( picoShader_t *shader, picoColor_t color );
+void                                           PicoSetShaderTransparency( picoShader_t *shader, float value );
+void                                           PicoSetShaderShininess( picoShader_t *shader, float value );
+
+void                                           PicoSetSurfaceData( picoSurface_t *surface, void *data );
+void                                           PicoSetSurfaceType( picoSurface_t *surface, picoSurfaceType_t type );
+void                                           PicoSetSurfaceName( picoSurface_t *surface, char *name );
+void                                           PicoSetSurfaceShader( picoSurface_t *surface, picoShader_t *shader );
+void                                           PicoSetSurfaceXYZ( picoSurface_t *surface, int num, picoVec3_t xyz );
+void                                           PicoSetSurfaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
+void                                           PicoSetSurfaceST( picoSurface_t *surface, int array, int num, picoVec2_t st );
+void                                           PicoSetSurfaceColor( picoSurface_t *surface, int array, int num, picoColor_t color );
+void                                           PicoSetSurfaceIndex( picoSurface_t *surface, int num, picoIndex_t index );
+void                                           PicoSetSurfaceIndexes( picoSurface_t *surface, int num, picoIndex_t *index, int count );
+void                                           PicoSetFaceNormal( picoSurface_t *surface, int num, picoVec3_t normal );
+void                                           PicoSetSurfaceSpecial( picoSurface_t *surface, int num, int special );
+
+
+/* getter functions */
+char                                           *PicoGetModelName( picoModel_t *model );
+char                                           *PicoGetModelFileName( picoModel_t *model );
+int                                                    PicoGetModelFrameNum( picoModel_t *model );
+int                                                    PicoGetModelNumFrames( picoModel_t *model );
+void                                           *PicoGetModelData( picoModel_t *model );
+int                                            PicoGetModelNumShaders( picoModel_t *model );
+picoShader_t                           *PicoGetModelShader( picoModel_t *model, int num );     /* sea */
+int                                                    PicoGetModelNumSurfaces( picoModel_t *model );
+picoSurface_t                          *PicoGetModelSurface( picoModel_t *model, int num );
+int                                            PicoGetModelTotalVertexes( picoModel_t *model );
+int                                            PicoGetModelTotalIndexes( picoModel_t *model );
+
+char                                           *PicoGetShaderName( picoShader_t *shader );
+char                                           *PicoGetShaderMapName( picoShader_t *shader );
+picoByte_t                                     *PicoGetShaderAmbientColor( picoShader_t *shader );
+picoByte_t                                     *PicoGetShaderDiffuseColor( picoShader_t *shader );
+picoByte_t                                     *PicoGetShaderSpecularColor( picoShader_t *shader );
+float                                          PicoGetShaderTransparency( picoShader_t *shader );
+float                                          PicoGetShaderShininess( picoShader_t *shader );
+
+void                                           *PicoGetSurfaceData( picoSurface_t *surface );
+char                                           *PicoGetSurfaceName( picoSurface_t *surface );          /* sea */
+picoSurfaceType_t                      PicoGetSurfaceType( picoSurface_t *surface );
+char                                           *PicoGetSurfaceName( picoSurface_t *surface );
+picoShader_t                           *PicoGetSurfaceShader( picoSurface_t *surface );        /* sea */
+
+int                                                    PicoGetSurfaceNumVertexes( picoSurface_t *surface );
+picoVec_t                                      *PicoGetSurfaceXYZ( picoSurface_t *surface, int num );
+picoVec_t                                      *PicoGetSurfaceNormal( picoSurface_t *surface, int num );
+picoVec_t                                      *PicoGetSurfaceST( picoSurface_t *surface, int array, int num );
+picoByte_t                                     *PicoGetSurfaceColor( picoSurface_t *surface, int array, int num );
+int                                                    PicoGetSurfaceNumIndexes( picoSurface_t *surface );
+picoIndex_t                                    PicoGetSurfaceIndex( picoSurface_t *surface, int num );
+picoIndex_t                                    *PicoGetSurfaceIndexes( picoSurface_t *surface, int num );
+picoVec_t                                      *PicoGetFaceNormal( picoSurface_t *surface, int num );
+int                                                    PicoGetSurfaceSpecial( picoSurface_t *surface, int num );
+
+
+/* hashtable related functions */
+typedef struct picoVertexCombinationData_s
+{
+       picoVec3_t      xyz, normal;
+       picoVec2_t      st;
+       picoColor_t     color;
+} picoVertexCombinationData_t;
+
+typedef struct picoVertexCombinationHash_s
+{
+       picoVertexCombinationData_t     vcd;
+       picoIndex_t                                     index;
+
+       void                                            *data;
+
+       struct picoVertexCombinationHash_s      *next;
+} picoVertexCombinationHash_t;
+
+int                                                    PicoGetHashTableSize( void );
+unsigned int                           PicoVertexCoordGenerateHash( picoVec3_t xyz );
+picoVertexCombinationHash_t    **PicoNewVertexCombinationHashTable( void );
+void                                           PicoFreeVertexCombinationHashTable( picoVertexCombinationHash_t **hashTable );
+picoVertexCombinationHash_t    *PicoFindVertexCombinationInHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color );
+picoVertexCombinationHash_t *PicoAddVertexCombinationToHashTable( picoVertexCombinationHash_t **hashTable, picoVec3_t xyz, picoVec3_t normal, picoVec3_t st, picoColor_t color, picoIndex_t index );
+
+/* specialized functions */
+int                                                    PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color );
+void                                           PicoFixSurfaceNormals( picoSurface_t *surface );
+int                                                    PicoRemapModel( picoModel_t *model, char *remapFile );
+
+
+void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader );
+
+/* end marker */
+#ifdef __cplusplus
+}
+#endif
+
+#endif