]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/selection.cpp
Q3map2:
[xonotic/netradiant.git] / radiant / selection.cpp
index 76ca557a0bec84ba1e97565a28cefa0052de24d7..ff4c6ee32fab33129828cde4ea9f0542aef36e2f 100644 (file)
@@ -2577,6 +2577,8 @@ enum EModifier
        eToggle,
        eReplace,
        eCycle,
+       eSelect,
+       eDeselect,
 };
 
 RadiantSelectionSystem() :
@@ -2769,22 +2771,29 @@ void deselectAll(){
        }
 }
 
+void deselectComponentsOrAll( bool components ){
+       if ( components ) {
+               setSelectedAllComponents( false );
+       }
+       else
+       {
+               deselectAll();
+       }
+}
+
 void SelectPoint( const View& view, const float device_point[2], const float device_epsilon[2], RadiantSelectionSystem::EModifier modifier, bool face ){
+       //globalOutputStream() << device_point[0] << "   " << device_point[1] << "\n";
        ASSERT_MESSAGE( fabs( device_point[0] ) <= 1.0f && fabs( device_point[1] ) <= 1.0f, "point-selection error" );
+
        if ( modifier == eReplace ) {
-               if ( face ) {
-                       setSelectedAllComponents( false );
-               }
-               else
-               {
-                       deselectAll();
-               }
+               deselectComponentsOrAll( face );
        }
-
+/*
+//nothingSelected() doesn't consider faces, selected in non-component mode, m
        if ( modifier == eCycle && nothingSelected() ){
                modifier = eReplace;
        }
-
+*/
   #if defined ( DEBUG_SELECTION )
        g_render_clipped.destroy();
   #endif
@@ -2833,7 +2842,7 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
                                while ( i != selector.end() )
                                {
                                        if ( ( *i ).second->isSelected() ) {
-                                               ( *i ).second->setSelected( false );
+                                               deselectComponentsOrAll( face );
                                                ++i;
                                                if ( i != selector.end() ) {
                                                        i->second->setSelected( true );
@@ -2848,40 +2857,75 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
                                        ++i;
                                }
                                if( !CycleSelectionOccured ){
-                                       if ( face ){
-                                               setSelectedAllComponents( false );
-                                       }
-                                       else{
-                                               deselectAll();
-                                       }
+                                       deselectComponentsOrAll( face );
                                        ( *selector.begin() ).second->setSelected( true );
                                }
                        }
                        break;
+                       case RadiantSelectionSystem::eSelect:
+                       {
+                               if( !( *selector.begin() ).second->isSelected() ){
+                                       ( *selector.begin() ).second->setSelected( true );
+                               }
+                       }
+                       break;
+                       case RadiantSelectionSystem::eDeselect:
+                       {
+                               if( ( *selector.begin() ).second->isSelected() ){
+                                       ( *selector.begin() ).second->setSelected( false );
+                               }
+                       }
+                       break;
                        default:
                                break;
                        }
                }
-               else if( modifier == eCycle || modifier == eReplace ){
-                       if ( face ){
-                               setSelectedAllComponents( false );
-                       }
-                       else{
-                               deselectAll();
-                       }
+               else if( modifier == eCycle ){
+                       deselectComponentsOrAll( face );
                }
        }
 }
 
-void SelectArea( const View& view, const float device_point[2], const float device_delta[2], RadiantSelectionSystem::EModifier modifier, bool face ){
-       if ( modifier == eReplace ) {
+bool SelectPoint_InitPaint( const View& view, const float device_point[2], const float device_epsilon[2], bool face ){
+       ASSERT_MESSAGE( fabs( device_point[0] ) <= 1.0f && fabs( device_point[1] ) <= 1.0f, "point-selection error" );
+  #if defined ( DEBUG_SELECTION )
+       g_render_clipped.destroy();
+  #endif
+
+       {
+               View scissored( view );
+               ConstructSelectionTest( scissored, SelectionBoxForPoint( device_point, device_epsilon ) );
+
+               SelectionVolume volume( scissored );
+               SelectionPool selector;
                if ( face ) {
-                       setSelectedAllComponents( false );
+                       Scene_TestSelect_Component( selector, volume, scissored, eFace );
                }
                else
                {
-                       deselectAll();
+                       Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
+               }
+
+               if ( !selector.failed() ) {
+                       SelectableSortedSet::iterator best = selector.begin();
+                       if ( ( *best ).second->isSelected() ) {
+                               ( *best ).second->setSelected( false );
+                               return false;
+                       }
+                       else{
+                               ( *best ).second->setSelected( true );
+                               return true;
+                       }
                }
+               else{
+                       return true;
+               }
+       }
+}
+
+void SelectArea( const View& view, const float device_point[2], const float device_delta[2], RadiantSelectionSystem::EModifier modifier, bool face ){
+       if ( modifier == eReplace ) {
+               deselectComponentsOrAll( face );
        }
 
   #if defined ( DEBUG_SELECTION )
@@ -3356,7 +3400,7 @@ void RadiantSelectionSystem::ConstructPivot() const {
                        m_object_pivot = bounds.origin;
                }
 
-               vector3_snap( m_object_pivot, GetSnapGridSize() );
+               //vector3_snap( m_object_pivot, GetSnapGridSize() );
                m_pivot2world = matrix4_translation_for_vec3( m_object_pivot );
 
                switch ( m_manipulator_mode )
@@ -3494,11 +3538,13 @@ const ModifierFlags c_modifier_copy_texture = c_modifierNone;
 class Selector_
 {
 RadiantSelectionSystem::EModifier modifier_for_state( ModifierFlags state ){
-       if ( state == c_modifier_toggle || state == c_modifier_toggle_face ) {
-               return RadiantSelectionSystem::eToggle;
-       }
-       if ( state == c_modifier_replace || state == c_modifier_replace_face ) {
-               return RadiantSelectionSystem::eReplace;
+       if ( ( state == c_modifier_toggle || state == c_modifier_toggle_face || state == c_modifier_face ) ) {
+               if( m_mouse2 ){
+                       return RadiantSelectionSystem::eReplace;
+               }
+               else{
+                       return RadiantSelectionSystem::eToggle;
+               }
        }
        return RadiantSelectionSystem::eManipulator;
 }
@@ -3520,10 +3566,14 @@ DeviceVector m_start;
 DeviceVector m_current;
 DeviceVector m_epsilon;
 ModifierFlags m_state;
+bool m_mouse2;
+bool m_mouseMoved;
+bool m_mouseMovedWhilePressed;
+bool m_paintSelect;
 const View* m_view;
 RectangleCallback m_window_update;
 
-Selector_() : m_start( 0.0f, 0.0f ), m_current( 0.0f, 0.0f ), m_state( c_modifierNone ){
+Selector_() : m_start( 0.0f, 0.0f ), m_current( 0.0f, 0.0f ), m_state( c_modifierNone ), m_mouse2( false ), m_mouseMoved( false ), m_mouseMovedWhilePressed( false ){
 }
 
 void draw_area(){
@@ -3536,11 +3586,11 @@ void testSelect( DeviceVector position ){
                DeviceVector delta( position - m_start );
                if ( fabs( delta.x() ) > m_epsilon.x() && fabs( delta.y() ) > m_epsilon.y() ) {
                        DeviceVector delta( position - m_start );
-                       getSelectionSystem().SelectArea( *m_view, &m_start[0], &delta[0], modifier, ( m_state & c_modifier_face ) != c_modifierNone );
+                       //getSelectionSystem().SelectArea( *m_view, &m_start[0], &delta[0], modifier, ( m_state & c_modifier_face ) != c_modifierNone );
+                       getSelectionSystem().SelectArea( *m_view, &m_start[0], &delta[0], RadiantSelectionSystem::eToggle, ( m_state & c_modifier_face ) != c_modifierNone );
                }
-               else
-               {
-                       if ( modifier == RadiantSelectionSystem::eReplace ) {
+               else if( !m_mouseMovedWhilePressed ){
+                       if ( modifier == RadiantSelectionSystem::eReplace && !m_mouseMoved ) {
                                modifier = RadiantSelectionSystem::eCycle;
                        }
                        getSelectionSystem().SelectPoint( *m_view, &position[0], &m_epsilon[0], modifier, ( m_state & c_modifier_face ) != c_modifierNone );
@@ -3552,18 +3602,19 @@ void testSelect( DeviceVector position ){
 }
 
 void testSelect_simpleM1( DeviceVector position ){
-       RadiantSelectionSystem::EModifier modifier = RadiantSelectionSystem::eReplace;
+       /*RadiantSelectionSystem::EModifier modifier = RadiantSelectionSystem::eReplace;
        DeviceVector delta( position - m_start );
        if ( fabs( delta.x() ) < m_epsilon.x() && fabs( delta.y() ) < m_epsilon.y() ) {
                modifier = RadiantSelectionSystem::eCycle;
        }
-       getSelectionSystem().SelectPoint( *m_view, &position[0], &m_epsilon[0], modifier, false );
+       getSelectionSystem().SelectPoint( *m_view, &position[0], &m_epsilon[0], modifier, false );*/
+       getSelectionSystem().SelectPoint( *m_view, &position[0], &m_epsilon[0], m_mouseMoved ? RadiantSelectionSystem::eReplace : RadiantSelectionSystem::eCycle, false );
        m_start = m_current = device_constrained( position );
 }
 
 
 bool selecting() const {
-       return m_state != c_modifier_manipulator;
+       return m_state != c_modifier_manipulator && m_mouse2;
 }
 
 void setState( ModifierFlags state ){
@@ -3587,16 +3638,32 @@ void modifierDisable( ModifierFlags type ){
 
 void mouseDown( DeviceVector position ){
        m_start = m_current = device_constrained( position );
+       if( !m_mouse2 && m_state != c_modifierNone ){
+               m_paintSelect = getSelectionSystem().SelectPoint_InitPaint( *m_view, &position[0], &m_epsilon[0], ( m_state & c_modifier_face ) != c_modifierNone );
+       }
 }
 
 void mouseMoved( DeviceVector position ){
        m_current = device_constrained( position );
-       draw_area();
+       m_mouseMovedWhilePressed = true;
+       if( m_mouse2 ){
+               draw_area();
+       }
+       else if( m_state != c_modifier_manipulator ){
+               getSelectionSystem().SelectPoint( *m_view, &m_current[0], &m_epsilon[0],
+                                                                               m_paintSelect ? RadiantSelectionSystem::eSelect : RadiantSelectionSystem::eDeselect,
+                                                                               ( m_state & c_modifier_face ) != c_modifierNone );
+       }
 }
 typedef MemberCaller1<Selector_, DeviceVector, &Selector_::mouseMoved> MouseMovedCaller;
 
 void mouseUp( DeviceVector position ){
-       testSelect( device_constrained( position ) );
+       if( m_mouse2 ){
+               testSelect( device_constrained( position ) );
+       }
+       else{
+               m_start = m_current = DeviceVector( 0.0f, 0.0f );
+       }
 
        g_mouseMovedCallback.clear();
        g_mouseUpCallback.clear();
@@ -3666,8 +3733,9 @@ void onSizeChanged( int width, int height ){
        m_selector.m_epsilon = m_manipulator.m_epsilon = epsilon;
 }
 void onMouseDown( const WindowVector& position, ButtonIdentifier button, ModifierFlags modifiers ){
-       if ( button == c_button_select ) {
+       if ( button == c_button_select || ( button == c_button_select2 && modifiers != c_modifierNone ) ) {
                m_mouse_down = true;
+               //m_selector.m_mouseMoved = false;
 
                DeviceVector devicePosition( window_to_normalised_device( position, m_width, m_height ) );
                if ( modifiers == c_modifier_manipulator && m_manipulator.mouseDown( devicePosition ) ) {
@@ -3676,6 +3744,12 @@ void onMouseDown( const WindowVector& position, ButtonIdentifier button, Modifie
                }
                else
                {
+                       if ( button == c_button_select ) {
+                               m_selector.m_mouse2 = false;
+                       }
+                       else{
+                               m_selector.m_mouse2 = true;
+                       }
                        m_selector.mouseDown( devicePosition );
                        g_mouseMovedCallback.insert( MouseEventCallback( Selector_::MouseMovedCaller( m_selector ) ) );
                        g_mouseUpCallback.insert( MouseEventCallback( Selector_::MouseUpCaller( m_selector ) ) );
@@ -3697,22 +3771,26 @@ void onMouseDown( const WindowVector& position, ButtonIdentifier button, Modifie
        }
 }
 void onMouseMotion( const WindowVector& position, ModifierFlags modifiers ){
+       m_selector.m_mouseMoved = true;
        if ( m_mouse_down && !g_mouseMovedCallback.empty() ) {
                g_mouseMovedCallback.get() ( window_to_normalised_device( position, m_width, m_height ) );
        }
 }
 void onMouseUp( const WindowVector& position, ButtonIdentifier button, ModifierFlags modifiers ){
-       if ( button == c_button_select && !g_mouseUpCallback.empty() ) {
+       if ( ( button == c_button_select || button == c_button_select2 ) && !g_mouseUpCallback.empty() ) {
                m_mouse_down = false;
 
                g_mouseUpCallback.get() ( window_to_normalised_device( position, m_width, m_height ) );
        }
        //L button w/o scene changed = tunnel selection
        if( !getSelectionSystem().m_undo_begun && modifiers == c_modifierNone && button == c_button_select &&
+               //( !m_selector.m_mouseMoved || !m_mouse_down ) &&
                ( GlobalSelectionSystem().Mode() != SelectionSystem::eComponent || GlobalSelectionSystem().ManipulatorMode() != SelectionSystem::eDrag ) ){
-               m_selector.testSelect_simpleM1( window_to_normalised_device( position, m_width, m_height ) );
+               m_selector.testSelect_simpleM1( device_constrained( window_to_normalised_device( position, m_width, m_height ) ) );
        }
        getSelectionSystem().m_undo_begun = false;
+       m_selector.m_mouseMoved = false;
+       m_selector.m_mouseMovedWhilePressed = false;
 }
 void onModifierDown( ModifierFlags type ){
        m_selector.modifierEnable( type );