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, out Material material); if (!CollisionFilter.IsCollisionEnabled(input.Collider->Filter, filter)) // TODO: could do this check within GetPrimitive() { return(false); } int numPolygons = Mesh.GetNumPolygonsInPrimitive(flags); bool isQuad = Mesh.IsPrimitiveFlagSet(flags, Mesh.PrimitiveFlags.IsQuad); bool acceptHit = false; var polygon = new PolygonCollider(); polygon.InitNoVertices(CollisionFilter.Default, material); for (int polygonIndex = 0; polygonIndex < numPolygons; polygonIndex++) { sfloat 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); }