2 Copyright (C) 2001-2006, William Joseph.
5 This file is part of GtkRadiant.
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "patchmodule.h"
24 #include "qerplugin.h"
28 #include "patchmanip.h"
32 std::size_t g_patchModuleCount = 0;
35 void Patch_Construct(EPatchType type)
37 if(++g_patchModuleCount != 1)
42 PatchFilters_construct();
44 PatchPreferences_construct();
46 Patch_registerPreferencesPage();
48 Patch::constructStatic(type);
49 PatchInstance::constructStatic();
51 if(type == ePatchTypeDoom3)
53 MAX_PATCH_WIDTH = MAX_PATCH_HEIGHT = 99;
57 MAX_PATCH_WIDTH = MAX_PATCH_HEIGHT = 15;
63 if(--g_patchModuleCount != 0)
68 Patch::destroyStatic();
69 PatchInstance::destroyStatic();
72 class CommonPatchCreator : public PatchCreator
75 void Patch_undoSave(scene::Node& patch) const
77 Node_getPatch(patch)->undoSave();
79 void Patch_resize(scene::Node& patch, std::size_t width, std::size_t height) const
81 Node_getPatch(patch)->setDims(width, height);
83 PatchControlMatrix Patch_getControlPoints(scene::Node& node) const
85 Patch& patch = *Node_getPatch(node);
86 return PatchControlMatrix(patch.getHeight(), patch.getWidth(), patch.getControlPoints().data());
88 void Patch_controlPointsChanged(scene::Node& patch) const
90 return Node_getPatch(patch)->controlPointsChanged();
92 const char* Patch_getShader(scene::Node& patch) const
94 return Node_getPatch(patch)->GetShader();
96 void Patch_setShader(scene::Node& patch, const char* shader) const
98 Node_getPatch(patch)->SetShader(shader);
102 class Quake3PatchCreator : public CommonPatchCreator
105 scene::Node& createPatch()
107 return (new PatchNodeQuake3())->node();
111 Quake3PatchCreator g_Quake3PatchCreator;
113 PatchCreator& GetQuake3PatchCreator()
115 return g_Quake3PatchCreator;
118 class Doom3PatchCreator : public CommonPatchCreator
121 scene::Node& createPatch()
123 return (new PatchNodeDoom3(true))->node();
127 Doom3PatchCreator g_Doom3PatchCreator;
129 PatchCreator& GetDoom3PatchCreator()
131 return g_Doom3PatchCreator;
134 class Doom3PatchDef2Creator : public CommonPatchCreator
137 scene::Node& createPatch()
139 return (new PatchNodeDoom3())->node();
143 Doom3PatchDef2Creator g_Doom3PatchDef2Creator;
145 PatchCreator& GetDoom3PatchDef2Creator()
147 return g_Doom3PatchDef2Creator;
150 #include "modulesystem/singletonmodule.h"
151 #include "modulesystem/moduleregistry.h"
153 class PatchDependencies :
154 public GlobalRadiantModuleRef,
155 public GlobalSceneGraphModuleRef,
156 public GlobalShaderCacheModuleRef,
157 public GlobalSelectionModuleRef,
158 public GlobalOpenGLModuleRef,
159 public GlobalUndoModuleRef,
160 public GlobalFilterModuleRef
164 class PatchQuake3API : public TypeSystemRef
166 PatchCreator* m_patchquake3;
168 typedef PatchCreator Type;
169 STRING_CONSTANT(Name, "quake3");
173 Patch_Construct(ePatchTypeQuake3);
175 m_patchquake3 = &GetQuake3PatchCreator();
176 g_patchCreator = m_patchquake3;
182 PatchCreator* getTable()
184 return m_patchquake3;
188 typedef SingletonModule<PatchQuake3API, PatchDependencies> PatchQuake3Module;
189 typedef Static<PatchQuake3Module> StaticPatchQuake3Module;
190 StaticRegisterModule staticRegisterPatchQuake3(StaticPatchQuake3Module::instance());
194 class PatchDoom3API : public TypeSystemRef
196 PatchCreator* m_patchdoom3;
198 typedef PatchCreator Type;
199 STRING_CONSTANT(Name, "doom3");
203 Patch_Construct(ePatchTypeDoom3);
205 m_patchdoom3 = &GetDoom3PatchCreator();
211 PatchCreator* getTable()
217 typedef SingletonModule<PatchDoom3API, PatchDependencies> PatchDoom3Module;
218 typedef Static<PatchDoom3Module> StaticPatchDoom3Module;
219 StaticRegisterModule staticRegisterPatchDoom3(StaticPatchDoom3Module::instance());
222 class PatchDef2Doom3API : public TypeSystemRef
224 PatchCreator* m_patchdef2doom3;
226 typedef PatchCreator Type;
227 STRING_CONSTANT(Name, "def2doom3");
231 Patch_Construct(ePatchTypeDoom3);
233 m_patchdef2doom3 = &GetDoom3PatchDef2Creator();
234 g_patchCreator = m_patchdef2doom3;
240 PatchCreator* getTable()
242 return m_patchdef2doom3;
246 typedef SingletonModule<PatchDef2Doom3API, PatchDependencies> PatchDef2Doom3Module;
247 typedef Static<PatchDef2Doom3Module> StaticPatchDef2Doom3Module;
248 StaticRegisterModule staticRegisterPatchDef2Doom3(StaticPatchDef2Doom3Module::instance());