152 lines
4.5 KiB
C++
152 lines
4.5 KiB
C++
/*
|
|
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 "iscriplib.h"
|
|
#include "ibrush.h"
|
|
#include "ipatch.h"
|
|
#include "ifiletypes.h"
|
|
#include "ieclass.h"
|
|
#include "qerplugin.h"
|
|
|
|
#include "scenelib.h"
|
|
#include "string/string.h"
|
|
#include "stringio.h"
|
|
#include "generic/constant.h"
|
|
|
|
#include "modulesystem/singletonmodule.h"
|
|
|
|
#include "parse.h"
|
|
#include "write.h"
|
|
|
|
class MapDependencies :
|
|
public GlobalRadiantModuleRef,
|
|
public GlobalBrushModuleRef,
|
|
public GlobalPatchModuleRef,
|
|
public GlobalFiletypesModuleRef,
|
|
public GlobalScripLibModuleRef,
|
|
public GlobalEntityClassManagerModuleRef,
|
|
public GlobalSceneGraphModuleRef {
|
|
public:
|
|
MapDependencies() :
|
|
GlobalBrushModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("brushtypes")),
|
|
GlobalPatchModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("patchtypes")),
|
|
GlobalEntityClassManagerModuleRef(GlobalRadiant().getRequiredGameDescriptionKeyValue("entityclass"))
|
|
{
|
|
}
|
|
};
|
|
|
|
class MapQ3API : public TypeSystemRef, public MapFormat, public PrimitiveParser {
|
|
mutable bool detectedFormat;
|
|
public:
|
|
typedef MapFormat Type;
|
|
|
|
STRING_CONSTANT(Name, "worldspawn");
|
|
|
|
MapQ3API()
|
|
{
|
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(),
|
|
filetype_t("WorldSpawn maps", "*.map", true, true, true));
|
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(),
|
|
filetype_t("WorldSpawn region", "*.reg", true, true, true));
|
|
GlobalFiletypesModule::getTable().addType(Type::Name(), Name(),
|
|
filetype_t("WorldSpawn compiled maps", "*.bsp", false, true, false));
|
|
}
|
|
|
|
MapFormat *getTable()
|
|
{
|
|
return this;
|
|
}
|
|
|
|
scene::Node &parsePrimitive(Tokeniser &tokeniser) const
|
|
{
|
|
const char *primitive = tokeniser.getToken();
|
|
if (primitive != 0) {
|
|
if (string_equal(primitive, "patchDef2") || string_equal(primitive, "patchDef2WS")) {
|
|
return GlobalPatchModule::getTable().createPatch(false, false);
|
|
} if (string_equal(primitive, "patchDef3") || string_equal(primitive, "patchDef3WS")) {
|
|
return GlobalPatchModule::getTable().createPatch(true, false);
|
|
} if (string_equal(primitive, "patchDefWS")) {
|
|
return GlobalPatchModule::getTable().createPatch(false, true);
|
|
}
|
|
|
|
if (!detectedFormat)
|
|
{
|
|
EBrushType fmt;
|
|
if (string_equal(primitive, "brushDef"))
|
|
fmt = eBrushTypeQuake3BP;
|
|
else if (string_equal(primitive, "("))
|
|
{
|
|
if (1) //tokeniser.getLine
|
|
fmt = eBrushTypeQuake3Valve;
|
|
else
|
|
fmt = eBrushTypeQuake3;
|
|
}
|
|
if (fmt != GlobalBrushModule::getTable().getBrushType())
|
|
GlobalBrushModule::getTable().setBrushType(fmt);
|
|
}
|
|
|
|
switch(GlobalBrushModule::getTable().getBrushType())
|
|
{
|
|
default:
|
|
tokeniser.ungetToken(); // (
|
|
case eBrushTypeQuake3BP:
|
|
return GlobalBrushModule::getTable().createBrush();
|
|
}
|
|
}
|
|
|
|
Tokeniser_unexpectedError(tokeniser, primitive, "#quake3-primitive");
|
|
return g_nullNode;
|
|
}
|
|
|
|
void readGraph(scene::Node &root, TextInputStream &inputStream, EntityCreator &entityTable) const
|
|
{
|
|
detectedFormat = false;
|
|
wrongFormat = false;
|
|
Tokeniser &tokeniser = GlobalScripLibModule::getTable().m_pfnNewSimpleTokeniser(inputStream);
|
|
Map_Read(root, tokeniser, entityTable, *this);
|
|
tokeniser.release();
|
|
}
|
|
|
|
void writeGraph(scene::Node &root, GraphTraversalFunc traverse, TextOutputStream &outputStream) const
|
|
{
|
|
TokenWriter &writer = GlobalScripLibModule::getTable().m_pfnNewSimpleTokenWriter(outputStream);
|
|
Map_Write(root, traverse, writer, false);
|
|
writer.release();
|
|
}
|
|
};
|
|
|
|
typedef SingletonModule<MapQ3API, MapDependencies> MapQ3Module;
|
|
|
|
MapQ3Module g_MapQ3Module;
|
|
|
|
|
|
extern "C" void
|
|
#ifdef _WIN32
|
|
__declspec(dllexport)
|
|
#else
|
|
__attribute__((visibility("default")))
|
|
#endif
|
|
Radiant_RegisterModules(ModuleServer &server)
|
|
{
|
|
initialiseModule(server);
|
|
|
|
g_MapQ3Module.selfRegister();
|
|
}
|