def __enumPresetValues(param): presets = IECore.StringVectorData() enum = arnold.AiParamGetEnum(param) while True: preset = arnold.AiEnumGetString(enum, len(presets)) if not preset: break presets.append(preset) return presets
while not arnold.AiParamIteratorFinished( paramIt ) : ## \todo We could allow custom ui types to be specified using # arnold metadata entries. param = arnold.AiParamIteratorGetNext( paramIt ) paramName = arnold.AiParamGetName( param ) paramPath = nodeName + "." + paramName description = __aiMetadataGetStr( nodeEntry, paramName, "desc" ) if description is not None : __metadata[paramPath]["description"] = description paramType = arnold.AiParamGetType( param ) if paramType == arnold.AI_TYPE_ENUM : enum = arnold.AiParamGetEnum( param ) presets = IECore.StringVectorData() while True : preset = arnold.AiEnumGetString( enum, len( presets ) ) if not preset : break presets.append( preset ) __metadata[paramPath]["plugValueWidget:type"] = "GafferUI.PresetsPlugValueWidget" __metadata[paramPath]["presetNames"] = presets __metadata[paramPath]["presetValues"] = presets ########################################################################## # Gaffer Metadata queries. These are implemented using the preconstructed # registry above. ##########################################################################
def getParameterStr(paramType, paramValue=None, paramEntry=None): typeStr = '' valueStr = '' optionsStr = '' if paramType == ai.AI_TYPE_BYTE: typeStr = 'uchar' if paramValue: valueStr = str(paramValue.contents.BYTE) elif paramType == ai.AI_TYPE_INT: typeStr = 'int' if paramValue: valueStr = str(paramValue.contents.INT) elif paramType == ai.AI_TYPE_UINT: typeStr = 'uint' if paramValue: valueStr = str(paramValue.contents.UINT) elif paramType == ai.AI_TYPE_BOOLEAN: typeStr = 'bool' if paramValue: valueStr = 'true' if paramValue.contents.BOOL else 'false' elif paramType == ai.AI_TYPE_FLOAT: typeStr = 'float' if paramValue: valueStr = str(paramValue.contents.FLT) elif paramType == ai.AI_TYPE_RGB: typeStr = 'color3f' if paramValue: rgbVal = paramValue.contents.RGB valueStr = '({},{},{})'.format(str(rgbVal.r), str(rgbVal.g), str(rgbVal.b)) elif paramType == ai.AI_TYPE_RGBA: typeStr = 'color4f' if paramValue: rgbaVal = paramValue.contents.RGBA valueStr = '({},{},{},{})'.format(str(rgbaVal.r), str(rgbaVal.g), str(rgbaVal.b), str(rgbaVal.a)) elif paramType == ai.AI_TYPE_VECTOR: typeStr = 'vector3f' # vector3f if paramValue: vecVal = paramValue.contents.VEC valueStr = '({},{},{})'.format(str(vecVal.x), str(vecVal.y), str(vecVal.z)) elif paramType == ai.AI_TYPE_VECTOR2: typeStr = 'float2' if paramValue: vec2Val = paramValue.contents.VEC2 valueStr = '({},{})'.format(str(vec2Val.x), str(vec2Val.y)) elif paramType == ai.AI_TYPE_STRING: typeStr = 'string' if paramValue: strVal = str(paramValue.contents.STR) valueStr = '"{}"'.format(str(strVal)) elif paramType == ai.AI_TYPE_NODE: typeStr = 'string' strVal = '' valueStr = '""' # FIXME: matrix parameter is an array elif paramType == ai.AI_TYPE_MATRIX: typeStr = 'matrix4d' if paramValue: if paramValue.contents.pMTX is None: return '', '', '' mtxVal = paramValue.contents.pMTX[0] valueStr = '(({},{},{},{}),({},{},{},{}),({},{},{},{}),({},{},{},{}))'.format(mtxVal[0][0], mtxVal[0][1], mtxVal[0][2], mtxVal[0][3], mtxVal[1][0],\ mtxVal[1][1],mtxVal[1][2],mtxVal[1][3],\ mtxVal[2][0], mtxVal[2][1], mtxVal[2][2],\ mtxVal[2][3], mtxVal[3][0],mtxVal[3][1],\ mtxVal[3][2],mtxVal[3][3]) elif paramType == ai.AI_TYPE_ENUM: typeStr = 'token' paramEnum = ai.AiParamGetEnum(paramEntry) if paramValue: intVal = paramValue.contents.INT strVal = str(ai.AiEnumGetString(paramEnum, intVal)) # FIXME we still have a problem with parameter "auto" as it creates a token that can't be parsed properly in the generated file tokens.h if strVal == 'auto': strVal = 'metric_auto' if strVal == 'linux': strVal = 'os_linux' valueStr = '"{}"'.format(strVal) optionsStr = '\n allowedTokens = [' i = 0 while True: t = ai.AiEnumGetString(paramEnum, i) if t is None: break if t == 'auto': t = "metric_auto" if t == 'linux': t = "os_linux" if i > 0: optionsStr += ',' optionsStr += '"{}"'.format(t) i += 1 optionsStr += ']' elif paramType == ai.AI_TYPE_CLOSURE: # shouldn't be needed since closures are just for shaders typeStr = 'color4f' valueStr = '(0,0,0,0)' return typeStr, valueStr, optionsStr
def __translateNodeMetadata(nodeEntry): nodeName = arnold.AiNodeEntryGetName(nodeEntry) # Shader description. We support Arnold-style "desc" and # OSL style "help". description = __aiMetadataGetStr(nodeEntry, None, "desc", defaultValue=__aiMetadataGetStr( nodeEntry, None, "help")) if description is not None: __metadata[nodeName]["description"] = description # Documentation URL. We support OSL-style "URL" url = __aiMetadataGetStr(nodeEntry, None, "URL") if url is not None: __metadata[nodeName]["documentation:url"] = url havePages = False paramIt = arnold.AiNodeEntryGetParamIterator(nodeEntry) while not arnold.AiParamIteratorFinished(paramIt): ## \todo We could allow custom ui types to be specified using # arnold metadata entries. param = arnold.AiParamIteratorGetNext(paramIt) paramName = arnold.AiParamGetName(param) paramPath = nodeName + ".parameters." + paramName # Parameter description description = __aiMetadataGetStr(nodeEntry, paramName, "desc") if description is not None: __metadata[paramPath]["description"] = description # Parameter presets from enum values paramType = arnold.AiParamGetType(param) if paramType == arnold.AI_TYPE_ENUM: enum = arnold.AiParamGetEnum(param) presets = IECore.StringVectorData() while True: preset = arnold.AiEnumGetString(enum, len(presets)) if not preset: break presets.append(preset) __metadata[paramPath][ "plugValueWidget:type"] = "GafferUI.PresetsPlugValueWidget" __metadata[paramPath]["presetNames"] = presets __metadata[paramPath]["presetValues"] = presets # Nodule type from linkable metadata and parameter type linkable = __aiMetadataGetBool( nodeEntry, paramName, "linkable", defaultValue=paramType not in (arnold.AI_TYPE_BYTE, arnold.AI_TYPE_INT, arnold.AI_TYPE_UINT, arnold.AI_TYPE_BOOLEAN, arnold.AI_TYPE_ENUM, arnold.AI_TYPE_STRING)) __metadata[paramPath][ "nodule:type"] = "GafferUI::StandardNodule" if linkable else "" # PlugValueWidget type from OSL "widget" widget = None widget = __aiMetadataGetStr(nodeEntry, paramName, "widget", widget) if widget is not None: __metadata[paramPath]["plugValueWidget:type"] = { "number": "GafferUI.NumericPlugValueWidget", "string": "GafferUI.StringPlugValueWidget", "boolean": "GafferUI.BoolPlugValueWidget", "checkBox": "GafferUI.BoolPlugValueWidget", "popup": "GafferUI.PresetsPlugValueWidget", "mapper": "GafferUI.PresetsPlugValueWidget", "filename": "GafferUI.PathPlugValueWidget", "null": "", }[widget] # Layout section from OSL "page". page = __aiMetadataGetStr(nodeEntry, paramName, "page") if page is not None: havePages = True __metadata[paramPath]["layout:section"] = page # Label from OSL "label" label = __aiMetadataGetStr(nodeEntry, paramName, "label") if label is not None: __metadata[paramPath]["label"] = label elif "_" in paramName: # Label from Arnold naming convention # Arnold uses snake_case rather than camelCase for naming, so translate this into # nice looking names __metadata[paramPath]["label"] = " ".join( [i.capitalize() for i in paramName.split("_")]) # NodeGraph visibility from Gaffer-specific metadata visible = __aiMetadataGetBool( nodeEntry, None, "gaffer.nodeGraphLayout.defaultVisibility") visible = __aiMetadataGetBool(nodeEntry, paramName, "gaffer.nodeGraphLayout.visible", visible) if visible is not None: __metadata[paramPath]["noduleLayout:visible"] = visible
def __translateNodeMetadata( nodeEntry ) : nodeName = arnold.AiNodeEntryGetName( nodeEntry ) # Shader description. We support Arnold-style "desc" and # OSL style "help". description = __aiMetadataGetStr( nodeEntry, None, "desc", defaultValue = __aiMetadataGetStr( nodeEntry, None, "help" ) ) if description is not None : __metadata[nodeName]["description"] = description # Documentation URL. We support OSL-style "URL" and # Houdini-style "help_url". url = __aiMetadataGetStr( nodeEntry, None, "URL", defaultValue = __aiMetadataGetStr( nodeEntry, None, "houdini.help_url" ) ) if url is not None : __metadata[nodeName]["documentation:url"] = url havePages = False paramIt = arnold.AiNodeEntryGetParamIterator( nodeEntry ) while not arnold.AiParamIteratorFinished( paramIt ) : ## \todo We could allow custom ui types to be specified using # arnold metadata entries. param = arnold.AiParamIteratorGetNext( paramIt ) paramName = arnold.AiParamGetName( param ) paramPath = nodeName + ".parameters." + paramName # Parameter description description = __aiMetadataGetStr( nodeEntry, paramName, "desc" ) if description is not None : __metadata[paramPath]["description"] = description # Parameter presets from enum values paramType = arnold.AiParamGetType( param ) if paramType == arnold.AI_TYPE_ENUM : enum = arnold.AiParamGetEnum( param ) presets = IECore.StringVectorData() while True : preset = arnold.AiEnumGetString( enum, len( presets ) ) if not preset : break presets.append( preset ) __metadata[paramPath]["plugValueWidget:type"] = "GafferUI.PresetsPlugValueWidget" __metadata[paramPath]["presetNames"] = presets __metadata[paramPath]["presetValues"] = presets # Nodule type from linkable metadata and parameter type linkable = __aiMetadataGetBool( nodeEntry, paramName, "linkable", defaultValue = paramType not in ( arnold.AI_TYPE_BYTE, arnold.AI_TYPE_INT, arnold.AI_TYPE_UINT, arnold.AI_TYPE_BOOLEAN, arnold.AI_TYPE_ENUM, arnold.AI_TYPE_STRING ) ) __metadata[paramPath]["nodule:type"] = "GafferUI::StandardNodule" if linkable else "" # PlugValueWidget type from OSL "widget" or "houdini.type". widget = None if __aiMetadataGetStr( nodeEntry, paramName, "houdini.type" ) == "file:image" : widget = "filename" widget = __aiMetadataGetStr( nodeEntry, paramName, "widget", widget ) if widget is not None : __metadata[paramPath]["plugValueWidget:type"] = { "number" : "GafferUI.NumericPlugValueWidget", "string" : "GafferUI.StringPlugValueWidget", "boolean" : "GafferUI.BoolPlugValueWidget", "checkBox" : "GafferUI.BoolPlugValueWidget", "popup" : "GafferUI.PresetsPlugValueWidget", "mapper" : "GafferUI.PresetsPlugValueWidget", "filename" : "GafferUI.PathPlugValueWidget", "null" : "", }[widget] # Layout section from OSL "page". page = __aiMetadataGetStr( nodeEntry, paramName, "page" ) if page is not None : havePages = True __metadata[paramPath]["layout:section"] = page # Label from OSL "label" or "houdini.label". label = __aiMetadataGetStr( nodeEntry, paramName, "houdini.label" ) label = __aiMetadataGetStr( nodeEntry, paramName, "label", label ) if label is not None : __metadata[paramPath]["label"] = label # NodeGraph visibility from Gaffer-specific metadata visible = __aiMetadataGetBool( nodeEntry, None, "gaffer.nodeGraphLayout.defaultVisibility" ) visible = __aiMetadataGetBool( nodeEntry, paramName, "gaffer.nodeGraphLayout.visible", visible ) if visible is not None : __metadata[paramPath]["noduleLayout:visible"] = visible # If we haven't seen any nice sane OSL "page" metadata, then have # a go at translating the houdini layout metadata. Surely one of the # most tortured ways of defining a UI ever. if not havePages : __translateHoudiniLayout( nodeEntry )
def __translateNodeMetadata(nodeEntry): nodeName = arnold.AiNodeEntryGetName(nodeEntry) # Shader description. We support Arnold-style "desc" and # OSL style "help". description = __aiMetadataGetStr(nodeEntry, None, "desc", defaultValue=__aiMetadataGetStr( nodeEntry, None, "help")) if description is not None: __metadata[nodeName]["description"] = description # Documentation URL. We support OSL-style "URL" url = __aiMetadataGetStr(nodeEntry, None, "URL") if url is not None: __metadata[nodeName]["documentation:url"] = url paramIt = arnold.AiNodeEntryGetParamIterator(nodeEntry) while not arnold.AiParamIteratorFinished(paramIt): ## \todo We could allow custom ui types to be specified using # arnold metadata entries. param = arnold.AiParamIteratorGetNext(paramIt) paramName = arnold.AiParamGetName(param) paramPath = nodeName + ".parameters." + paramName # Parameter description description = __aiMetadataGetStr(nodeEntry, paramName, "desc") if description is not None: __metadata[paramPath]["description"] = description # Parameter presets from enum values paramType = arnold.AiParamGetType(param) if paramType == arnold.AI_TYPE_ENUM: enum = arnold.AiParamGetEnum(param) presets = IECore.StringVectorData() while True: preset = arnold.AiEnumGetString(enum, len(presets)) if not preset: break presets.append(preset) __metadata[paramPath][ "plugValueWidget:type"] = "GafferUI.PresetsPlugValueWidget" __metadata[paramPath]["presetNames"] = presets __metadata[paramPath]["presetValues"] = presets # Nodule type from linkable metadata and parameter type linkable = __aiMetadataGetBool( nodeEntry, paramName, "linkable", defaultValue=paramType not in (arnold.AI_TYPE_BYTE, arnold.AI_TYPE_INT, arnold.AI_TYPE_UINT, arnold.AI_TYPE_BOOLEAN, arnold.AI_TYPE_ENUM, arnold.AI_TYPE_STRING)) __metadata[paramPath]["nodule:type"] = None if linkable else "" # PlugValueWidget type from OSL "widget" widget = None widget = __aiMetadataGetStr(nodeEntry, paramName, "widget", widget) if widget is not None: __metadata[paramPath]["plugValueWidget:type"] = { "number": "GafferUI.NumericPlugValueWidget", "string": "GafferUI.StringPlugValueWidget", "boolean": "GafferUI.BoolPlugValueWidget", "checkBox": "GafferUI.BoolPlugValueWidget", "popup": "GafferUI.PresetsPlugValueWidget", "mapper": "GafferUI.PresetsPlugValueWidget", "filename": "GafferUI.PathPlugValueWidget", "null": "", }[widget] # Layout section from OSL "page". page = __aiMetadataGetStr(nodeEntry, paramName, "page") if page is not None: __metadata[paramPath]["layout:section"] = page # Uncollapse sections if desired collapsed = __aiMetadataGetBool( nodeEntry, None, "gaffer.layout.section.%s.collapsed" % page) if collapsed == False: parent = paramPath.rsplit('.', 1)[0] __metadata[parent]["layout:section:%s:collapsed" % page] = collapsed # Label from OSL "label" label = __aiMetadataGetStr(nodeEntry, paramName, "label") if label is None: # Label from Arnold naming convention # Arnold uses snake_case rather than camelCase for naming, so translate this into # nice looking names label = " ".join([i.capitalize() for i in paramName.split("_")]) __metadata[paramPath]["label"] = label __metadata[paramPath]["noduleLayout:label"] = label childComponents = { arnold.AI_TYPE_VECTOR2: "xy", arnold.AI_TYPE_VECTOR: "xyz", arnold.AI_TYPE_RGB: "rgb", arnold.AI_TYPE_RGBA: "rgba", }.get(paramType) if childComponents is not None: for c in childComponents: __metadata["{}.{}".format( paramPath, c)]["noduleLayout:label"] = "{}.{}".format(label, c) # GraphEditor visibility from Gaffer-specific metadata visible = __aiMetadataGetBool( nodeEntry, None, "gaffer.graphEditorLayout.defaultVisibility") visible = __aiMetadataGetBool(nodeEntry, paramName, "gaffer.graphEditorLayout.visible", visible) if visible is not None: __metadata[paramPath]["noduleLayout:visible"] = visible userDefault = None if paramType in [ arnold.AI_TYPE_BYTE, arnold.AI_TYPE_INT, arnold.AI_TYPE_UINT ]: userDefault = __aiMetadataGetInt(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_BOOLEAN: userDefault = __aiMetadataGetBool(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_FLOAT: userDefault = __aiMetadataGetFlt(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_RGB: userDefault = __aiMetadataGetRGB(nodeEntry, paramName, "gaffer.userDefault") #elif paramType == arnold.AI_TYPE_RGBA: # userDefault = __aiMetadataGetRGBA( nodeEntry, paramName, "gaffer.userDefault" ) elif paramType == arnold.AI_TYPE_VECTOR: userDefault = __aiMetadataGetVec(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_VECTOR2: userDefault = __aiMetadataGetVec2(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_STRING: userDefault = __aiMetadataGetStr(nodeEntry, paramName, "gaffer.userDefault") elif paramType == arnold.AI_TYPE_ENUM: userDefault = __aiMetadataGetStr(nodeEntry, paramName, "gaffer.userDefault") if userDefault: __metadata[paramPath]["userDefault"] = userDefault