]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/selection.cpp
Merge commit '667d3275589dac91b5bfe96f0244183007be6efd' into master-merge
[xonotic/netradiant.git] / radiant / selection.cpp
index 43a9ca995991dd3b200c335f4c695f11f992ecf9..2ac9844517fd49c83203c2c6734afcc2d6cd5e33 100644 (file)
@@ -381,9 +381,9 @@ void Transform( const Matrix4& manip2object, const Matrix4& device2manip, const
                float grid = GetSnapGridSize();
                Vector3 maxs( m_bounds.origin + m_bounds.extents );
                Vector3 mins( m_bounds.origin - m_bounds.extents );
-//             globalOutputStream() << "current: " << current << "\n";
+               //globalOutputStream() << "current: " << current << "\n";
                for( std::size_t i = 0; i < 3; ++i ){
-                       if( current[i] != 0.f ){
+                       if( fabs( current[i] ) > 0.000001f ){
                                float snapto1 = float_snapped( maxs[i] + current[i] , grid );
                                float snapto2 = float_snapped( mins[i] + current[i] , grid );
 
@@ -2642,7 +2642,8 @@ std::list<Selectable*>& best(){
 }
 };
 
-bool g_bAltDragManipulatorResize = false;
+bool g_bAltDragManipulatorResize = false; //+select primitives in component modes
+bool g_bTmpComponentMode = false;
 
 class DragManipulator : public Manipulator
 {
@@ -2729,6 +2730,7 @@ void testSelect( const View& view, const Matrix4& pivot2world ){
        {
                ( *i ).second->setSelected( true );
        }
+       g_bTmpComponentMode = m_selected;
 }
 
 void setSelected( bool select ){
@@ -3159,7 +3161,7 @@ void SelectPoint( const View& view, const float device_point[2], const float dev
                                Scene_TestSelect_Component( selector, volume, scissored, eFace );
                        }
                        else{
-                               Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
+                               Scene_TestSelect( selector, volume, scissored, g_bAltDragManipulatorResize ? ePrimitive : Mode(), ComponentMode() );
                        }
 
                        if ( !selector.failed() ) {
@@ -3308,7 +3310,7 @@ bool SelectPoint_InitPaint( const View& view, const float device_point[2], const
                                Scene_TestSelect_Component( selector, volume, scissored, eFace );
                        }
                        else{
-                               Scene_TestSelect( selector, volume, scissored, Mode(), ComponentMode() );
+                               Scene_TestSelect( selector, volume, scissored, g_bAltDragManipulatorResize ? ePrimitive : Mode(), ComponentMode() );
                        }
                        if ( !selector.failed() ){
                                SelectableSortedSet::iterator best = selector.begin();
@@ -3468,9 +3470,9 @@ void MoveSelected( const View& view, const float device_point[2], bool snap, boo
 
 /// \todo Support view-dependent nudge.
 void NudgeManipulator( const Vector3& nudge, const Vector3& view ){
-       if ( ManipulatorMode() == eTranslate || ManipulatorMode() == eDrag ) {
+//     if ( ManipulatorMode() == eTranslate || ManipulatorMode() == eDrag ) {
                translateSelected( nudge );
-       }
+//     }
 }
 
 void endMove();
@@ -3681,6 +3683,7 @@ void RadiantSelectionSystem::endMove(){
 
        if ( Mode() == ePrimitive ) {
                if ( ManipulatorMode() == eDrag ) {
+                       g_bTmpComponentMode = false;
                        if( g_bAltDragManipulatorResize ){
                                Scene_SelectAll_Component( false, SelectionSystem::eVertex );
                        }
@@ -3927,7 +3930,7 @@ void RadiantSelectionSystem::setCustomPivotOrigin( Vector3& point ) const {
 AABB RadiantSelectionSystem::getSelectionAABB() const {
        AABB bounds;
        if ( !nothingSelected() ) {
-               if ( Mode() == eComponent ) {
+               if ( Mode() == eComponent || g_bTmpComponentMode ) {
                        Scene_BoundsSelectedComponent( GlobalSceneGraph(), bounds );
                }
                else
@@ -3960,8 +3963,11 @@ void RadiantSelectionSystem::renderSolid( Renderer& renderer, const VolumeTest&
 #include "preferencesystem.h"
 #include "preferences.h"
 
+bool g_bLeftMouseClickSelector = true;
+
 void SelectionSystem_constructPreferences( PreferencesPage& page ){
        page.appendCheckBox( "", "Prefer point entities in 2D", getSelectionSystem().m_bPreferPointEntsIn2D );
+       page.appendCheckBox( "", "Left mouse click tunnel selector", g_bLeftMouseClickSelector );
 }
 void SelectionSystem_constructPage( PreferenceGroup& group ){
        PreferencesPage page( group.createPage( "Selection", "Selection System Settings" ) );
@@ -3989,6 +3995,7 @@ void SelectionSystem_Construct(){
        GlobalShaderCache().attachRenderable( getSelectionSystem() );
 
        GlobalPreferenceSystem().registerPreference( "PreferPointEntsIn2D", make_property_string( getSelectionSystem().m_bPreferPointEntsIn2D ) );
+       GlobalPreferenceSystem().registerPreference( "LeftMouseClickSelector", make_property_string( g_bLeftMouseClickSelector ) );
        SelectionSystem_registerPreferencesPage();
 }
 
@@ -4062,7 +4069,7 @@ 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 || state == c_modifier_face ) ) {
+       if ( ( state == c_modifier_toggle || state == c_modifier_toggle_face || state == c_modifier_face || state == c_modifierAlt ) ) {
                if( m_mouse2 ){
                        return RadiantSelectionSystem::eReplace;
                }
@@ -4132,7 +4139,9 @@ void testSelect_simpleM1( DeviceVector position ){
                modifier = RadiantSelectionSystem::eCycle;
        }
        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 );
+       if( g_bLeftMouseClickSelector ){
+               getSelectionSystem().SelectPoint( *m_view, &position[0], &m_epsilon[0], m_mouseMoved ? RadiantSelectionSystem::eReplace : RadiantSelectionSystem::eCycle, false );
+       }
        m_start = m_current = device_constrained( position );
 }
 
@@ -4282,18 +4291,13 @@ void onMouseDown( const WindowVector& position, ButtonIdentifier button, Modifie
 
                DeviceVector devicePosition( window_to_normalised_device( position, m_width, m_height ) );
                g_bAltDragManipulatorResize = ( modifiers == c_modifierAlt ) ? true : false;
-               if ( ( modifiers == c_modifier_manipulator || modifiers == c_modifierAlt ) && m_manipulator.mouseDown( devicePosition ) ) {
+               if ( ( modifiers == c_modifier_manipulator || ( modifiers == c_modifierAlt && getSelectionSystem().Mode() != SelectionSystem::eComponent ) ) && m_manipulator.mouseDown( devicePosition ) ) {
                        g_mouseMovedCallback.insert( MouseEventCallback( Manipulator_::MouseMovedCaller( m_manipulator ) ) );
                        g_mouseUpCallback.insert( MouseEventCallback( Manipulator_::MouseUpCaller( m_manipulator ) ) );
                }
                else
                {
-                       if ( button == c_button_select ) {
-                               m_selector.m_mouse2 = false;
-                       }
-                       else{
-                               m_selector.m_mouse2 = true;
-                       }
+                       m_selector.m_mouse2 = ( button == c_button_select ) ? false : true;
                        m_selector.mouseDown( devicePosition );
                        g_mouseMovedCallback.insert( MouseEventCallback( Selector_::MouseMovedCaller( m_selector ) ) );
                        g_mouseUpCallback.insert( MouseEventCallback( Selector_::MouseUpCaller( m_selector ) ) );