public void ProcessSelectionEdit(int MouseX, int MouseY)
        {
            //Trace.WriteLine("edit active = " + MdxRender.Input.EditActive.ToString());
            //get selected instance
            if ((activeSelection != null) && (MdxRender.Input.EditActive))
            {
                Vector3 PickRayDirection = new Vector3();
                Vector3 PickRayOrigin    = new Vector3();
                MouseX = MdxRender.Input.MouseX;
                MouseY = MdxRender.Input.MouseY;
                MdxRender.CalculatePickRayWorld(MouseX, MouseY, out PickRayDirection, out PickRayOrigin);

                //use the z-plane of most recent object selected
                float z_plane = activeSelection.ZPlane;


                //calculate mouse-movement of selected object
                Vector3 move_vector = new Vector3();
                Vector3 sel_pos     = new Vector3();
                Vector3 obj_pos     = new Vector3();

                //use last selected object's reference planes to figure out where to move the object
                activeSelection.GetTranslation(out obj_pos);


                if (MdxRender.Input.EditVerticalPlacement)
                {
                    //do calculation to determine selection plane intersect point for XZ plane
                    if ((PickRayOrigin.Y - PickRayDirection.Y) != 0)
                    {
                        float u = (PickRayOrigin.Y - obj_pos.Y) / (PickRayOrigin.Y - PickRayDirection.Y);

                        sel_pos.X = PickRayOrigin.X + u * (PickRayDirection.X - PickRayOrigin.X);
                        sel_pos.Y = PickRayOrigin.Y + u * (PickRayDirection.Y - PickRayOrigin.Y);
                        sel_pos.Z = PickRayOrigin.Z + u * (PickRayDirection.Z - PickRayOrigin.Z);

                        move_vector.X = 0;
                        move_vector.Y = 0;
                        move_vector.Z = sel_pos.Z - lastSelectionPosition.Z;
                    }
                }
                else //X-Y Object Movement
                {
                    //do calculation to determine selection plane intersect point for XY plane
                    if ((PickRayOrigin.Z - PickRayDirection.Z) != 0)
                    {
                        float u = (PickRayOrigin.Z - obj_pos.Z) / (PickRayOrigin.Z - PickRayDirection.Z);

                        sel_pos.X = PickRayOrigin.X + u * (PickRayDirection.X - PickRayOrigin.X);
                        sel_pos.Y = PickRayOrigin.Y + u * (PickRayDirection.Y - PickRayOrigin.Y);
                        sel_pos.Z = PickRayOrigin.Z + u * (PickRayDirection.Z - PickRayOrigin.Z);

                        move_vector.X = sel_pos.X - lastSelectionPosition.X;
                        move_vector.Y = sel_pos.Y - lastSelectionPosition.Y;
                        move_vector.Z = 0;
                    }
                }

                lastSelectionPosition = sel_pos;

                activeSelection.IncrementTranslation(move_vector);
            }
        }
        public void MouseUp(int MouseX, int MouseY)
        {
            Vector3 PickRayDirection = new Vector3();
            Vector3 PickRayOrigin    = new Vector3();

            MdxRender.CalculatePickRayWorld(MouseX, MouseY, out PickRayDirection, out PickRayOrigin);

            #region 2D Selection Box
            //see if we need to do a 2D select box
            multiSelectBox.MouseUp(MouseX, MouseY);
            if (multiSelectBox.Mode != MultiSelectMode.Disabled)
            {
                if (multiSelectBox.Mode != MultiSelectMode.Disabled)
                {
                    ArrayList  tmp = multiSelectBox.UpdateFrustumSelection(this);
                    bool       bFoundDuplicate = false;
                    Instance3D inst, tmp_inst;
                    //add 2d select box selection list to master selection list
                    for (int s = 0; s < tmp.Count; s++)
                    {
                        tmp_inst = (Instance3D)tmp[s];
                        //check for duplication
                        for (int k = 0; k < selectionList.Count; k++)
                        {
                            inst = (Instance3D)selectionList[k];
                            if (tmp_inst == inst)
                            {
                                bFoundDuplicate = true;
                                break;
                            }
                        }

                        if (bFoundDuplicate == false)
                        {
                            selectionList.Add(tmp[s]);
                        }
                    }
                }
            }
            #endregion

            //debug code
            if (activeSelection == null)
            {
                foreach (Instance3D instance in this)
                {
                    if (instance.MouseUp(PickRayOrigin, PickRayDirection, false) == true)
                    {
                        activeSelection = instance;
                    }
                }

                if ((selectionList.Count != 0) && (multiSelectBox.Mode == MultiSelectMode.Disabled))
                {
                    foreach (Instance3D item in this)
                    {
                        item.Selected = false;
                    }

                    selectionList.Clear();
                }
                //if(m_DebugObject1.MouseUp(PickRayOrigin, PickRayDirection, false))
                //  m_ActiveSelection = m_DebugObject1;
            }
            else
            {
                activeSelection.MakeEditInactive();
                if (activeSelection.MouseUp(PickRayOrigin, PickRayDirection, true) == false)
                {
                    if (activeSelection.EditMode == EditMode.NotSelected)
                    {
                        activeSelection = null;
                    }
                }
            }

            UpdateSelectionLeader();
        }