/** * @brief Yields the contents mask (bitwise OR) for the specified point. The * world model and all solids are checked. */ int32_t Cl_PointContents(const vec3_t point) { int32_t contents = Cm_PointContents(point, 0); for (uint16_t i = 0; i < cl.frame.num_entities; i++) { const uint32_t snum = (cl.frame.entity_state + i) & ENTITY_STATE_MASK; const entity_state_t *s = &cl.entity_states[snum]; if (s->solid < SOLID_BOX) { continue; } const cl_entity_t *ent = &cl.entities[s->number]; if (ent == cl.entity) { continue; } const int32_t head_node = Cl_HullForEntity(s); contents |= Cm_TransformedPointContents(point, head_node, &ent->inverse_matrix); } return contents; }
/* * @brief Clips the specified trace to other solid entities in the frame. */ static void Cl_ClipTraceToEntities(cl_trace_t *trace) { for (uint16_t i = 0; i < cl.frame.num_entities; i++) { const uint32_t snum = (cl.frame.entity_state + i) & ENTITY_STATE_MASK; const entity_state_t *s = &cl.entity_states[snum]; if (s->solid < SOLID_BOX) continue; if (s->number == trace->skip) continue; if (s->number == cl.client_num + 1) continue; const int32_t head_node = Cl_HullForEntity(s); const cl_entity_t *ent = &cl.entities[s->number]; cm_trace_t tr = Cm_TransformedBoxTrace(trace->start, trace->end, trace->mins, trace->maxs, head_node, trace->contents, &ent->matrix, &ent->inverse_matrix); if (tr.start_solid || tr.fraction < trace->trace.fraction) { trace->trace = tr; trace->trace.ent = (struct g_entity_s *) (intptr_t) s->number; if (tr.start_solid) return; } } }