private Selection GetSelection(int screenX, int screenY) { // Try to see what can be selected Vector3 rayStart = GeometryMath.Unproject(new Vector3(screenX, Viewport.height - screenY, 0.1), ProjectionMatrix, Viewport); Vector3 rayEnd = GeometryMath.Unproject(new Vector3(screenX, Viewport.height - screenY, IsPerspective ? 1.0 : -1.0), ProjectionMatrix, Viewport); Vector3 rayDirection = (rayEnd - rayStart).GetNormalized(); bool closestHitOpaque = false; double closestDistance = Double.MaxValue; int closestPrimitiveTriangleIndex = -1; DebugRenderPrimitive closestPrimitive = null; List <DebugRenderPrimitive> debugRenderPrimitives = Session.DebugRenderStorage.GetCachedPrimitives(); foreach (DebugRenderPrimitive primitive in debugRenderPrimitives) { bool hitOpaque; int triangleIndex; Vector3 intersection = new Vector3(0, 0, 0); if (primitive.RayCheck(Session.PlaybackPosition, rayStart, rayDirection, out triangleIndex, out hitOpaque, out intersection)) { double distance = rayStart.Distance(intersection); if (distance < closestDistance) { closestPrimitiveTriangleIndex = triangleIndex; closestDistance = distance; closestPrimitive = primitive; closestHitOpaque = hitOpaque; } } } return(closestPrimitive != null ? new Selection(closestPrimitive, closestPrimitiveTriangleIndex, closestHitOpaque) : null); }