Python Usage Examples#

Load an MDL module and listing it’s materials#

Here is a simple but complete example of how to access the materials defined in a given MDL module. The INeuray and the ITransaction instances are provided by omni.mdl.neuraylib. All other functionalities of the MDL SDK bindings can be used independent of Omniverse.

import omni.mdl.pymdlsdk as pymdlsdk    # low-level MDL python binding that matches the native SDK
import omni.mdl.neuraylib               # interface the OV material backend

# acquire the neuraylib instance from OV
ov_neuraylib = omni.mdl.neuraylib.get_neuraylib()

# feed the neuray instance handle into the python binding
ov_neuray_handle = ov_neuraylib.getNeurayAPI()
neuray: pymdlsdk.INeuray = pymdlsdk.attach_ineuray(ov_neuray_handle)

# we need to load modules to Omniverse using the omni.mdl.neuraylib to allow proper tracking of loaded content,
# to enable reloads, and more Omniverse specific features
usd_identifier = "nvidia/support_definitions.mdl"
ov_module = ov_neuraylib.createMdlModule(usd_identifier)

if ov_module and ov_module.valid():
    # create a transaction after loading so we we can see the loaded module
    # we also request a handle from omni.mdl.neuraylib to initialize a pymdlsdk (Python Binding) transaction.
    ov_transaction_handle = ov_neuraylib.createReadingTransaction()
    transaction: pymdlsdk.ITransaction = pymdlsdk.attach_itransaction(ov_transaction_handle)

    # the MdlModule returned from omni.mdl.neuray provides the database name of the MDL module
    # after accessing it using a transaction, you have a IModule with all its MDL SDK functionality and API
    m: pymdlsdk.IModule = transaction.access_as(pymdlsdk.IModule, ovModule.dbName)

    # for example to access the containing material definitions:
    for i in range(m.get_material_count()):
        definition_db_name: str = m.get_material(i)
        definition: pymdlsdk.IFunction_definition = trans.access_as(pymdlsdk.IFunction_definition, definition_db_name)
        simple_name: str = definition.get_mdl_simple_name()
        print(f"found material: {simple_name}" )

    # MdlModules, MdlEntities, and MdlEntitySnapshots returned from omni.mdl.neuraylib need to be destroyed when not needed anymore
    ov_neuraylib.destroyMdlModule(ovModule)