]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - plugins/mapq3/write.cpp
Merge branch 'NateEag-master-patch-12920' into 'master'
[xonotic/netradiant.git] / plugins / mapq3 / write.cpp
index 7a95458644ce22909f52518521b484ce60f064ef..cbf0ec05140334b31be28215bee76a8c1cbb84ce 100644 (file)
@@ -61,19 +61,27 @@ class WriteTokensWalker : public scene::Traversable::Walker
 mutable Stack<bool> m_stack;
 TokenWriter& m_writer;
 bool m_ignorePatches;
+bool m_writeComments;
 public:
-WriteTokensWalker( TokenWriter& writer, bool ignorePatches )
-       : m_writer( writer ), m_ignorePatches( ignorePatches ){
+WriteTokensWalker( TokenWriter& writer, bool ignorePatches, bool writeComments )
+       : m_writer( writer ), m_ignorePatches( ignorePatches ), m_writeComments( writeComments ){
 }
-bool pre( scene::Node& node ) const {
+
+bool pre( scene::Node &node ) const {
        m_stack.push( false );
 
        Entity* entity = Node_getEntity( node );
        if ( entity != 0 ) {
-               m_writer.writeToken( "//" );
-               m_writer.writeToken( "entity" );
-               m_writer.writeUnsigned( g_count_entities++ );
-               m_writer.nextLine();
+               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" );
+                       m_writer.writeUnsigned( g_count_entities++ );
+                       m_writer.nextLine();
+               }
 
                m_writer.writeToken( "{" );
                m_writer.nextLine();
@@ -85,11 +93,13 @@ bool pre( scene::Node& node ) const {
        {
                MapExporter* exporter = Node_getMapExporter( node );
                if ( exporter != 0
-                        && !( m_ignorePatches && Node_isPatch( node ) ) ) {
-                       m_writer.writeToken( "//" );
-                       m_writer.writeToken( "brush" );
-                       m_writer.writeUnsigned( g_count_brushes++ );
-                       m_writer.nextLine();
+                       && !( m_ignorePatches && Node_isPatch( node ) ) ) {
+                       if ( m_writeComments ) {
+                               m_writer.writeToken( "//" );
+                               m_writer.writeToken( "brush" );
+                               m_writer.writeUnsigned( g_count_brushes++ );
+                               m_writer.nextLine();
+                       }
 
                        exporter->exportTokens( m_writer );
                }
@@ -97,6 +107,7 @@ bool pre( scene::Node& node ) const {
 
        return true;
 }
+
 void post( scene::Node& node ) const {
        if ( m_stack.top() ) {
                m_writer.writeToken( "}" );
@@ -106,7 +117,7 @@ void post( scene::Node& node ) const {
 }
 };
 
-void Map_Write( scene::Node& root, GraphTraversalFunc traverse, TokenWriter& writer, bool ignorePatches ){
+void Map_Write( scene::Node& root, GraphTraversalFunc traverse, TokenWriter& writer, bool ignorePatches, bool writeComments ){
        g_count_entities = 0;
-       traverse( root, WriteTokensWalker( writer, ignorePatches ) );
+       traverse( root, WriteTokensWalker( writer, ignorePatches, writeComments ) );
 }