def appendShaders(menuDefinition, prefix="/Arnold"): with IECoreArnold.UniverseBlock(): it = arnold.AiUniverseGetNodeEntryIterator(arnold.AI_NODE_SHADER | arnold.AI_NODE_LIGHT) while not arnold.AiNodeEntryIteratorFinished(it): nodeEntry = arnold.AiNodeEntryIteratorGetNext(it) shaderName = arnold.AiNodeEntryGetName(nodeEntry) displayName = " ".join( [IECore.CamelCase.toSpaced(x) for x in shaderName.split("_")]) if arnold.AiNodeEntryGetType(nodeEntry) == arnold.AI_NODE_SHADER: menuPath = prefix + "/Shader/" + displayName nodeType = GafferArnold.ArnoldShader else: menuPath = prefix + "/Light/" + displayName nodeType = GafferArnold.ArnoldLight menuDefinition.append( menuPath, { "command": GafferUI.NodeMenu.nodeCreatorWrapper( IECore.curry(__shaderCreator, shaderName, nodeType)), }) arnold.AiNodeEntryIteratorDestroy(it) arnold.AiEnd()
def testSceneDescription(self): r = GafferScene.Private.IECoreScenePreview.Renderer.create( "IECoreArnold::Renderer", GafferScene.Private.IECoreScenePreview. Renderer.RenderType.SceneDescription, self.temporaryDirectory() + "/test.ass") o = r.object( "testPlane", IECore.MeshPrimitive.createPlane( IECore.Box2f(IECore.V2f(-1), IECore.V2f(1)))) o.transform(IECore.M44f().translate(IECore.V3f(1, 2, 3))) r.render() del r with IECoreArnold.UniverseBlock(): arnold.AiASSLoad(self.temporaryDirectory() + "/test.ass") n = arnold.AiNodeLookUpByName("testPlane") self.assertTrue( arnold.AiNodeEntryGetType(arnold.AiNodeGetNodeEntry(n)), arnold.AI_NODE_SHAPE)
def appendShaders(menuDefinition, prefix="/Arnold"): MenuItem = collections.namedtuple("MenuItem", ["menuPath", "nodeCreator"]) # Build a list of menu items we want to create. categorisedMenuItems = [] uncategorisedMenuItems = [] with IECoreArnold.UniverseBlock(writable=False): it = arnold.AiUniverseGetNodeEntryIterator(arnold.AI_NODE_SHADER | arnold.AI_NODE_LIGHT) while not arnold.AiNodeEntryIteratorFinished(it): nodeEntry = arnold.AiNodeEntryIteratorGetNext(it) shaderName = arnold.AiNodeEntryGetName(nodeEntry) displayName = " ".join( [IECore.CamelCase.toSpaced(x) for x in shaderName.split("_")]) category = __aiMetadataGetStr(nodeEntry, "", "gaffer.nodeMenu.category") if category == "": continue if arnold.AiNodeEntryGetType(nodeEntry) == arnold.AI_NODE_SHADER: menuPath = "Shader" if shaderName == "light_blocker": nodeCreator = functools.partial( __shaderCreator, shaderName, GafferArnold.ArnoldLightFilter) else: nodeCreator = functools.partial(__shaderCreator, shaderName, GafferArnold.ArnoldShader) else: menuPath = "Light" if shaderName != "mesh_light": nodeCreator = functools.partial(__shaderCreator, shaderName, GafferArnold.ArnoldLight) else: nodeCreator = GafferArnold.ArnoldMeshLight if category: menuPath += "/" + category.strip("/") menuPath += "/" + displayName if category: categorisedMenuItems.append(MenuItem(menuPath, nodeCreator)) else: uncategorisedMenuItems.append(MenuItem(menuPath, nodeCreator)) arnold.AiNodeEntryIteratorDestroy(it) # Tidy up uncategorised shaders into a submenu if necessary. rootsWithCategories = set( [m.menuPath.partition("/")[0] for m in categorisedMenuItems]) for i, menuItem in enumerate(uncategorisedMenuItems): s = menuItem.menuPath.split("/") if s[0] in rootsWithCategories: uncategorisedMenuItems[i] = MenuItem( "/".join([s[0], "Other", s[1]]), menuItem.nodeCreator) # Create the actual menu items. for menuItem in categorisedMenuItems + uncategorisedMenuItems: menuDefinition.append( prefix + "/" + menuItem.menuPath, { "command": GafferUI.NodeMenu.nodeCreatorWrapper(menuItem.nodeCreator), "searchText": "ai" + menuItem.menuPath.rpartition("/")[2].replace(" ", ""), })