Exemplo n.º 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);
        }