]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel/pm_md3.c
Merge commit 'ff48e71434a414958e6e56628ccf04284d030784' into master-merge
[xonotic/netradiant.git] / libs / picomodel / pm_md3.c
index 94f7a8f45dc1321e41eb94d0c53e1a51100be89c..1b93c7b4d93b2fe875638332fc32510df88a2cda 100644 (file)
 
    ----------------------------------------------------------------------------- */
 
-
-
-/* marker */
-#define PM_MD3_C
-
-
-
 /* dependencies */
 #include "picointernal.h"
 
 
 
 /* md3 model format */
-#define MD3_MAGIC           "IDP3"
-#define MD3_VERSION         15
+const char *MD3_MAGIC = "IDP3";
+const int MD3_VERSION = 15;
 
 /* md3 vertex scale */
-#define MD3_SCALE         ( 1.0f / 64.0f )
+const float MD3_SCALE = ( 1.0f / 64.0f );
 
 /* md3 model frame information */
 typedef struct md3Frame_s
@@ -144,22 +137,19 @@ md3_t;
  */
 
 static int _md3_canload( PM_PARAMS_CANLOAD ){
-       md3_t   *md3;
-
+       const md3_t *md3;
 
-       /* to keep the compiler happy */
-       *fileName = *fileName;
 
        /* sanity check */
-       if ( bufSize < ( sizeof( *md3 ) * 2 ) ) {
+       if ( (size_t) bufSize < ( sizeof( *md3 ) * 2 ) ) {
                return PICO_PMV_ERROR_SIZE;
        }
 
        /* set as md3 */
-       md3 = (md3_t*) buffer;
+       md3 = (const md3_t*) buffer;
 
        /* check md3 magic */
-       if ( *( (int*) md3->magic ) != *( (int*) MD3_MAGIC ) ) {
+       if ( *( (const int*) md3->magic ) != *( (const int*) MD3_MAGIC ) ) {
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -181,7 +171,7 @@ static int _md3_canload( PM_PARAMS_CANLOAD ){
 
 static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
        int i, j;
-       picoByte_t      *bb;
+       picoByte_t      *bb, *bb0;
        md3_t           *md3;
        md3Surface_t    *surface;
        md3Shader_t     *shader;
@@ -196,7 +186,6 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
        picoShader_t    *picoShader;
        picoVec3_t xyz, normal;
        picoVec2_t st;
-       picoColor_t color;
 
 
        /* -------------------------------------------------
@@ -205,12 +194,14 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
 
 
        /* set as md3 */
-       bb = (picoByte_t*) buffer;
-       md3 = (md3_t*) buffer;
+       bb0 = bb = (picoByte_t*) _pico_alloc( bufSize );
+       memcpy( bb, buffer, bufSize );
+       md3 = (md3_t*) bb;
 
        /* check ident and version */
        if ( *( (int*) md3->magic ) != *( (int*) MD3_MAGIC ) || _pico_little_long( md3->version ) != MD3_VERSION ) {
                /* not an md3 file (todo: set error) */
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -228,11 +219,13 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
        /* do frame check */
        if ( md3->numFrames < 1 ) {
                _pico_printf( PICO_ERROR, "MD3 with 0 frames" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( frameNum < 0 || frameNum >= md3->numFrames ) {
                _pico_printf( PICO_ERROR, "Invalid or out-of-range MD3 frame specified" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -305,6 +298,7 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
        picoModel = PicoNewModel();
        if ( picoModel == NULL ) {
                _pico_printf( PICO_ERROR, "Unable to allocate a new model" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -325,6 +319,7 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
                if ( picoSurface == NULL ) {
                        _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" );
                        PicoFreeModel( picoModel ); /* sea */
+                       _pico_free( bb0 );
                        return NULL;
                }
 
@@ -339,12 +334,13 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
                if ( picoShader == NULL ) {
                        _pico_printf( PICO_ERROR, "Unable to allocate a new model shader" );
                        PicoFreeModel( picoModel );
+                       _pico_free( bb0 );
                        return NULL;
                }
 
                /* detox and set shader name */
                shader = (md3Shader_t*) ( (picoByte_t*) surface + surface->ofsShaders );
-               _pico_setfext( shader->name, "" );
+               _pico_setfext( shader->name, NULL );
                _pico_unixify( shader->name );
                PicoSetShaderName( picoShader, shader->name );
 
@@ -364,7 +360,6 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
                /* copy vertexes */
                texCoord = (md3TexCoord_t*) ( (picoByte_t *) surface + surface->ofsSt );
                vertex = (md3Vertex_t*) ( (picoByte_t*) surface + surface->ofsVertexes + surface->numVerts * frameNum * sizeof( md3Vertex_t ) );
-               _pico_set_color( color, 255, 255, 255, 255 );
 
                for ( j = 0; j < surface->numVerts; j++, texCoord++, vertex++ )
                {
@@ -390,7 +385,7 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
                        PicoSetSurfaceST( picoSurface, 0, j, st );
 
                        /* set color */
-                       PicoSetSurfaceColor( picoSurface, 0, j, color );
+                       PicoSetSurfaceColor( picoSurface, 0, j, picoColor_white );
                }
 
                /* get next surface */
@@ -398,6 +393,7 @@ static picoModel_t *_md3_load( PM_PARAMS_LOAD ){
        }
 
        /* return the new pico model */
+       _pico_free( bb0 );
        return picoModel;
 }