X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Fbrushmodule.cpp;h=af5a240cc2d2926362a2b7f5df5135da80a0ee6f;hb=537bb25ca3ac99e6239fd7d6518a0dbb438969f1;hp=6b47e0926e6990d2ac228942b2165e2f5fbcddfd;hpb=107765f0e4b543dfc346851ee5b4605cc17eb1c6;p=xonotic%2Fnetradiant.git diff --git a/radiant/brushmodule.cpp b/radiant/brushmodule.cpp index 6b47e092..af5a240c 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,182 +34,207 @@ 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"); +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; + 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) +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", - LatchedBoolImportCaller(g_useAlternativeTextureProjection), - BoolExportCaller(g_useAlternativeTextureProjection.m_latched) + "", "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 ); - } - // d1223m - page.appendCheckBox("", - "Always use caulk for new brushes", - g_brush_always_caulk - ); } -void Brush_constructPage(PreferenceGroup& group) + +void Brush_constructPage(PreferenceGroup &group) { - PreferencesPage page(group.createPage("Brush", "Brush Settings")); - Brush_constructPreferences(page); + PreferencesPage page(group.createPage("Brush", "Brush Settings")); + Brush_constructPreferences(page); } + void Brush_registerPreferencesPage() { - PreferencesDialog_addSettingsPage(FreeCaller1()); + PreferencesDialog_addSettingsPage(makeCallbackF(Brush_constructPage)); } +void Brush_unlatchPreferences() +{ + Brush_toggleFormat(0); +} -void Brush_Construct(EBrushType type) +void Brush_toggleFormat(int i) { - if(type == eBrushTypeQuake3) - { - g_showAlternativeTextureProjectionOption = true; - - GlobalPreferenceSystem().registerPreference( - "AlternativeTextureProjection", - BoolImportStringCaller(g_useAlternativeTextureProjection.m_latched), - BoolExportStringCaller(g_useAlternativeTextureProjection.m_latched) - ); - g_useAlternativeTextureProjection.useLatched(); + if (g_showAlternativeTextureProjectionOption) { + g_useAlternativeTextureProjection.m_value = g_useAlternativeTextureProjection.m_latched ^ i; + Brush::destroyStatic(); + Brush::constructStatic(g_useAlternativeTextureProjection.m_value ? eBrushTypeQuake3BP : eBrushTypeQuake3); + } +} - if(g_useAlternativeTextureProjection.m_value) - { - type = eBrushTypeQuake3BP; +int Brush_toggleFormatCount() +{ + if (g_showAlternativeTextureProjectionOption) { + return 2; } - - // 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; + 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", + make_property_string(g_useAlternativeTextureProjection.m_latched) + ); + g_useAlternativeTextureProjection.useLatched(); + + if (g_useAlternativeTextureProjection.m_value) { + type = eBrushTypeQuake3BP; + } + + // d1223m + GlobalPreferenceSystem().registerPreference( + "BrushAlwaysCaulk", + make_property_string(g_brush_always_caulk) + ); } - else - { - globalErrorStream() << "error parsing \"default_scale\" attribute\n"; + + 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)); + 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 = FreeCaller(); + GridStatus_getTextureLockEnabled = getTextureLockEnabled; + g_texture_lock_status_changed = makeCallbackF(GridStatus_onTextureLockEnabledChanged); } void Brush_Destroy() { - Brush::m_maxWorldCoord = 0; - BrushInstance::m_counter = 0; + Brush::m_maxWorldCoord = 0; + BrushInstance::m_counter = 0; - Brush::destroyStatic(); - BrushInstance::destroyStatic(); - BrushClipPlane::destroyStatic(); + Brush::destroyStatic(); + BrushInstance::destroyStatic(); + BrushClipPlane::destroyStatic(); } void Brush_clipperColourChanged() { - BrushClipPlane::destroyStatic(); - BrushClipPlane::constructStatic(); + BrushClipPlane::destroyStatic(); + BrushClipPlane::constructStatic(); } -void BrushFaceData_fromFace(const BrushFaceDataCallback& callback, Face& face) +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); + _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; -class Quake3BrushCreator : public BrushCreator -{ +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() +BrushCreator &GetBrushCreator() { - return g_Quake3BrushCreator; + return g_Quake3BrushCreator; } #include "modulesystem/singletonmodule.h" @@ -217,37 +242,38 @@ 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; +class BrushDoom3API : public TypeSystemRef { + 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; @@ -255,27 +281,29 @@ typedef Static StaticBrushDoom3Module; StaticRegisterModule staticRegisterBrushDoom3(StaticBrushDoom3Module::instance()); -class BrushQuake4API : public TypeSystemRef -{ - BrushCreator* m_brushquake4; +class BrushQuake4API : public TypeSystemRef { + 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; @@ -283,27 +311,29 @@ typedef Static StaticBrushQuake4Module; StaticRegisterModule staticRegisterBrushQuake4(StaticBrushQuake4Module::instance()); -class BrushQuake3API : public TypeSystemRef -{ - BrushCreator* m_brushquake3; +class BrushQuake3API : public TypeSystemRef { + 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; @@ -311,27 +341,29 @@ typedef Static StaticBrushQuake3Module; StaticRegisterModule staticRegisterBrushQuake3(StaticBrushQuake3Module::instance()); -class BrushQuake2API : public TypeSystemRef -{ - BrushCreator* m_brushquake2; +class BrushQuake2API : public TypeSystemRef { + 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; @@ -339,27 +371,29 @@ typedef Static StaticBrushQuake2Module; StaticRegisterModule staticRegisterBrushQuake2(StaticBrushQuake2Module::instance()); -class BrushQuake1API : public TypeSystemRef -{ - BrushCreator* m_brushquake1; +class BrushQuake1API : public TypeSystemRef { + 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; @@ -367,27 +401,29 @@ typedef Static StaticBrushQuake1Module; StaticRegisterModule staticRegisterBrushQuake1(StaticBrushQuake1Module::instance()); -class BrushHalfLifeAPI : public TypeSystemRef -{ - BrushCreator* m_brushhalflife; +class BrushHalfLifeAPI : public TypeSystemRef { + 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;