Пример #1
0
        /// <summary>
        ///     Converts the given point or ray hit test result into a PointHitTestResult.
        ///     In the case of a RayHitTestResult this is done by walking up the
        ///     transforming the 3D intersection into the coordinate space of the
        ///     Viewport3DVisual which contains the Visual3D subtree.
        /// </summary>
        internal static PointHitTestResult AsNearestPointHitTestResult(HitTestResult result)
        {
            if (result == null)
            {
                return(null);
            }

            PointHitTestResult resultAsPointHitTestResult = result as PointHitTestResult;

            if (resultAsPointHitTestResult != null)
            {
                return(resultAsPointHitTestResult);
            }

            RayHitTestResult resultAsRayHitTestResult = result as RayHitTestResult;

            if (resultAsRayHitTestResult != null)
            {
                Visual3D current        = (Visual3D)resultAsRayHitTestResult.VisualHit;
                Matrix3D worldTransform = Matrix3D.Identity;

                while (true)
                {
                    if (current.Transform != null)
                    {
                        worldTransform.Append(current.Transform.Value);
                    }

                    Visual3D parent3D = current.InternalVisualParent as Visual3D;

                    if (parent3D == null)
                    {
                        break;
                    }

                    current = parent3D;
                }

                Viewport3DVisual viewport = current.InternalVisualParent as Viewport3DVisual;

                if (viewport != null)
                {
                    Point4D worldPoint    = ((Point4D)resultAsRayHitTestResult.PointHit) * worldTransform;
                    Point   viewportPoint = viewport.WorldToViewport(worldPoint);

                    return(new PointHitTestResult(viewport, viewportPoint));
                }

                Debug.Fail("How did a ray hit a Visual3D not parented to a Viewport3DVisual?");

                return(null);
            }

            Debug.Fail(String.Format("Unhandled HitTestResult type '{0}'", result.GetType().Name));

            return(null);
        }