void CreateView(RenderingSurface xiSurface, Scene xiScene, Camera xiCamera, RenderMode xiFixedRenderMode) { xiSurface.MouseDown += new MouseEventHandler(Viewer3DRenderingSurface_MouseDown); xiSurface.MouseUp += new MouseEventHandler(Viewer3DRenderingSurface_MouseUp); xiSurface.MouseMove += new MouseEventHandler(Viewer3DRenderingSurface_MouseMove); xiSurface.MouseWheel += new MouseEventHandler(Viewer3DRenderingSurface_MouseWheel); xiSurface.GotFocus += new EventHandler(Viewer3DRenderingSurface_GotFocus); ImmediateModeRenderer lRenderer = new ImmediateModeRenderer(); lRenderer.FixedRenderMode = xiFixedRenderMode; lRenderer.Attach(xiSurface); MMEdEditorView lView = new MMEdEditorView(this, xiScene, xiCamera, lRenderer); mViews.Add(xiSurface, lView); }
void Viewer3DRenderingSurface_MouseMove(object sender, MouseEventArgs e) { if (!mDraggingView || mSubject == null) { return; } System.Drawing.Point lNewMousePoint = e.Location; RenderingSurface lSender = sender as RenderingSurface; Camera lCamera = mViews[lSender].Camera; if (mDraggingButton == MouseButtons.Left) { if (Control.ModifierKeys == Keys.Alt && lCamera.ProjectionMode == eProjectionMode.Orthographic) { IPositionable lObject = ActiveObject as IPositionable; if (lObject != null) { double lDeltaX = (lNewMousePoint.X - mLastMouseDown.X); // Origin is at bottom-left, but mouse position is measured from orign at top-left (or vice versa) double lDeltaY = -(lNewMousePoint.Y - mLastMouseDown.Y); double lScale = (lCamera.Position.GetPositionVector() * lCamera.ZAxis) / lSender.Width; Vector lDelta = ((lDeltaX * lCamera.XAxis) + (lDeltaY * lCamera.YAxis)) * lScale; lObject.OriginPosition.X += (short)(lDelta.x); lObject.OriginPosition.Y += (short)(lDelta.y); // MMs has a left handed coordinate system, so the z-axis is pointing the "wrong" way lObject.OriginPosition.Z -= (short)(lDelta.z); RebuildObject(lObject); InvalidateAllViewers(); } } else if (Control.ModifierKeys == Keys.Shift) { IRotatable lObject = ActiveObject as IRotatable; if (lObject != null) { double lDelta = (double)(lNewMousePoint.Y - mLastMouseDown.Y); lObject.RotationVector = Utils.RotationMatrixToShort3Coord( Matrix.Rotation(lDelta / 100, lCamera.ZAxis) * Utils.Short3CoordToRotationMatrix(lObject.RotationVector)); RebuildObject(lObject); InvalidateAllViewers(); } } else if (lCamera.ProjectionMode == eProjectionMode.Perspective) { switch (MovementMode) { case eMovementMode.FlyMode: bool lCameraIsUpsideDown = lCamera.YAxis.Dot(Vector.ZAxis) < 0; lCamera.Rotate(0.01 * (lNewMousePoint.X - mLastMouseDown.X), lCameraIsUpsideDown ? Vector.ZAxis : -Vector.ZAxis); lCamera.Rotate(0.01 * (lNewMousePoint.Y - mLastMouseDown.Y), lCamera.XAxis); break; case eMovementMode.InspectMode: lCamera.RotateAboutWorldOrigin(0.01 * (lNewMousePoint.X - mLastMouseDown.X), lCamera.YAxis); lCamera.RotateAboutWorldOrigin(0.01 * (lNewMousePoint.Y - mLastMouseDown.Y), lCamera.XAxis); break; default: throw new Exception("Unreachable case"); } } } if (mDraggingButton == MouseButtons.Right) { if (Control.ModifierKeys == Keys.Alt) { } else if (Control.ModifierKeys == Keys.Shift) { } else { if (lCamera.ProjectionMode == eProjectionMode.Orthographic) { double lScale = (lCamera.Position.GetPositionVector() * lCamera.ZAxis) / lSender.Width; lCamera.Move(-lScale * (lNewMousePoint.X - mLastMouseDown.X) * lCamera.XAxis); lCamera.Move(lScale * (lNewMousePoint.Y - mLastMouseDown.Y) * lCamera.YAxis); } else { if (lCamera.ProjectionMode == eProjectionMode.Perspective && MovementMode == eMovementMode.FlyMode) { lCamera.Move(0.1 * MoveScale * (lNewMousePoint.X - mLastMouseDown.X) * lCamera.XAxis); lCamera.Move(0.1 * MoveScale * (lNewMousePoint.Y - mLastMouseDown.Y) * lCamera.YAxis); } } } } mLastMouseDown = lNewMousePoint; lSender.Invalidate(); }
public override void UploadBuffers(RenderingSurface surface) { throw new NotImplementedException(); }