From f2ca7a8d1ccd91f0dac99f2f93faa0d1f4be5cb2 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 11 Apr 2021 08:39:04 +0200 Subject: [PATCH] #5585: Expose Material sort request methods. Fix a typo in the C++ interface. --- include/ishaders.h | 2 +- install/scripts/materialtest.py | 8 +++++++ .../interfaces/ShaderSystemInterface.cpp | 21 +++++++++++++++++ .../script/interfaces/ShaderSystemInterface.h | 23 +++++++++++++++++++ .../ui/materials/editor/MaterialEditor.cpp | 2 +- radiantcore/shaders/CShader.cpp | 4 ++-- radiantcore/shaders/CShader.h | 2 +- radiantcore/shaders/ShaderTemplate.cpp | 2 +- radiantcore/shaders/ShaderTemplate.h | 2 +- 9 files changed, 59 insertions(+), 7 deletions(-) diff --git a/include/ishaders.h b/include/ishaders.h index 4663c5649e..9532efa899 100644 --- a/include/ishaders.h +++ b/include/ishaders.h @@ -224,7 +224,7 @@ class Material virtual void setSortRequest(float sortRequest) = 0; // Resets the sort request to the default value - virtual void resetSortReqest() = 0; + virtual void resetSortRequest() = 0; /// Return a polygon offset if one is defined. The default is 0. virtual float getPolygonOffset() const = 0; diff --git a/install/scripts/materialtest.py b/install/scripts/materialtest.py index cbd54a131c..b27bbb538c 100644 --- a/install/scripts/materialtest.py +++ b/install/scripts/materialtest.py @@ -1,4 +1,5 @@ import os +import darkradiant as dr # Some interface tests @@ -33,6 +34,13 @@ newMaterial.setShaderFileName(filename) newMaterial.setEditorImageExpressionFromString('textures/common/caulk') +newMaterial.setSortRequest(45.3) + +# There are a couple of pre-defined sort requests, corresponding to the engine code +newMaterial.setSortRequest(dr.Material.SortRequest.NEAREST) + +print('Full Material definition:\n{0}\n{{{1}}}'.format(newMaterial.getName(), newMaterial.getDefinition())) + GlobalMaterialManager.saveMaterial(newMaterial.getName()) fullPath = GlobalFileSystem.findFile(filename) + filename diff --git a/plugins/script/interfaces/ShaderSystemInterface.cpp b/plugins/script/interfaces/ShaderSystemInterface.cpp index 23b959761a..f93abf0165 100644 --- a/plugins/script/interfaces/ShaderSystemInterface.cpp +++ b/plugins/script/interfaces/ShaderSystemInterface.cpp @@ -84,6 +84,23 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa // Add the old name as alias scope.add_object("Shader", material); + // Expose the enums in the material scope + py::enum_(material, "SortRequest") + .value("SUBVIEW", Material::SORT_SUBVIEW) + .value("GUI", Material::SORT_GUI) + .value("BAD", Material::SORT_BAD) + .value("OPAQUE", Material::SORT_OPAQUE) + .value("PORTAL_SKY", Material::SORT_PORTAL_SKY) + .value("DECAL", Material::SORT_DECAL) + .value("FAR", Material::SORT_FAR) + .value("MEDIUM", Material::SORT_MEDIUM) + .value("CLOSE", Material::SORT_CLOSE) + .value("ALMOST_NEAREST", Material::SORT_ALMOST_NEAREST) + .value("NEAREST", Material::SORT_NEAREST) + .value("AFTER_FOG", Material::SORT_AFTER_FOG) + .value("POST_PROCESS", Material::SORT_POST_PROCESS) + .export_values(); + material.def(py::init()); material.def("getName", &ScriptMaterial::getName); material.def("getShaderFileName", &ScriptMaterial::getShaderFileName); @@ -97,6 +114,10 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa material.def("isNull", &ScriptMaterial::isNull); material.def("getEditorImageExpressionString", &ScriptMaterial::getEditorImageExpressionString); material.def("setEditorImageExpressionFromString", &ScriptMaterial::setEditorImageExpressionFromString); + material.def("getSortRequest", &ScriptMaterial::getSortRequest); + material.def("setSortRequest", static_cast(&ScriptMaterial::setSortRequest)); + material.def("setSortRequest", static_cast(&ScriptMaterial::setSortRequest)); + material.def("resetSortRequest", &ScriptMaterial::resetSortRequest); // Expose the MaterialVisitor interface diff --git a/plugins/script/interfaces/ShaderSystemInterface.h b/plugins/script/interfaces/ShaderSystemInterface.h index de0d6b806a..b60be37644 100644 --- a/plugins/script/interfaces/ShaderSystemInterface.h +++ b/plugins/script/interfaces/ShaderSystemInterface.h @@ -79,6 +79,29 @@ class ScriptMaterial _material->setEditorImageExpressionFromString(editorImagePath); } + float getSortRequest() + { + return _material ? _material->getSortRequest() : -1; + } + + void setSortRequest(float sortRequest) + { + throwIfMaterialCannotBeModified(); + if (_material) _material->setSortRequest(sortRequest); + } + + void setSortRequest(Material::SortRequest sortRequest) // overload needed for python + { + throwIfMaterialCannotBeModified(); + if (_material) _material->setSortRequest(static_cast(sortRequest)); + } + + void resetSortRequest() + { + throwIfMaterialCannotBeModified(); + if (_material) _material->resetSortRequest(); + } + private: void throwIfMaterialCannotBeModified() { diff --git a/radiant/ui/materials/editor/MaterialEditor.cpp b/radiant/ui/materials/editor/MaterialEditor.cpp index 4c20f6c7d9..3869fc2147 100644 --- a/radiant/ui/materials/editor/MaterialEditor.cpp +++ b/radiant/ui/materials/editor/MaterialEditor.cpp @@ -586,7 +586,7 @@ void MaterialEditor::setupMaterialProperties() { if (!value) { - material->resetSortReqest(); + material->resetSortRequest(); } else { diff --git a/radiantcore/shaders/CShader.cpp b/radiantcore/shaders/CShader.cpp index c6147c695c..feed34235d 100644 --- a/radiantcore/shaders/CShader.cpp +++ b/radiantcore/shaders/CShader.cpp @@ -58,10 +58,10 @@ void CShader::setSortRequest(float sortRequest) _template->setSortRequest(sortRequest); } -void CShader::resetSortReqest() +void CShader::resetSortRequest() { ensureTemplateCopy(); - _template->resetSortReqest(); + _template->resetSortRequest(); } float CShader::getPolygonOffset() const diff --git a/radiantcore/shaders/CShader.h b/radiantcore/shaders/CShader.h index e81261f353..4a4b4c7002 100644 --- a/radiantcore/shaders/CShader.h +++ b/radiantcore/shaders/CShader.h @@ -61,7 +61,7 @@ class CShader final : /* Material implementation */ float getSortRequest() const override; void setSortRequest(float sortRequest) override; - void resetSortReqest() override; + void resetSortRequest() override; float getPolygonOffset() const override; void setPolygonOffset(float offset) override; TexturePtr getEditorImage() override; diff --git a/radiantcore/shaders/ShaderTemplate.cpp b/radiantcore/shaders/ShaderTemplate.cpp index e4726bb3e4..c2cbf1847d 100644 --- a/radiantcore/shaders/ShaderTemplate.cpp +++ b/radiantcore/shaders/ShaderTemplate.cpp @@ -1252,7 +1252,7 @@ void ShaderTemplate::parseDefinition() // Some blend materials get SORT_MEDIUM applied by default, diffuses get OPAQUE assigned, but lights do not, etc. if (_sortReq == SORT_UNDEFINED) { - resetSortReqest(); + resetSortRequest(); } std::size_t numAmbientStages = 0; diff --git a/radiantcore/shaders/ShaderTemplate.h b/radiantcore/shaders/ShaderTemplate.h index daa3a9dcd4..907c4053e7 100644 --- a/radiantcore/shaders/ShaderTemplate.h +++ b/radiantcore/shaders/ShaderTemplate.h @@ -384,7 +384,7 @@ class ShaderTemplate final onTemplateChanged(); } - void resetSortReqest() + void resetSortRequest() { if (!_parsed) parseDefinition();