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"); } }
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); } } }