public bool Raycast(Ray ray, ref RayTriangleHit closestRayTriangleHitInfo, ref Triangle closestTriangle) { if (!_boundingBox.Raycast(ray, closestRayTriangleHitInfo.Distance)) return false; bool hitFound = false; var hitInfo = new RayTriangleHit(); foreach (Triangle triangle in _directTriangleChildren) { if (triangle.RayCast(ray, ref hitInfo) && (closestRayTriangleHitInfo.Distance > hitInfo.Distance)) { closestRayTriangleHitInfo = hitInfo; closestTriangle = triangle; hitFound = true; } } for (int i = 0; i < 8; i++) { if (_children[i] != null) { bool childHit = _children[i].Raycast(ray, ref closestRayTriangleHitInfo, ref closestTriangle); hitFound |= childHit; } } return hitFound; }
public Mesh(Vector3[] vertices, Triangle[] triangles, Vector3 position, Quaternion rotation, Shader shader, ISampler normalSampler) { Vertices = vertices; _triangles = triangles; Shader = shader; Position = position; Rotation = rotation; _normalSampler = normalSampler; Init(); }
public Octree(Triangle[] triangles, Mesh parentMesh) { _parentMesh = parentMesh; _children = new Octree[8]; _triangles = triangles; Vector3 max; Vector3 min; FindEdges(out min, out max); _boundingBox = new Box(min.x, max.x, min.y, max.y, min.z, max.z); if (triangles.Length > TriangleCountInLeaf) { Subdivide(min, max); } else { _directTriangleChildren = new List<Triangle>(triangles); } }
private static int AssignSubnode(Triangle triangle, float avgX, float avgY, float avgZ) { int subNodeIndex = 0; if (triangle.V1.x > avgX && triangle.V2.x > avgX && triangle.V3.x > avgX) { subNodeIndex += 1; } else if (triangle.V1.x > avgX || triangle.V2.x > avgX || triangle.V3.x > avgX) { return -1; } if (triangle.V1.y > avgY && triangle.V2.y > avgY && triangle.V3.y > avgY) { subNodeIndex += 2; } else if (triangle.V1.y > avgY || triangle.V2.y > avgY || triangle.V3.y > avgY) { return -1; } if (triangle.V1.z > avgZ && triangle.V2.z > avgZ && triangle.V3.z > avgZ) { subNodeIndex += 4; } else if (triangle.V1.z > avgZ || triangle.V2.z > avgZ || triangle.V3.z > avgZ) { return -1; } return subNodeIndex; }