protected Triangle DoesIntersectAnyInnerTriangles(Ray ray) { if (InnerTriangles == null || !InnerTriangles.Any()) { return(null); } float currZ = 0; Triangle res = null; foreach (var triangle in InnerTriangles) { if (Renderer.IntersectionRayTriangle(ray, triangle, out float u, out float v)) { if (res == null) { res = triangle; currZ = (triangle.a.Z + triangle.b.Z + triangle.c.Z) / 3; } else { float z = (triangle.a.Z + triangle.b.Z + triangle.c.Z) / 3; if (z < currZ) { res = triangle; currZ = z; } } } } return(res); }
protected bool DoesIntersectAnyInnerTriangles(Ray ray) { if (InnerTriangles == null || !InnerTriangles.Any()) { return(false); } foreach (var Triangle in InnerTriangles) { if (Renderer.IntersectionRayTriangle(ray, Triangle)) { return(true); } } return(false); }
public void SpreadTriangles() { for (int i = 0; i < 8; i++) { var child = ChildNodes[i]; var resTriangleangles = InnerTriangles.GetRange(0, InnerTriangles.Count); foreach (var Triangle in InnerTriangles) { if (child.IsTriangleInside(Triangle)) { child.InnerTriangles.Add(Triangle); resTriangleangles.Remove(Triangle); } } InnerTriangles = resTriangleangles; ChildNodes[i] = child; } }