/* ================= Loads any of the supported image types into a cannonical 32 bit format. ================= */ void R_LoadImage( const char *shortname, byte **pic, int *width, int *height ) { *pic = NULL; *width = 0; *height = 0; // Try loading the image with the original extension (if possible). const char *extension = COM_GetExtension (shortname); const ImageLoaderMap *imageLoader = FindImageLoader (extension); if ( imageLoader != NULL ) { imageLoader->loader (shortname, pic, width, height); if ( *pic ) { return; } } // Loop through all the image loaders trying to load this image. char extensionlessName[MAX_QPATH]; COM_StripExtension(shortname, extensionlessName, sizeof( extensionlessName )); for ( int i = 0; i < numImageLoaders; i++ ) { const ImageLoaderMap *tryLoader = &imageLoaders[i]; if ( tryLoader == imageLoader ) { // Already tried this one. continue; } const char *name = va ("%s.%s", extensionlessName, tryLoader->extension); tryLoader->loader (name, pic, width, height); if ( *pic ) { return; } } }
/* ==================== 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; qhandle_t hModel; qboolean orgNameFailed = qfalse; int orgLoader = -1; int i; char localName[ MAX_QPATH ]; const char *ext; char altName[ MAX_QPATH ]; if ( !name || !name[0] ) { ri.Printf( PRINT_ALL, "RE_RegisterModel: NULL name\n" ); return 0; } if ( strlen( name ) >= MAX_QPATH ) { ri.Printf( PRINT_ALL, "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 Q_strncpyz( mod->name, name, sizeof( mod->name ) ); R_IssuePendingRenderCommands(); mod->type = MOD_BAD; mod->numLods = 0; // // load the files // Q_strncpyz( localName, name, MAX_QPATH ); ext = COM_GetExtension( localName ); if( *ext ) { // Look for the correct loader and use it for( i = 0; i < numModelLoaders; i++ ) { if( !Q_stricmp( ext, modelLoaders[ i ].ext ) ) { // Load hModel = modelLoaders[ i ].ModelLoader( localName, mod ); break; } } // A loader was found if( i < numModelLoaders ) { if( !hModel ) { // Loader failed, most likely because the file isn't there; // try again without the extension orgNameFailed = qtrue; orgLoader = i; COM_StripExtension( name, localName, MAX_QPATH ); } else { // Something loaded return mod->index; } } } // Try and find a suitable match using all // the model formats supported for( i = 0; i < numModelLoaders; i++ ) { if (i == orgLoader) continue; Com_sprintf( altName, sizeof (altName), "%s.%s", localName, modelLoaders[ i ].ext ); // Load hModel = modelLoaders[ i ].ModelLoader( altName, mod ); if( hModel ) { if( orgNameFailed ) { ri.Printf( PRINT_DEVELOPER, "WARNING: %s not present, using %s instead\n", name, altName ); } break; } } return hModel; }
/* ======================================================================================================================================= S_CodecGetSound Opens/loads a sound, tries codec based on the sound's file extension then tries all supported codecs. ======================================================================================================================================= */ static void *S_CodecGetSound(const char *filename, snd_info_t *info) { snd_codec_t *codec; snd_codec_t *orgCodec = NULL; qboolean orgNameFailed = qfalse; char localName[MAX_QPATH]; const char *ext; char altName[MAX_QPATH]; void *rtn = NULL; Q_strncpyz(localName, filename, MAX_QPATH); ext = COM_GetExtension(localName); if (*ext) { // Look for the correct loader and use it for (codec = codecs; codec; codec = codec->next) { if (!Q_stricmp(ext, codec->ext)) { // Load if (info) { rtn = codec->load(localName, info); } else { rtn = codec->open(localName); } break; } } // A loader was found if (codec) { if (!rtn) { // Loader failed, most likely because the file isn't there; try again without the extension orgNameFailed = qtrue; orgCodec = codec; COM_StripExtension(filename, localName, MAX_QPATH); } else { // Something loaded return rtn; } } } // Try and find a suitable match using all the sound codecs supported for (codec = codecs; codec; codec = codec->next) { if (codec == orgCodec) { continue; } Com_sprintf(altName, sizeof(altName), "%s.%s", localName, codec->ext); // Load if (info) { rtn = codec->load(altName, info); } else { rtn = codec->open(altName); } if (rtn) { if (orgNameFailed) { Com_DPrintf(S_COLOR_YELLOW "WARNING: %s not present, using %s instead\n", filename, altName); } return rtn; } } // Com_Printf(S_COLOR_YELLOW "WARNING: Failed to %s sound %s!\n", info ? "load" : "open", filename); return NULL; }