diff --git a/radiant/csg.cpp b/radiant/csg.cpp index 465727ab..472e3817 100644 --- a/radiant/csg.cpp +++ b/radiant/csg.cpp @@ -380,13 +380,9 @@ public: : m_brushlist( brushlist ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { - if ( path.top().get().visible() ) { - Brush* brush = Node_getBrush( path.top() ); - if ( brush != 0 - && Instance_isSelected( instance ) ) { + if ( path.top().get().visible() && Instance_isSelected( instance ) ) + if ( Brush* brush = Node_getBrush( path.top() ) ) m_brushlist.push_back( brush ); - } - } return true; } }; @@ -414,41 +410,28 @@ void post( const scene::Path& path, scene::Instance& instance ) const { class BrushDeleteSelected : public scene::Graph::Walker { scene::Node* m_keepNode; - mutable bool m_eraseParent; + scene::Node* m_world = Map_FindWorldspawn( g_map ); + mutable bool m_eraseParent = false; public: - BrushDeleteSelected( scene::Node* keepNode ): m_keepNode( keepNode ), m_eraseParent( false ){ - } - BrushDeleteSelected(): m_keepNode( NULL ), m_eraseParent( false ){ + BrushDeleteSelected( scene::Node* keepNode = nullptr ): m_keepNode( keepNode ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { return true; } void post( const scene::Path& path, scene::Instance& instance ) const { - //globalOutputStream() << path.size() << '\n'; - if ( path.top().get().visible() ) { - Brush* brush = Node_getBrush( path.top() ); - if ( brush != 0 + if ( Brush* brush = Node_getBrush( path.top() ) ) { + if ( path.top().get().visible() && Instance_isSelected( instance ) - && path.size() > 1 && path.top().get_pointer() != m_keepNode ) { scene::Node& parent = path.parent(); Path_deleteTop( path ); - if( Node_getTraversable( parent )->empty() ){ - m_eraseParent = true; - //globalOutputStream() << "Empty node?!.\n"; - } - return; + m_eraseParent = Node_getTraversable( parent )->empty(); } } - if( m_eraseParent && !Node_isPrimitive( path.top() ) && path.size() > 1 ){ - //globalOutputStream() << "about to Delete empty node!.\n"; + else if( m_eraseParent ){ m_eraseParent = false; - Entity* entity = Node_getEntity( path.top() ); - if ( entity != 0 && path.top().get_pointer() != Map_FindWorldspawn( g_map ) - && Node_getTraversable( path.top() )->empty() && path.top().get_pointer() != m_keepNode ) { - //globalOutputStream() << "now Deleting empty node!.\n"; + if ( path.top().get_pointer() != m_world && path.top().get_pointer() != m_keepNode ) Path_deleteTop( path ); - } } } }; @@ -605,46 +588,40 @@ class SubtractBrushesFromUnselected : public scene::Graph::Walker const brush_vector_t& m_brushlist; std::size_t& m_before; std::size_t& m_after; - mutable bool m_eraseParent; + mutable bool m_eraseParent = false; + scene::Node* m_world = Map_FindWorldspawn( g_map ); public: SubtractBrushesFromUnselected( const brush_vector_t& brushlist, std::size_t& before, std::size_t& after ) - : m_brushlist( brushlist ), m_before( before ), m_after( after ), m_eraseParent( false ){ + : m_brushlist( brushlist ), m_before( before ), m_after( after ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { - if ( path.top().get().visible() ) { - return true; - } - return false; + return path.top().get().visible(); } void post( const scene::Path& path, scene::Instance& instance ) const { - if ( path.top().get().visible() ) { - Brush* brush = Node_getBrush( path.top() ); - if ( brush != 0 - && !Instance_isSelected( instance ) ) { + if ( Brush* thebrush = Node_getBrush( path.top() ) ) { + if ( path.top().get().visible() && !Instance_isSelected( instance ) ) { brush_vector_t buffer[2]; bool swap = false; - Brush* original = new Brush( *brush ); - buffer[static_cast( swap )].push_back( original ); + Brush* original = new Brush( *thebrush ); + buffer[swap].push_back( original ); + for ( const Brush *subbrush : m_brushlist ) { - for ( brush_vector_t::const_iterator i( m_brushlist.begin() ); i != m_brushlist.end(); ++i ) + for ( Brush *brush : buffer[swap] ) { - for ( brush_vector_t::iterator j( buffer[static_cast( swap )].begin() ); j != buffer[static_cast( swap )].end(); ++j ) + if ( Brush_subtract( *brush, *subbrush, buffer[!swap] ) ) { + delete brush; + } + else { - if ( Brush_subtract( *( *j ), *( *i ), buffer[static_cast( !swap )] ) ) { - delete ( *j ); - } - else - { - buffer[static_cast( !swap )].push_back( ( *j ) ); - } + buffer[!swap].push_back( brush ); } - buffer[static_cast( swap )].clear(); - swap = !swap; } + buffer[swap].clear(); + swap = !swap; } - brush_vector_t& out = buffer[static_cast( swap )]; + brush_vector_t& out = buffer[swap]; if ( out.size() == 1 && out.back() == original ) { delete original; @@ -652,35 +629,30 @@ public: else { ++m_before; - for ( brush_vector_t::const_iterator i = out.begin(); i != out.end(); ++i ) + for ( Brush *brush : out ) { ++m_after; - ( *i )->removeEmptyFaces(); - if ( !( *i )->empty() ) { + brush->removeEmptyFaces(); + if ( !brush->empty() ) { NodeSmartReference node( ( new BrushNode() )->node() ); - Node_getBrush( node )->copy( *( *i ) ); - delete ( *i ); + Node_getBrush( node )->copy( *brush ); + delete brush; Node_getTraversable( path.parent() )->insert( node ); } else{ - delete ( *i ); + delete brush; } } scene::Node& parent = path.parent(); Path_deleteTop( path ); - if( Node_getTraversable( parent )->empty() ){ - m_eraseParent = true; - } + m_eraseParent = Node_getTraversable( parent )->empty(); } } } - if( m_eraseParent && !Node_isPrimitive( path.top() ) && path.size() > 1 ){ + else if( m_eraseParent ){ m_eraseParent = false; - Entity* entity = Node_getEntity( path.top() ); - if ( entity != 0 && path.top().get_pointer() != Map_FindWorldspawn( g_map ) - && Node_getTraversable( path.top() )->empty() ) { + if ( path.top().get_pointer() != m_world ) Path_deleteTop( path ); - } } } }; @@ -703,8 +675,8 @@ void CSG_Subtract(){ std::size_t after = 0; GlobalSceneGraph().traverse( SubtractBrushesFromUnselected( selected_brushes, before, after ) ); globalOutputStream() << "CSG Subtract: Result: " - << after << " fragment" << ( after == 1 ? "" : "s" ) - << " from " << before << " brush" << ( before == 1 ? "" : "es" ) << ".\n"; + << after << ( after == 1 ? " fragment" : " fragments" ) + << " from " << before << ( before == 1 ? " brush.\n" : " brushes.\n" ); SceneChangeNotify(); } diff --git a/radiant/entity.cpp b/radiant/entity.cpp index 7127ac5f..78da3ba7 100644 --- a/radiant/entity.cpp +++ b/radiant/entity.cpp @@ -383,13 +383,14 @@ void Entity_createFromSelection( const char* name, const Vector3& origin ){ return; } #else - const scene::Node* world_node = Map_FindWorldspawn( g_map ); - if ( world_node && string_equal( name, "worldspawn" ) ) { -// GlobalRadiant().m_pfnMessageBox( MainFrame_getWindow(), "There's already a worldspawn in your map!", "Info", EMessageBoxType::Info, 0 ); - UndoableCommand undo( "ungroupSelectedPrimitives" ); - Scene_parentSelectedBrushesToEntity( GlobalSceneGraph(), Map_FindOrInsertWorldspawn( g_map ) ); //=no action, if no worldspawn (but one inserted) (since insertion deselects everything) - //Scene_parentSelectedBrushesToEntity( GlobalSceneGraph(), *Map_FindWorldspawn( g_map ) ); = crash, if no worldspawn - return; + if ( string_equal( name, "worldspawn" ) ) { + // only process if worldspawn is present + // Map_FindOrInsertWorldspawn( g_map ) ) would be no action (since worldspawn insertion deselects everything) + if( scene::Node* world_node = Map_FindWorldspawn( g_map ) ){ + UndoableCommand undo( "ungroupSelectedPrimitives" ); + Scene_parentSelectedBrushesToEntity( GlobalSceneGraph(), *world_node ); + return; + } } #endif diff --git a/radiant/map.cpp b/radiant/map.cpp index 2f1f4fc4..6a723311 100644 --- a/radiant/map.cpp +++ b/radiant/map.cpp @@ -1611,10 +1611,10 @@ bool Map_SaveSelected( const char* filename ){ class ParentSelectedBrushesToEntityWalker : public scene::Graph::Walker { scene::Node& m_parent; - scene::Node* m_world; - mutable bool m_emptyOldParent; + scene::Node* m_world = Map_FindWorldspawn( g_map ); + mutable bool m_emptyOldParent = false; public: - ParentSelectedBrushesToEntityWalker( scene::Node& parent ) : m_parent( parent ), m_world( Map_FindWorldspawn( g_map ) ), m_emptyOldParent( false ){ + ParentSelectedBrushesToEntityWalker( scene::Node& parent ) : m_parent( parent ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { return path.top().get_pointer() != &m_parent; /* skip traverse of target node */ @@ -1631,7 +1631,7 @@ public: } else if ( m_emptyOldParent ){ m_emptyOldParent = false; - if ( Node_isEntity( path.top() ) && path.top().get_pointer() != m_world && Node_getTraversable( path.top() )->empty() ) /* delete empty entity left */ + if ( path.top().get_pointer() != m_world ) /* delete empty entity left */ Path_deleteTop( path ); } } diff --git a/radiant/select.cpp b/radiant/select.cpp index 6342b2c4..dbc83849 100644 --- a/radiant/select.cpp +++ b/radiant/select.cpp @@ -241,9 +241,8 @@ public: m_removedChild = false; // delete empty entities - Entity* entity = Node_getEntity( path.top() ); - if ( entity != 0 - && path.top().get_pointer() != Map_FindWorldspawn( g_map ) + if ( Node_isEntity( path.top() ) + && path.top().get_pointer() != Map_FindWorldspawn( g_map ) // direct worldspawn deletion is permitted, so do find it each time && Node_getTraversable( path.top() )->empty() ) { Path_deleteTop( path ); } @@ -334,11 +333,9 @@ void Select_Invert(){ //interesting printings class ExpandSelectionToEntitiesWalker_dbg : public scene::Graph::Walker { - mutable std::size_t m_depth; - const scene::Node* m_world; + mutable std::size_t m_depth = 0; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: - ExpandSelectionToEntitiesWalker_dbg() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){ - } bool pre( const scene::Path& path, scene::Instance& instance ) const { ++m_depth; globalOutputStream() << "pre depth_" << m_depth; @@ -385,11 +382,9 @@ public: class ExpandSelectionToPrimitivesWalker : public scene::Graph::Walker { - mutable std::size_t m_depth; - const scene::Node* m_world; + mutable std::size_t m_depth = 0; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: - ExpandSelectionToPrimitivesWalker() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){ - } bool pre( const scene::Path& path, scene::Instance& instance ) const { ++m_depth; @@ -426,11 +421,9 @@ void Scene_ExpandSelectionToPrimitives(){ class ExpandSelectionToEntitiesWalker : public scene::Graph::Walker { - mutable std::size_t m_depth; - const scene::Node* m_world; + mutable std::size_t m_depth = 0; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: - ExpandSelectionToEntitiesWalker() : m_depth( 0 ), m_world( Map_FindWorldspawn( g_map ) ){ - } bool pre( const scene::Path& path, scene::Instance& instance ) const { ++m_depth; @@ -731,10 +724,9 @@ template class EntityFindByPropertyValueWalker : public scene::Graph::Walker { const EntityMatcher& m_entityMatcher; - const scene::Node* m_world; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: - EntityFindByPropertyValueWalker( const EntityMatcher& entityMatcher ) - : m_entityMatcher( entityMatcher ), m_world( Map_FindWorldspawn( g_map ) ){ + EntityFindByPropertyValueWalker( const EntityMatcher& entityMatcher ) : m_entityMatcher( entityMatcher ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { if( !path.top().get().visible() ){ @@ -777,14 +769,13 @@ class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker { PropertyValues& m_propertyvalues; const char *m_prop; - const scene::Node* m_world; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: EntityGetSelectedPropertyValuesWalker( const char *prop, PropertyValues& propertyvalues ) - : m_propertyvalues( propertyvalues ), m_prop( prop ), m_world( Map_FindWorldspawn( g_map ) ){ + : m_propertyvalues( propertyvalues ), m_prop( prop ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { - Entity* entity = Node_getEntity( path.top() ); - if ( entity != 0 ){ + if ( Entity* entity = Node_getEntity( path.top() ) ){ if( path.top().get_pointer() != m_world ){ if ( Instance_isSelected( instance ) || instance.childSelected() ) { if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) { @@ -1235,10 +1226,10 @@ void MoveToCamera(){ class CloneSelected : public scene::Graph::Walker { const bool m_makeUnique; - const scene::Node* m_world; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: mutable std::vector m_cloned; - CloneSelected( bool makeUnique ) : m_makeUnique( makeUnique ), m_world( Map_FindWorldspawn( g_map ) ){ + CloneSelected( bool makeUnique ) : m_makeUnique( makeUnique ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { if ( path.size() == 1 ) { @@ -1771,10 +1762,10 @@ class EntityGetSelectedPropertyValuesWalker_nonEmpty : public scene::Graph::Walk { PropertyValues& m_propertyvalues; const char *m_prop; - const scene::Node* m_world; + const scene::Node* m_world = Map_FindWorldspawn( g_map ); public: EntityGetSelectedPropertyValuesWalker_nonEmpty( const char *prop, PropertyValues& propertyvalues ) - : m_propertyvalues( propertyvalues ), m_prop( prop ), m_world( Map_FindWorldspawn( g_map ) ){ + : m_propertyvalues( propertyvalues ), m_prop( prop ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { Entity* entity = Node_getEntity( path.top() );