public void One_Triangle() { // Assign RTMeshBVHBuilder builder = new RTMeshBVHBuilder(); Vector3[] vertices = new Vector3[3]; vertices[0] = new Vector3(0, 0, 0); vertices[1] = new Vector3(0, 5, 0); vertices[2] = new Vector3(5, 0, 0); RTBoundingBox box = RTBoundingBox.RTBoundingBoxFromTriangle(triangleIndex: 0, vertices[0], vertices[1], vertices[2]); // Act builder.AddBoundingBox(box); builder.Construct(0); // Assert Assert.AreEqual(new Vector3(0, 0, 0), builder.Root.bounding.min); Assert.AreEqual(new Vector3(5, 5, 0), builder.Root.bounding.max); Assert.AreEqual(1, builder.Root.bounding.geoIndices.ToList().Count); Assert.AreEqual(1, builder.Root.children.Count); Assert.IsNull(builder.Root.left); Assert.AreEqual(-1, builder.Root.leftID); Assert.IsNull(builder.Root.right); Assert.AreEqual(-1, builder.Root.rightID); }
public void Two_Triangle() { // Assign RTMeshBVHBuilder builder = new RTMeshBVHBuilder(); Vector3[] triangle1 = new Vector3[3]; triangle1[0] = new Vector3(0, 0, 0); triangle1[1] = new Vector3(0, 5, 0); triangle1[2] = new Vector3(5, 0, 0); RTBoundingBox box1 = RTBoundingBox.RTBoundingBoxFromTriangle(primitiveCounter: 0, triangle1[0], triangle1[1], triangle1[2]); Vector3[] triangle2 = new Vector3[3]; triangle2[0] = new Vector3(10, 0, 0); triangle2[1] = new Vector3(10, 5, 0); triangle2[2] = new Vector3(15, 0, 0); RTBoundingBox box2 = RTBoundingBox.RTBoundingBoxFromTriangle(primitiveCounter: 1, triangle2[0], triangle2[1], triangle2[2]); // Act builder.AddBoundingBox(box1); builder.AddBoundingBox(box2); builder.Construct(); // Assert Assert.AreEqual(new Vector3(0, 0, 0), builder.Root.bounding.min); Assert.AreEqual(new Vector3(15, 5, 0), builder.Root.bounding.max); Assert.AreEqual(0, builder.Root.bounding.primitiveBegin); Assert.AreEqual(2, builder.Root.bounding.primitiveCount); Assert.AreEqual(2, builder.Root.children.Count); Assert.IsNotNull(builder.Root.left); var leftNode = builder.Root.left; Assert.AreEqual(new Vector3(0, 0, 0), leftNode.bounding.min); Assert.AreEqual(new Vector3(5, 5, 0), leftNode.bounding.max); Assert.AreEqual(0, leftNode.bounding.primitiveBegin); Assert.AreEqual(1, leftNode.bounding.primitiveCount); Assert.AreEqual(1, leftNode.children.Count); Assert.IsNotNull(builder.Root.right); var rightNode = builder.Root.right; Assert.AreEqual(new Vector3(10, 0, 0), rightNode.bounding.min); Assert.AreEqual(new Vector3(15, 5, 0), rightNode.bounding.max); Assert.AreEqual(1, rightNode.bounding.primitiveBegin); Assert.AreEqual(1, rightNode.bounding.primitiveCount); Assert.AreEqual(1, rightNode.children.Count); }
public void Serialize_OneTriangle_BVH() { // Assign Vector3[] vertices = new Vector3[3]; vertices[0] = new Vector3(0, 0, 0); vertices[1] = new Vector3(0, 5, 0); vertices[2] = new Vector3(5, 0, 0); Vector3[] normals = new Vector3[3]; normals[0] = new Vector3(0, 0, -1); normals[1] = new Vector3(0, 0, -1); normals[2] = new Vector3(0, 0, -1); int[] trianglesVertexOrder = new int[3]; trianglesVertexOrder[0] = 0; trianglesVertexOrder[1] = 1; trianglesVertexOrder[2] = 2; var actuator = new Mock <RTMeshBVHController.IActuator>(); actuator.Setup(x => x.GetVertices()).Returns(vertices); actuator.Setup(x => x.LocalToWorldVertex(It.IsAny <Vector3>())).Returns <Vector3>(v => v); RTMeshBVHController controller = new RTMeshBVHController(actuator: actuator.Object); List <List <float> > flatten = new List <List <float> >(); List <List <int> > accelerationGeometryMappingCollection = new List <List <int> >(); // Act controller.BuildBVHAndTriangleList(0, normals, trianglesVertexOrder, vertices); RTMeshBVHBuilder.Flatten(ref flatten, 0, 0, ref accelerationGeometryMappingCollection, controller.GetRoot()); List <float> serialized = RTMeshBVHController.SerializeRTMeshBVH(flatten); // Assert Assert.AreEqual(1, flatten.Count); // There is only 1 bounding box var box = flatten[0]; Assert.AreEqual(10, box.Count); // 10 fields per box Assert.AreEqual(-1, box[0]); // No child node on the left Assert.AreEqual(-1, box[1]); // No child node on the right Assert.AreEqual(5, box[2]); // max.x Assert.AreEqual(5, box[3]); // max.y Assert.AreEqual(0, box[4]); // max.z Assert.AreEqual(0, box[5]); // min.x Assert.AreEqual(0, box[6]); // min.y Assert.AreEqual(0, box[7]); // min.z Assert.AreEqual(0, box[8]); // primitive begin Assert.AreEqual(1, box[9]); // primitive count Assert.AreEqual(1, accelerationGeometryMappingCollection.Count); // There is only 1 triangles Assert.AreEqual(1 + 1 + 10 + 14, serialized.Count); // Size of the BVH + Size of the primitive list + BVH + Primitive List Assert.AreEqual(12, serialized[0]); // #1 = the end + 1 of the BVH Assert.AreEqual(26, serialized[1]); // #2 = the size of the primitive list }