/* * R_LoadBspSubmodels */ static void R_LoadBspSubmodels(const d_bsp_lump_t *l) { const d_bsp_model_t *in; r_bsp_submodel_t *out; int i, j, count; in = (const void *) (mod_base + l->file_ofs); if (l->file_len % sizeof(*in)) { Com_Error(ERR_DROP, "R_LoadBspSubmodels: Funny lump size in %s.", r_load_model->name); } count = l->file_len / sizeof(*in); out = R_HunkAlloc(count * sizeof(*out)); r_load_model->submodels = out; r_load_model->num_submodels = count; for (i = 0; i < count; i++, in++, out++) { for (j = 0; j < 3; j++) { // spread the mins / maxs by 1 unit out->mins[j] = LittleFloat(in->mins[j]) - 1.0; out->maxs[j] = LittleFloat(in->maxs[j]) + 1.0; out->origin[j] = LittleFloat(in->origin[j]); } out->radius = R_RadiusFromBounds(out->mins, out->maxs); out->head_node = LittleLong(in->head_node); out->first_face = LittleLong(in->first_face); out->num_faces = LittleLong(in->num_faces); } }
/** * @brief Loads brush entities like func_door and func_breakable * @sa CMod_LoadSubmodels */ static void R_ModLoadSubmodels (const lump_t *l) { const dBspModel_t *in; mBspHeader_t *out; int i, j, count; in = (const dBspModel_t *) (mod_base + l->fileofs); if (l->filelen % sizeof(*in)) Com_Error(ERR_DROP, "R_ModLoadSubmodels: funny lump size in %s", r_worldmodel->name); count = l->filelen / sizeof(*in); out = (mBspHeader_t *)Mem_PoolAlloc(count * sizeof(*out), vid_modelPool, 0); Com_DPrintf(DEBUG_RENDERER, "...submodels: %i\n", count); r_worldmodel->bsp.submodels = out; r_worldmodel->bsp.numsubmodels = count; for (i = 0; i < count; i++, in++, out++) { /* spread the mins / maxs by a pixel */ for (j = 0; j < 3; j++) { out->mins[j] = LittleFloat(in->mins[j]) - 1.0f + (float)shift[j]; out->maxs[j] = LittleFloat(in->maxs[j]) + 1.0f + (float)shift[j]; out->origin[j] = LittleFloat(in->origin[j]) + (float)shift[j]; } out->radius = R_RadiusFromBounds(out->mins, out->maxs); out->headnode = LittleLong(in->headnode); out->firstface = LittleLong(in->firstface); out->numfaces = LittleLong(in->numfaces); } }
/* * @brief Loads all r_bsp_inline_model_t for the specified BSP model. These are * later registered as first-class r_model_t's in R_SetupBspInlineModels. */ static void R_LoadBspInlineModels(r_bsp_model_t *bsp, const d_bsp_lump_t *l) { r_bsp_inline_model_t *out; uint16_t i, j; const d_bsp_model_t *in = (const void *) (mod_base + l->file_ofs); if (l->file_len % sizeof(*in)) { Com_Error(ERR_DROP, "Funny lump size\n"); } bsp->num_inline_models = l->file_len / sizeof(*in); bsp->inline_models = out = Z_LinkMalloc(bsp->num_inline_models * sizeof(*out), bsp); for (i = 0; i < bsp->num_inline_models; i++, in++, out++) { for (j = 0; j < 3; j++) { // spread the bounds slightly out->mins[j] = LittleFloat(in->mins[j]) - 1.0; out->maxs[j] = LittleFloat(in->maxs[j]) + 1.0; out->origin[j] = LittleFloat(in->origin[j]); } out->radius = R_RadiusFromBounds(out->mins, out->maxs); out->head_node = LittleLong(in->head_node); // some (old) maps have invalid inline model head_nodes if (out->head_node < 0 || out->head_node >= bsp->num_nodes) { Com_Warn("Bad head_node for %d: %d\n", i, out->head_node); out->head_node = -1; } out->first_surface = (uint16_t) LittleLong(in->first_face); out->num_surfaces = (uint16_t) LittleLong(in->num_faces); } }