/* * @brief Register event listener for models. */ static void R_RegisterModel(r_media_t *self) { r_model_t *mod = (r_model_t *) self; if (mod->type == MOD_BSP) { uint16_t i; const r_bsp_texinfo_t *t = mod->bsp->texinfo; for (i = 0; i < mod->bsp->num_texinfo; i++, t++) { R_RegisterDependency(self, (r_media_t *) t->material); } const r_bsp_surface_t *s = mod->bsp->surfaces; for (i = 0; i < mod->bsp->num_surfaces; i++, s++) { R_RegisterDependency(self, (r_media_t *) s->lightmap); R_RegisterDependency(self, (r_media_t *) s->deluxemap); } // keep a reference to the world model r_model_state.world = mod; } else if (IS_MESH_MODEL(mod)) { R_RegisterDependency(self, (r_media_t *) mod->mesh->material); } }
/* * @brief The inline models have been loaded into memory, but are not yet * represented as r_model_t. Convert them, and take ownership of their nodes. */ static void R_SetupBspInlineModels(r_model_t *mod) { uint16_t i; for (i = 0; i < mod->bsp->num_inline_models; i++) { r_model_t *m = Z_TagMalloc(sizeof(r_model_t), Z_TAG_RENDERER); g_snprintf(m->media.name, sizeof(m->media.name), "%s#%d", mod->media.name, i); m->type = MOD_BSP_INLINE; m->bsp_inline = &mod->bsp->inline_models[i]; // copy bounds from the inline model VectorCopy(m->bsp_inline->maxs, m->maxs); VectorCopy(m->bsp_inline->mins, m->mins); m->radius = m->bsp_inline->radius; // setup the nodes if (m->bsp_inline->head_node != -1) { r_bsp_node_t *nodes = &mod->bsp->nodes[m->bsp_inline->head_node]; R_SetupBspInlineModel(nodes, m); } // register with the subsystem R_RegisterDependency((r_media_t *) mod, (r_media_t *) m); } }