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); } }
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); } }
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); } } } }