Skip to content

Commit

Permalink
#5585: Start exposing the IEditableShaderLayer interface
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Apr 11, 2021
1 parent 55078b8 commit 46c64db
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 1 deletion.
5 changes: 5 additions & 0 deletions install/scripts/materialtest.py
Expand Up @@ -81,6 +81,11 @@

print('Material has now {0} stages'.format(newMaterial.getNumStages()))

# Edit some stage parameters
editableDiffuseStage = newMaterial.getEditableStage(diffuseStageIndex)
editableDiffuseStage.setStageFlag(dr.MaterialStage.Flag.IGNORE_ALPHATEST)
editableDiffuseStage.clearStageFlag(dr.MaterialStage.Flag.FILTER_LINEAR)

for stage in newMaterial.getAllStages():
print('Stage type: {0}'.format(stage.getType()))
print('Stage map type: {0}'.format(stage.getMapType()))
Expand Down
7 changes: 7 additions & 0 deletions plugins/script/interfaces/ShaderSystemInterface.cpp
Expand Up @@ -82,6 +82,7 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa
// Add the declaration for a Material and Stage object
py::class_<ScriptMaterial> material(scope, "Material");
py::class_<ScriptMaterialStage> stage(scope, "MaterialStage");
py::class_<ScriptEditableMaterialStage, ScriptMaterialStage> editableStage(scope, "EditableMaterialStage");

// Add the old name as alias
scope.add_object("Shader", material);
Expand Down Expand Up @@ -284,6 +285,7 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa
material.def("getAllStages", &ScriptMaterial::getAllStages);
material.def("getNumStages", &ScriptMaterial::getNumStages);
material.def("getStage", &ScriptMaterial::getStage);
material.def("getEditableStage", &ScriptMaterial::getEditableStage);
material.def("addStage", &ScriptMaterial::addStage);
material.def("removeStage", &ScriptMaterial::removeStage);
material.def("duplicateStage", &ScriptMaterial::duplicateStage);
Expand Down Expand Up @@ -375,6 +377,11 @@ void ShaderSystemInterface::registerInterface(py::module& scope, py::dict& globa
stage.def("getFragmentMap", &ScriptMaterialStage::getFragmentMap);
stage.def("getPrivatePolygonOffset", &ScriptMaterialStage::getPrivatePolygonOffset);

// Stage edit interface
stage.def(py::init<const IEditableShaderLayer::Ptr&>());
editableStage.def("setStageFlag", &ScriptEditableMaterialStage::setStageFlag);
editableStage.def("clearStageFlag", &ScriptEditableMaterialStage::clearStageFlag);

// Expose the MaterialVisitor interface

py::class_<MaterialVisitor, MaterialVisitorWrapper> visitor(scope, "MaterialVisitor");
Expand Down
34 changes: 33 additions & 1 deletion plugins/script/interfaces/ShaderSystemInterface.h
Expand Up @@ -191,6 +191,30 @@ class ScriptMaterialStage
}
};

// Editable shader stage interface
class ScriptEditableMaterialStage :
public ScriptMaterialStage
{
private:
IEditableShaderLayer::Ptr _layer;

public:
ScriptEditableMaterialStage(const IEditableShaderLayer::Ptr& layer) :
ScriptMaterialStage(layer),
_layer(layer)
{}

void setStageFlag(IShaderLayer::Flags flag)
{
if (_layer) _layer->setStageFlag(flag);
}

void clearStageFlag(IShaderLayer::Flags flag)
{
if (_layer) _layer->clearStageFlag(flag);
}
};

/**
* This class represents a single Material as seen by the Python script.
*/
Expand Down Expand Up @@ -246,7 +270,7 @@ class ScriptMaterial
return _material ? _material->getAllLayers().size() : 0;
}

ScriptMaterialStage getStage(int index)
ScriptMaterialStage getStage(std::size_t index)
{
if (!_material) return ScriptMaterialStage(IShaderLayer::Ptr());

Expand All @@ -255,6 +279,14 @@ class ScriptMaterial
return ScriptMaterialStage(index >= 0 && index < layers.size() ? layers[index] : IShaderLayer::Ptr());
}

ScriptEditableMaterialStage getEditableStage(std::size_t index)
{
throwIfMaterialCannotBeModified();

return ScriptEditableMaterialStage(index >= 0 && index < getNumStages() ?
_material->getEditableLayer(index) : IEditableShaderLayer::Ptr());
}

std::size_t addStage(IShaderLayer::Type type)
{
throwIfMaterialCannotBeModified();
Expand Down

0 comments on commit 46c64db

Please sign in to comment.