Skip to content

Commit

Permalink
Add Python bindings for TargetDef and AttributeDef (#1241)
Browse files Browse the repository at this point in the history
- Add in AttributeDef Python interface
- Add in TargetDef Python interface
- Add in missing Python interfaces on Document and ShaderGenerator using these interface and metadata registration
  • Loading branch information
kwokcb committed Mar 24, 2023
1 parent 1373fce commit 4be7456
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 3 deletions.
39 changes: 38 additions & 1 deletion python/MaterialXTest/genshader.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,11 +45,19 @@ def test_ShaderInterface(self):
output.setNodeName("foo1");
output.setAttribute("output", "o");

# Test for target
targetDefs = doc.getTargetDefs()
self.assertTrue(len(targetDefs))
shadergen = mx_gen_osl.OslShaderGenerator.create()
target = shadergen.getTarget()
foundTarget = next((
t for t in targetDefs
if t.getName() == target), None)
self.assertTrue(foundTarget)
context = mx_gen_shader.GenContext(shadergen)
context.registerSourceCodeSearchPath(searchPath)

# Test complete mode
# Test generator with complete mode
context.getOptions().shaderInterfaceType = mx_gen_shader.ShaderInterfaceType.SHADER_INTERFACE_COMPLETE;
shader = shadergen.generate(exampleName, output, context);
self.assertTrue(shader)
Expand All @@ -68,6 +76,7 @@ def test_ShaderInterface(self):
file.close()
os.remove(shader.getName() + "_complete.osl");

# Test generator with reduced mode
context.getOptions().shaderInterfaceType = mx_gen_shader.ShaderInterfaceType.SHADER_INTERFACE_REDUCED;
shader = shadergen.generate(exampleName, output, context);
self.assertTrue(shader)
Expand All @@ -86,5 +95,33 @@ def test_ShaderInterface(self):
file.close()
os.remove(shader.getName() + "_reduced.osl");

# Define a custom attribute
customAttribute = doc.addAttributeDef("AD_attribute_node_name");
self.assertIsNotNone(customAttribute)
customAttribute.setType("string");
customAttribute.setAttrName("node_name");
customAttribute.setExportable(True);

# Define a nodedef referencing the custom attribute.
stdSurfNodeDef = doc.getNodeDef("ND_standard_surface_surfaceshader");
self.assertIsNotNone(stdSurfNodeDef)
stdSurfNodeDef.setAttribute("node_name", "Standard_Surface_Number_1");
self.assertTrue(stdSurfNodeDef.getAttribute("node_name") == "Standard_Surface_Number_1")
stdSurf1 = doc.addNodeInstance(stdSurfNodeDef, "standardSurface1");
self.assertIsNotNone(stdSurf1)

# Register shader metadata
shadergen.registerShaderMetadata(doc, context);

# Generate and test that attribute is in the code
context.getOptions().shaderInterfaceType = mx_gen_shader.ShaderInterfaceType.SHADER_INTERFACE_COMPLETE;
shader = shadergen.generate(stdSurf1.getName(), stdSurf1, context);
self.assertIsNotNone(shader)
code = shader.getSourceCode(mx_gen_shader.PIXEL_STAGE)
self.assertTrue('Standard_Surface_Number_1' in code)
self.assertTrue('node_name' in code)

print()

if __name__ == '__main__':
unittest.main()
15 changes: 15 additions & 0 deletions source/PyMaterialX/PyMaterialXCore/PyDefinition.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,19 @@ void bindPyDefinition(py::module& mod)
py::class_<mx::UnitTypeDef, mx::UnitTypeDefPtr, mx::Element>(mod, "UnitTypeDef")
.def("getUnitDefs", &mx::UnitTypeDef::getUnitDefs)
.def_readonly_static("CATEGORY", &mx::UnitTypeDef::CATEGORY);

py::class_<mx::AttributeDef, mx::AttributeDefPtr, mx::TypedElement>(mod, "AttributeDef")
.def("setAttrName", &mx::AttributeDef::setAttrName)
.def("hasAttrName", &mx::AttributeDef::hasAttrName)
.def("getAttrName", &mx::AttributeDef::getAttrName)
.def("setValueString", &mx::AttributeDef::setValueString)
.def("hasValueString", &mx::AttributeDef::hasValueString)
.def("getValueString", &mx::AttributeDef::getValueString)
.def("setExportable", &mx::AttributeDef::setExportable)
.def("getExportable", &mx::AttributeDef::getExportable)
.def_readonly_static("CATEGORY", &mx::AttributeDef::CATEGORY);

py::class_<mx::TargetDef, mx::TargetDefPtr, mx::TypedElement>(mod, "TargetDef")
.def("getMatchingTargets", &mx::TargetDef::getMatchingTargets)
.def_readonly_static("CATEGORY", &mx::TargetDef::CATEGORY);
}
10 changes: 9 additions & 1 deletion source/PyMaterialX/PyMaterialXCore/PyDocument.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,14 @@ void bindPyDocument(py::module& mod)
.def("getNodeDefs", &mx::Document::getNodeDefs)
.def("removeNodeDef", &mx::Document::removeNodeDef)
.def("getMatchingNodeDefs", &mx::Document::getMatchingNodeDefs)
.def("getMatchingImplementations", &mx::Document::getMatchingImplementations)
.def("addAttributeDef", &mx::Document::addAttributeDef)
.def("getAttributeDef", &mx::Document::getAttributeDef)
.def("getAttributeDefs", &mx::Document::getAttributeDefs)
.def("removeAttributeDef", &mx::Document::removeAttributeDef)
.def("addTargetDef", &mx::Document::addTargetDef)
.def("getTargetDef", &mx::Document::getTargetDef)
.def("getTargetDefs", &mx::Document::getTargetDefs)
.def("removeTargetDef", &mx::Document::removeTargetDef)
.def("addPropertySet", &mx::Document::addPropertySet,
py::arg("name") = mx::EMPTY_STRING)
.def("getPropertySet", &mx::Document::getPropertySet)
Expand All @@ -80,6 +87,7 @@ void bindPyDocument(py::module& mod)
.def("getImplementation", &mx::Document::getImplementation)
.def("getImplementations", &mx::Document::getImplementations)
.def("removeImplementation", &mx::Document::removeImplementation)
.def("getMatchingImplementations", &mx::Document::getMatchingImplementations)
.def("addUnitDef", &mx::Document::addUnitDef)
.def("getUnitDef", &mx::Document::getUnitDef)
.def("getUnitDefs", &mx::Document::getUnitDefs)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,7 @@ void bindPyShaderGenerator(py::module& mod)
.def("setColorManagementSystem", &mx::ShaderGenerator::setColorManagementSystem)
.def("getColorManagementSystem", &mx::ShaderGenerator::getColorManagementSystem)
.def("setUnitSystem", &mx::ShaderGenerator::setUnitSystem)
.def("getUnitSystem", &mx::ShaderGenerator::getUnitSystem);
.def("getUnitSystem", &mx::ShaderGenerator::getUnitSystem)
.def("getTokenSubstitutions", &mx::ShaderGenerator::getTokenSubstitutions)
.def("registerShaderMetadata", &mx::ShaderGenerator::registerShaderMetadata);
}

0 comments on commit 4be7456

Please sign in to comment.