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 "brushmodule.h"
24 #include "qerplugin.h"
26 #include "brushnode.h"
27 #include "brushmanip.h"
29 #include "preferencesystem.h"
34 #include "mainframe.h"
35 #include "preferences.h"
37 LatchedBool g_useAlternativeTextureProjection(false, "Use alternative texture-projection");
38 bool g_showAlternativeTextureProjectionOption = false;
40 bool getTextureLockEnabled()
42 return g_brush_texturelock_enabled;
45 void Face_importSnapPlanes(bool value)
47 Face::m_quantise = value ? quantiseInteger : quantiseFloating;
49 typedef FreeCaller1<bool, Face_importSnapPlanes> FaceImportSnapPlanesCaller;
51 void Face_exportSnapPlanes(const BoolImportCallback& importer)
53 importer(Face::m_quantise == quantiseInteger);
55 typedef FreeCaller1<const BoolImportCallback&, Face_exportSnapPlanes> FaceExportSnapPlanesCaller;
57 void Brush_constructPreferences(PreferencesPage& page)
60 "", "Snap planes to integer grid",
61 FaceImportSnapPlanesCaller(),
62 FaceExportSnapPlanesCaller()
65 "Default texture scale",
66 g_texdef_default_scale
68 if(g_showAlternativeTextureProjectionOption)
71 "", "Use alternative texture-projection",
72 LatchedBoolImportCaller(g_useAlternativeTextureProjection),
73 BoolExportCaller(g_useAlternativeTextureProjection.m_latched)
77 void Brush_constructPage(PreferenceGroup& group)
79 PreferencesPage page(group.createPage("Brush", "Brush Settings"));
80 Brush_constructPreferences(page);
82 void Brush_registerPreferencesPage()
84 PreferencesDialog_addSettingsPage(FreeCaller1<PreferenceGroup&, Brush_constructPage>());
88 void Brush_Construct(EBrushType type)
90 if(type == eBrushTypeQuake3)
92 g_showAlternativeTextureProjectionOption = true;
94 GlobalPreferenceSystem().registerPreference(
95 "AlternativeTextureProjection",
96 BoolImportStringCaller(g_useAlternativeTextureProjection.m_latched),
97 BoolExportStringCaller(g_useAlternativeTextureProjection.m_latched)
99 g_useAlternativeTextureProjection.useLatched();
101 if(g_useAlternativeTextureProjection.m_value)
103 type = eBrushTypeQuake3BP;
107 Brush_registerCommands();
108 Brush_registerPreferencesPage();
110 BrushFilters_construct();
112 BrushClipPlane::constructStatic();
113 BrushInstance::constructStatic();
114 Brush::constructStatic(type);
116 Brush::m_maxWorldCoord = g_MaxWorldCoord;
117 BrushInstance::m_counter = &g_brushCount;
119 g_texdef_default_scale = 0.5f;
120 const char* value = g_pGameDescription->getKeyValue("default_scale");
121 if(!string_empty(value))
123 float scale = static_cast<float>(atof(value));
126 g_texdef_default_scale = scale;
130 globalErrorStream() << "error parsing \"default_scale\" attribute\n";
134 FaceTextureClipboard_setDefault();
136 GlobalPreferenceSystem().registerPreference("TextureLock", BoolImportStringCaller(g_brush_texturelock_enabled), BoolExportStringCaller(g_brush_texturelock_enabled));
137 GlobalPreferenceSystem().registerPreference("BrushSnapPlanes", makeBoolStringImportCallback(FaceImportSnapPlanesCaller()), makeBoolStringExportCallback(FaceExportSnapPlanesCaller()));
138 GlobalPreferenceSystem().registerPreference("TexdefDefaultScale", FloatImportStringCaller(g_texdef_default_scale), FloatExportStringCaller(g_texdef_default_scale));
140 GridStatus_getTextureLockEnabled = getTextureLockEnabled;
141 g_texture_lock_status_changed = FreeCaller<GridStatus_onTextureLockEnabledChanged>();
146 Brush::m_maxWorldCoord = 0;
147 BrushInstance::m_counter = 0;
149 Brush::destroyStatic();
150 BrushInstance::destroyStatic();
151 BrushClipPlane::destroyStatic();
154 void Brush_clipperColourChanged()
156 BrushClipPlane::destroyStatic();
157 BrushClipPlane::constructStatic();
161 class Quake3BrushCreator : public BrushCreator
164 scene::Node& createBrush()
166 return (new BrushNode)->node();
168 bool useAlternativeTextureProjection() const
170 return g_useAlternativeTextureProjection.m_value;
174 Quake3BrushCreator g_Quake3BrushCreator;
176 BrushCreator& GetBrushCreator()
178 return g_Quake3BrushCreator;
181 #include "modulesystem/singletonmodule.h"
182 #include "modulesystem/moduleregistry.h"
185 class BrushDependencies :
186 public GlobalRadiantModuleRef,
187 public GlobalSceneGraphModuleRef,
188 public GlobalShaderCacheModuleRef,
189 public GlobalSelectionModuleRef,
190 public GlobalOpenGLModuleRef,
191 public GlobalUndoModuleRef,
192 public GlobalFilterModuleRef
196 class BrushDoom3API : public TypeSystemRef
198 BrushCreator* m_brushdoom3;
200 typedef BrushCreator Type;
201 STRING_CONSTANT(Name, "doom3");
205 Brush_Construct(eBrushTypeDoom3);
207 m_brushdoom3 = &GetBrushCreator();
213 BrushCreator* getTable()
219 typedef SingletonModule<BrushDoom3API, BrushDependencies> BrushDoom3Module;
220 typedef Static<BrushDoom3Module> StaticBrushDoom3Module;
221 StaticRegisterModule staticRegisterBrushDoom3(StaticBrushDoom3Module::instance());
224 class BrushQuake4API : public TypeSystemRef
226 BrushCreator* m_brushquake4;
228 typedef BrushCreator Type;
229 STRING_CONSTANT(Name, "quake4");
233 Brush_Construct(eBrushTypeQuake4);
235 m_brushquake4 = &GetBrushCreator();
241 BrushCreator* getTable()
243 return m_brushquake4;
247 typedef SingletonModule<BrushQuake4API, BrushDependencies> BrushQuake4Module;
248 typedef Static<BrushQuake4Module> StaticBrushQuake4Module;
249 StaticRegisterModule staticRegisterBrushQuake4(StaticBrushQuake4Module::instance());
252 class BrushQuake3API : public TypeSystemRef
254 BrushCreator* m_brushquake3;
256 typedef BrushCreator Type;
257 STRING_CONSTANT(Name, "quake3");
261 Brush_Construct(eBrushTypeQuake3);
263 m_brushquake3 = &GetBrushCreator();
269 BrushCreator* getTable()
271 return m_brushquake3;
275 typedef SingletonModule<BrushQuake3API, BrushDependencies> BrushQuake3Module;
276 typedef Static<BrushQuake3Module> StaticBrushQuake3Module;
277 StaticRegisterModule staticRegisterBrushQuake3(StaticBrushQuake3Module::instance());
280 class BrushQuake2API : public TypeSystemRef
282 BrushCreator* m_brushquake2;
284 typedef BrushCreator Type;
285 STRING_CONSTANT(Name, "quake2");
289 Brush_Construct(eBrushTypeQuake2);
291 m_brushquake2 = &GetBrushCreator();
297 BrushCreator* getTable()
299 return m_brushquake2;
303 typedef SingletonModule<BrushQuake2API, BrushDependencies> BrushQuake2Module;
304 typedef Static<BrushQuake2Module> StaticBrushQuake2Module;
305 StaticRegisterModule staticRegisterBrushQuake2(StaticBrushQuake2Module::instance());
308 class BrushQuake1API : public TypeSystemRef
310 BrushCreator* m_brushquake1;
312 typedef BrushCreator Type;
313 STRING_CONSTANT(Name, "quake");
317 Brush_Construct(eBrushTypeQuake);
319 m_brushquake1 = &GetBrushCreator();
325 BrushCreator* getTable()
327 return m_brushquake1;
331 typedef SingletonModule<BrushQuake1API, BrushDependencies> BrushQuake1Module;
332 typedef Static<BrushQuake1Module> StaticBrushQuake1Module;
333 StaticRegisterModule staticRegisterBrushQuake1(StaticBrushQuake1Module::instance());
336 class BrushHalfLifeAPI : public TypeSystemRef
338 BrushCreator* m_brushhalflife;
340 typedef BrushCreator Type;
341 STRING_CONSTANT(Name, "halflife");
345 Brush_Construct(eBrushTypeHalfLife);
347 m_brushhalflife = &GetBrushCreator();
353 BrushCreator* getTable()
355 return m_brushhalflife;
359 typedef SingletonModule<BrushHalfLifeAPI, BrushDependencies> BrushHalfLifeModule;
360 typedef Static<BrushHalfLifeModule> StaticBrushHalfLifeModule;
361 StaticRegisterModule staticRegisterBrushHalfLife(StaticBrushHalfLifeModule::instance());