Exemple #1
0
 public HitTestResultCallbackWrapper(HitTestResultCallback resultCallback, HitTestResultBehavior behaviorOnResult)
 {
     this._resultCallback       = resultCallback;
     this._resultInsertionIndex = 0;
     this._results               = (List <HitTestResult>)null;
     this._onHitFoundBehavior    = behaviorOnResult;
     this._wrappedResultCallback = new HitTestResultCallback(this.OnResult);
 }
        internal HitTestResultBehavior RaiseCallback(HitTestResultCallback resultCallback,
                                                     HitTestFilterCallback filterCallback,
                                                     HitTestResultBehavior lastResult,
                                                     double distanceAdjustment)
        {
            results.Sort(RayHitTestResult.CompareByDistanceToRayOrigin);

            for (int i = 0, count = results.Count; i < count; i++)
            {
                RayHitTestResult result = results[i];

                result.SetDistanceToRayOrigin(result.DistanceToRayOrigin + distanceAdjustment);

                Viewport2DVisual3D viewport2DVisual3D = result.VisualHit as Viewport2DVisual3D;
                if (viewport2DVisual3D != null)
                {
                    Point  intersectionPoint;
                    Visual viewport2DVisual3DChild = viewport2DVisual3D.Visual;

                    if (viewport2DVisual3DChild != null)
                    {
                        if (Viewport2DVisual3D.GetIntersectionInfo(result, out intersectionPoint))
                        {
                            // convert the resulting point to visual coordinates
                            Point            visualPoint = Viewport2DVisual3D.TextureCoordsToVisualCoords(intersectionPoint, viewport2DVisual3DChild);
                            GeneralTransform gt          = viewport2DVisual3DChild.TransformToOuterSpace().Inverse;

                            Point pointOnChild;
                            if (gt != null && gt.TryTransform(visualPoint, out pointOnChild))
                            {
                                HitTestResultBehavior behavior2D = viewport2DVisual3DChild.HitTestPoint(filterCallback,
                                                                                                        resultCallback,
                                                                                                        new PointHitTestParameters(pointOnChild));

                                if (behavior2D == HitTestResultBehavior.Stop)
                                {
                                    return(HitTestResultBehavior.Stop);
                                }
                            }
                        }
                    }
                }

                HitTestResultBehavior behavior = resultCallback(results[i]);

                if (behavior == HitTestResultBehavior.Stop)
                {
                    return(HitTestResultBehavior.Stop);
                }
            }

            return(lastResult);
        }
        /// <summary>
        /// The HTResult function simply takes the intersection closest to the origin and
        /// and stores the intersection info for that closest intersection point.
        /// </summary>
        /// <param name="rawresult"></param>
        /// <returns></returns>
        private HitTestResultBehavior HTResult(System.Windows.Media.HitTestResult rawresult)
        {
            RayHitTestResult      rayResult             = rawresult as RayHitTestResult;
            HitTestResultBehavior hitTestResultBehavior = HitTestResultBehavior.Continue;

            // since we're hit testing a viewport3D we should be getting the ray hit test result back
            if (rayResult != null)
            {
                _closestIntersectInfo = GetIntersectionInfo(rayResult);
                hitTestResultBehavior = HitTestResultBehavior.Stop;
            }

            return(hitTestResultBehavior);
        }
Exemple #4
0
        internal override HitTestResultBehavior HitTestPointInternal(
            HitTestFilterCallback filterCallback,
            HitTestResultCallback resultCallback,
            PointHitTestParameters hitTestParameters)
        {
            if (_children.Count != 0)
            {
                double distanceAdjustment;

                RayHitTestParameters rayParams =
                    Camera.RayFromViewportPoint(
                        hitTestParameters.HitPoint,
                        Viewport.Size,
                        BBoxSubgraph,
                        out distanceAdjustment);

                HitTestResultBehavior result = Visual3D.HitTestChildren(filterCallback, rayParams, this);

                return(rayParams.RaiseCallback(resultCallback, filterCallback, result, distanceAdjustment));
            }

            return(HitTestResultBehavior.Continue);
        }
 internal HitTestResultBehavior RaiseCallback(HitTestResultCallback resultCallback,
                                              HitTestFilterCallback filterCallback,
                                              HitTestResultBehavior lastResult)
 {
     return(RaiseCallback(resultCallback, filterCallback, lastResult, 0.0 /* distance adjustment */));
 }
        internal HitTestResultBehavior RaiseCallback(HitTestResultCallback resultCallback, 
                                                     HitTestFilterCallback filterCallback,
                                                     HitTestResultBehavior lastResult, 
                                                     double distanceAdjustment) 
        {
            results.Sort(RayHitTestResult.CompareByDistanceToRayOrigin); 

            for(int i = 0, count = results.Count; i < count; i++)
            {
                RayHitTestResult result = results[i]; 

                result.SetDistanceToRayOrigin(result.DistanceToRayOrigin + distanceAdjustment); 
 
                Viewport2DVisual3D viewport2DVisual3D = result.VisualHit as Viewport2DVisual3D;
                if (viewport2DVisual3D != null) 
                {
                    Point intersectionPoint;
                    Visual viewport2DVisual3DChild = viewport2DVisual3D.Visual;
 
                    if (viewport2DVisual3DChild != null)
                    { 
                        if (Viewport2DVisual3D.GetIntersectionInfo(result, out intersectionPoint)) 
                        {
                            // convert the resulting point to visual coordinates 
                            Point visualPoint = Viewport2DVisual3D.TextureCoordsToVisualCoords(intersectionPoint, viewport2DVisual3DChild);
                            GeneralTransform gt = viewport2DVisual3DChild.TransformToOuterSpace().Inverse;

                            Point pointOnChild; 
                            if (gt != null && gt.TryTransform(visualPoint, out pointOnChild))
                            { 
 
                                HitTestResultBehavior behavior2D = viewport2DVisual3DChild.HitTestPoint(filterCallback,
                                                                                                        resultCallback, 
                                                                                                        new PointHitTestParameters(pointOnChild));

                                if (behavior2D == HitTestResultBehavior.Stop)
                                { 
                                    return HitTestResultBehavior.Stop;
                                } 
                            } 
                        }
                    } 
                }

                HitTestResultBehavior behavior = resultCallback(results[i]);
 
                if (behavior == HitTestResultBehavior.Stop)
                { 
                    return HitTestResultBehavior.Stop; 
                }
            } 

            return lastResult;
        }
 internal HitTestResultBehavior RaiseCallback(HitTestResultCallback resultCallback, 
                                              HitTestFilterCallback filterCallback, 
                                              HitTestResultBehavior lastResult)
 { 
     return RaiseCallback(resultCallback, filterCallback, lastResult, 0.0 /* distance adjustment */);
 }