public bool ColliderCastLeaf <T>(ColliderCastInput input, int primitiveKey, ref T collector) where T : struct, ICollector <ColliderCastHit> { m_Mesh->GetPrimitive(primitiveKey, out float3x4 vertices, out Mesh.PrimitiveFlags flags, out CollisionFilter filter); if (!CollisionFilter.IsCollisionEnabled(input.Collider->Filter, filter)) // TODO: could do this check within GetPrimitive() { return(false); } int numPolygons = Mesh.GetNumPolygonsInPrimitive(flags); bool isQuad = Mesh.IsPrimitveFlagSet(flags, Mesh.PrimitiveFlags.IsQuad); bool acceptHit = false; int numHits = collector.NumHits; var polygon = new PolygonCollider(); polygon.InitEmpty(); for (int polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) { float fraction = collector.MaxFraction; if (isQuad) { polygon.SetAsQuad(vertices[0], vertices[1], vertices[2], vertices[3]); } else { polygon.SetAsTriangle(vertices[0], vertices[1 + polygonIndex], vertices[2 + polygonIndex]); } if (ConvexConvex(input, (Collider *)&polygon, ref collector)) { acceptHit = true; // TODO.ma make a version that doesn't transform, just updates collider key collector.TransformNewHits(numHits++, fraction, MTransform.Identity, m_NumColliderKeyBits, (uint)(primitiveKey << 1 | polygonIndex)); } } return(acceptHit); }
public bool ColliderCastLeaf <T>(ColliderCastInput input, int primitiveKey, ref T collector) where T : struct, ICollector <ColliderCastHit> { m_Mesh->GetPrimitive(primitiveKey, out float3x4 vertices, out Mesh.PrimitiveFlags flags, out CollisionFilter filter); if (!CollisionFilter.IsCollisionEnabled(input.Collider->Filter, filter)) // TODO: could do this check within GetPrimitive() { return(false); } int numPolygons = Mesh.GetNumPolygonsInPrimitive(flags); bool isQuad = Mesh.IsPrimitveFlagSet(flags, Mesh.PrimitiveFlags.IsQuad); bool acceptHit = false; var polygon = new PolygonCollider(); polygon.InitEmpty(); for (int polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) { float fraction = collector.MaxFraction; if (isQuad) { polygon.SetAsQuad(vertices[0], vertices[1], vertices[2], vertices[3]); } else { polygon.SetAsTriangle(vertices[0], vertices[1 + polygonIndex], vertices[2 + polygonIndex]); } if (ConvexConvex(input, (Collider *)&polygon, collector.MaxFraction, out ColliderCastHit hit)) { hit.ColliderKey = input.QueryContext.SetSubKey(m_NumColliderKeyBits, (uint)(primitiveKey << 1 | polygonIndex)); acceptHit |= collector.AddHit(hit); } } return(acceptHit); }