/* * R_BeginLoading * * Loads the specified level after resetting all model data. */ void R_BeginLoading(const char *bsp_name, int bsp_size) { R_FreeModels(); // free all models // load bsp for collision detection (prediction) if (!Com_WasInit(Q2W_SERVER)) { int bs; Cm_LoadBsp(bsp_name, &bs); if (bs != bsp_size) { Com_Error(ERR_DROP, "Local map version differs from server: " "%i != %i.", bs, bsp_size); } } // then load materials R_LoadMaterials(bsp_name); // finally load the bsp for rendering (surface arrays) r_world_model = R_LoadModel(bsp_name); }
/* * @brief Loads the model by the specified name. */ r_model_t *R_LoadModel(const char *name) { r_model_t *mod; char key[MAX_QPATH]; size_t i; if (!name || !name[0]) { Com_Error(ERR_DROP, "R_LoadModel: NULL name\n"); } if (*name == '*') { g_snprintf(key, sizeof(key), "%s#%s", r_model_state.world->media.name, name + 1); } else { StripExtension(name, key); } if (!(mod = (r_model_t *) R_FindMedia(key))) { void *buf; const r_model_format_t *format = r_model_formats; for (i = 0; i < lengthof(r_model_formats); i++, format++) { StripExtension(name, key); strcat(key, format->extension); if (Fs_Load(key, &buf) != -1) break; } if (i == lengthof(r_model_formats)) { // not found if (strstr(name, "players/")) { Com_Debug("Failed to load player %s\n", name); } else { Com_Warn("Failed to load %s\n", name); } return NULL; } StripExtension(name, key); mod = (r_model_t *) R_AllocMedia(key, sizeof(r_model_t)); mod->media.Register = R_RegisterModel; mod->media.Free = R_FreeModel; mod->type = format->type; // load the materials first, so that we can resolve surfaces lists R_LoadMaterials(mod); // load it format->Load(mod, buf); // free the file Fs_Free(buf); // assemble vertex buffer objects from static arrays R_LoadVertexBuffers(mod); // calculate an approximate radius from the bounding box vec3_t tmp; VectorSubtract(mod->maxs, mod->mins, tmp); mod->radius = VectorLength(tmp) / 2.0; R_RegisterMedia((r_media_t *) mod); } return mod; }
static void R_ModEndLoading (const char *mapName) { R_EndBuildingLightmaps(); R_LoadMaterials(mapName); R_LoadSurfacesArrays(); }