void Viewport::MouseUp( const Helium::MouseButtonInput& input ) { // have we completed a drag? bool dragComplete = false; switch (m_DragMode) { case DragModes::None: { if (!m_Tool && input.RightUp()) { m_End = Point (input.GetPosition().x, input.GetPosition().y); m_SelectionFrame->m_End = m_End; m_SelectionFrame->Update(); PickVisitor* pick = NULL; SelectionTargetMode targetMode = SelectionTargetModes::Single; if (m_SelectionFrame->m_Start.x == m_SelectionFrame->m_End.x && m_SelectionFrame->m_Start.y == m_SelectionFrame->m_End.y) { pick = new FrustumLinePickVisitor (&m_Cameras[m_CameraMode], m_SelectionFrame->m_Start.x, m_SelectionFrame->m_Start.y); targetMode = SelectionTargetModes::Single; } else { Frustum worldSpaceFrustum; if ( m_Cameras[m_CameraMode].ViewportToFrustum( (float32_t)m_SelectionFrame->m_Start.x, (float32_t)m_SelectionFrame->m_Start.y, (float32_t)m_SelectionFrame->m_End.x, (float32_t)m_SelectionFrame->m_End.y, worldSpaceFrustum) ) { Point center ( m_SelectionFrame->m_Start + m_SelectionFrame->m_End / 2 ); Line line; m_Cameras[m_CameraMode].ViewportToLine( (float32_t)center.x, (float32_t)center.y, line); pick = new FrustumLinePickVisitor(&m_Cameras[m_CameraMode], line, worldSpaceFrustum ); targetMode = SelectionTargetModes::Multiple; } } if ( pick ) { m_Select.Raise( SelectArgs (pick, SelectionModes::Manifest, targetMode) ); delete pick; pick = NULL; } // our drag is complete now dragComplete = true; } break; } case DragModes::Select: { if (input.LeftUp() || input.MiddleUp()) { m_End = Point (input.GetPosition().x, input.GetPosition().y); m_SelectionFrame->m_End = m_End; m_SelectionFrame->Update(); PickVisitor* pick = NULL; SelectionTargetMode targetMode = SelectionTargetModes::Single; if (m_SelectionFrame->m_Start.x == m_SelectionFrame->m_End.x && m_SelectionFrame->m_Start.y == m_SelectionFrame->m_End.y) { pick = new FrustumLinePickVisitor (&m_Cameras[m_CameraMode], m_SelectionFrame->m_Start.x, m_SelectionFrame->m_Start.y); targetMode = SelectionTargetModes::Single; } else { Frustum worldSpaceFrustum; if ( m_Cameras[m_CameraMode].ViewportToFrustum( (float32_t)m_SelectionFrame->m_Start.x, (float32_t)m_SelectionFrame->m_Start.y, (float32_t)m_SelectionFrame->m_End.x, (float32_t)m_SelectionFrame->m_End.y, worldSpaceFrustum) ) { Point center ( m_SelectionFrame->m_Start + m_SelectionFrame->m_End / 2 ); Line line; m_Cameras[m_CameraMode].ViewportToLine( (float32_t)center.x, (float32_t)center.y, line); pick = new FrustumLinePickVisitor (&m_Cameras[m_CameraMode], line, worldSpaceFrustum); targetMode = SelectionTargetModes::Multiple; } } if ( pick ) { SelectionModes::SelectionMode selectMode; if (input.MiddleUp()) { selectMode = SelectionModes::Manifest; } else { if ( input.CtrlIsDown() ) { if ( input.ShiftIsDown()) { selectMode = SelectionModes::Add; } else { selectMode = SelectionModes::Remove; } } else { if ( input.ShiftIsDown()) { selectMode = SelectionModes::Toggle; } else { selectMode = SelectionModes::Replace; } } } m_Select.Raise( SelectArgs (pick, selectMode, targetMode) ); delete pick; pick = NULL; } // our drag is complete now dragComplete = true; } break; } case DragModes::Camera: { if (input.AltIsDown()) { m_Cameras[m_CameraMode].MouseUp( input ); } break; } default: { if (m_Tool) { m_Tool->MouseUp( input ); } break; } } if (dragComplete) { m_DragMode = DragModes::None; } }