Nurail: Used pm_md3.c (Randy Reddig) as a template.
*/
-/* marker */
-#define PM_FM_C
-
/* dependencies */
#include "pm_fm.h"
// _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;
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Header Ident incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_IDENT;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Header Version incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_VERSION;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Skin Ident incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_IDENT;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Skin Version incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_VERSION;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM ST Ident incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_IDENT;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM ST Version incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_VERSION;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Tri Ident incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_IDENT;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Tri Version incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_VERSION;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Frame Ident incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_IDENT;
}
#ifdef FM_DBG
_pico_printf( PICO_WARNING, "FM Frame Version incorrect\n" );
#endif
+ _pico_free( bb0 );
return PICO_PMV_ERROR_VERSION;
}
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;
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;
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;
}
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;
}
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;
}
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;
}
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;
}
// 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;
}
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
picoModel = PicoNewModel();
if ( picoModel == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model" );
+ _pico_free( bb0 );
return NULL;
}
if ( picoSurface == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model surface" );
PicoFreeModel( picoModel );
+ _pico_free( bb0 );
return NULL;
}
if ( picoShader == NULL ) {
_pico_printf( PICO_ERROR, "Unable to allocate a new model shader" );
PicoFreeModel( picoModel );
+ _pico_free( bb0 );
return NULL;
}
}
// 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;
_pico_free( p_index_LUT_DUPS );
/* return the new pico model */
+ _pico_free( bb0 );
return picoModel;
}