]> git.xonotic.org Git - xonotic/netradiant.git/commitdiff
Merge commit '667d3275589dac91b5bfe96f0244183007be6efd' into master-merge
authorThomas Debesse <dev@illwieckz.net>
Tue, 21 Jun 2022 04:27:31 +0000 (06:27 +0200)
committerThomas Debesse <dev@illwieckz.net>
Tue, 21 Jun 2022 04:27:31 +0000 (06:27 +0200)
12 files changed:
plugins/mapq3/write.cpp
radiant/brush.h
radiant/entityinspector.cpp
radiant/mainframe.cpp
radiant/map.cpp
radiant/patch.h
radiant/select.cpp
radiant/selection.cpp
tools/quake3/q3map2/light.c
tools/quake3/q3map2/light_ydnar.c
tools/quake3/q3map2/q3map2.h
tools/quake3/q3map2/shaders.c

index 4bfbbe78da0097a8d8974a4c658ac32b7eb0767f..cbf0ec05140334b31be28215bee76a8c1cbb84ce 100644 (file)
@@ -72,6 +72,10 @@ bool pre( scene::Node &node ) const {
 
        Entity* entity = Node_getEntity( node );
        if ( entity != 0 ) {
+               if( entity->isContainer() && Node_getTraversable( node )->empty() && !string_equal( entity->getKeyValue( "classname" ), "worldspawn" ) ){
+                       globalErrorStream() << "discarding empty group entity: # = " << g_count_entities << "; classname = " << entity->getKeyValue( "classname" ) << "\n";
+                       return false;
+               }
                if ( m_writeComments ) {
                        m_writer.writeToken( "//" );
                        m_writer.writeToken( "entity" );
index c20f03cbd36f4d22d9f8dddc703dc345329ac556..9d01c5f22583fe53e624bdd38da0c34508c86a56 100644 (file)
@@ -3538,6 +3538,39 @@ void testSelectComponents( Selector& selector, SelectionTest& test, SelectionSys
        }
 }
 
+void invertComponentSelection( SelectionSystem::EComponentMode mode ){
+       switch ( mode )
+       {
+       case SelectionSystem::eVertex:
+       {
+               for ( VertexInstances::iterator i = m_vertexInstances.begin(); i != m_vertexInstances.end(); ++i )
+               {
+                       ( *i ).setSelected( !( *i ).isSelected() );
+               }
+       }
+       break;
+       case SelectionSystem::eEdge:
+       {
+               for ( EdgeInstances::iterator i = m_edgeInstances.begin(); i != m_edgeInstances.end(); ++i )
+               {
+                       ( *i ).setSelected( !( *i ).isSelected() );
+               }
+       }
+       break;
+       case SelectionSystem::eFace:
+       {
+               for ( FaceInstances::iterator i = m_faceInstances.begin(); i != m_faceInstances.end(); ++i )
+               {
+                       if( !( *i ).getFace().isFiltered() )
+                               ( *i ).setSelected( mode, !( *i ).isSelected() );
+               }
+       }
+       break;
+       default:
+               break;
+       }
+}
+
 void selectPlanes( Selector& selector, SelectionTest& test, const PlaneCallback& selectedPlaneCallback ){
        test.BeginMesh( localToWorld() );
 
index 81bcd06c8031cd65741b8ad2b3b18da84e8e9572..a2291f8fd59fdeb04a449887a1336a0460686dc5 100644 (file)
@@ -1216,7 +1216,7 @@ static gint EntityClassList_keypress( ui::Widget widget, GdkEventKey* event, gpo
        }
 
        // select the entity that starts with the key pressed
-       if ( code <= 'Z' && code >= 'A' ) {
+       if ( code <= 'Z' && code >= 'A' && event->state == 0 ) {
                auto view = ui::TreeView(g_entityClassList);
                GtkTreeModel* model;
                GtkTreeIter iter;
@@ -1321,7 +1321,7 @@ static gint EntityInspector_hideWindowKB( GtkWidget* widget, GdkEventKey* event,
                return TRUE;
        }
        /* this doesn't work, if tab is bound (func is not called then) */
-       if ( event->keyval == GDK_Tab  ) {
+       if ( event->keyval == GDK_Tab ) {
                gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityKeyEntry ) );
                return TRUE;
        }
index ffd40db9b1bab1a42b722ffe23034f2c4c60d3ac..be017b027119e952e32cce299e7c27f03a25526a 100644 (file)
@@ -2722,7 +2722,11 @@ ui::Widget create_main_statusbar( ui::Widget pStatusLabel[c_count_status] ){
                gtk_frame_set_shadow_type( frame, GTK_SHADOW_IN );
 
                auto label = ui::Label( "Label" );
-               gtk_label_set_ellipsize( label, PANGO_ELLIPSIZE_END );
+               if( i == c_texture_status )
+                       gtk_label_set_ellipsize( label, PANGO_ELLIPSIZE_START );
+               else
+                       gtk_label_set_ellipsize( label, PANGO_ELLIPSIZE_END );
+
                gtk_misc_set_alignment( GTK_MISC( label ), 0, 0.5 );
                gtk_misc_set_padding( GTK_MISC( label ), 4, 2 );
                label.show();
index 40a8e537ea245be317afa1a3649cda06137ada67..14425bea5a5e44cdcdc2069c048d4eecb57a79a8 100644 (file)
@@ -2202,7 +2202,7 @@ void SelectBrush( int entitynum, int brushnum ){
 }
 
 
-class BrushFindIndexWalker : public scene::Graph::Walker
+class BrushFindIndexWalker : public scene::Traversable::Walker
 {
 mutable const scene::Node* m_node;
 std::size_t& m_count;
@@ -2211,9 +2211,9 @@ BrushFindIndexWalker( const scene::Node& node, std::size_t& count )
        : m_node( &node ), m_count( count ){
 }
 
-bool pre( const scene::Path& path, scene::Instance& instance ) const {
-       if ( Node_isPrimitive( path.top() ) ) {
-               if ( m_node == path.top().get_pointer() ) {
+bool pre( scene::Node& node ) const {
+       if ( Node_isPrimitive( node ) ) {
+               if ( m_node == &node ) {
                        m_node = 0;
                }
                if ( m_node ) {
@@ -2224,7 +2224,7 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
 }
 };
 
-class EntityFindIndexWalker : public scene::Graph::Walker
+class EntityFindIndexWalker : public scene::Traversable::Walker
 {
 mutable const scene::Node* m_node;
 std::size_t& m_count;
@@ -2233,9 +2233,9 @@ EntityFindIndexWalker( const scene::Node& node, std::size_t& count )
        : m_node( &node ), m_count( count ){
 }
 
-bool pre( const scene::Path& path, scene::Instance& instance ) const {
-       if ( Node_isEntity( path.top() ) ) {
-               if ( m_node == path.top().get_pointer() ) {
+bool pre( scene::Node& node ) const {
+       if ( Node_isEntity( node ) ) {
+               if ( m_node == &node ) {
                        m_node = 0;
                }
                if ( m_node ) {
@@ -2252,8 +2252,24 @@ static void GetSelectionIndex( int *ent, int *brush ){
        if ( GlobalSelectionSystem().countSelected() != 0 ) {
                const scene::Path& path = GlobalSelectionSystem().ultimateSelected().path();
 
-               GlobalSceneGraph().traverse( BrushFindIndexWalker( path.top(), count_brush ) );
-               GlobalSceneGraph().traverse( EntityFindIndexWalker( path.parent(), count_entity ) );
+               {
+                       scene::Traversable* traversable = Node_getTraversable( path.parent() );
+                       if ( traversable != 0 && path.size() == 3 ) {
+                               traversable->traverse( BrushFindIndexWalker( path.top(), count_brush ) );
+                       }
+               }
+
+               {
+                       scene::Traversable* traversable = Node_getTraversable( GlobalSceneGraph().root() );
+                       if ( traversable != 0 ) {
+                               if( path.size() == 3 ){
+                                       traversable->traverse( EntityFindIndexWalker( path.parent(), count_entity ) );
+                               }
+                               else if ( path.size() == 2 ){
+                                       traversable->traverse( EntityFindIndexWalker( path.top(), count_entity ) );
+                               }
+                       }
+               }
        }
        *brush = int(count_brush);
        *ent = int(count_entity);
index 79264b003c06da07144f8f1e5609c44270a80265..45d53fa845b85676ae2a6e9b1558713a13544127 100644 (file)
@@ -1585,6 +1585,13 @@ void transformComponents( const Matrix4& matrix ){
        }
 }
 
+void invertComponentSelection(){
+       for ( PatchControlInstances::iterator i = m_ctrl_instances.begin(); i != m_ctrl_instances.end(); ++i )
+       {
+               ( *i ).m_selectable.setSelected( !( *i ).m_selectable.isSelected() );
+       }
+}
+
 
 void selectPlanes( Selector& selector, SelectionTest& test, const PlaneCallback& selectedPlaneCallback ){
        test.BeginMesh( localToWorld() );
index 8e749542975c5d62dcab68f6f6784ab4a4dcc0cb..bca6f2ccddb7f249e7538212b8bb050f812ef99c 100644 (file)
@@ -41,6 +41,7 @@
 #include "gtkutil/widget.h"
 #include "brushmanip.h"
 #include "brush.h"
+#include "patch.h"
 #include "patchmanip.h"
 #include "patchdialog.h"
 #include "selection.h"
@@ -277,10 +278,11 @@ void Select_Delete( void ){
 class InvertSelectionWalker : public scene::Graph::Walker
 {
 SelectionSystem::EMode m_mode;
+SelectionSystem::EComponentMode m_compmode;
 mutable Selectable* m_selectable;
 public:
-InvertSelectionWalker( SelectionSystem::EMode mode )
-       : m_mode( mode ), m_selectable( 0 ){
+InvertSelectionWalker( SelectionSystem::EMode mode, SelectionSystem::EComponentMode compmode )
+       : m_mode( mode ), m_compmode( compmode ), m_selectable( 0 ){
 }
 bool pre( const scene::Path& path, scene::Instance& instance ) const {
        if( !path.top().get().visible() ){
@@ -300,6 +302,18 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
                        m_selectable = path.top().get().visible() ? selectable : 0;
                        break;
                case SelectionSystem::eComponent:
+                       BrushInstance* brushinstance = Instance_getBrush( instance );
+                       if( brushinstance != 0 ){
+                               if( brushinstance->isSelected() )
+                                       brushinstance->invertComponentSelection( m_compmode );
+                       }
+                       else{
+                               PatchInstance* patchinstance = Instance_getPatch( instance );
+                               if( patchinstance != 0 && m_compmode == SelectionSystem::eVertex ){
+                                       if( patchinstance->isSelected() )
+                                               patchinstance->invertComponentSelection();
+                               }
+                       }
                        break;
                }
        }
@@ -314,7 +328,7 @@ void post( const scene::Path& path, scene::Instance& instance ) const {
 };
 
 void Scene_Invert_Selection( scene::Graph& graph ){
-       graph.traverse( InvertSelectionWalker( GlobalSelectionSystem().Mode() ) );
+       graph.traverse( InvertSelectionWalker( GlobalSelectionSystem().Mode(), GlobalSelectionSystem().ComponentMode() ) );
 }
 
 void Select_Invert(){
index 2b911a0ea4e85d8c4bd60f00ee3a557428fb5628..2ac9844517fd49c83203c2c6734afcc2d6cd5e33 100644 (file)
@@ -2642,7 +2642,7 @@ 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
@@ -3161,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() ) {
@@ -3310,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();
@@ -4069,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;
                }
@@ -4291,7 +4291,7 @@ 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 ) ) );
                }
index 20252c36a9d2b113efa943cf0f4d771722e38006..a2a1f62d62dba79d70926282cc8f26ff77005e2b 100644 (file)
@@ -2296,6 +2296,18 @@ int LightMain( int argc, char **argv ){
                        i++;
                }
 
+               else if ( !strcmp( argv[ i ], "-backsplash" ) && i < ( argc - 3 ) ) {
+                       f = atof( argv[ i + 1 ] );
+                       g_backsplashFractionScale = f;
+                       Sys_Printf( "Area lights backsplash fraction scaled by %f\n", f, g_backsplashFractionScale );
+                       f = atof( argv[ i + 2 ] );
+                       if ( f >= -900.0f ){
+                               g_backsplashDistance = f;
+                               Sys_Printf( "Area lights backsplash distance set globally to %f\n", f, g_backsplashDistance );
+                       }
+                       i+=2;
+               }
+
                else if ( !strcmp( argv[ i ], "-nolm" ) ) {
                        nolm = qtrue;
                        Sys_Printf( "No lightmaps yo\n" );
index c024dd3eb39fe4597f88b2c7b45b16d507ae0e46..e244d943702264316618a350a1bb8c34cff743e6 100644 (file)
@@ -2238,7 +2238,7 @@ void IlluminateRawLightmap( int rawLightmapNum ){
                        }
 
                        /* set luxel filter radius */
-                       luxelFilterRadius = superSample * filterRadius / lm->sampleSize;
+                       luxelFilterRadius = lm->sampleSize != 0 ? superSample * filterRadius / lm->sampleSize : 0;
                        if ( luxelFilterRadius == 0 && ( filterRadius > 0.0f || filter ) ) {
                                luxelFilterRadius = 1;
                        }
index 720dec29053fc042f0541d74295b7e0cc0d053cf..aa852347e811cef9a6837697b07ca6b7c92388a0 100644 (file)
@@ -2369,6 +2369,8 @@ Q_EXTERN float skyScale Q_ASSIGN( 1.0f );
 Q_EXTERN float bounceScale Q_ASSIGN( 0.25f );
 Q_EXTERN float bounceColorRatio Q_ASSIGN( 1.0f );
 Q_EXTERN float vertexglobalscale Q_ASSIGN( 1.0f );
+Q_EXTERN float g_backsplashFractionScale Q_ASSIGN( 1.0f );
+Q_EXTERN float g_backsplashDistance Q_ASSIGN( -999.0f );
 
 /* jal: alternative angle attenuation curve */
 Q_EXTERN qboolean lightAngleHL Q_ASSIGN( qfalse );
index 3c26a1cda270a3064cd4d495b751344af8590861..f075a3ea623d2ac723a57749358c0ec54ed04928 100644 (file)
@@ -645,8 +645,8 @@ static shaderInfo_t *AllocShaderInfo( void ){
        /* set defaults */
        ApplySurfaceParm( "default", &si->contentFlags, &si->surfaceFlags, &si->compileFlags );
 
-       si->backsplashFraction = DEF_BACKSPLASH_FRACTION;
-       si->backsplashDistance = DEF_BACKSPLASH_DISTANCE;
+       si->backsplashFraction = DEF_BACKSPLASH_FRACTION * g_backsplashFractionScale;
+       si->backsplashDistance = g_backsplashDistance < -900.0f ? DEF_BACKSPLASH_DISTANCE : g_backsplashDistance;
 
        si->bounceScale = DEF_RADIOSITY_BOUNCE;