/* Copyright (C) 2001-2006, William Joseph. All Rights Reserved. This file is part of GtkRadiant. GtkRadiant is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. GtkRadiant is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GtkRadiant; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "write.h" #include "ientity.h" #include "iscriplib.h" #include "scenelib.h" inline MapExporter* Node_getMapExporter(scene::Node& node) { return NodeTypeCast::cast(node); } 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); } class WriteTokensWalker : public scene::Traversable::Walker { mutable Stack m_stack; TokenWriter& m_writer; bool m_ignorePatches; 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(); } }; void Map_Write(scene::Node& root, GraphTraversalFunc traverse, TokenWriter& writer, bool ignorePatches) { g_count_entities = 0; traverse(root, WriteTokensWalker(writer, ignorePatches)); }