From a3f708490aff1ddac4473ca71caf08f64dcf90b7 Mon Sep 17 00:00:00 2001 From: June Kim Date: Mon, 11 May 2026 21:39:11 -0700 Subject: [PATCH] Add unit test and benchmark for mesh loading + BVH generation (#691) Implements the request from issue #691 to create a unit test and benchmark for loading a mesh and generating its BVH structure. - TestKaijuMeshLoadAndGenerateBVH: validates that a loaded mesh can generate a BVH and correctly perform ray intersection queries - BenchmarkKaijuMeshLoadAndGenerateBVH: measures performance of deserializing a 50K vertex mesh and generating its BVH The test follows the existing pattern from TestKaijuMeshSerializePreservesBVH but adds explicit BVH generation and ray intersection validation. --- .../loaders/kaiju_mesh/kaiju_mesh_test.go | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/src/rendering/loaders/kaiju_mesh/kaiju_mesh_test.go b/src/rendering/loaders/kaiju_mesh/kaiju_mesh_test.go index d8fc340bc..0fea4a4c1 100644 --- a/src/rendering/loaders/kaiju_mesh/kaiju_mesh_test.go +++ b/src/rendering/loaders/kaiju_mesh/kaiju_mesh_test.go @@ -164,6 +164,62 @@ func BenchmarkKaijuMeshDeserializeLegacyGob(b *testing.B) { } } +func TestKaijuMeshLoadAndGenerateBVH(t *testing.T) { + km := KaijuMesh{ + Name: "test-bvh", + Verts: []rendering.Vertex{ + {Position: matrix.Vec3{0, 0, 0}}, + {Position: matrix.Vec3{1, 0, 0}}, + {Position: matrix.Vec3{0, 1, 0}}, + }, + Indexes: []uint32{0, 1, 2}, + } + data, err := km.Serialize() + if err != nil { + t.Fatal(err) + } + loaded, err := Deserialize(data) + if err != nil { + t.Fatal(err) + } + bvh := loaded.GenerateBVH(nil, nil, "test-data") + if bvh == nil { + t.Fatal("expected BVH to be generated") + } + ray := graviton.Ray{ + Origin: matrix.Vec3{0.25, 0.25, 1}, + Direction: matrix.Vec3{0, 0, -1}, + } + target, _, ok := bvh.RayIntersect(ray, 2) + if !ok { + t.Fatal("expected BVH ray intersection to succeed") + } + if target != "test-data" { + t.Fatalf("expected BVH data to be %q, got %v", "test-data", target) + } +} + +func BenchmarkKaijuMeshLoadAndGenerateBVH(b *testing.B) { + km := benchmarkMesh() + data, err := km.Serialize() + if err != nil { + b.Fatal(err) + } + b.ReportAllocs() + b.SetBytes(int64(len(data))) + b.ResetTimer() + for range b.N { + loaded, err := Deserialize(data) + if err != nil { + b.Fatal(err) + } + bvh := loaded.GenerateBVH(nil, nil, nil) + if bvh == nil { + b.Fatal("expected BVH to be generated") + } + } +} + func benchmarkMesh() KaijuMesh { const vertexCount = 50_000 const indexCount = 150_000