Forum: Poser Python Scripting


Subject: Something more about Poser Materials

adp001 opened this issue on Apr 04, 2021 ยท 3 posts


adp001 posted Mon, 05 April 2021 at 1:03 AM

Update: Set the correct render engine in Shadertree.

def copy_material(source_material, target_material, clean=True):
    assert isinstance(source_material, poser.MaterialType)
    assert isinstance(target_material, poser.MaterialType)

    target_layer_names = [l.Name() for l in target_material.Layers()]

    for source_idx, source_layer in enumerate(source_material.Layers()):
        if source_layer.Name() not in target_layer_names:
            target_material.CreateLayer(source_layer.Name())
            target_layer_names = [l.Name() for l in target_material.Layers()]
        target_idx = target_layer_names.index(source_layer.Name())
        source_tree = source_material.LayerShaderTree(source_idx)
        target_tree = target_material.LayerShaderTree(target_idx)
        if clean:
            for node in target_tree.Nodes():
                if not node.Type() in "PoserSurface CyclesSurface":
                    node.Delete()

        copy_shadertree(source_tree, target_tree)

        for renderengine in (poser.kRenderEngineCodeFIREFLY,
                             poser.kRenderEngineCodeSUPERFLY,
                             poser.kRenderEngineCodePOSER4):
            root_node = source_tree.RendererRootNode(renderengine)
            if root_node:
                troot = target_tree.NodeByInternalName(root_node.InternalName())
                target_tree.SetRendererRootNode(renderengine, troot)