/* * G_PointContents * returns the CONTENTS_* value from the world at the given point. * Quake 2 extends this to also check entities, to allow moving liquids */ static int GClip_PointContents( vec3_t p, int timeDelta ) { c4clipedict_t *clipEnt; int touch[MAX_EDICTS]; int i, num; int contents, c2; struct cmodel_s *cmodel; float *angles; // get base contents from world contents = trap_CM_TransformedPointContents( p, NULL, NULL, NULL ); // or in contents from all the other entities num = GClip_AreaEdicts( p, p, touch, MAX_EDICTS, AREA_SOLID, timeDelta ); for( i = 0; i < num; i++ ) { clipEnt = GClip_GetClipEdictForDeltaTime( touch[i], timeDelta ); // might intersect, so do an exact clip cmodel = GClip_CollisionModelForEntity( &clipEnt->s, &clipEnt->r ); if( !ISBRUSHMODEL( clipEnt->s.modelindex ) ) angles = vec3_origin; // boxes don't rotate else angles = clipEnt->s.angles; c2 = trap_CM_TransformedPointContents( p, cmodel, clipEnt->s.origin, clipEnt->s.angles ); contents |= c2; } return contents; }
/* * GClip_ClipMoveToEntities */ /*static*/ void GClip_ClipMoveToEntities( moveclip_t *clip, int timeDelta ) { int i, num; c4clipedict_t *touch; int touchlist[MAX_EDICTS]; trace_t trace; struct cmodel_s *cmodel; float *angles; num = GClip_AreaEdicts( clip->boxmins, clip->boxmaxs, touchlist, MAX_EDICTS, AREA_SOLID, timeDelta ); // be careful, it is possible to have an entity in this // list removed before we get to it (killtriggered) for( i = 0; i < num; i++ ) { touch = GClip_GetClipEdictForDeltaTime( touchlist[i], timeDelta ); if( clip->passent >= 0 ) { // when they are offseted in time, they can be a different pointer but be the same entity if( touch->s.number == clip->passent ) continue; if( touch->r.owner && ( touch->r.owner->s.number == clip->passent ) ) continue; if( game.edicts[clip->passent].r.owner && ( game.edicts[clip->passent].r.owner->s.number == touch->s.number ) ) continue; // wsw : jal : never clipmove against SVF_PROJECTILE entities if( touch->r.svflags & SVF_PROJECTILE ) continue; } if( ( touch->r.svflags & SVF_CORPSE ) && !( clip->contentmask & CONTENTS_CORPSE ) ) continue; // might intersect, so do an exact clip cmodel = GClip_CollisionModelForEntity( &touch->s, &touch->r ); if( ISBRUSHMODEL( touch->s.modelindex ) ) angles = touch->s.angles; else angles = vec3_origin; // boxes don't rotate trap_CM_TransformedBoxTrace( &trace, clip->start, clip->end, clip->mins, clip->maxs, cmodel, clip->contentmask, touch->s.origin, angles ); if( trace.allsolid || trace.fraction < clip->trace->fraction ) { trace.ent = touch->s.number; *( clip->trace ) = trace; } else if( trace.startsolid ) clip->trace->startsolid = qtrue; if( clip->trace->allsolid ) return; } }