예제 #1
0
        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);
        }
예제 #3
0
        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
        }