/* ==================== R_RegisterMDR ==================== */ qhandle_t R_RegisterMDR(const char *name, model_t *mod) { union { unsigned *u; void *v; } buf; int ident; qboolean loaded = qfalse; int filesize; filesize = ri.FS_ReadFile(name, (void **) &buf.v); if(!buf.u) { mod->type = MOD_BAD; return 0; } ident = LittleLong(*(unsigned *)buf.u); if(ident == MDR_IDENT) loaded = R_LoadMDR(mod, buf.u, filesize, name); ri.FS_FreeFile (buf.v); if(!loaded) { ri.Printf(PRINT_WARNING,"R_RegisterMDR: couldn't load mdr file %s\n", name); mod->type = MOD_BAD; return 0; } return mod->index; }
/* ==================== R_RegisterMDR ==================== */ qhandle_t R_RegisterMDR(const char *name, model_t *mod) { int ident; bool loaded = false; byte *buffer; int filesize = og::FS->LoadFile( name, &buffer ); if(!buffer) { mod->type = MOD_BAD; return 0; } ident = LittleLong(*(unsigned *)buffer); if(ident == MDR_IDENT) loaded = R_LoadMDR(mod, buffer, filesize, name); og::FS->FreeFile( buffer ); if(!loaded) { ri->Printf(PRINT_WARNING,"R_RegisterMDR: couldn't load mdr file %s\n", name); mod->type = MOD_BAD; return 0; } return mod->index; }
/* ==================== RE_RegisterModel Loads in a model for the given name Zero will be returned if the model fails to load. An entry will be retained for failed models as an optimization to prevent disk rescanning if they are asked for again. ==================== */ qhandle_t RE_RegisterModel( const char *name ) { model_t *mod; unsigned *buf; int lod; int ident; qboolean loaded = qfalse; qhandle_t hModel; int numLoaded; char *fext, defex[] = "md3", filename[MAX_QPATH], namebuf[MAX_QPATH+20]; if ( !name || !name[0] ) { ri.Printf( PRINT_ALL, "RE_RegisterModel: NULL name\n" ); return 0; } if ( strlen( name ) >= MAX_QPATH ) { ri.Printf( PRINT_WARNING, "Model name exceeds MAX_QPATH\n" ); return 0; } // // search the currently loaded models // for ( hModel = 1 ; hModel < tr.numModels; hModel++ ) { mod = tr.models[hModel]; if ( !strcmp( mod->name, name ) ) { if( mod->type == MOD_BAD ) { return 0; } return hModel; } } // allocate a new model_t if ( ( mod = R_AllocModel() ) == NULL ) { ri.Printf( PRINT_WARNING, "RE_RegisterModel: R_AllocModel() failed for '%s'\n", name); return 0; } // only set the name after the model has been successfully loaded strlcpy( mod->name, name, sizeof( mod->name ) ); // make sure the render thread is stopped R_SyncRenderThread(); mod->numLods = 0; // // load the files // numLoaded = 0; strcpy(filename, name); fext = strchr(filename, '.'); if(!fext) fext = defex; else { *fext = '\0'; fext++; } #ifdef RAVENMD4 if(!Q_stricmp(fext, "mdr")) { int filesize; filesize = ri.FS_ReadFile(name, (void **) &buf); if(!buf) { ri.Printf (PRINT_WARNING,"RE_RegisterModel: couldn't load %s\n", name); mod->type = MOD_BAD; return 0; } ident = LittleLong(*(unsigned *)buf); if(ident == MDR_IDENT) loaded = R_LoadMDR(mod, buf, filesize, name); ri.FS_FreeFile (buf); if(!loaded) { ri.Printf(PRINT_WARNING,"RE_RegisterModel: couldn't load mdr file %s\n", name); mod->type = MOD_BAD; return 0; } return mod->index; } #endif fext = defex; for ( lod = MD3_MAX_LODS - 1 ; lod >= 0 ; lod-- ) { if ( lod ) snprintf(namebuf, sizeof(namebuf), "%s_%d.%s", filename, lod, fext); else snprintf(namebuf, sizeof(namebuf), "%s.%s", filename, fext); ri.FS_ReadFile( namebuf, (void **)&buf ); if ( !buf ) { continue; } loadmodel = mod; ident = LittleLong(*(unsigned *)buf); if ( ident == MD4_IDENT ) { loaded = R_LoadMD4( mod, buf, name ); } else { if ( ident != MD3_IDENT ) { ri.Printf (PRINT_WARNING,"RE_RegisterModel: unknown fileid for %s\n", name); goto fail; } loaded = R_LoadMD3( mod, lod, buf, name ); } ri.FS_FreeFile (buf); if ( !loaded ) { if ( lod == 0 ) { goto fail; } else { break; } } else { mod->numLods++; numLoaded++; // if we have a valid model and are biased // so that we won't see any higher detail ones, // stop loading them // if ( lod <= r_lodbias->value ) { // break; // } } } if ( numLoaded ) { // duplicate into higher lod spots that weren't // loaded, in case the user changes r_lodbias on the fly for ( lod-- ; lod >= 0 ; lod-- ) { mod->numLods++; mod->md3[lod] = mod->md3[lod+1]; } return mod->index; } #ifdef _DEBUG else { ri.Printf (PRINT_WARNING,"RE_RegisterModel: couldn't load %s\n", name); } #endif fail: // we still keep the model_t around, so if the model name is asked for // again, we won't bother scanning the filesystem mod->type = MOD_BAD; return 0; }