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