Esempio n. 1
0
        private void UpdatePosition(Vector2 screenPosition)
        {
            var ray              = context.World.GetRayForLocalBounds(screenPosition);
            var scene            = context.Scene;
            var intersectionInfo = scene.GetBVHData().GetClosestIntersection(ray);

            var oldPosition = getPosition();
            var newPosition = oldPosition;
            var world       = Object3DControlContext.World;
            var rayNormal   = (oldPosition - world.EyePosition).GetNormal();

            if (intersectionInfo == null)
            {
                if (HitPlane == null)
                {
                    HitPlane = new PlaneShape(new Plane(rayNormal, oldPosition), null);
                }

                intersectionInfo = HitPlane.GetClosestIntersection(ray);
                if (intersectionInfo != null)
                {
                    newPosition = intersectionInfo.HitPosition;
                }
            }
            else
            {
                HitPlane = new PlaneShape(new Plane(rayNormal, oldPosition), null);

                foreach (var object3D in scene.Children)
                {
                    if (object3D.GetBVHData().Contains(intersectionInfo.HitPosition))
                    {
                        newPosition = intersectionInfo.HitPosition;
                        break;
                    }
                }
            }

            if (newPosition != oldPosition)
            {
                setPosition(newPosition);
                context.GuiSurface.Invalidate();
            }
        }