Example #1
0
        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);
        }
Example #2
0
        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();
 }