/* * 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; }
/* ================ CG_PointContents ================ */ int CG_PointContents( const vec3_t point, int passEntityNum ) { int i; entityState_t *ent; centity_t *cent; clipHandle_t cmodel; int contents; contents = trap_CM_PointContents (point, 0); for ( i = 0 ; i < cg_numSolidEntities ; i++ ) { cent = cg_solidEntities[ i ]; ent = ¢->currentState; if ( ent->number == passEntityNum ) { continue; } if ( ent->collisionType != CT_SUBMODEL ) { continue; } cmodel = trap_CM_InlineModel( ent->modelindex ); if ( !cmodel ) { continue; } contents |= trap_CM_TransformedPointContents( point, cmodel, cent->lerpOrigin, cent->lerpAngles ); } return contents; }