Пример #1
0
/**
 * @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;
}
Пример #2
0
/*
 * @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;
		}
	}
}