]> git.rm.cloudns.org Git - xonotic/netradiant.git/commitdiff
Q3map2:
authorGarux <garux@mail.ru>
Wed, 2 Aug 2017 06:19:22 +0000 (09:19 +0300)
committerGarux <garux@mail.ru>
Wed, 2 Aug 2017 06:19:22 +0000 (09:19 +0300)
* -backsplash (float)scale (float)distance: scale area lights backsplash fraction + set distance globally
(distance < -900 to omit distance setting); def = 1 23; real area lights have no backsplash (scale = 0)
q3map_backsplash shader keyword overrides this setting

Radiant:

binds...
* alt + m1 click/drag in component modes: select objects
misc...
* fix: selected entity and brush numbers display in 'Find brush' dialog
* prefer to display texture width and height in status bar over name (PANGO_ELLIPSIZE_START)
* allow search shortcut (ctr+f in win) in entity inspector -> entity class list
* fix: don't save empty group entities (but worldspawn)

16 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/common/aselib.c
tools/quake3/q3map2/brush.c
tools/quake3/q3map2/bspfile_abstract.c
tools/quake3/q3map2/light.c
tools/quake3/q3map2/light_ydnar.c
tools/quake3/q3map2/lightmaps_ydnar.c
tools/quake3/q3map2/q3map2.h
tools/quake3/q3map2/shaders.c

index 7a95458644ce22909f52518521b484ce60f064ef..f7becfeebdaf99c5a56eff86fdf37ff73072d7d7 100644 (file)
@@ -70,6 +70,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;
+               }
                m_writer.writeToken( "//" );
                m_writer.writeToken( "entity" );
                m_writer.writeUnsigned( g_count_entities++ );
index d26547e8a2116d7aa7f4bea10bf00520fb2da669..c467af92110ebd5dae6e81197de2cdd1b5aa40ce 100644 (file)
@@ -3428,6 +3428,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 f1096bf087dc4c73346f5fc7a23a4860db5bb8a0..45232943f18d2002bd873768e3af46394ca3947d 100644 (file)
@@ -1233,7 +1233,7 @@ static gint EntityClassList_keypress( GtkWidget* 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 ) {
                GtkTreeView* view = g_entityClassList;
                GtkTreeModel* model;
                GtkTreeIter iter;
@@ -1339,7 +1339,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 04e7b000d09313eb5079e59c587ce4e74a90dec7..75662b23bfc08052610d2731fb2c8db55e49d2e9 100644 (file)
@@ -2475,7 +2475,11 @@ GtkWidget* create_main_statusbar( GtkWidget *pStatusLabel[c_count_status] ){
                gtk_frame_set_shadow_type( frame, GTK_SHADOW_IN );
 
                GtkLabel* label = GTK_LABEL( gtk_label_new( "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 );
                gtk_widget_show( GTK_WIDGET( label ) );
index e4c6e26aa0a902b6aa629714045afe28c9723dd0..73fceb5d449f01bec55f10222f3429887c0ccb2a 100644 (file)
@@ -2099,7 +2099,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;
@@ -2107,9 +2107,9 @@ public:
 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 ) {
@@ -2120,7 +2120,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;
@@ -2128,9 +2128,9 @@ public:
 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 ) {
@@ -2147,8 +2147,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 66f53ef8c8d7f5ea3cc92e342c97175f08e203f4..32f591652568e3b1fd32e770ab9176a51dfd9174 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 240c05f49e8e1ad62aba91da0a804fa4d7645d25..67986fc606cf23710db4915982c759e3750f0164 100644 (file)
@@ -39,6 +39,7 @@
 #include "gtkutil/widget.h"
 #include "brushmanip.h"
 #include "brush.h"
+#include "patch.h"
 #include "patchmanip.h"
 #include "patchdialog.h"
 #include "selection.h"
@@ -275,10 +276,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() ){
@@ -298,6 +300,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;
                }
        }
@@ -312,7 +326,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 805b6ed7007f5f5d3bd9dabbb8359a951c6c4718..a08659b4ab61f5f2b4d48355dd90b22d6ed28bca 100644 (file)
@@ -2638,7 +2638,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
@@ -3157,7 +3157,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() ) {
@@ -3306,7 +3306,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();
@@ -4065,7 +4065,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;
                }
@@ -4287,7 +4287,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 76215232aee5b414599a322400848eeb243f6ce6..b60758b85eb1e49f633f277b788fdf789da0ad15 100644 (file)
@@ -411,9 +411,9 @@ static void ASE_SkipRestOfLine( void ){
 }
 
 static void ASE_KeyMAP_DIFFUSE( const char *token ){
-       char fullpath[1024], bitmap[1024], modeldir[1024];
+       char bitmap[1024];
        char filename[1024];
-       int i = 0, count;
+       int i = 0;
 
        strcpy( filename, gl_filename );
 
index e15d5612cf2ec303080ba83a524a28d4966b0ac1..0f01063d46ff91ec24c9cd04f813468e6b623579 100644 (file)
@@ -257,7 +257,7 @@ void SnapWeldVector( vec3_t a, vec3_t b, vec3_t out ){
        {
                /* round to integer */
                ai = Q_rint( a[ i ] );
-               bi = Q_rint( a[ i ] );
+               bi = Q_rint( b[ i ] );
 
                /* prefer exact integer */
                if ( ai == a[ i ] ) {
@@ -268,7 +268,7 @@ void SnapWeldVector( vec3_t a, vec3_t b, vec3_t out ){
                }
 
                /* use nearest */
-               else if ( fabs( ai - a[ i ] ) < fabs( bi < b[ i ] ) ) {
+               else if ( fabs( ai - a[ i ] ) < fabs( bi - b[ i ] ) ) {
                        out[ i ] = a[ i ];
                }
                else{
index 8aad909195fc824496867552aa7341c243b854e1..d94a6fa8b8c46eeec3ff99783d9beacf39806e68 100644 (file)
@@ -109,7 +109,7 @@ void SetDrawSurfacesBuffer(){
 
        bspDrawSurfaces = safe_malloc_info( sizeof( bspDrawSurface_t ) * numBSPDrawSurfacesBuffer, "IncDrawSurfaces" );
 
-       memset( bspDrawSurfaces, 0, MAX_MAP_DRAW_SURFS * sizeof( bspDrawVert_t ) );
+       memset( bspDrawSurfaces, 0, MAX_MAP_DRAW_SURFS * sizeof( bspDrawSurface_t ) );
 }
 
 void SetDrawSurfaces( int n ){
@@ -122,7 +122,7 @@ void SetDrawSurfaces( int n ){
 
        bspDrawSurfaces = safe_malloc_info( sizeof( bspDrawSurface_t ) * numBSPDrawSurfacesBuffer, "IncDrawSurfaces" );
 
-       memset( bspDrawSurfaces, 0, n * sizeof( bspDrawVert_t ) );
+       memset( bspDrawSurfaces, 0, n * sizeof( bspDrawSurface_t ) );
 }
 
 void BSPFilesCleanup(){
index d6916367188190b037caaf0b75fd90db07ca1b31..f3f20ff35ce57858624917bbd10e0b5c0e67218d 100644 (file)
@@ -2256,6 +2256,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 83595337a81d7be42a1a86c5b68a5e8afc86679a..f655fb03088d22a09438e5433e1b676aea773679 100644 (file)
@@ -2235,7 +2235,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 c1c9ced0ffbd9c2e45011d863ef8dd850aabf888..f8b52105707c4515caf6320a249dfd0b312c5a32 100644 (file)
@@ -525,7 +525,7 @@ qboolean AddPatchToRawLightmap( int num, rawLightmap_t *lm ){
        length = 0;
        for ( x = 0; x < ( mesh->width - 1 ); x++ )
                length += widthTable[ x ];
-       lm->w = ceil( length / lm->sampleSize ) + 1;
+       lm->w = lm->sampleSize != 0 ? ceil( length / lm->sampleSize ) + 1 : 0;
        if ( lm->w < ds->patchWidth ) {
                lm->w = ds->patchWidth;
        }
@@ -538,7 +538,7 @@ qboolean AddPatchToRawLightmap( int num, rawLightmap_t *lm ){
        length = 0;
        for ( y = 0; y < ( mesh->height - 1 ); y++ )
                length += heightTable[ y ];
-       lm->h = ceil( length / lm->sampleSize ) + 1;
+       lm->h = lm->sampleSize != 0 ? ceil( length / lm->sampleSize ) + 1 : 0;
        if ( lm->h < ds->patchHeight ) {
                lm->h = ds->patchHeight;
        }
index 141ddcbd8db5cd48fd2f2512c22d563be6552942..ba10713ead6ae9bbab41eef187a9a9053db47cd1 100644 (file)
@@ -2322,6 +2322,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 3d5249ef1f41f9c305acc20dddf79af8096152b1..82be170aa2fbea5080cd6301d884d8e517087911 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;