/** * @brief Primary entry point for drawing all entities. * @sa R_RenderFrame */ void R_GetEntityLists (void) { int i; entity_t** chain; if (!r_drawentities->integer) return; r_opaque_mesh_entities = r_special_entities = r_blend_mesh_entities = r_null_entities = nullptr; for (i = 0; i < refdef.numEntities; i++) { entity_t* e = &r_entities[i]; /* frustum cull check */ if (R_CullEntity(e)) continue; R_CalcTransform(e); if (!e->model) { if ((e->flags & RF_BOX) || (e->flags & RF_PATH) || (e->flags & RF_ARROW)) chain = &r_special_entities; else chain = &r_null_entities; } else { const image_t* skin; switch (e->model->type) { case mod_bsp_submodel: R_AddBspRRef(&(e->model->bsp), e->origin, e->angles, true); continue; case mod_alias_md2: case mod_alias_md3: case mod_obj: skin = R_AliasModelState(e->model, &e->as.mesh, &e->as.frame, &e->as.oldframe, &e->skinnum); if (skin == nullptr || skin->texnum == 0) Com_Error(ERR_DROP, "Model '%s' has no skin assigned", e->model->name); if (skin->has_alpha || (e->flags & RF_TRANSLUCENT)) chain = &r_blend_mesh_entities; else chain = &r_opaque_mesh_entities; break; default: if (e->model->loaded) Com_Error(ERR_DROP, "Unknown model type in R_GetEntityLists entity chain: %i (%s)", e->model->type, e->model->name); return; } } e->next = *chain; *chain = e; } }
/** * @brief Renders a particle model for the battlescape * @param[in,out] mi The model information that is used to render the particle model. * @sa R_DrawPtlModel */ void R_DrawModelParticle (modelInfo_t * mi) { image_t *skin; mAliasMesh_t *mesh; /* check if the model exists */ if (!mi->model) return; skin = R_AliasModelState(mi->model, &mi->mesh, &mi->frame, &mi->oldframe, &mi->skin); if (skin == NULL) { Com_Printf("Model '%s' is broken\n", mi->name); return; } R_Color(mi->color); glPushMatrix(); glTranslatef(mi->origin[0], mi->origin[1], mi->origin[2]); glRotatef(mi->angles[YAW], 0, 0, 1); glRotatef(mi->angles[PITCH], 0, 1, 0); glRotatef(-mi->angles[ROLL], 1, 0, 0); /* draw it */ R_BindTexture(skin->texnum); /* draw the model */ mesh = &mi->model->alias.meshes[0]; refdef.aliasCount += mesh->num_tris; if (mi->model->alias.num_frames == 1) R_DrawAliasStaticWithReset(mesh, vec4_origin); else R_DrawAliasFrameLerp(&mi->model->alias, mesh, mi->backlerp, mi->frame, mi->oldframe, vec4_origin); /* show model bounding box */ if (r_showbox->integer) R_DrawBoundingBox(mi->model->alias.frames[mi->frame].mins, mi->model->alias.frames[mi->frame].maxs); glPopMatrix(); R_Color(NULL); }
/** * @brief Draws a model in 2d mode (for rendering model data from the ui) * @param[in,out] mi All the needed model information to render the model * @param[in,out] pmi The model information of the parent model. This is used * in those cases, where the model that should get rendered here is placed relativly * to an already existing model in the world. * @param[in] tagname If a parent model is given, a @c tagname is given in most cases, too. It's used * to transform the model location relative to the parent model location again. E.g. a * @c tagname of tag_rweapon will transform the location to the right hand of an actor. * @sa R_DrawAliasModel */ void R_DrawModelDirect (modelInfo_t * mi, modelInfo_t * pmi, const char *tagname) { image_t *skin; mAliasMesh_t *mesh; if (Q_strnull(mi->name)) return; /* register the model */ mi->model = R_FindModel(mi->name); /* check if the model exists */ if (!mi->model) { Com_Printf("No model found for '%s'\n", mi->name); return; } skin = R_AliasModelState(mi->model, &mi->mesh, &mi->frame, &mi->oldframe, &mi->skin); if (skin == NULL) { Com_Printf("Model '%s' is broken\n", mi->name); return; } glPushMatrix(); glScalef(viddef.rx, viddef.ry, (viddef.rx + viddef.ry) / 2); R_Color(mi->color); if (pmi) { /* register the parent model */ pmi->model = R_FindModel(pmi->name); /* transform - the next transform for the child model will be relative from the * parent model location now */ R_TransformModelDirect(pmi); /* tag transformation */ if (tagname) { const mAliasTagOrientation_t *current = NULL; const mAliasTagOrientation_t *old = NULL; R_GetTags(pmi->model, tagname, pmi->frame, pmi->oldframe, ¤t, &old); if (current != NULL && old != NULL) { float interpolated[16]; /* do interpolation */ R_InterpolateTransform(pmi->backlerp, pmi->model->alias.num_frames, current, old, interpolated); /* transform */ glMultMatrixf(interpolated); R_CheckError(); } } } /* transform */ R_TransformModelDirect(mi); /* we have to reenable this here - we are in 2d mode here already */ glEnable(GL_DEPTH_TEST); /* draw it */ R_BindTexture(skin->texnum); /* draw the model */ mesh = &mi->model->alias.meshes[0]; refdef.aliasCount += mesh->num_tris; if (mi->model->alias.num_frames == 1) R_DrawAliasStaticWithReset(mesh, vec4_origin); else R_DrawAliasFrameLerp(&mi->model->alias, mesh, mi->backlerp, mi->frame, mi->oldframe, vec4_origin); /* show model bounding box */ if (r_showbox->integer) R_DrawBoundingBox(mi->model->alias.frames[mi->frame].mins, mi->model->alias.frames[mi->frame].maxs); glDisable(GL_DEPTH_TEST); glPopMatrix(); R_Color(NULL); }