示例#1
0
        private MeshRenderRaycastInfo RaycastMeshBounds(MeshRenderable renderer)
        {
            if (renderer.IsRaytracable == false)
            {
                return(null);
            }
            if (renderer.IsEnabled == false)
            {
                return(null);
            }
            if (renderer.Mesh == null)
            {
                return(null);
            }
            if (renderer.Mesh.Bounds == null)
            {
                return(null);
            }
            if (renderer.Mesh.Vertices == null)
            {
                return(null);
            }
            if (renderer.SceneObject.Layer.Intersects(_currentLayer) == false)
            {
                return(null);
            }

            if (renderer.Mesh.Type != PrimitiveType.Triangles)
            {
                Log.Warning(renderer.Mesh.Type + " is not supported for raytracing");
                return(null);
            }

            var result = new MeshRenderRaycastInfo(_worldSpaceRay, renderer);

            if (renderer.Mesh.Bounds.Sphere.FastRaycast(result.ModelSpaceRay))
            {
                return(result);
            }
            else
            {
                return(null);
            }
        }
示例#2
0
        private void AddHit(MeshRenderRaycastInfo raycast, Reference <Vector3> hit)
        {
            var distance = hit.Value.Z;
            var hitPoint = raycast.ModelSpaceRay.Origin + raycast.ModelSpaceRay.Direction * distance;

            hitPoint = Vector3.Transform(hitPoint, raycast.MeshRenderable.Transform.ModelMatrix);

            var raycasthit = new RaycastMeshRendererHit()
            {
                Distance = Vector3.Distance(_worldSpaceRay.Origin, hitPoint),
                Renderer = raycast.MeshRenderable,
                Point    = hitPoint
            };

            lock (_results) {
                if (_nearestHit > raycasthit.Distance)
                {
                    _nearestHit = raycasthit.Distance;
                }
                _results.Add(raycasthit);
            }
        }
示例#3
0
        private void RaycastMeshTriangles(MeshRenderRaycastInfo raycast)
        {
            var mesh     = raycast.MeshRenderable.Mesh;
            var triangle = new Triangle();

            if (mesh.Indices != null)
            {
                for (int i = 0; i < mesh.Indices.Length / 3; i++)
                {
                    triangle.A = mesh.Vertices[(Int32)mesh.Indices[3 * i]];
                    triangle.B = mesh.Vertices[(Int32)mesh.Indices[3 * i + 1]];
                    triangle.C = mesh.Vertices[(Int32)mesh.Indices[3 * i + 2]];

                    var hit = triangle.Raycast(raycast.ModelSpaceRay);
                    if (hit != null)
                    {
                        AddHit(raycast, hit);
                    }
                }
            }
            else
            {
                for (int i = 0; i < mesh.Vertices.Length / 3; i++)
                {
                    triangle.A = mesh.Vertices[3 * i];
                    triangle.B = mesh.Vertices[3 * i + 1];
                    triangle.C = mesh.Vertices[3 * i + 2];

                    var hit = triangle.Raycast(raycast.ModelSpaceRay);
                    if (hit != null)
                    {
                        AddHit(raycast, hit);
                    }
                }
            }
        }