Example #1
0
        public bool Raycast(Ray ray, ref RayTriangleHit closestRayTriangleHitInfo,
            ref Triangle closestTriangle)
        {
            if (!_boundingBox.Raycast(ray, closestRayTriangleHitInfo.Distance)) return false;
            bool hitFound = false;
            var hitInfo = new RayTriangleHit();
            foreach (Triangle triangle in _directTriangleChildren)
            {
                if (triangle.RayCast(ray, ref hitInfo) && (closestRayTriangleHitInfo.Distance > hitInfo.Distance))
                {
                    closestRayTriangleHitInfo = hitInfo;
                    closestTriangle = triangle;
                    hitFound = true;
                }
            }

            for (int i = 0; i < 8; i++)
            {
                if (_children[i] != null)
                {
                    bool childHit = _children[i].Raycast(ray, ref closestRayTriangleHitInfo, ref closestTriangle);
                    hitFound |= childHit;
                }
            }
            return hitFound;
        }
Example #2
0
 public Mesh(Vector3[] vertices, Triangle[] triangles, Vector3 position, Quaternion rotation, Shader shader, ISampler normalSampler)
 {
     Vertices = vertices;
     _triangles = triangles;
     Shader = shader;
     Position = position;
     Rotation = rotation;
     _normalSampler = normalSampler;
     Init();
 }
Example #3
0
 public Octree(Triangle[] triangles, Mesh parentMesh)
 {
     _parentMesh = parentMesh;
     _children = new Octree[8];
     _triangles = triangles;
     Vector3 max;
     Vector3 min;
     FindEdges(out min, out max);
     _boundingBox = new Box(min.x, max.x, min.y, max.y, min.z, max.z);
     if (triangles.Length > TriangleCountInLeaf)
     {
         Subdivide(min, max);
     }
     else
     {
         _directTriangleChildren = new List<Triangle>(triangles);
     }
 }
Example #4
0
        private static int AssignSubnode(Triangle triangle, float avgX, float avgY, float avgZ)
        {
            int subNodeIndex = 0;
            if (triangle.V1.x > avgX &&
                triangle.V2.x > avgX &&
                triangle.V3.x > avgX)
            {
                subNodeIndex += 1;
            }
            else if (triangle.V1.x > avgX ||
                     triangle.V2.x > avgX ||
                     triangle.V3.x > avgX)
            {
                return -1;
            }

            if (triangle.V1.y > avgY &&
                triangle.V2.y > avgY &&
                triangle.V3.y > avgY)
            {
                subNodeIndex += 2;
            }
            else if (triangle.V1.y > avgY ||
                     triangle.V2.y > avgY ||
                     triangle.V3.y > avgY)
            {
                return -1;
            }

            if (triangle.V1.z > avgZ &&
                triangle.V2.z > avgZ &&
                triangle.V3.z > avgZ)
            {
                subNodeIndex += 4;
            }
            else if (triangle.V1.z > avgZ ||
                     triangle.V2.z > avgZ ||
                     triangle.V3.z > avgZ)
            {
                return -1;
            }

            return subNodeIndex;
        }