Click here to Skip to main content
15,896,063 members
Articles / Programming Languages / C#

Space and Matrix Transformations - Building a 3D Engine

Rate me:
Please Sign up or sign in to vote.
4.84/5 (13 votes)
4 Sep 2009CPOL8 min read 94.9K   6.1K   101  
This Article Describes How to Navigate 3D Space
#region Kam 2007
/*
 *  I took this code from Kam article 
 *  http://www.codeproject.com/KB/openGL/Tao_Arcball.aspx though there was
 *  np statement of ownership I am trying to recognize my sources.  It was
 *  a Good article. Check it out.  I will be using it for my Arcball Camera.
*/
#endregion

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace AGE_Engine3D
{
    public enum MouseButtonPressType { NONE, LEFTBUTTON, RIGHTBUTTON, MIDDLEBUTTON }; 
    
    public class MouseControl
    {
        #region Fields
        protected Control CurrCtrl;
        protected MouseButtons FinalClick; 
        #endregion

        #region Events
        public event MouseEventHandler MouseMove;

        public event EventHandler LeftClick;
        public event EventHandler RightClick;
        public event EventHandler MiddleClick;

        public event EventHandler LeftDoubleClick;
        public event EventHandler RightDoubleClick;
        public event EventHandler MiddleDoubleClick;

        public event MouseEventHandler LeftMouseClick;
        public event MouseEventHandler RightMouseClick;
        public event MouseEventHandler MiddleMouseClick;

        public event MouseEventHandler LeftMouseDoubleClick;
        public event MouseEventHandler RightMouseDoubleClick;
        public event MouseEventHandler MiddleMouseDoubleClick;

        public event MouseEventHandler LeftMouseDown;
        public event MouseEventHandler LeftMouseUp;

        public event MouseEventHandler RightMouseDown;
        public event MouseEventHandler RightMouseUp;

        public event MouseEventHandler MiddleMouseDown;
        public event MouseEventHandler MiddleMouseUp; 
        #endregion
        
        #region Interface

        public Control Control
        {
            get { return CurrCtrl; }
            set
            {
                CurrCtrl = value;
                Initialize();
            }
        }
        
        #endregion

        #region Methods
        public MouseControl()
        {
        }

        public MouseControl(Control ctrl)
        {
            Control = ctrl;
        }

        public void AddControl(Control ctrl)
        {
            Control = ctrl;
        }

        protected virtual void Initialize()
        {
            CurrCtrl.MouseMove += new MouseEventHandler(OnMouseMove);
            CurrCtrl.Click += new EventHandler(OnClick);
            CurrCtrl.DoubleClick += new EventHandler(OnDoubleClick);
            CurrCtrl.MouseClick += new MouseEventHandler(OnMouseClick);
            CurrCtrl.MouseDoubleClick += new MouseEventHandler(OnMouseDoubleClick);
            CurrCtrl.MouseDown += new MouseEventHandler(OnMouseDown);
            CurrCtrl.MouseUp += new MouseEventHandler(OnMouseUp);



        } 
        #endregion

        #region Mouse Events
        private void OnMouseMove(object sender, MouseEventArgs e)
        {
            MouseMove(sender, e);
        }

        private void OnClick(object sender, EventArgs e)
        {
            switch (FinalClick)
            {
                case MouseButtons.Left:
                    if (LeftClick != null)
                    {
                        LeftClick(sender, e);
                    }
                    break;

                case MouseButtons.Right:
                    if (RightClick != null)
                    {
                        RightClick(sender, e);
                    }
                    break;
                case MouseButtons.Middle:
                    if (MiddleClick != null)
                    {
                        MiddleClick(sender, e);
                    }
                    break;
            }
        }

        private void OnDoubleClick(object sender, EventArgs e)
        {
            switch (FinalClick)
            {
                case MouseButtons.Left:
                    if (LeftDoubleClick != null)
                    {
                        LeftDoubleClick(sender, e);
                    }
                    break;

                case MouseButtons.Right:
                    if (RightDoubleClick != null)
                    {
                        RightDoubleClick(sender, e);
                    }
                    break;
                case MouseButtons.Middle:
                    if (MiddleDoubleClick != null)
                    {
                        MiddleDoubleClick(sender, e);
                    }
                    break;
            }
        }

        private void OnMouseClick(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    {
                        if (LeftMouseClick != null)
                        {
                            LeftMouseClick(sender, e);
                        }
                        break;
                    }
                case MouseButtons.Middle:
                    {
                        if (MiddleMouseClick != null)
                        {
                            MiddleMouseClick(sender, e);
                        }
                        break;
                    }

                case MouseButtons.Right:
                    {
                        if (RightMouseClick != null)
                        {
                            RightMouseClick(sender, e);
                        }
                        break;
                    }
            }
        }

        private void OnMouseDoubleClick(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    {
                        if (LeftMouseDoubleClick != null)
                        {
                            LeftMouseDoubleClick(sender, e);
                        }
                        break;
                    }
                case MouseButtons.Middle:
                    {
                        if (MiddleMouseDoubleClick != null)
                        {
                            MiddleMouseDoubleClick(sender, e);
                        }
                        break;
                    }

                case MouseButtons.Right:
                    {
                        if (RightMouseDoubleClick != null)
                        {
                            RightMouseDoubleClick(sender, e);
                        }
                        break;
                    }
            }
        }

        private void OnMouseDown(object sender, MouseEventArgs e)
        {
            FinalClick = e.Button;
            
            switch (e.Button)
            {
                case MouseButtons.Left:
                    {
                        if (LeftMouseDown != null)
                        {
                            LeftMouseDown(sender, e);
                        }
                        break;
                    }
                case MouseButtons.Middle:
                    {
                        if (MiddleMouseDown != null)
                        {
                            MiddleMouseDown(sender, e);
                        }
                        break;
                    }

                case MouseButtons.Right:
                    {
                        if (RightMouseDown != null)
                        {
                            RightMouseDown(sender, e);
                        }
                        break;
                    }
            }
        }

        private void OnMouseUp(object sender, MouseEventArgs e)
        {
            switch (e.Button)
            {
                case MouseButtons.Left:
                    {
                        if (LeftMouseUp != null)
                        {
                            LeftMouseUp(sender, e);
                        }
                        break;
                    }
                case MouseButtons.Middle:
                    {
                        if (MiddleMouseUp != null)
                        {
                            MiddleMouseUp(sender, e);
                        }
                        break;
                    }

                case MouseButtons.Right:
                    {
                        if (RightMouseUp != null)
                        {
                            RightMouseUp(sender, e);
                        }
                        break;
                    }
            }
        } 
        #endregion
    }

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Engineer Lea+Elliott, Inc.
United States United States
I am a licensed Electrical Engineer at Lea+Elliott, Inc. We specialize in the planning, procurement and implementation of transportation systems, with special emphasis on automated and emerging technologies.

Comments and Discussions