X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fpicomodel%2Fpm_ms3d.c;h=1472de549e0d128eb31c1152ea965a780acd0557;hb=ba54332d190b19c00bb8f15ee7d7b7634221646d;hp=8626beedddf407976c1fe9df9752abba2d8a26a3;hpb=231225d6f97d0b926b2e896e5783cccfbc7c5619;p=xonotic%2Fnetradiant.git diff --git a/libs/picomodel/pm_ms3d.c b/libs/picomodel/pm_ms3d.c index 8626beed..1472de54 100644 --- a/libs/picomodel/pm_ms3d.c +++ b/libs/picomodel/pm_ms3d.c @@ -1,47 +1,43 @@ /* ----------------------------------------------------------------------------- -PicoModel Library + PicoModel Library -Copyright (c) 2002, Randy Reddig & seaw0lf -All rights reserved. + 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: + 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 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. + 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. + 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. + 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 */ -#define PM_MS3D_C + ----------------------------------------------------------------------------- */ /* dependencies */ #include "picointernal.h" +#include "globaldefs.h" /* disable warnings */ -#ifdef WIN32 +#if GDEF_COMPILER_MSVC #pragma warning( disable:4100 ) /* unref param */ #endif @@ -55,22 +51,19 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define DEBUG_PM_MS3D #define DEBUG_PM_MS3D_EX -/* plain white */ -static picoColor_t white = { 255,255,255,255 }; - /* ms3d limits */ -#define MS3D_MAX_VERTS 8192 -#define MS3D_MAX_TRIS 16384 -#define MS3D_MAX_GROUPS 128 -#define MS3D_MAX_MATERIALS 128 -#define MS3D_MAX_JOINTS 128 -#define MS3D_MAX_KEYFRAMES 216 +const int MS3D_MAX_VERTS = 8192; +const int MS3D_MAX_TRIS = 16384; +const int MS3D_MAX_GROUPS = 128; +const int MS3D_MAX_MATERIALS = 128; +const int MS3D_MAX_JOINTS = 128; +const int MS3D_MAX_KEYFRAMES = 216; /* ms3d flags */ -#define MS3D_SELECTED 1 -#define MS3D_HIDDEN 2 -#define MS3D_SELECTED2 4 -#define MS3D_DIRTY 8 +const int MS3D_SELECTED = 1; +const int MS3D_HIDDEN = 2; +const int MS3D_SELECTED2 = 4; +const int MS3D_DIRTY = 8; /* this freaky loader needs byte alignment */ #pragma pack(push, 1) @@ -78,47 +71,47 @@ static picoColor_t white = { 255,255,255,255 }; /* ms3d header */ typedef struct SMsHeader { - char magic[10]; - int version; + char magic[10]; + int version; } TMsHeader; /* ms3d vertex */ typedef struct SMsVertex { - unsigned char flags; /* sel, sel2, or hidden */ - float xyz[3]; - char boneID; /* -1 means 'no bone' */ - unsigned char refCount; + unsigned char flags; /* sel, sel2, or hidden */ + float xyz[3]; + char boneID; /* -1 means 'no bone' */ + unsigned char refCount; } TMsVertex; /* ms3d triangle */ typedef struct SMsTriangle { - unsigned short flags; /* sel, sel2, or hidden */ - unsigned short vertexIndices[3]; - float vertexNormals[3][3]; - float s[3]; - float t[3]; - unsigned char smoothingGroup; /* 1 - 32 */ - unsigned char groupIndex; + unsigned short flags; /* sel, sel2, or hidden */ + unsigned short vertexIndices[3]; + float vertexNormals[3][3]; + float s[3]; + float t[3]; + unsigned char smoothingGroup; /* 1 - 32 */ + unsigned char groupIndex; } TMsTriangle; /* ms3d material */ typedef struct SMsMaterial { - char name[32]; - float ambient[4]; - float diffuse[4]; - float specular[4]; - float emissive[4]; - float shininess; /* range 0..128 */ - float transparency; /* range 0..1 */ - unsigned char mode; - char texture [128]; /* texture.bmp */ - char alphamap[128]; /* alpha.bmp */ + char name[32]; + float ambient[4]; + float diffuse[4]; + float specular[4]; + float emissive[4]; + float shininess; /* range 0..128 */ + float transparency; /* range 0..1 */ + unsigned char mode; + char texture [128]; /* texture.bmp */ + char alphamap[128]; /* alpha.bmp */ } TMsMaterial; @@ -126,34 +119,34 @@ TMsMaterial; // followed by a variable size block (see below) typedef struct SMsGroup { - unsigned char flags; // sel, hidden - char name[32]; - unsigned short numTriangles; + unsigned char flags; // sel, hidden + char name[32]; + unsigned short numTriangles; /* - unsigned short triangleIndices[ numTriangles ]; - char materialIndex; // -1 means 'no material' -*/ + unsigned short triangleIndices[ numTriangles ]; + char materialIndex; // -1 means 'no material' + */ } TMsGroup; // ms3d joint typedef struct SMsJoint { - unsigned char flags; - char name[32]; - char parentName[32]; - float rotation[3]; - float translation[3]; - unsigned short numRotationKeyframes; - unsigned short numTranslationKeyframes; + unsigned char flags; + char name[32]; + char parentName[32]; + float rotation[3]; + float translation[3]; + unsigned short numRotationKeyframes; + unsigned short numTranslationKeyframes; } TMsJoint; // ms3d keyframe typedef struct SMsKeyframe { - float time; - float parameter[3]; + float time; + float parameter[3]; } TMsKeyframe; @@ -163,26 +156,26 @@ TMsKeyframe; /* _ms3d_canload: * validates a milkshape3d model file. */ -static int _ms3d_canload( PM_PARAMS_CANLOAD ) -{ +static int _ms3d_canload( PM_PARAMS_CANLOAD ){ const TMsHeader *hdr; - - + + /* sanity check */ - if ((size_t) bufSize < sizeof(TMsHeader)) + if ( (size_t) bufSize < sizeof( TMsHeader ) ) { return PICO_PMV_ERROR_SIZE; + } /* get ms3d header */ hdr = (const TMsHeader *)buffer; /* check ms3d magic */ - if (strncmp(hdr->magic,"MS3D000000",10) != 0) + if ( strncmp( hdr->magic,"MS3D000000",10 ) != 0 ) { return PICO_PMV_ERROR_IDENT; + } /* check ms3d version */ - if (_pico_little_long(hdr->version) < 3 || - _pico_little_long(hdr->version) > 4) - { + if ( _pico_little_long( hdr->version ) < 3 || + _pico_little_long( hdr->version ) > 4 ) { _pico_printf( PICO_ERROR,"MS3D file ignored. Only MS3D 1.3 and 1.4 is supported." ); return PICO_PMV_ERROR_VERSION; } @@ -190,53 +183,55 @@ static int _ms3d_canload( PM_PARAMS_CANLOAD ) return PICO_PMV_OK; } -static unsigned char *GetWord( unsigned char *bufptr, int *out ) -{ - if (bufptr == NULL) return NULL; +static unsigned char *GetWord( unsigned char *bufptr, int *out ){ + if ( bufptr == NULL ) { + return NULL; + } *out = _pico_little_short( *(unsigned short *)bufptr ); return( bufptr + 2 ); } /* _ms3d_load: * loads a milkshape3d model file. -*/ -static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ) -{ - picoModel_t *model; + */ +static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ){ + picoModel_t *model; unsigned char *bufptr, *bufptr0; - int shaderRefs[ MS3D_MAX_GROUPS ]; - int numGroups; - int numMaterials; + int shaderRefs[ MS3D_MAX_GROUPS ]; + int numGroups; + int numMaterials; // unsigned char *ptrToGroups; - int numVerts; + int numVerts; unsigned char *ptrToVerts; - int numTris; + int numTris; unsigned char *ptrToTris; - int i,k,m; + int i,k,m; /* create new pico model */ model = PicoNewModel(); - if (model == NULL) return NULL; + if ( model == NULL ) { + return NULL; + } /* do model setup */ PicoSetModelFrameNum( model, frameNum ); PicoSetModelName( model, fileName ); PicoSetModelFileName( model, fileName ); - bufptr0 = bufptr = (picoByte_t*) _pico_alloc(bufSize); - memcpy(bufptr, buffer, bufSize); + bufptr0 = bufptr = (picoByte_t*) _pico_alloc( bufSize ); + memcpy( bufptr, buffer, bufSize ); /* skip header */ - bufptr += sizeof(TMsHeader); + bufptr += sizeof( TMsHeader ); /* get number of vertices */ bufptr = GetWord( bufptr,&numVerts ); ptrToVerts = bufptr; #ifdef DEBUG_PM_MS3D - printf("NumVertices: %d\n",numVerts); + printf( "NumVertices: %d\n",numVerts ); #endif /* swap verts */ - for (i=0; ixyz[ 2 ] = _pico_little_float( vertex->xyz[ 2 ] ); #ifdef DEBUG_PM_MS3D_EX_ - printf("Vertex: x: %f y: %f z: %f\n", - msvd[i]->vertex[0], - msvd[i]->vertex[1], - msvd[i]->vertex[2]); + printf( "Vertex: x: %f y: %f z: %f\n", + msvd[i]->vertex[0], + msvd[i]->vertex[1], + msvd[i]->vertex[2] ); #endif } /* get number of triangles */ @@ -258,10 +253,10 @@ static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ) ptrToTris = bufptr; #ifdef DEBUG_PM_MS3D - printf("NumTriangles: %d\n",numTris); + printf( "NumTriangles: %d\n",numTris ); #endif /* swap tris */ - for (i=0; iflags = _pico_little_short( triangle->flags ); /* run through all tri verts */ - for (k=0; k<3; k++) + for ( k = 0; k < 3; k++ ) { /* swap tex coords */ triangle->s[ k ] = _pico_little_float( triangle->s[ k ] ); @@ -283,11 +278,10 @@ static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ) triangle->vertexNormals[ 2 ][ k ] = _pico_little_float( triangle->vertexNormals[ 2 ][ k ] ); /* check for out of range indices */ - if (triangle->vertexIndices[ k ] >= numVerts) - { - _pico_printf( PICO_ERROR,"Vertex %d index %d out of range (%d, max %d)",i,k,triangle->vertexIndices[k],numVerts-1); + if ( triangle->vertexIndices[ k ] >= numVerts ) { + _pico_printf( PICO_ERROR,"Vertex %d index %d out of range (%d, max %d)",i,k,triangle->vertexIndices[k],numVerts - 1 ); PicoFreeModel( model ); - _pico_free(bufptr0); + _pico_free( bufptr0 ); return NULL; /* yuck */ } } @@ -297,21 +291,20 @@ static picoModel_t *_ms3d_load( PM_PARAMS_LOAD ) // ptrToGroups = bufptr; #ifdef DEBUG_PM_MS3D - printf("NumGroups: %d\n",numGroups); + printf( "NumGroups: %d\n",numGroups ); #endif /* run through all groups in model */ - for (i=0; i