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 (\"brush primitives\")" );
38 bool g_showAlternativeTextureProjectionOption = false;
39 bool g_brush_always_caulk;
41 bool getTextureLockEnabled(){
42 return g_brush_texturelock_enabled;
45 void Face_importSnapPlanes( bool value ){
46 Face::m_quantise = value ? quantiseInteger : quantiseFloating;
48 typedef FreeCaller1<bool, Face_importSnapPlanes> FaceImportSnapPlanesCaller;
50 void Face_exportSnapPlanes( const BoolImportCallback& importer ){
51 importer( Face::m_quantise == quantiseInteger );
53 typedef FreeCaller1<const BoolImportCallback&, Face_exportSnapPlanes> FaceExportSnapPlanesCaller;
55 void Brush_constructPreferences( PreferencesPage& page ){
57 "", "Snap planes to integer grid",
58 FaceImportSnapPlanesCaller(),
59 FaceExportSnapPlanesCaller()
62 "Default texture scale",
63 g_texdef_default_scale
65 if ( g_showAlternativeTextureProjectionOption ) {
67 "", "Use alternative texture-projection (\"brush primitives\")",
68 LatchedBoolImportCaller( g_useAlternativeTextureProjection ),
69 BoolExportCaller( g_useAlternativeTextureProjection.m_latched )
73 page.appendCheckBox( "",
74 "Always use caulk for new brushes",
78 void Brush_constructPage( PreferenceGroup& group ){
79 PreferencesPage page( group.createPage( "Brush", "Brush Settings" ) );
80 Brush_constructPreferences( page );
82 void Brush_registerPreferencesPage(){
83 PreferencesDialog_addSettingsPage( FreeCaller1<PreferenceGroup&, Brush_constructPage>() );
86 void Brush_unlatchPreferences(){
87 Brush_toggleFormat( 0 );
90 void Brush_toggleFormat( int i ){
91 if ( g_showAlternativeTextureProjectionOption ) {
92 g_useAlternativeTextureProjection.m_value = g_useAlternativeTextureProjection.m_latched ^ i;
93 Brush::destroyStatic();
94 Brush::constructStatic( g_useAlternativeTextureProjection.m_value ? eBrushTypeQuake3BP : eBrushTypeQuake3 );
98 int Brush_toggleFormatCount(){
99 if ( g_showAlternativeTextureProjectionOption ) {
105 void Brush_Construct( EBrushType type ){
106 if ( type == eBrushTypeQuake3 ) {
107 g_showAlternativeTextureProjectionOption = true;
109 const char *value = g_pGameDescription->getKeyValue( "brush_primit" );
110 if ( !string_empty( value ) ) {
111 g_useAlternativeTextureProjection.m_latched = atoi( value );
114 GlobalPreferenceSystem().registerPreference(
115 "AlternativeTextureProjection",
116 BoolImportStringCaller( g_useAlternativeTextureProjection.m_latched ),
117 BoolExportStringCaller( g_useAlternativeTextureProjection.m_latched )
119 g_useAlternativeTextureProjection.useLatched();
121 if ( g_useAlternativeTextureProjection.m_value ) {
122 type = eBrushTypeQuake3BP;
126 GlobalPreferenceSystem().registerPreference(
128 BoolImportStringCaller( g_brush_always_caulk ),
129 BoolExportStringCaller( g_brush_always_caulk ) );
132 Brush_registerCommands();
133 Brush_registerPreferencesPage();
135 BrushFilters_construct();
137 BrushClipPlane::constructStatic();
138 BrushInstance::constructStatic();
139 Brush::constructStatic( type );
141 Brush::m_maxWorldCoord = g_MaxWorldCoord;
142 BrushInstance::m_counter = &g_brushCount;
144 g_texdef_default_scale = 0.5f;
145 const char* value = g_pGameDescription->getKeyValue( "default_scale" );
146 if ( !string_empty( value ) ) {
147 float scale = static_cast<float>( atof( value ) );
149 g_texdef_default_scale = scale;
153 globalErrorStream() << "error parsing \"default_scale\" attribute\n";
157 GlobalPreferenceSystem().registerPreference( "TextureLock", BoolImportStringCaller( g_brush_texturelock_enabled ), BoolExportStringCaller( g_brush_texturelock_enabled ) );
158 GlobalPreferenceSystem().registerPreference( "BrushSnapPlanes", makeBoolStringImportCallback( FaceImportSnapPlanesCaller() ), makeBoolStringExportCallback( FaceExportSnapPlanesCaller() ) );
159 GlobalPreferenceSystem().registerPreference( "TexdefDefaultScale", FloatImportStringCaller( g_texdef_default_scale ), FloatExportStringCaller( g_texdef_default_scale ) );
161 GridStatus_getTextureLockEnabled = getTextureLockEnabled;
162 g_texture_lock_status_changed = FreeCaller<GridStatus_onTextureLockEnabledChanged>();
165 void Brush_Destroy(){
166 Brush::m_maxWorldCoord = 0;
167 BrushInstance::m_counter = 0;
169 Brush::destroyStatic();
170 BrushInstance::destroyStatic();
171 BrushClipPlane::destroyStatic();
174 void Brush_clipperColourChanged(){
175 BrushClipPlane::destroyStatic();
176 BrushClipPlane::constructStatic();
179 void BrushFaceData_fromFace( const BrushFaceDataCallback& callback, Face& face ){
180 _QERFaceData faceData;
181 faceData.m_p0 = face.getPlane().planePoints()[0];
182 faceData.m_p1 = face.getPlane().planePoints()[1];
183 faceData.m_p2 = face.getPlane().planePoints()[2];
184 faceData.m_shader = face.GetShader();
185 faceData.m_texdef = face.getTexdef().m_projection.m_texdef;
186 faceData.contents = face.getShader().m_flags.m_contentFlags;
187 faceData.flags = face.getShader().m_flags.m_surfaceFlags;
188 faceData.value = face.getShader().m_flags.m_value;
189 callback( faceData );
191 typedef ConstReferenceCaller1<BrushFaceDataCallback, Face&, BrushFaceData_fromFace> BrushFaceDataFromFaceCaller;
192 typedef Callback1<Face&> FaceCallback;
194 class Quake3BrushCreator : public BrushCreator
197 scene::Node& createBrush(){
198 return ( new BrushNode )->node();
200 bool useAlternativeTextureProjection() const {
201 return g_useAlternativeTextureProjection.m_value;
203 void Brush_forEachFace( scene::Node& brush, const BrushFaceDataCallback& callback ){
204 ::Brush_forEachFace( *Node_getBrush( brush ), FaceCallback( BrushFaceDataFromFaceCaller( callback ) ) );
206 bool Brush_addFace( scene::Node& brush, const _QERFaceData& faceData ){
207 Node_getBrush( brush )->undoSave();
208 return Node_getBrush( brush )->addPlane( faceData.m_p0, faceData.m_p1, faceData.m_p2, faceData.m_shader, TextureProjection( faceData.m_texdef, brushprimit_texdef_t(), Vector3( 0, 0, 0 ), Vector3( 0, 0, 0 ) ) ) != 0;
212 Quake3BrushCreator g_Quake3BrushCreator;
214 BrushCreator& GetBrushCreator(){
215 return g_Quake3BrushCreator;
218 #include "modulesystem/singletonmodule.h"
219 #include "modulesystem/moduleregistry.h"
222 class BrushDependencies :
223 public GlobalRadiantModuleRef,
224 public GlobalSceneGraphModuleRef,
225 public GlobalShaderCacheModuleRef,
226 public GlobalSelectionModuleRef,
227 public GlobalOpenGLModuleRef,
228 public GlobalUndoModuleRef,
229 public GlobalFilterModuleRef
233 class BrushDoom3API : public TypeSystemRef
235 BrushCreator* m_brushdoom3;
237 typedef BrushCreator Type;
238 STRING_CONSTANT( Name, "doom3" );
241 Brush_Construct( eBrushTypeDoom3 );
243 m_brushdoom3 = &GetBrushCreator();
248 BrushCreator* getTable(){
253 typedef SingletonModule<BrushDoom3API, BrushDependencies> BrushDoom3Module;
254 typedef Static<BrushDoom3Module> StaticBrushDoom3Module;
255 StaticRegisterModule staticRegisterBrushDoom3( StaticBrushDoom3Module::instance() );
258 class BrushQuake4API : public TypeSystemRef
260 BrushCreator* m_brushquake4;
262 typedef BrushCreator Type;
263 STRING_CONSTANT( Name, "quake4" );
266 Brush_Construct( eBrushTypeQuake4 );
268 m_brushquake4 = &GetBrushCreator();
273 BrushCreator* getTable(){
274 return m_brushquake4;
278 typedef SingletonModule<BrushQuake4API, BrushDependencies> BrushQuake4Module;
279 typedef Static<BrushQuake4Module> StaticBrushQuake4Module;
280 StaticRegisterModule staticRegisterBrushQuake4( StaticBrushQuake4Module::instance() );
283 class BrushQuake3API : public TypeSystemRef
285 BrushCreator* m_brushquake3;
287 typedef BrushCreator Type;
288 STRING_CONSTANT( Name, "quake3" );
291 Brush_Construct( eBrushTypeQuake3 );
293 m_brushquake3 = &GetBrushCreator();
298 BrushCreator* getTable(){
299 return m_brushquake3;
303 typedef SingletonModule<BrushQuake3API, BrushDependencies> BrushQuake3Module;
304 typedef Static<BrushQuake3Module> StaticBrushQuake3Module;
305 StaticRegisterModule staticRegisterBrushQuake3( StaticBrushQuake3Module::instance() );
308 class BrushQuake2API : public TypeSystemRef
310 BrushCreator* m_brushquake2;
312 typedef BrushCreator Type;
313 STRING_CONSTANT( Name, "quake2" );
316 Brush_Construct( eBrushTypeQuake2 );
318 m_brushquake2 = &GetBrushCreator();
323 BrushCreator* getTable(){
324 return m_brushquake2;
328 typedef SingletonModule<BrushQuake2API, BrushDependencies> BrushQuake2Module;
329 typedef Static<BrushQuake2Module> StaticBrushQuake2Module;
330 StaticRegisterModule staticRegisterBrushQuake2( StaticBrushQuake2Module::instance() );
333 class BrushQuake1API : public TypeSystemRef
335 BrushCreator* m_brushquake1;
337 typedef BrushCreator Type;
338 STRING_CONSTANT( Name, "quake" );
341 Brush_Construct( eBrushTypeQuake );
343 m_brushquake1 = &GetBrushCreator();
348 BrushCreator* getTable(){
349 return m_brushquake1;
353 typedef SingletonModule<BrushQuake1API, BrushDependencies> BrushQuake1Module;
354 typedef Static<BrushQuake1Module> StaticBrushQuake1Module;
355 StaticRegisterModule staticRegisterBrushQuake1( StaticBrushQuake1Module::instance() );
358 class BrushHalfLifeAPI : public TypeSystemRef
360 BrushCreator* m_brushhalflife;
362 typedef BrushCreator Type;
363 STRING_CONSTANT( Name, "halflife" );
366 Brush_Construct( eBrushTypeHalfLife );
368 m_brushhalflife = &GetBrushCreator();
373 BrushCreator* getTable(){
374 return m_brushhalflife;
378 typedef SingletonModule<BrushHalfLifeAPI, BrushDependencies> BrushHalfLifeModule;
379 typedef Static<BrushHalfLifeModule> StaticBrushHalfLifeModule;
380 StaticRegisterModule staticRegisterBrushHalfLife( StaticBrushHalfLifeModule::instance() );