X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=radiant%2Fbrushmodule.cpp;h=6a9565df8906a24823573a8ff180c288d3be49bb;hp=f493156ccb6f0c9c263cc32a040e613e76a51c99;hb=HEAD;hpb=ffae4a0febc1820053a48f837a431126f76cca79 diff --git a/radiant/brushmodule.cpp b/radiant/brushmodule.cpp index f493156c..6a9565df 100644 --- a/radiant/brushmodule.cpp +++ b/radiant/brushmodule.cpp @@ -1,23 +1,23 @@ /* -Copyright (C) 2001-2006, William Joseph. -All Rights Reserved. + Copyright (C) 2001-2006, William Joseph. + All Rights Reserved. -This file is part of GtkRadiant. + 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 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. + 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 -*/ + 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 "brushmodule.h" @@ -34,207 +34,193 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "mainframe.h" #include "preferences.h" -LatchedBool g_useAlternativeTextureProjection(false, "Use alternative texture-projection (\"brush primitives\")"); +LatchedValue g_useAlternativeTextureProjection( false, "Use alternative texture-projection (\"brush primitives\")" ); bool g_showAlternativeTextureProjectionOption = false; bool g_brush_always_caulk; -bool getTextureLockEnabled() -{ - return g_brush_texturelock_enabled; +bool getTextureLockEnabled(){ + return g_brush_texturelock_enabled; } -void Face_importSnapPlanes(bool value) -{ - Face::m_quantise = value ? quantiseInteger : quantiseFloating; -} -typedef FreeCaller1 FaceImportSnapPlanesCaller; +struct Face_SnapPlanes { + static void Export(const QuantiseFunc &self, const Callback &returnz) { + returnz(self == quantiseInteger); + } -void Face_exportSnapPlanes(const BoolImportCallback& importer) -{ - importer(Face::m_quantise == quantiseInteger); -} -typedef FreeCaller1 FaceExportSnapPlanesCaller; + static void Import(QuantiseFunc &self, bool value) { + self = value ? quantiseInteger : quantiseFloating; + } +}; -void Brush_constructPreferences(PreferencesPage& page) -{ - page.appendCheckBox( - "", "Snap planes to integer grid", - FaceImportSnapPlanesCaller(), - FaceExportSnapPlanesCaller() - ); - page.appendEntry( - "Default texture scale", - g_texdef_default_scale - ); - if(g_showAlternativeTextureProjectionOption) - { - page.appendCheckBox( - "", "Use alternative texture-projection (\"brush primitives\")", - LatchedBoolImportCaller(g_useAlternativeTextureProjection), - BoolExportCaller(g_useAlternativeTextureProjection.m_latched) - ); - } - // d1223m - page.appendCheckBox("", - "Always use caulk for new brushes", - g_brush_always_caulk - ); -} -void Brush_constructPage(PreferenceGroup& group) -{ - PreferencesPage page(group.createPage("Brush", "Brush Settings")); - Brush_constructPreferences(page); +void Brush_constructPreferences( PreferencesPage& page ){ + page.appendCheckBox( + "", "Snap planes to integer grid", + make_property(Face::m_quantise) + ); + page.appendEntry( + "Default texture scale", + g_texdef_default_scale + ); + if ( g_showAlternativeTextureProjectionOption ) { + page.appendCheckBox( + "", "Use alternative texture-projection (\"brush primitives\")", + make_property(g_useAlternativeTextureProjection) + ); + } + // d1223m + page.appendCheckBox( "", + "Always use caulk for new brushes", + g_brush_always_caulk + ); } -void Brush_registerPreferencesPage() -{ - PreferencesDialog_addSettingsPage(FreeCaller1()); +void Brush_constructPage( PreferenceGroup& group ){ + PreferencesPage page( group.createPage( "Brush", "Brush Settings" ) ); + Brush_constructPreferences( page ); +} +void Brush_registerPreferencesPage(){ + PreferencesDialog_addSettingsPage( makeCallbackF(Brush_constructPage) ); } -void Brush_unlatchPreferences() -{ - Brush_toggleFormat(0); +void Brush_unlatchPreferences(){ + Brush_toggleFormat( 0 ); } -void Brush_toggleFormat(int i) -{ - if(g_showAlternativeTextureProjectionOption) - { +void Brush_toggleFormat( int i ){ + if ( g_showAlternativeTextureProjectionOption ) { g_useAlternativeTextureProjection.m_value = g_useAlternativeTextureProjection.m_latched ^ i; Brush::destroyStatic(); - Brush::constructStatic(g_useAlternativeTextureProjection.m_value ? eBrushTypeQuake3BP : eBrushTypeQuake3); + Brush::constructStatic( g_useAlternativeTextureProjection.m_value ? eBrushTypeQuake3BP : eBrushTypeQuake3 ); } } -int Brush_toggleFormatCount() -{ - if(g_showAlternativeTextureProjectionOption) +int Brush_toggleFormatCount(){ + if ( g_showAlternativeTextureProjectionOption ) { return 2; + } return 1; } -void Brush_Construct(EBrushType type) -{ - if(type == eBrushTypeQuake3) - { - g_showAlternativeTextureProjectionOption = true; - - const char *value = g_pGameDescription->getKeyValue("brush_primit"); - if(!string_empty(value)) - g_useAlternativeTextureProjection.m_latched = atoi(value); - - GlobalPreferenceSystem().registerPreference( - "AlternativeTextureProjection", - BoolImportStringCaller(g_useAlternativeTextureProjection.m_latched), - BoolExportStringCaller(g_useAlternativeTextureProjection.m_latched) - ); - g_useAlternativeTextureProjection.useLatched(); - - if(g_useAlternativeTextureProjection.m_value) - { - type = eBrushTypeQuake3BP; - } - - // d1223m - GlobalPreferenceSystem().registerPreference( - "BrushAlwaysCaulk", - BoolImportStringCaller(g_brush_always_caulk), - BoolExportStringCaller(g_brush_always_caulk)); - } - - Brush_registerCommands(); - Brush_registerPreferencesPage(); - - BrushFilters_construct(); - - BrushClipPlane::constructStatic(); - BrushInstance::constructStatic(); - Brush::constructStatic(type); - - Brush::m_maxWorldCoord = g_MaxWorldCoord; - BrushInstance::m_counter = &g_brushCount; - - g_texdef_default_scale = 0.5f; - const char* value = g_pGameDescription->getKeyValue("default_scale"); - if(!string_empty(value)) - { - float scale = static_cast(atof(value)); - if(scale != 0) - { - g_texdef_default_scale = scale; - } - else - { - globalErrorStream() << "error parsing \"default_scale\" attribute\n"; - } - } - - GlobalPreferenceSystem().registerPreference("TextureLock", BoolImportStringCaller(g_brush_texturelock_enabled), BoolExportStringCaller(g_brush_texturelock_enabled)); - GlobalPreferenceSystem().registerPreference("BrushSnapPlanes", makeBoolStringImportCallback(FaceImportSnapPlanesCaller()), makeBoolStringExportCallback(FaceExportSnapPlanesCaller())); - GlobalPreferenceSystem().registerPreference("TexdefDefaultScale", FloatImportStringCaller(g_texdef_default_scale), FloatExportStringCaller(g_texdef_default_scale)); - - GridStatus_getTextureLockEnabled = getTextureLockEnabled; - g_texture_lock_status_changed = FreeCaller(); -} - -void Brush_Destroy() -{ - Brush::m_maxWorldCoord = 0; - BrushInstance::m_counter = 0; +void Brush_switchFormat( bool switch_format ){ + if ( switch_format ) + { + g_useAlternativeTextureProjection.m_latched = g_useAlternativeTextureProjection.m_value; + g_useAlternativeTextureProjection.m_value = !g_useAlternativeTextureProjection.m_value; + PreferencesDialog_restartRequired( g_useAlternativeTextureProjection.m_description ); + PreferencesDialog_restartIfRequired(); + } +} + +void Brush_Construct( EBrushType type ){ + if ( type == eBrushTypeQuake3 ) { + g_showAlternativeTextureProjectionOption = true; + + const char *value = g_pGameDescription->getKeyValue( "brush_primit" ); + if ( !string_empty( value ) ) { + g_useAlternativeTextureProjection.m_latched = atoi( value ); + } + + GlobalPreferenceSystem().registerPreference( + "AlternativeTextureProjection", + make_property_string( g_useAlternativeTextureProjection.m_latched ) + ); + + g_useAlternativeTextureProjection.useLatched(); + + if ( g_useAlternativeTextureProjection.m_value ) { + type = eBrushTypeQuake3BP; + } - Brush::destroyStatic(); - BrushInstance::destroyStatic(); - BrushClipPlane::destroyStatic(); + // d1223m + GlobalPreferenceSystem().registerPreference( + "BrushAlwaysCaulk", + make_property_string( g_brush_always_caulk ) + ); + } + + Brush_registerCommands(); + Brush_registerPreferencesPage(); + + BrushFilters_construct(); + + BrushClipPlane::constructStatic(); + BrushInstance::constructStatic(); + Brush::constructStatic( type ); + + Brush::m_maxWorldCoord = g_MaxWorldCoord; + BrushInstance::m_counter = &g_brushCount; + + g_texdef_default_scale = 0.5f; + const char* value = g_pGameDescription->getKeyValue( "default_scale" ); + if ( !string_empty( value ) ) { + float scale = static_cast( atof( value ) ); + if ( scale != 0 ) { + g_texdef_default_scale = scale; + } + else + { + globalErrorStream() << "error parsing \"default_scale\" attribute\n"; + } + } + + GlobalPreferenceSystem().registerPreference( "TextureLock", make_property_string( g_brush_texturelock_enabled ) ); + GlobalPreferenceSystem().registerPreference("BrushSnapPlanes", make_property_string(Face::m_quantise)); + GlobalPreferenceSystem().registerPreference( "TexdefDefaultScale", make_property_string( g_texdef_default_scale ) ); + + GridStatus_getTextureLockEnabled = getTextureLockEnabled; + g_texture_lock_status_changed = makeCallbackF(GridStatus_onTextureLockEnabledChanged); } -void Brush_clipperColourChanged() -{ - BrushClipPlane::destroyStatic(); - BrushClipPlane::constructStatic(); +void Brush_Destroy(){ + Brush::m_maxWorldCoord = 0; + BrushInstance::m_counter = 0; + + Brush::destroyStatic(); + BrushInstance::destroyStatic(); + BrushClipPlane::destroyStatic(); } -void BrushFaceData_fromFace(const BrushFaceDataCallback& callback, Face& face) -{ - _QERFaceData faceData; - faceData.m_p0 = face.getPlane().planePoints()[0]; - faceData.m_p1 = face.getPlane().planePoints()[1]; - faceData.m_p2 = face.getPlane().planePoints()[2]; - faceData.m_shader = face.GetShader(); - faceData.m_texdef = face.getTexdef().m_projection.m_texdef; - faceData.contents = face.getShader().m_flags.m_contentFlags; - faceData.flags = face.getShader().m_flags.m_surfaceFlags; - faceData.value = face.getShader().m_flags.m_value; - callback(faceData); -} -typedef ConstReferenceCaller1 BrushFaceDataFromFaceCaller; -typedef Callback1 FaceCallback; +void Brush_clipperColourChanged(){ + BrushClipPlane::destroyStatic(); + BrushClipPlane::constructStatic(); +} + +void BrushFaceData_fromFace( const BrushFaceDataCallback& callback, Face& face ){ + _QERFaceData faceData; + faceData.m_p0 = face.getPlane().planePoints()[0]; + faceData.m_p1 = face.getPlane().planePoints()[1]; + faceData.m_p2 = face.getPlane().planePoints()[2]; + faceData.m_shader = face.GetShader(); + faceData.m_texdef = face.getTexdef().m_projection.m_texdef; + faceData.contents = face.getShader().m_flags.m_contentFlags; + faceData.flags = face.getShader().m_flags.m_surfaceFlags; + faceData.value = face.getShader().m_flags.m_value; + callback( faceData ); +} +typedef ConstReferenceCaller BrushFaceDataFromFaceCaller; +typedef Callback FaceCallback; class Quake3BrushCreator : public BrushCreator { public: - scene::Node& createBrush() - { - return (new BrushNode)->node(); - } - bool useAlternativeTextureProjection() const - { - return g_useAlternativeTextureProjection.m_value; - } - void Brush_forEachFace(scene::Node& brush, const BrushFaceDataCallback& callback) - { - ::Brush_forEachFace(*Node_getBrush(brush), FaceCallback(BrushFaceDataFromFaceCaller(callback))); - } - bool Brush_addFace(scene::Node& brush, const _QERFaceData& faceData) - { - Node_getBrush(brush)->undoSave(); - 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; - } +scene::Node& createBrush(){ + return ( new BrushNode )->node(); +} +bool useAlternativeTextureProjection() const { + return g_useAlternativeTextureProjection.m_value; +} +void Brush_forEachFace( scene::Node& brush, const BrushFaceDataCallback& callback ){ + ::Brush_forEachFace( *Node_getBrush( brush ), FaceCallback( BrushFaceDataFromFaceCaller( callback ) ) ); +} +bool Brush_addFace( scene::Node& brush, const _QERFaceData& faceData ){ + Node_getBrush( brush )->undoSave(); + 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; +} }; Quake3BrushCreator g_Quake3BrushCreator; -BrushCreator& GetBrushCreator() -{ - return g_Quake3BrushCreator; +BrushCreator& GetBrushCreator(){ + return g_Quake3BrushCreator; } #include "modulesystem/singletonmodule.h" @@ -242,179 +228,161 @@ BrushCreator& GetBrushCreator() class BrushDependencies : - public GlobalRadiantModuleRef, - public GlobalSceneGraphModuleRef, - public GlobalShaderCacheModuleRef, - public GlobalSelectionModuleRef, - public GlobalOpenGLModuleRef, - public GlobalUndoModuleRef, - public GlobalFilterModuleRef + public GlobalRadiantModuleRef, + public GlobalSceneGraphModuleRef, + public GlobalShaderCacheModuleRef, + public GlobalSelectionModuleRef, + public GlobalOpenGLModuleRef, + public GlobalUndoModuleRef, + public GlobalFilterModuleRef { }; class BrushDoom3API : public TypeSystemRef { - BrushCreator* m_brushdoom3; +BrushCreator* m_brushdoom3; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "doom3"); - - BrushDoom3API() - { - Brush_Construct(eBrushTypeDoom3); - - m_brushdoom3 = &GetBrushCreator(); - } - ~BrushDoom3API() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushdoom3; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "doom3" ); + +BrushDoom3API(){ + Brush_Construct( eBrushTypeDoom3 ); + + m_brushdoom3 = &GetBrushCreator(); +} +~BrushDoom3API(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushdoom3; +} }; typedef SingletonModule BrushDoom3Module; typedef Static StaticBrushDoom3Module; -StaticRegisterModule staticRegisterBrushDoom3(StaticBrushDoom3Module::instance()); +StaticRegisterModule staticRegisterBrushDoom3( StaticBrushDoom3Module::instance() ); class BrushQuake4API : public TypeSystemRef { - BrushCreator* m_brushquake4; +BrushCreator* m_brushquake4; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "quake4"); - - BrushQuake4API() - { - Brush_Construct(eBrushTypeQuake4); - - m_brushquake4 = &GetBrushCreator(); - } - ~BrushQuake4API() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushquake4; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "quake4" ); + +BrushQuake4API(){ + Brush_Construct( eBrushTypeQuake4 ); + + m_brushquake4 = &GetBrushCreator(); +} +~BrushQuake4API(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushquake4; +} }; typedef SingletonModule BrushQuake4Module; typedef Static StaticBrushQuake4Module; -StaticRegisterModule staticRegisterBrushQuake4(StaticBrushQuake4Module::instance()); +StaticRegisterModule staticRegisterBrushQuake4( StaticBrushQuake4Module::instance() ); class BrushQuake3API : public TypeSystemRef { - BrushCreator* m_brushquake3; +BrushCreator* m_brushquake3; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "quake3"); - - BrushQuake3API() - { - Brush_Construct(eBrushTypeQuake3); - - m_brushquake3 = &GetBrushCreator(); - } - ~BrushQuake3API() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushquake3; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "quake3" ); + +BrushQuake3API(){ + Brush_Construct( eBrushTypeQuake3 ); + + m_brushquake3 = &GetBrushCreator(); +} +~BrushQuake3API(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushquake3; +} }; typedef SingletonModule BrushQuake3Module; typedef Static StaticBrushQuake3Module; -StaticRegisterModule staticRegisterBrushQuake3(StaticBrushQuake3Module::instance()); +StaticRegisterModule staticRegisterBrushQuake3( StaticBrushQuake3Module::instance() ); class BrushQuake2API : public TypeSystemRef { - BrushCreator* m_brushquake2; +BrushCreator* m_brushquake2; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "quake2"); - - BrushQuake2API() - { - Brush_Construct(eBrushTypeQuake2); - - m_brushquake2 = &GetBrushCreator(); - } - ~BrushQuake2API() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushquake2; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "quake2" ); + +BrushQuake2API(){ + Brush_Construct( eBrushTypeQuake2 ); + + m_brushquake2 = &GetBrushCreator(); +} +~BrushQuake2API(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushquake2; +} }; typedef SingletonModule BrushQuake2Module; typedef Static StaticBrushQuake2Module; -StaticRegisterModule staticRegisterBrushQuake2(StaticBrushQuake2Module::instance()); +StaticRegisterModule staticRegisterBrushQuake2( StaticBrushQuake2Module::instance() ); class BrushQuake1API : public TypeSystemRef { - BrushCreator* m_brushquake1; +BrushCreator* m_brushquake1; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "quake"); - - BrushQuake1API() - { - Brush_Construct(eBrushTypeQuake); - - m_brushquake1 = &GetBrushCreator(); - } - ~BrushQuake1API() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushquake1; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "quake" ); + +BrushQuake1API(){ + Brush_Construct( eBrushTypeQuake ); + + m_brushquake1 = &GetBrushCreator(); +} +~BrushQuake1API(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushquake1; +} }; typedef SingletonModule BrushQuake1Module; typedef Static StaticBrushQuake1Module; -StaticRegisterModule staticRegisterBrushQuake1(StaticBrushQuake1Module::instance()); +StaticRegisterModule staticRegisterBrushQuake1( StaticBrushQuake1Module::instance() ); class BrushHalfLifeAPI : public TypeSystemRef { - BrushCreator* m_brushhalflife; +BrushCreator* m_brushhalflife; public: - typedef BrushCreator Type; - STRING_CONSTANT(Name, "halflife"); - - BrushHalfLifeAPI() - { - Brush_Construct(eBrushTypeHalfLife); - - m_brushhalflife = &GetBrushCreator(); - } - ~BrushHalfLifeAPI() - { - Brush_Destroy(); - } - BrushCreator* getTable() - { - return m_brushhalflife; - } +typedef BrushCreator Type; +STRING_CONSTANT( Name, "halflife" ); + +BrushHalfLifeAPI(){ + Brush_Construct( eBrushTypeHalfLife ); + + m_brushhalflife = &GetBrushCreator(); +} +~BrushHalfLifeAPI(){ + Brush_Destroy(); +} +BrushCreator* getTable(){ + return m_brushhalflife; +} }; typedef SingletonModule BrushHalfLifeModule; typedef Static StaticBrushHalfLifeModule; -StaticRegisterModule staticRegisterBrushHalfLife(StaticBrushHalfLifeModule::instance()); +StaticRegisterModule staticRegisterBrushHalfLife( StaticBrushHalfLifeModule::instance() );