public bool Occlude() { bool result = default; for (int i = 0; i < traceQueries.Length; i++) { OccludeQuery query = occludeQueries[i]; result ^= CurrentPair.scene.Occlude(ref query); } return(result); }
public BenchmarkBVH() { Scene scene = new Scene(); Mesh mesh = new(@"C:\Users\MMXXXVIII\Things\CodingStuff\C#\EchoRenderer\EchoRenderer\Assets\Models\BlenderBMW\BlenderBMW.obj"); scene.children.Add(new MeshObject(mesh, new Matte())); traceQueries = new TraceQuery[65536]; occludeQueries = new OccludeQuery[65536]; IRandom random = new SystemRandom(42); const float Radius = 9f; const float Height = 5f; for (int i = 0; i < traceQueries.Length; i++) { Float2 point = new Float2(MathF.Sqrt(random.Next1()) * Radius, random.Next1() * Height); Float3 position = point.X_Y.RotateXZ(random.Next1() * 360f); Float3 target = Float3.CreateY(0.6f) + random.NextInSphere(0.25f); if (random.Next1() < 0.01f) { Float3 offset = (target - position) / 2f; target = position; position += offset; } Ray ray = new Ray(position, (target - position).Normalized); traceQueries[i] = ray; occludeQueries[i] = ray; } Pairs = new[] { new Pair(new PreparedScene(scene, new ScenePrepareProfile { AggregatorProfile = new AggregatorProfile { AggregatorType = typeof(BoundingVolumeHierarchy) } }), "Regular"), new Pair(new PreparedScene(scene, new ScenePrepareProfile { AggregatorProfile = new AggregatorProfile { AggregatorType = typeof(QuadBoundingVolumeHierarchy) } }), "Quad") }; }