X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fmap.cpp;h=e1e6a727bca7fad9cc8d51ffbc6fa9523edc3320;hb=c3e5c14ba5970a5f9c58c2129e2d9511ab8ee795;hp=36b77ae1b828478767148f91738b156287139b5f;hpb=9b94ff18c880814ba57370489857de3a4d813bad;p=xonotic%2Fnetradiant.git diff --git a/radiant/map.cpp b/radiant/map.cpp index 36b77ae1..e1e6a727 100644 --- a/radiant/map.cpp +++ b/radiant/map.cpp @@ -966,6 +966,8 @@ void Map_LoadFile( const char *filename ){ MRU_AddFile( filename ); g_strLastMapFolder = g_path_get_dirname( filename ); + bool switch_format = false; + { ScopeTimer timer( "map load" ); @@ -992,6 +994,7 @@ void Map_LoadFile( const char *filename ){ if ( !format->wrongFormat ) { break; } + switch_format = !switch_format; } } @@ -1012,6 +1015,8 @@ void Map_LoadFile( const char *filename ){ Map_StartPosition(); g_currentMap = &g_map; + + Brush_switchFormat( switch_format ); } class Excluder @@ -1676,21 +1681,19 @@ bool Map_SaveSelected( const char* filename ){ return MapResource_saveFile( MapFormat_forFile( filename ), GlobalSceneGraph().root(), Map_Traverse_Selected, filename ); } - class ParentSelectedBrushesToEntityWalker : public scene::Graph::Walker { -scene::Node& m_parent; + scene::Node& m_parent; + mutable bool m_emptyOldParent; + public: -ParentSelectedBrushesToEntityWalker( scene::Node& parent ) : m_parent( parent ){ +ParentSelectedBrushesToEntityWalker( scene::Node& parent ) : m_parent( parent ), m_emptyOldParent( false ){ } bool pre( const scene::Path& path, scene::Instance& instance ) const { - if ( path.top().get_pointer() != &m_parent - && Node_isPrimitive( path.top() ) ) { + if ( path.top().get_pointer() != &m_parent && ( Node_isPrimitive( path.top() ) || m_emptyOldParent ) ) { Selectable* selectable = Instance_getSelectable( instance ); - if ( selectable != 0 - && selectable->isSelected() - && path.size() > 1 ) { + if ( selectable && selectable->isSelected() && path.size() > 1 ) { return false; } } @@ -1698,20 +1701,33 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const { } void post( const scene::Path& path, scene::Instance& instance ) const { - if ( path.top().get_pointer() != &m_parent - && Node_isPrimitive( path.top() ) ) { + if ( path.top().get_pointer() == &m_parent ) + return; + + if ( Node_isPrimitive( path.top() ) ){ + m_emptyOldParent = false; Selectable* selectable = Instance_getSelectable( instance ); - if ( selectable != 0 - && selectable->isSelected() - && path.size() > 1 ) { + + if ( selectable && selectable->isSelected() && path.size() > 1 ){ scene::Node& parent = path.parent(); - if ( &parent != &m_parent ) { + if ( &parent != &m_parent ){ NodeSmartReference node( path.top().get() ); - Node_getTraversable( parent )->erase( node ); + scene::Traversable* traversable_parent = Node_getTraversable( parent ); + traversable_parent->erase( node ); Node_getTraversable( m_parent )->insert( node ); + if ( traversable_parent->empty() ) + m_emptyOldParent = true; } } } + else if ( m_emptyOldParent ){ + m_emptyOldParent = false; + // delete empty entities + Entity* entity = Node_getEntity( path.top() ); + if ( entity != 0 && path.top().get_pointer() != Map_FindWorldspawn( g_map ) && Node_getTraversable( path.top() )->empty() ) { + Path_deleteTop( path ); + } + } } }; @@ -1933,6 +1949,9 @@ void SaveMap(){ } else if ( Map_Modified( g_map ) ) { Map_Save(); +#ifdef WIN32 + MRU_AddFile( g_map.m_name.c_str() ); //add on saving, but not opening via cmd line: spoils the list +#endif } }