]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/picomodel/pm_fm.c
Merge commit 'bf6dd1f2d186c799adf11f1e744a1ff57aa8d335' into garux-merge
[xonotic/netradiant.git] / libs / picomodel / pm_fm.c
index 9201e27e895a8d902f1209991d6a09e97b484c53..c4086184c317cf15547c4f42637dff9f9d32b85b 100644 (file)
@@ -36,9 +36,6 @@
    Nurail: Used pm_md3.c (Randy Reddig) as a template.
  */
 
-/* marker */
-#define PM_FM_C
-
 /* dependencies */
 #include "pm_fm.h"
 
@@ -65,10 +62,11 @@ typedef struct index_DUP_LUT_s
 // _fm_canload()
 static int _fm_canload( PM_PARAMS_CANLOAD ){
        fm_t fm;
-       unsigned char   *bb;
+       unsigned char   *bb, *bb0;
        int fm_file_pos;
 
-       bb = (unsigned char *) buffer;
+       bb0 = bb = (picoByte_t*) _pico_alloc( bufSize );
+       memcpy( bb, buffer, bufSize );
 
        // Header
        fm.fm_header_hdr = (fm_chunk_header_t *) bb;
@@ -80,6 +78,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Header Ident incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -88,6 +87,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Header Version incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_VERSION;
        }
 
@@ -101,6 +101,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Skin Ident incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -109,6 +110,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Skin Version incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_VERSION;
        }
 
@@ -122,6 +124,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM ST Ident incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -130,6 +133,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM ST Version incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_VERSION;
        }
 
@@ -143,6 +147,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Tri Ident incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -151,6 +156,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Tri Version incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_VERSION;
        }
 
@@ -164,6 +170,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Frame Ident incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_IDENT;
        }
 
@@ -172,6 +179,7 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 #ifdef FM_DBG
                _pico_printf( PICO_WARNING, "FM Frame Version incorrect\n" );
 #endif
+               _pico_free( bb0 );
                return PICO_PMV_ERROR_VERSION;
        }
 
@@ -185,7 +193,6 @@ static int _fm_canload( PM_PARAMS_CANLOAD ){
 static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        int i, j, dups, dup_index;
        int fm_file_pos;
-       short tot_numVerts;
        index_LUT_t     *p_index_LUT, *p_index_LUT2, *p_index_LUT3;
        index_DUP_LUT_t *p_index_LUT_DUPS;
 
@@ -199,7 +206,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        fm_xyz_st_t     *triangle;
        fm_frame_t      *frame;
 
-       picoByte_t      *bb;
+       picoByte_t      *bb, *bb0;
        picoModel_t *picoModel;
        picoSurface_t   *picoSurface;
        picoShader_t    *picoShader;
@@ -208,21 +215,21 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        picoColor_t color;
 
 
-       // fm loading
-       _pico_printf( PICO_NORMAL, "Loading \"%s\"", fileName );
-
-       bb = (picoByte_t*) buffer;
+       bb0 = bb = (picoByte_t*) _pico_alloc( bufSize );
+       memcpy( bb, buffer, bufSize );
 
        // Header Header
        fm.fm_header_hdr = (fm_chunk_header_t *) bb;
        fm_file_pos = sizeof( fm_chunk_header_t ) + fm.fm_header_hdr->size;
        if ( ( strcmp( fm.fm_header_hdr->ident, FM_HEADERCHUNKNAME ) )  ) {
                _pico_printf( PICO_WARNING, "FM Header Ident incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( _pico_little_long( fm.fm_header_hdr->version ) != FM_HEADERCHUNKVER ) {
                _pico_printf( PICO_WARNING, "FM Header Version incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -231,11 +238,13 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        fm_file_pos += sizeof( fm_chunk_header_t ) + fm.fm_skin_hdr->size;
        if ( ( strcmp( fm.fm_skin_hdr->ident, FM_SKINCHUNKNAME ) ) ) {
                _pico_printf( PICO_WARNING, "FM Skin Ident incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( _pico_little_long( fm.fm_skin_hdr->version ) != FM_SKINCHUNKVER ) {
                _pico_printf( PICO_WARNING, "FM Skin Version incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -244,11 +253,13 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        fm_file_pos += sizeof( fm_chunk_header_t ) + fm.fm_st_hdr->size;
        if ( ( strcmp( fm.fm_st_hdr->ident, FM_STCOORDCHUNKNAME ) ) ) {
                _pico_printf( PICO_WARNING, "FM ST Ident incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( _pico_little_long( fm.fm_st_hdr->version ) != FM_STCOORDCHUNKVER ) {
                _pico_printf( PICO_WARNING, "FM ST Version incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -257,11 +268,13 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        fm_file_pos += sizeof( fm_chunk_header_t ) + fm.fm_tri_hdr->size;
        if ( ( strcmp( fm.fm_tri_hdr->ident, FM_TRISCHUNKNAME ) ) ) {
                _pico_printf( PICO_WARNING, "FM Tri Ident incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( _pico_little_long( fm.fm_tri_hdr->version ) != FM_TRISCHUNKVER ) {
                _pico_printf( PICO_WARNING, "FM Tri Version incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -270,11 +283,13 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        fm_file_pos += sizeof( fm_chunk_header_t );
        if ( ( strcmp( fm.fm_frame_hdr->ident, FM_FRAMESCHUNKNAME ) ) ) {
                _pico_printf( PICO_WARNING, "FM Frame Ident incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( _pico_little_long( fm.fm_frame_hdr->version ) != FM_FRAMESCHUNKVER ) {
                _pico_printf( PICO_WARNING, "FM Frame Version incorrect\n" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -305,11 +320,13 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        // do frame check
        if ( fm_head->numFrames < 1 ) {
                _pico_printf( PICO_ERROR, "%s has 0 frames!", fileName );
+               _pico_free( bb0 );
                return NULL;
        }
 
        if ( frameNum < 0 || frameNum >= fm_head->numFrames ) {
                _pico_printf( PICO_ERROR, "Invalid or out-of-range FM frame specified" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -350,7 +367,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
                texCoord->t = _pico_little_short( texCoord[i].t );
        }
        // set Skin Name
-       strncpy( skinname, (unsigned char *) fm.fm_skin, FM_SKINPATHSIZE );
+       strncpy( skinname, (const char *) fm.fm_skin, FM_SKINPATHSIZE );
 
 #ifdef FM_VERBOSE_DBG
        // Print out md2 values
@@ -365,6 +382,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        picoModel = PicoNewModel();
        if ( picoModel == NULL ) {
                _pico_printf( PICO_ERROR, "Unable to allocate a new model" );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -379,6 +397,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        if ( picoSurface == NULL ) {
                _pico_printf( PICO_ERROR, "Unable to allocate a new model surface" );
                PicoFreeModel( picoModel );
+               _pico_free( bb0 );
                return NULL;
        }
 
@@ -389,6 +408,7 @@ static picoModel_t *_fm_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;
        }
 
@@ -407,7 +427,6 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        }
 
        // Fill in Look Up Table, and allocate/fill Linked List from vert array as needed for dup STs per Vert.
-       tot_numVerts = fm_head->numXYZ;
        dups = 0;
        triangle = tri_verts;
 
@@ -619,6 +638,7 @@ static picoModel_t *_fm_load( PM_PARAMS_LOAD ){
        _pico_free( p_index_LUT_DUPS );
 
        /* return the new pico model */
+       _pico_free( bb0 );
        return picoModel;
 
 }