public override float AddSingleResult(LocalConvexResult convexResult, bool normalInWorldSpace) { //caller already does the filter on the m_closestHitFraction Debug.Assert(convexResult.HitFraction <= ClosestHitFraction); ClosestHitFraction = convexResult.HitFraction; HitCollisionObject = convexResult.HitCollisionObject; if (normalInWorldSpace) { HitNormalWorld = convexResult.HitNormalLocal; } else { // need to transform normal into worldspace HitNormalWorld = Vector3.TransformCoordinate(convexResult.HitNormalLocal, HitCollisionObject.WorldTransform.Basis); } HitPointWorld = convexResult.HitPointLocal; return convexResult.HitFraction; }
public override float AddSingleResult(LocalConvexResult convexResult, bool normalInWorldSpace) { if (convexResult.HitCollisionObject == _me) { return 1.0f; } if (!convexResult.HitCollisionObject.HasContactResponse) { return 1.0f; } Vector3 hitNormalWorld; if (normalInWorldSpace) { hitNormalWorld = convexResult.HitNormalLocal; } else { // need to transform normal into worldspace hitNormalWorld = Vector3.TransformCoordinate(convexResult.HitNormalLocal, convexResult.HitCollisionObject.WorldTransform.Basis); } float dotUp; Vector3.Dot(ref _up, ref hitNormalWorld, out dotUp); if (dotUp < _minSlopeDot) { return 1.0f; } return base.AddSingleResult(convexResult, normalInWorldSpace); }
public abstract float AddSingleResult(LocalConvexResult convexResult, bool normalInWorldSpace);
public override float AddSingleResult(LocalConvexResult convexResult, bool normalInWorldSpace) { var r0 = Container?.Room; var c1 = convexResult.HitCollisionObject.UserObject as EngineContainer; var r1 = c1?.Room; if ((c1 == null && c1 == Container) || (SkipGhost && c1.CollisionType == COLLISION_TYPE.Ghost)) { return 1.0f; } if (r0 == null || r1 == null) { return base.AddSingleResult(convexResult, normalInWorldSpace); } if (r0 != null && r1 != null) { if (r0.IsInNearRoomsList(r1)) { return base.AddSingleResult(convexResult, normalInWorldSpace); } } return 1.0f; }