テクスチャノード・プラグインによって、Maya のテクスチャ・ノードを作成することができます。
ここでは、2Dテクスチャの作成方法を解説します。
2Dテクスチャ・ノードを作成するときには、 最低限以下のアトリビュートを実装する必要があります。
UV座標が0.5以上の部分に色がつくというテクスチャノードを作成してみましょう。
import sys import maya.OpenMaya import maya.OpenMayaMPx kPluginNodeName = 'myTexture1' kPluginNodeId = maya.OpenMaya.MTypeId(0x87010) class myTexture1(maya.OpenMayaMPx.MPxNode): aUVCoord = maya.OpenMaya.MObject() aFilterSize = maya.OpenMaya.MObject() aInColor = maya.OpenMaya.MObject() aOutColor = maya.OpenMaya.MObject() def __init__(self): maya.OpenMayaMPx.MPxNode.__init__(self) def compute(self, plug, block): if plug == myTexture1.aOutColor or plug.parent() == myTexture1.aOutColor: resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0) uv = block.inputValue(myTexture1.aUVCoord).asFloat2(); inColor = block.inputValue(myTexture1.aInColor).asFloatVector() if uv[0] > 0.5 and uv[1] > 0.5: resultColor.x = inColor.x resultColor.y = inColor.y resultColor.z = inColor.z outColorHandle = block.outputValue(myTexture1.aOutColor) outColorHandle.setMFloatVector(resultColor) outColorHandle.setClean() else: return maya.OpenMaya.kUnknownParameter def nodeCreator(): return maya.OpenMayaMPx.asMPxPtr(myTexture1()) def nodeInitializer(): nAttr = maya.OpenMaya.MFnNumericAttribute() child1 = nAttr.create('uCoord', 'u', maya.OpenMaya.MFnNumericData.kFloat) child2 = nAttr.create('vCoord', 'v', maya.OpenMaya.MFnNumericData.kFloat) myTexture1.aUVCoord = nAttr.create("uvCoord", "uv", child1, child2) nAttr.setKeyable(True) nAttr.setStorable(True) nAttr.setReadable(True) nAttr.setWritable(True) child1 = nAttr.create("uvFilterSizeX", "fsx", maya.OpenMaya.MFnNumericData.kFloat) child2 = nAttr.create("uvFilterSizeY", "fsy", maya.OpenMaya.MFnNumericData.kFloat) myTexture1.aFilterSize = nAttr.create("uvFilterSize", "fs", child1, child2) nAttr.setKeyable(True) nAttr.setStorable(True) nAttr.setReadable(True) nAttr.setWritable(True) myTexture1.aInColor = nAttr.createColor('inColor', 'ic') nAttr.setStorable(True) nAttr.setReadable(True) nAttr.setWritable(True) nAttr.setDefault(1.0, 1.0, 1.0) myTexture1.aOutColor = nAttr.createColor('outColor', 'oc') nAttr.setStorable(False) nAttr.setHidden(False) nAttr.setReadable(True) nAttr.setWritable(False) myTexture1.addAttribute(myTexture1.aUVCoord) myTexture1.addAttribute(myTexture1.aFilterSize) myTexture1.addAttribute(myTexture1.aInColor) myTexture1.addAttribute(myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aUVCoord, myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aFilterSize, myTexture1.aOutColor) myTexture1.attributeAffects (myTexture1.aInColor, myTexture1.aOutColor) def initializePlugin(mobject): mplugin = maya.OpenMayaMPx.MFnPlugin(mobject) try: mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator, nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'texture/2d') except: sys.stderr.write('Failed to register node: %s' % kPluginNodeName) raise def uninitializePlugin(mobject): mplugin = maya.OpenMayaMPx.MFnPlugin(mobject) try: mplugin.deregisterNode(kPluginNodeId) except: sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName) raise
import sys
import maya.OpenMaya
import maya.OpenMayaMPx
kPluginNodeName = 'myTexture1'
kPluginNodeId = maya.OpenMaya.MTypeId(0x87010)
class myTexture1(maya.OpenMayaMPx.MPxNode):
aUVCoord = maya.OpenMaya.MObject()
aFilterSize = maya.OpenMaya.MObject()
aInColor = maya.OpenMaya.MObject()
aOutColor = maya.OpenMaya.MObject()
def __init__(self):
maya.OpenMayaMPx.MPxNode.__init__(self)
def compute(self, plug, block):
if plug == myTexture1.aOutColor or plug.parent() == myTexture1.aOutColor:
resultColor = maya.OpenMaya.MFloatVector(0.0, 0.0, 0.0)
uv = block.inputValue(myTexture1.aUVCoord).asFloat2();
inColor = block.inputValue(myTexture1.aInColor).asFloatVector()
if uv[0] > 0.5 and uv[1] > 0.5:
resultColor.x = inColor.x
resultColor.y = inColor.y
resultColor.z = inColor.z
outColorHandle = block.outputValue(myTexture1.aOutColor)
outColorHandle.setMFloatVector(resultColor)
outColorHandle.setClean()
else:
return maya.OpenMaya.kUnknownParameter
def nodeCreator():
return maya.OpenMayaMPx.asMPxPtr(myTexture1())
def nodeInitializer():
nAttr = maya.OpenMaya.MFnNumericAttribute()
child1 = nAttr.create('uCoord', 'u', maya.OpenMaya.MFnNumericData.kFloat)
child2 = nAttr.create('vCoord', 'v', maya.OpenMaya.MFnNumericData.kFloat)
myTexture1.aUVCoord = nAttr.create("uvCoord", "uv", child1, child2)
nAttr.setKeyable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setWritable(True)
child1 = nAttr.create("uvFilterSizeX", "fsx", maya.OpenMaya.MFnNumericData.kFloat)
child2 = nAttr.create("uvFilterSizeY", "fsy", maya.OpenMaya.MFnNumericData.kFloat)
myTexture1.aFilterSize = nAttr.create("uvFilterSize", "fs", child1, child2)
nAttr.setKeyable(True)
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setWritable(True)
myTexture1.aInColor = nAttr.createColor('inColor', 'ic')
nAttr.setStorable(True)
nAttr.setReadable(True)
nAttr.setWritable(True)
nAttr.setDefault(1.0, 1.0, 1.0)
myTexture1.aOutColor = nAttr.createColor('outColor', 'oc')
nAttr.setStorable(False)
nAttr.setHidden(False)
nAttr.setReadable(True)
nAttr.setWritable(False)
myTexture1.addAttribute(myTexture1.aUVCoord)
myTexture1.addAttribute(myTexture1.aFilterSize)
myTexture1.addAttribute(myTexture1.aInColor)
myTexture1.addAttribute(myTexture1.aOutColor)
myTexture1.attributeAffects (myTexture1.aUVCoord, myTexture1.aOutColor)
myTexture1.attributeAffects (myTexture1.aFilterSize, myTexture1.aOutColor)
myTexture1.attributeAffects (myTexture1.aInColor, myTexture1.aOutColor)
def initializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
try:
mplugin.registerNode(kPluginNodeName, kPluginNodeId, nodeCreator,
nodeInitializer, maya.OpenMayaMPx.MPxNode.kDependNode, 'texture/2d')
except:
sys.stderr.write('Failed to register node: %s' % kPluginNodeName)
raise
def uninitializePlugin(mobject):
mplugin = maya.OpenMayaMPx.MFnPlugin(mobject)
,,
try:
mplugin.deregisterNode( kPluginNodeId )
except:
sys.stderr.write('Failed to deregister node: %s' % kPluginNodeName)
raise