X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=plugins%2Fmapq3%2Fwrite.cpp;h=4bfbbe78da0097a8d8974a4c658ac32b7eb0767f;hp=f37b5b03b076e18c79bd61dd7cda68543168013f;hb=HEAD;hpb=02a51890a3d97a0e937fbb11071cf7c41cc00aa9 diff --git a/plugins/mapq3/write.cpp b/plugins/mapq3/write.cpp index f37b5b03..cbf0ec05 100644 --- a/plugins/mapq3/write.cpp +++ b/plugins/mapq3/write.cpp @@ -25,9 +25,8 @@ #include "iscriplib.h" #include "scenelib.h" -inline MapExporter *Node_getMapExporter(scene::Node &node) -{ - return NodeTypeCast::cast(node); +inline MapExporter* Node_getMapExporter( scene::Node& node ){ + return NodeTypeCast::cast( node ); } @@ -35,84 +34,90 @@ static std::size_t g_count_entities; static std::size_t g_count_brushes; -void Entity_ExportTokens(const Entity &entity, TokenWriter &writer) -{ - g_count_brushes = 0; - - class WriteKeyValue : public Entity::Visitor { - TokenWriter &m_writer; - public: - WriteKeyValue(TokenWriter &writer) - : m_writer(writer) - { - } - - void visit(const char *key, const char *value) - { - m_writer.writeString(key); - m_writer.writeString(value); - m_writer.nextLine(); - } - - } visitor(writer); - - entity.forEachKeyValue(visitor); +void Entity_ExportTokens( const Entity& entity, TokenWriter& writer ){ + g_count_brushes = 0; + + class WriteKeyValue : public Entity::Visitor + { + TokenWriter& m_writer; +public: + WriteKeyValue( TokenWriter& writer ) + : m_writer( writer ){ + } + + void visit( const char* key, const char* value ){ + m_writer.writeString( key ); + m_writer.writeString( value ); + m_writer.nextLine(); + } + + } visitor( writer ); + + entity.forEachKeyValue( visitor ); } -class WriteTokensWalker : public scene::Traversable::Walker { - mutable Stack m_stack; - TokenWriter &m_writer; - bool m_ignorePatches; +class WriteTokensWalker : public scene::Traversable::Walker +{ +mutable Stack m_stack; +TokenWriter& m_writer; +bool m_ignorePatches; +bool m_writeComments; public: - WriteTokensWalker(TokenWriter &writer, bool ignorePatches) - : m_writer(writer), m_ignorePatches(ignorePatches) - { - } - - 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(); - - m_writer.writeToken("{"); - m_writer.nextLine(); - m_stack.top() = true; - - Entity_ExportTokens(*entity, m_writer); - } else { - 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(); - - exporter->exportTokens(m_writer); - } - } - - return true; - } - - void post(scene::Node &node) const - { - if (m_stack.top()) { - m_writer.writeToken("}"); - m_writer.nextLine(); - } - m_stack.pop(); - } +WriteTokensWalker( TokenWriter& writer, bool ignorePatches, bool writeComments ) + : m_writer( writer ), m_ignorePatches( ignorePatches ), m_writeComments( writeComments ){ +} + +bool pre( scene::Node &node ) const { + m_stack.push( false ); + + 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" ); + m_writer.writeUnsigned( g_count_entities++ ); + m_writer.nextLine(); + } + + m_writer.writeToken( "{" ); + m_writer.nextLine(); + m_stack.top() = true; + + Entity_ExportTokens( *entity, m_writer ); + } + else + { + MapExporter* exporter = Node_getMapExporter( node ); + if ( exporter != 0 + && !( 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 ); + } + } + + return true; +} + +void post( scene::Node& node ) const { + if ( m_stack.top() ) { + m_writer.writeToken( "}" ); + m_writer.nextLine(); + } + m_stack.pop(); +} }; -void Map_Write(scene::Node &root, GraphTraversalFunc traverse, TokenWriter &writer, bool ignorePatches) -{ - g_count_entities = 0; - traverse(root, WriteTokensWalker(writer, ignorePatches)); +void Map_Write( scene::Node& root, GraphTraversalFunc traverse, TokenWriter& writer, bool ignorePatches, bool writeComments ){ + g_count_entities = 0; + traverse( root, WriteTokensWalker( writer, ignorePatches, writeComments ) ); }