47 import maya.OpenMaya
as OpenMaya
48 import maya.OpenMayaUI
as OpenMayaUI
49 import maya.OpenMayaMPx
as OpenMayaMPx
53 kSlopeShaderBehaviourName =
"slopeShaderBehaviour"
54 kSlopeNodeName =
"spSlopeShader"
55 kSlopeNodeClassify =
"utility/color"
56 kSlopeNodeId = OpenMaya.MTypeId(0x87001)
59 class slopeShader(OpenMayaMPx.MPxNode):
61 aAngle = OpenMaya.MObject()
62 aColor1 = OpenMaya.MObject()
63 aColor2 = OpenMaya.MObject()
64 aTriangleNormalCamera = OpenMaya.MObject()
65 aOutColor = OpenMaya.MObject()
66 aMatrixEyeToWorld = OpenMaya.MObject()
67 aDirtyShaderAttr = OpenMaya.MObject()
70 OpenMayaMPx.MPxNode.__init__(self)
73 def compute(self, plug, dataBlock):
74 if plug == slopeShader.aOutColor
or plug.parent() == slopeShader.aOutColor:
76 resultColor = OpenMaya.MFloatVector(0.0,0.0,0.0)
79 dataHandle = dataBlock.inputValue( slopeShader.aColor1 )
81 sys.stderr.write(
"Failed to get inputValue aColor1" )
83 walkable = dataHandle.asFloatVector()
86 dataHandle = dataBlock.inputValue( slopeShader.aColor2 )
88 sys.stderr.write(
"Failed to get inputValue aColor2" )
90 nonWalkable = dataHandle.asFloatVector()
93 dataHandle = dataBlock.inputValue( slopeShader.aTriangleNormalCamera )
95 sys.stderr.write(
"Failed to get inputValue aTriangleNormalCamera" )
97 surfaceNormal = dataHandle.asFloatVector()
100 dataHandle = dataBlock.inputValue( slopeShader.aMatrixEyeToWorld )
102 sys.stderr.write(
"Failed to get inputValue aMatrixEyeToWorld" )
104 viewMatrix = dataHandle.asFloatMatrix()
108 dataHandle = dataBlock.inputValue( slopeShader.aAngle )
110 sys.stderr.write(
"Failed to get inputValue aAngle" )
112 angle = dataHandle.asFloat()
114 yVector = OpenMaya.MFloatVector(0, 1, 0)
118 surfaceNormal.normalize()
119 WSVector = surfaceNormal * viewMatrix
123 scalarNormal = WSVector * yVector
127 if scalarNormal < 0.0:
130 radianAngle = math.radians(angle)
131 cosOfAngle = math.cos(radianAngle)
132 if cosOfAngle < scalarNormal:
133 resultColor = walkable
135 resultColor = nonWalkable
140 outColorHandle = dataBlock.outputValue( slopeShader.aOutColor )
142 sys.stderr.write(
"Failed to get outputValue aOutColor" )
145 outColorHandle.setMFloatVector(resultColor)
146 outColorHandle.setClean()
149 return OpenMaya.kUnknownParameter
152 def postConstructor(self):
153 print "In slopeShader.postConstructor"
157 class slopeShaderBehavior(OpenMayaMPx.MPxDragAndDropBehavior):
159 OpenMayaMPx.MPxDragAndDropBehavior.__init__(self)
162 def shouldBeUsedFor(self, sourceNode, destinationNode, sourcePlug, destinationPlug):
164 Overloaded function from MPxDragAndDropBehavior
165 this method will return True if it is going to handle the connection
166 between the two nodes given.
170 if sourceNode.hasFn(OpenMaya.MFn.kLambert):
176 src = OpenMaya.MFnDependencyNode(sourceNode)
177 connections = OpenMaya.MPlugArray()
178 src.getConnections(connections)
180 for i
in range(connections.length()):
183 connectedPlugs = OpenMaya.MPlugArray()
184 connections[i].connectedTo(connectedPlugs,
True,
False)
185 for j
in range(connectedPlugs.length()):
190 testNode = OpenMaya.MFnDependencyNode(connectedPlugs[j].node())
191 if testNode.typeName() == kSlopeNodeName:
192 shaderNode = connectedPlugs[j].node()
198 if shaderNode
is not None:
203 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
207 node = OpenMaya.MFnDependencyNode(sourceNode)
208 if node.typeName() == kSlopeNodeName:
212 if destinationNode.hasFn(OpenMaya.MFn.kLambert):
214 elif destinationNode.hasFn(OpenMaya.MFn.kMesh):
220 def connectNodeToNode(self, sourceNode, destinationNode, force):
222 Overloaded function from MPxDragAndDropBehavior
223 this method will handle the connection between the slopeShader and the shader it is
224 assigned to as well as any meshes that it is assigned to.
226 src = OpenMaya.MFnDependencyNode(sourceNode)
231 if sourceNode.hasFn(OpenMaya.MFn.kLambert):
232 shaderNode = OpenMaya.MObject()
233 connections = OpenMaya.MPlugArray()
234 shaderNodes = OpenMaya.MObjectArray()
241 src.getConnections(connections)
242 for i
in range(connections.length()):
245 connectedPlugs = OpenMaya.MPlugArray()
246 connections[i].connectedTo(connectedPlugs,
True,
False)
247 for j
in range(connectedPlugs.length()):
251 currentnode = connectedPlugs[j].node()
252 if OpenMaya.MFnDependencyNode(currentnode).typeName() == kSlopeNodeName:
253 shaderNodes.append(currentnode)
259 if shaderNodes.length() > 0:
260 dest = OpenMaya.MFnDependencyNode(destinationNode)
261 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
267 for i
in range(shaderNodes.length()):
268 srcPlug = dest.findPlug(
"worldMesh")
269 destPlug = OpenMaya.MFnDependencyNode(shaderNodes[i]).findPlug(
"dirtyShaderPlug")
271 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
272 cmd =
"connectAttr -na %s %s" % (srcPlug.name(), destPlug.name())
273 OpenMaya.MGlobal.executeCommand(cmd)
278 shadingEngine = self._findShadingEngine(sourceNode)
283 if not shadingEngine.isNull():
284 cmd =
"sets -edit -forceElement %s %s" % (
285 OpenMaya.MFnDependencyNode(shadingEngine).name(),
286 OpenMaya.MFnDagNode(destinationNode).partialPathName()
288 OpenMaya.MGlobal.executeCommand(cmd)
290 elif src.typeName() == kSlopeNodeName:
294 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
299 dest = OpenMaya.MFnDependencyNode(destinationNode)
300 srcPlug = dest.findPlug(
"worldMesh")
301 destPlug = src.findPlug(
"dirtyShaderPlug")
302 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
303 cmd =
"connectAttr -na %s %s" % (srcPlug.name(), destPlug.name())
304 OpenMaya.MGlobal.executeCommand(cmd)
306 elif destinationNode.hasFn(OpenMaya.MFn.kLambert):
307 dest = OpenMaya.MFnDependencyNode(destinationNode)
308 srcPlug = src.findPlug(
"outColor")
309 destPlug = dest.findPlug(
"color")
310 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
312 cmd =
"connectAttr -f %s %s" % (srcPlug.name(), destPlug.name())
314 cmd =
"connectAttr %s %s" % (srcPlug.name(), destPlug.name())
315 OpenMaya.MGlobal.executeCommand(cmd)
318 def connectNodeToAttr(self, sourceNode, destinationPlug, force):
320 Overloaded function from MPxDragAndDropBehavior
321 this method will assign the correct output from the slope shader
322 onto the given attribute.
324 src = OpenMaya.MFnDependencyNode(sourceNode)
330 if destinationPlug.node().hasFn(OpenMaya.MFn.kLambert):
331 if src.typeName() == kSlopeNodeName:
332 srcPlug = src.findPlug(
"outColor")
333 if (
not srcPlug.isNull())
and (
not destinationPlug.isNull()):
334 cmd =
"connectAttr %s %s" % (srcPlug.name(), destinationPlug.name())
335 OpenMaya.MGlobal.executeCommand(cmd)
340 destinationNode = destinationPlug.node()
341 self.connectNodeToNode(sourceNode, destinationNode, force)
344 def _findShadingEngine(self, node):
346 Given the material MObject this method will
347 return the shading group that it is assigned to.
348 if there is no shading group associated with
349 the material than a null MObject is passed back.
351 nodeFn = OpenMaya.MFnDependencyNode (node)
352 srcPlug = nodeFn.findPlug(
"outColor")
353 nodeConnections = OpenMaya.MPlugArray()
354 srcPlug.connectedTo(nodeConnections,
False,
True)
359 for i
in range(nodeConnections.length()):
360 theNode = nodeConnections[i].node()
361 if theNode.hasFn(OpenMaya.MFn.kShadingEngine):
367 return OpenMaya.MObject()
374 return OpenMayaMPx.asMPxPtr(slopeShader())
377 def behaviourCreator():
378 return OpenMayaMPx.asMPxPtr(slopeShaderBehavior())
381 def nodeInitializer():
382 nAttr = OpenMaya.MFnNumericAttribute()
383 nMAttr = OpenMaya.MFnMatrixAttribute()
384 nTAttr = OpenMaya.MFnTypedAttribute()
385 nGAttr = OpenMaya.MFnGenericAttribute()
387 slopeShader.aAngle = nAttr.create(
"angle",
"ang", OpenMaya.MFnNumericData.kFloat )
388 nAttr.setDefault(30.0)
396 slopeShader.aColor1 = nAttr.createColor(
"walkableColor",
"w")
397 nAttr.setDefault(0.0, 1.0, 0.0)
400 nAttr.setUsedAsColor(1)
404 slopeShader.aColor2 = nAttr.createColor(
"nonWalkableColor",
"nw" )
405 nAttr.setDefault(1.0, 0.0, 0.0)
408 nAttr.setUsedAsColor(1)
414 slopeShader.aTriangleNormalCamera = nAttr.createPoint(
"triangleNormalCamera",
"n" )
422 slopeShader.aMatrixEyeToWorld = nMAttr.create(
"matrixEyeToWorld",
"mew", OpenMaya.MFnMatrixAttribute.kFloat )
424 nMAttr.setWritable(1)
428 slopeShader.aOutColor = nAttr.createColor(
"outColor",
"oc" )
434 meshTypeId = OpenMaya.MTypeId(OpenMaya.MFnData.kMesh)
438 slopeShader.aDirtyShaderAttr = nGAttr.create(
"dirtyShaderPlug",
"dsp")
441 nGAttr.setUsesArrayDataBuilder(1)
442 nGAttr.setReadable(0)
443 nGAttr.setStorable(1)
444 nGAttr.setIndexMatters(0)
449 slopeShader.addAttribute(slopeShader.aAngle)
450 slopeShader.addAttribute(slopeShader.aColor1)
451 slopeShader.addAttribute(slopeShader.aColor2)
452 slopeShader.addAttribute(slopeShader.aTriangleNormalCamera)
453 slopeShader.addAttribute(slopeShader.aOutColor)
454 slopeShader.addAttribute(slopeShader.aMatrixEyeToWorld)
455 slopeShader.addAttribute(slopeShader.aDirtyShaderAttr)
457 slopeShader.attributeAffects (slopeShader.aAngle, slopeShader.aOutColor)
458 slopeShader.attributeAffects (slopeShader.aColor1, slopeShader.aOutColor)
459 slopeShader.attributeAffects (slopeShader.aColor2, slopeShader.aOutColor)
460 slopeShader.attributeAffects (slopeShader.aTriangleNormalCamera, slopeShader.aOutColor)
461 slopeShader.attributeAffects (slopeShader.aDirtyShaderAttr, slopeShader.aOutColor)
465 def initializePlugin(mobject):
466 mplugin = OpenMayaMPx.MFnPlugin(mobject)
470 mplugin.registerNode(kSlopeNodeName, kSlopeNodeId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kDependNode, kSlopeNodeClassify)
472 sys.stderr.write(
"Failed to register node: %s" % kSlopeNodeName )
477 mplugin.registerDragAndDropBehavior(kSlopeShaderBehaviourName, behaviourCreator)
479 sys.stderr.write(
"Failed to register behaviour: %s" % kSlopeShaderBehaviourName)
481 postCmd =
"if( `window -exists createRenderNodeWindow` ) {refreshCreateRenderNodeWindow(\"%s\");}\n" % kSlopeNodeClassify
482 OpenMaya.MGlobal.executeCommand(postCmd)
486 def uninitializePlugin(mobject):
487 mplugin = OpenMayaMPx.MFnPlugin(mobject,
"Autodesk",
"1.0",
"Any")
489 mplugin.deregisterNode(kSlopeNodeId)
491 sys.stderr.write(
"Failed to unregister node: %s" % kSlopeNodeName )
495 plugin.deregisterDragAndDropBehavior(kSlopeShaderBehaviourName)
497 sys.stderr.write(
"Failed to deregister behaviour: %s" % kSlopeShaderBehaviourName)
499 postCmd =
"if( `window -exists createRenderNodeWindow` ) {refreshCreateRenderNodeWindow(\"%s\");}\n" % kSlopeNodeClassify
500 OpenMaya.MGlobal.executeCommand(postCmd)