X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=plugins%2Fmapxml%2Fplugin.cpp;h=fb850543765efbb2bc20396ef3410b0b6c46fc3d;hb=9dfae1c9b270ee369c6362903a9205b30751b95f;hp=30745a93806c129ec46593ca800317c4704c9621;hpb=80378101101ca1762bbf5638a9e3566893096d8a;p=xonotic%2Fnetradiant.git diff --git a/plugins/mapxml/plugin.cpp b/plugins/mapxml/plugin.cpp index 30745a93..fb850543 100644 --- a/plugins/mapxml/plugin.cpp +++ b/plugins/mapxml/plugin.cpp @@ -1,73 +1,108 @@ -#include "plugin.h" - -// ============================================================================= -// Globals - -// function tables -_QERFuncTable_1 g_FuncTable; -_QERShadersTable g_ShadersTable; -_QEREntityTable g_EntityTable; -_QERBrushTable g_BrushTable; -_QERPatchTable g_PatchTable; - -// ============================================================================= -// SYNAPSE - -CSynapseServer* g_pSynapseServer = NULL; -CSynapseClientXMap g_SynapseClient; - -static const XMLConfigEntry_t entries[] = - { - { SHADERS_MAJOR, SYN_REQUIRE, sizeof(g_ShadersTable), &g_ShadersTable }, - { NULL, SYN_UNKNOWN, 0, NULL } }; - -extern "C" CSynapseClient* SYNAPSE_DLL_EXPORT Synapse_EnumerateInterfaces (const char *version, CSynapseServer *pServer) -{ - if (strcmp(version, SYNAPSE_VERSION)) - { - Syn_Printf("ERROR: synapse API version mismatch: should be '" SYNAPSE_VERSION "', got '%s'\n", version); - return NULL; - } - g_pSynapseServer = pServer; - g_pSynapseServer->IncRef(); - Set_Syn_Printf(g_pSynapseServer->Get_Syn_Printf()); - - g_SynapseClient.AddAPI(MAP_MAJOR, "mapxml", sizeof(_QERPlugMapTable)); - g_SynapseClient.AddAPI(RADIANT_MAJOR, NULL, sizeof(_QERFuncTable_1), SYN_REQUIRE, &g_FuncTable); - g_SynapseClient.AddAPI(ENTITY_MAJOR, NULL, sizeof(g_EntityTable), SYN_REQUIRE, &g_EntityTable); - g_SynapseClient.AddAPI(BRUSH_MAJOR, NULL, sizeof(g_BrushTable), SYN_REQUIRE, &g_BrushTable); - g_SynapseClient.AddAPI(PATCH_MAJOR, NULL, sizeof(g_PatchTable), SYN_REQUIRE, &g_PatchTable); - - if ( !g_SynapseClient.ConfigXML( pServer, NULL, entries ) ) { - return NULL; - } - - return &g_SynapseClient; -} - -bool CSynapseClientXMap::RequestAPI(APIDescriptor_t *pAPI) -{ - if (!strcmp(pAPI->major_name, MAP_MAJOR)) - { - _QERPlugMapTable* pTable= static_cast<_QERPlugMapTable*>(pAPI->mpTable); - pTable->m_pfnMap_Read = &Map_Read; - pTable->m_pfnMap_Write = &Map_Write; - - return true; - } - - Syn_Printf("ERROR: RequestAPI( '%s' ) not found in '%s'\n", pAPI->major_name, GetInfo()); - return false; -} - -#include "version.h" - -const char* CSynapseClientXMap::GetInfo() -{ - return "XMAP module built " __DATE__ " " RADIANT_VERSION; -} - -const char* CSynapseClientXMap::GetName() -{ - return "xmap"; -} +/* + 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 "ibrush.h" +#include "ipatch.h" +#include "ifiletypes.h" +#include "ieclass.h" +#include "qerplugin.h" + +#include "modulesystem/singletonmodule.h" +#include "typesystem.h" + +#include "xmlparse.h" +#include "xmlwrite.h" + + +class MapXMLDependencies : + public GlobalRadiantModuleRef, + public GlobalBrushModuleRef, + public GlobalFiletypesModuleRef, + public GlobalEntityClassManagerModuleRef, + public GlobalSceneGraphModuleRef { + PatchModuleRef m_patchDef2Doom3Module; + PatchModuleRef m_patchDoom3Module; +public: + MapXMLDependencies() : + GlobalBrushModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("brushtypes")), + GlobalEntityClassManagerModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entityclass")), + m_patchDef2Doom3Module("def2doom3"), + m_patchDoom3Module("doom3") + { + } + + BrushCreator &getBrushDoom3() + { + return GlobalBrushModule::getTable(); + } + + PatchCreator &getPatchDoom3() + { + return *m_patchDoom3Module.getTable(); + } + + PatchCreator &getPatchDef2Doom3() + { + return *m_patchDef2Doom3Module.getTable(); + } +}; + +class MapXMLAPI : public TypeSystemRef, public MapFormat { +public: + typedef MapFormat Type; + + STRING_CONSTANT(Name, "xmldoom3"); + + MapXMLAPI() + { + GlobalFiletypesModule::getTable().addType(Type::Name(), Name(), filetype_t("xml doom3 maps", "*.xmap")); + } + + MapFormat *getTable() + { + return this; + } + + void readGraph(scene::Node &root, TextInputStream &inputStream, EntityCreator &entityTable) const + { + Map_Read(root, inputStream, entityTable); + } + + void writeGraph(scene::Node &root, GraphTraversalFunc traverse, TextOutputStream &outputStream) const + { + Map_Write(root, traverse, outputStream); + } +}; + +typedef SingletonModule MapXMLModule; + +MapXMLModule g_MapXMLModule; + + +extern "C" void RADIANT_DLLEXPORT Radiant_RegisterModules(ModuleServer &server) +{ + GlobalErrorStream::instance().setOutputStream(server.getErrorStream()); + GlobalOutputStream::instance().setOutputStream(server.getOutputStream()); + GlobalDebugMessageHandler::instance().setHandler(server.getDebugMessageHandler()); + GlobalModuleServer::instance().set(server); + + g_MapXMLModule.selfRegister(); +}