Ejemplo n.º 1
0
        public void UpdateDraw_Ray(Ray3f ray, int nStep)
        {
            // scene xform may have changed during steps (eg view rotation), so we
            // need to reconstruct our local frame
            Frame3f primCurW = scene.ToWorldFrame(primStartS);

            // step 1: find radius in plane
            // step 2: find height from plane
            float fY = MinDimension;

            if (nStep == 0)
            {
                Vector3f forwardDir = ray.Direction;
                Vector3f plane_hit  = VRUtil.SafeRayPlaneIntersection(ray, forwardDir, primCurW.Origin, primCurW.Y);
                plane_hit_local = primCurW.ToFrameP(plane_hit);
            }
            else if (nStep == 1)
            {
                Vector3f plane_hit = primCurW.FromFrameP(plane_hit_local);
                Line3d   l         = new Line3d(plane_hit, primCurW.Y);
                fY = (float)DistLine3Ray3.MinDistanceLineParam(ray, l);
            }

            // figure out possible dimensions, clamp to ranges
            float planeX   = MathUtil.SignedClamp(plane_hit_local[0], MinDimension, MaxDimension);
            float planeZ   = MathUtil.SignedClamp(plane_hit_local[2], MinDimension, MaxDimension);
            float fR_plane = MathUtil.Clamp(plane_hit_local.Length, MinDimension / 2, MaxDimension / 2);

            fY = MathUtil.SignedClamp(fY, MinDimension, MaxDimension);

            // update frame
            primitive.Frame = primCurW;

            // update dimensions
            bool  bIsCorner = (primitive.Center == CenterModes.Corner);
            float fScale    = 1.0f;     // object is not in scene coordinates!

            if (primitive.Type == MeshPrimitivePreview.PrimType.Cylinder)
            {
                primitive.Width  = (bIsCorner) ? fR_plane * fScale : 2 * fR_plane * fScale;
                primitive.Depth  = primitive.Width;
                primitive.Height = fY * fScale;
            }
            else if (primitive.Type == MeshPrimitivePreview.PrimType.Box)
            {
                primitive.Width  = (bIsCorner) ? planeX * fScale : 2 * planeX * fScale;
                primitive.Depth  = (bIsCorner) ? planeZ * fScale : 2 * planeZ * fScale;
                primitive.Height = fY * fScale;
            }
            else if (primitive.Type == MeshPrimitivePreview.PrimType.Sphere)
            {
                primitive.Width  = (bIsCorner) ? fR_plane * fScale : 2 * fR_plane * fScale;
                primitive.Depth  = primitive.Width;
                primitive.Height = Mathf.Sign(fY) * primitive.Width;
            }
            else
            {
                throw new NotImplementedException("DrawPrimitivesTool.UpdateDraw_Ray - type not supported");
            }
        }
Ejemplo n.º 2
0
        public void DoCameraControl(FScene scene, fCamera mainCamera, InputState input)
        {
            if (bInAction == false)
            {
                if (Input.GetMouseButtonDown(0) || Input.GetMouseButtonDown(1) || Input.GetMouseButtonDown(2))
                {
                    curPos2D  = new Vector2(0, 0);
                    rcInfo    = new CameraManipulator.RateControlInfo(curPos2D);
                    bInAction = bUsingMouse = true;
                }
                else if (InputExtension.Get.GamepadRightShoulder.Down || InputExtension.Get.GamepadLeftShoulder.Down)
                {
                    curPos2D  = secondPos2D = new Vector2(0, 0);
                    rcInfo    = new CameraManipulator.RateControlInfo(curPos2D);
                    rcInfo2   = new CameraManipulator.RateControlInfo(secondPos2D);
                    bInAction = bUsingGamepad = true;
                }
            }

            if (bInAction && bUsingMouse)
            {
                Vector2f mouseDelta = InputExtension.Get.Mouse.PositionDelta;
                curPos2D.x += mouseDelta.x;
                curPos2D.y += mouseDelta.y;

                if (Input.GetMouseButton(0))
                {
                    mainCamera.Manipulator().SceneRateControlledFly(scene, mainCamera, curPos2D, rcInfo);
                }
                else if (Input.GetMouseButton(1))
                {
                    mainCamera.Manipulator().SceneRateControlledZoom(scene, mainCamera, curPos2D, rcInfo);
                }
                else if (Input.GetMouseButton(2))
                {
                    mainCamera.Manipulator().SceneRateControlledEgogentricPan(scene, mainCamera, curPos2D, rcInfo);
                }
            }


            if (bInAction && bUsingGamepad)
            {
                Vector2f stick1 = InputExtension.Get.GamepadLeftStick.Position;
                Vector2f stick2 = InputExtension.Get.GamepadRightStick.Position;
                float    dx     = stick1.x;
                float    dy     = stick1.y;
                float    dx2    = stick2.x;
                float    dy2    = stick2.y;
                curPos2D.x    += dx;
                curPos2D.y    += dy;
                secondPos2D.x += dx2;
                secondPos2D.y += dy2;
                float use_t = 3.0f;     // 5 == hard stop, 1 == bit too soft
                curPos2D.x    = MathUtil.SignedClamp(curPos2D.x, rcInfo.rampUpRadius);
                curPos2D.x    = Mathf.Lerp(curPos2D.x, 0, use_t * Time.deltaTime);
                curPos2D.y    = MathUtil.SignedClamp(curPos2D.y, rcInfo.rampUpRadius);
                curPos2D.y    = Mathf.Lerp(curPos2D.y, 0, use_t * Time.deltaTime);
                secondPos2D.x = MathUtil.SignedClamp(secondPos2D.x, rcInfo.rampUpRadius);
                secondPos2D.x = Mathf.Lerp(secondPos2D.x, 0, use_t * Time.deltaTime);
                secondPos2D.y = MathUtil.SignedClamp(secondPos2D.y, rcInfo.rampUpRadius);
                secondPos2D.y = Mathf.Lerp(secondPos2D.y, 0, use_t * Time.deltaTime);

                if (InputExtension.Get.GamepadRightShoulder.Down)
                {
                    mainCamera.Manipulator().SceneRateControlledZoom(scene, mainCamera, curPos2D, rcInfo);
                    secondPos2D[0] = 0;
                    mainCamera.Manipulator().SceneRateControlledEgogentricPan(scene, mainCamera, secondPos2D, rcInfo2);
                }
                else if (InputExtension.Get.GamepadLeftShoulder.Down)
                {
                    mainCamera.Manipulator().SceneRateControlledFly(scene, mainCamera, curPos2D, rcInfo);
                    mainCamera.Manipulator().SceneRateControlledEgogentricPan(scene, mainCamera, secondPos2D, rcInfo2);
                }
            }
        }