static void LM_AddToSceneOrder (bool parents) { for (int i = 0; i < cl.numLMs; i++) { localModel_t& lm = cl.LMs[i]; if (!lm.inuse) continue; /* check for visibility */ if (!((1 << cl_worldlevel->integer) & lm.levelflags)) continue; /* if we want to render the parents and this is a child (has a parent assigned) * then skip it */ if (parents && lm.parent) continue; /* if we want to render the children and this is a parent (no further parent * assigned), then skip it. */ if (!parents && lm.parent == nullptr) continue; /* set entity values */ entity_t ent(RF_NONE); assert(lm.model); ent.model = lm.model; ent.skinnum = lm.skin; ent.lighting = &lm.lighting; ent.setScale(lm.scale); if (lm.parent) { /** @todo what if the tagent is not rendered due to different level flags? */ ent.tagent = R_GetEntity(lm.parent->renderEntityNum); if (ent.tagent == nullptr) Com_Error(ERR_DROP, "Invalid parent entity num for local model (%s/%s): %i", lm.model->name, lm.id, lm.parent->renderEntityNum); ent.tagname = lm.tagname; } else { R_EntitySetOrigin(&ent, lm.origin); VectorCopy(lm.origin, ent.oldorigin); VectorCopy(lm.angles, ent.angles); if (lm.animname[0] != '\0') { ent.as = lm.as; /* do animation */ R_AnimRun(&lm.as, ent.model, cls.frametime * 1000); } else { ent.as.frame = lm.frame; } } /* renderflags like RF_PULSE */ ent.flags = lm.renderFlags; /* add it to the scene */ lm.renderEntityNum = R_AddEntity(&ent); } }
/** * @brief Moves the given mins/maxs volume through the world from start to end. * @param[in] start Start vector to start the trace from * @param[in] end End vector to stop the trace at * @param[in] size Bounding box size used for tracing * @param[in] contentmask Searched content the trace should watch for */ void R_Trace (const vec3_t start, const vec3_t end, float size, int contentmask) { vec3_t mins, maxs; float frac; trace_t tr; int i; r_locals.tracenum++; if (r_locals.tracenum > 0xffff) /* avoid overflows */ r_locals.tracenum = 0; VectorSet(mins, -size, -size, -size); VectorSet(maxs, size, size, size); refdef.trace = CM_CompleteBoxTrace(refdef.mapTiles, start, end, mins, maxs, TRACING_ALL_VISIBLE_LEVELS, contentmask, 0); refdef.traceEntity = NULL; frac = refdef.trace.fraction; /* check bsp models */ for (i = 0; i < refdef.numEntities; i++) { entity_t *ent = R_GetEntity(i); const model_t *m = ent->model; if (!m || m->type != mod_bsp_submodel) continue; tr = CM_TransformedBoxTrace(&(refdef.mapTiles->mapTiles[m->bsp.maptile]), start, end, mins, maxs, m->bsp.firstnode, contentmask, 0, ent->origin, ent->angles); if (tr.fraction < frac) { refdef.trace = tr; refdef.traceEntity = ent; frac = tr.fraction; } } assert(refdef.trace.mapTile >= 0); assert(refdef.trace.mapTile < r_numMapTiles); }