/** * @brief Draw the bounding boxes for the server side edicts */ static bool CL_AddEdictFunc (le_t* le, entity_t* ent) { ent->flags = RF_BOX; VectorSet(ent->color, 1, 1, 1); ent->alpha = 1.0; ent->eBox.set(le->aabb); R_EntitySetOrigin(ent, le->origin); return true; }
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 Draw the bounding boxes for the server side edicts */ static qboolean CL_AddEdictFunc (le_t *le, entity_t *ent) { ent->flags = RF_BOX; VectorSet(ent->color, 1, 1, 1); ent->alpha = 1.0; VectorCopy(le->mins, ent->mins); VectorCopy(le->maxs, ent->maxs); R_EntitySetOrigin(ent, le->origin); return qtrue; }
/** * @sa CL_Sequence2D * @sa CL_ViewRender * @sa CL_SequenceEnd_f * @sa UI_PopWindow * @sa CL_SequenceFindEnt */ static void SEQ_Render3D (sequenceContext_t *context) { entity_t ent; seqEnt_t *se; int i; if (context->numEnts == 0) return; /* set camera */ SEQ_SetCamera(context); refdef.numEntities = 0; refdef.mapTiles = cl.mapTiles; /* render sequence */ for (i = 0, se = context->ents; i < context->numEnts; i++, se++) { if (!se->inuse) continue; /* advance in time */ VectorMA(se->origin, cls.frametime, se->speed, se->origin); VectorMA(se->angles, cls.frametime, se->omega, se->angles); R_AnimRun(&se->as, se->model, context->animspeed * cls.frametime); /* add to scene */ OBJZERO(ent); ent.model = se->model; ent.skinnum = se->skin; ent.as = se->as; ent.alpha = se->alpha; R_EntitySetOrigin(&ent, se->origin); VectorCopy(se->origin, ent.oldorigin); VectorCopy(se->angles, ent.angles); if (se->parent && se->tag) { seqEnt_t *parent; parent = SEQ_FindEnt(context, se->parent); if (parent) ent.tagent = parent->ep; ent.tagname = se->tag; } /* add to render list */ se->ep = R_GetFreeEntity(); R_AddEntity(&ent); } refdef.rendererFlags |= RDF_NOWORLDMODEL; /* use a relative fixed size */ viddef.x = context->pos[0]; viddef.y = context->pos[1]; viddef.viewWidth = context->size[0]; viddef.viewHeight = context->size[1]; /* update refdef */ CL_ViewUpdateRenderData(); /** @todo Models are not at the right position (relative to the node position). Maybe R_SetupFrustum erase matrix. Not a trivialous task. */ /* render the world */ R_PushMatrix(); R_RenderFrame(); R_PopMatrix(); }
/** * @sa CL_ViewRender * @sa CL_AddUGV * @sa CL_AddActor */ void LE_AddToScene (void) { for (int i = 0; i < cl.numLEs; i++) { le_t& le = cl.LEs[i]; if (le.flags & LE_REMOVE_NEXT_FRAME) { le.inuse = false; le.flags &= ~LE_REMOVE_NEXT_FRAME; } if (le.inuse && !LE_IsInvisible(&le)) { if (le.flags & LE_CHECK_LEVELFLAGS) { if (!((1 << cl_worldlevel->integer) & le.levelflags)) continue; } else if (le.flags & LE_ALWAYS_VISIBLE) { /* show them always */ } else if (le.pos[2] > cl_worldlevel->integer) continue; entity_t ent(RF_NONE); ent.alpha = le.alpha; VectorCopy(le.angles, ent.angles); ent.model = le.model1; ent.skinnum = le.bodySkin; ent.lighting = &le.lighting; switch (le.contents) { /* Only breakables do not use their origin; func_doors and func_rotating do!!! * But none of them have animations. */ case CONTENTS_SOLID: case CONTENTS_DETAIL: /* they use mins/maxs */ break; default: /* set entity values */ R_EntitySetOrigin(&ent, le.origin); VectorCopy(le.origin, ent.oldorigin); /* store animation values */ ent.as = le.as; break; } if (LE_IsOriginBrush(&le)) { ent.isOriginBrushModel = true; R_EntitySetOrigin(&ent, le.origin); VectorCopy(le.origin, ent.oldorigin); } if (LE_IsSelected(&le) && le.clientAction != nullptr) { const le_t* action = le.clientAction; if (action->inuse && action->type > ET_NULL && action->type < ET_MAX) LE_AddEdictHighlight(action); } /* call add function */ /* if it returns false, don't draw */ if (le.addFunc) if (!le.addFunc(&le, &ent)) continue; /* add it to the scene */ R_AddEntity(&ent); if (cl_le_debug->integer) CL_ParticleSpawn("cross", 0, le.origin); } } }