示例#1
0
        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);
        }