From 7ef0c652c36cb3425199a4b53b92199eb42c3038 Mon Sep 17 00:00:00 2001 From: codereader Date: Sun, 11 Apr 2021 15:59:54 +0200 Subject: [PATCH] #5585: Stage vertex parm exposed --- install/scripts/materialtest.py | 5 +++ .../interfaces/ShaderSystemInterface.cpp | 6 +++- .../script/interfaces/ShaderSystemInterface.h | 32 +++++++++++++++++-- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/install/scripts/materialtest.py b/install/scripts/materialtest.py index c5bfe901c3..263674a904 100644 --- a/install/scripts/materialtest.py +++ b/install/scripts/materialtest.py @@ -108,6 +108,11 @@ print('Stage transform expression1: {0}'.format(transform.expression1)) print('Stage transform expression2: {0}'.format(transform.expression2)) + for v in range(0, stage.getNumVertexParms()): + parm = stage.getVertexParm(v) + print('Stage Vertex Parm #{0}: {1}'.format(parm.index, ' '.join(parm.expressions))) + + newMaterial.swapStagePosition(diffuseStageIndex, bumpStageIndex) print("The new material has been modified" if newMaterial.isModified() else "The new material is not modified?") diff --git a/plugins/script/interfaces/ShaderSystemInterface.cpp b/plugins/script/interfaces/ShaderSystemInterface.cpp index 9f4764f40d..617024776f 100644 --- a/plugins/script/interfaces/ShaderSystemInterface.cpp +++ b/plugins/script/interfaces/ShaderSystemInterface.cpp @@ -338,11 +338,14 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa .export_values(); py::class_ stageTransform(stage, "Transformation"); - stageTransform.def_readwrite("type", &ScriptMaterialStage::Transformation::type); stageTransform.def_readwrite("expression1", &ScriptMaterialStage::Transformation::expression1); stageTransform.def_readwrite("expression2", &ScriptMaterialStage::Transformation::expression2); + py::class_ stageVertexParm(stage, "VertexParm"); + stageVertexParm.def_readwrite("index", &ScriptMaterialStage::VertexParm::index); + stageVertexParm.def_readwrite("expressions", &ScriptMaterialStage::VertexParm::expressions); + // Shader Stage stage.def(py::init()); stage.def("getType", &ScriptMaterialStage::getType); @@ -362,6 +365,7 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa stage.def("getFragmentProgram", &ScriptMaterialStage::getFragmentProgram); stage.def("getNumVertexParms", &ScriptMaterialStage::getNumVertexParms); stage.def("getNumFragmentMaps", &ScriptMaterialStage::getNumFragmentMaps); + stage.def("getVertexParm", &ScriptMaterialStage::getVertexParm); // Expose the MaterialVisitor interface diff --git a/plugins/script/interfaces/ShaderSystemInterface.h b/plugins/script/interfaces/ShaderSystemInterface.h index b29e748ed8..bdb1d7c70e 100644 --- a/plugins/script/interfaces/ShaderSystemInterface.h +++ b/plugins/script/interfaces/ShaderSystemInterface.h @@ -119,15 +119,43 @@ class ScriptMaterialStage return _layer ? _layer->getFragmentProgram() : std::string(); } - int getNumVertexParms() + std::size_t getNumVertexParms() { return _layer ? _layer->getNumVertexParms() : 0; } - int getNumFragmentMaps() + std::size_t getNumFragmentMaps() { return _layer ? _layer->getNumFragmentMaps() : 0; } + + struct VertexParm + { + std::size_t index; + std::vector expressions; + }; + + VertexParm getVertexParm(int index) + { + VertexParm parm; + + if (_layer && index >= 0 && index < 4) + { + const auto& vp = _layer->getVertexParm(index); + + parm.index = vp.index; + + for (auto i = 0; i < 4; ++i) + { + if (vp.expressions[i]) + { + parm.expressions.emplace_back(vp.expressions[i]->getExpressionString()); + } + } + } + + return parm; + } }; /**