68 import maya.OpenMaya
as OpenMaya
69 import maya.OpenMayaUI
as OpenMayaUI
70 import maya.OpenMayaMPx
as OpenMayaMPx
74 kSlopeShaderBehaviourName =
"slopeShaderBehaviour"
75 kSlopeNodeName =
"spSlopeShader"
76 kSlopeNodeClassify =
"utility/color"
80 class slopeShader(OpenMayaMPx.MPxNode):
91 OpenMayaMPx.MPxNode.__init__(self)
94 def compute(self, plug, dataBlock):
95 if plug == slopeShader.aOutColor
or plug.parent() == slopeShader.aOutColor:
100 dataHandle = dataBlock.inputValue( slopeShader.aColor1 )
102 sys.stderr.write(
"Failed to get inputValue aColor1" )
104 walkable = dataHandle.asFloatVector()
107 dataHandle = dataBlock.inputValue( slopeShader.aColor2 )
109 sys.stderr.write(
"Failed to get inputValue aColor2" )
111 nonWalkable = dataHandle.asFloatVector()
114 dataHandle = dataBlock.inputValue( slopeShader.aTriangleNormalCamera )
116 sys.stderr.write(
"Failed to get inputValue aTriangleNormalCamera" )
118 surfaceNormal = dataHandle.asFloatVector()
121 dataHandle = dataBlock.inputValue( slopeShader.aMatrixEyeToWorld )
123 sys.stderr.write(
"Failed to get inputValue aMatrixEyeToWorld" )
125 viewMatrix = dataHandle.asFloatMatrix()
129 dataHandle = dataBlock.inputValue( slopeShader.aAngle )
131 sys.stderr.write(
"Failed to get inputValue aAngle" )
133 angle = dataHandle.asFloat()
139 surfaceNormal.normalize()
140 WSVector = surfaceNormal * viewMatrix
144 scalarNormal = WSVector * yVector
148 if scalarNormal < 0.0:
151 radianAngle = math.radians(angle)
152 cosOfAngle = math.cos(radianAngle)
153 if cosOfAngle < scalarNormal:
154 resultColor = walkable
156 resultColor = nonWalkable
161 outColorHandle = dataBlock.outputValue( slopeShader.aOutColor )
163 sys.stderr.write(
"Failed to get outputValue aOutColor" )
166 outColorHandle.setMFloatVector(resultColor)
167 outColorHandle.setClean()
170 return OpenMaya.kUnknownParameter
173 def postConstructor(self):
174 print "In slopeShader.postConstructor"
178 class slopeShaderBehavior(OpenMayaMPx.MPxDragAndDropBehavior):
180 OpenMayaMPx.MPxDragAndDropBehavior.__init__(self)
183 def shouldBeUsedFor(self, sourceNode, destinationNode, sourcePlug, destinationPlug):
185 Overloaded function from MPxDragAndDropBehavior
186 this method will return True if it is going to handle the connection
187 between the two nodes given.
191 if sourceNode.hasFn(OpenMaya.MFn.kLambert):
199 src.getConnections(connections)
201 for i
in range(connections.length()):
205 connections[i].connectedTo(connectedPlugs,
True,
False)
206 for j
in range(connectedPlugs.length()):
212 if testNode.typeName() == kSlopeNodeName:
213 shaderNode = connectedPlugs[j].node()
219 if shaderNode
is not None:
224 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
229 if node.typeName() == kSlopeNodeName:
233 if destinationNode.hasFn(OpenMaya.MFn.kLambert):
235 elif destinationNode.hasFn(OpenMaya.MFn.kMesh):
241 def connectNodeToNode(self, sourceNode, destinationNode, force):
243 Overloaded function from MPxDragAndDropBehavior
244 this method will handle the connection between the slopeShader and the shader it is
245 assigned to as well as any meshes that it is assigned to.
252 if sourceNode.hasFn(OpenMaya.MFn.kLambert):
262 src.getConnections(connections)
263 for i
in range(connections.length()):
267 connections[i].connectedTo(connectedPlugs,
True,
False)
268 for j
in range(connectedPlugs.length()):
272 currentnode = connectedPlugs[j].node()
274 shaderNodes.append(currentnode)
280 if shaderNodes.length() > 0:
282 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
288 for i
in range(shaderNodes.length()):
289 srcPlug = dest.findPlug(
"worldMesh")
292 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
293 cmd =
"connectAttr -na %s %s" % (srcPlug.name(), destPlug.name())
294 OpenMaya.MGlobal.executeCommand(cmd)
299 shadingEngine = self._findShadingEngine(sourceNode)
304 if not shadingEngine.isNull():
305 cmd =
"sets -edit -forceElement %s %s" % (
309 OpenMaya.MGlobal.executeCommand(cmd)
311 elif src.typeName() == kSlopeNodeName:
315 if destinationNode.hasFn(OpenMaya.MFn.kMesh):
321 srcPlug = dest.findPlug(
"worldMesh")
322 destPlug = src.findPlug(
"dirtyShaderPlug")
323 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
324 cmd =
"connectAttr -na %s %s" % (srcPlug.name(), destPlug.name())
325 OpenMaya.MGlobal.executeCommand(cmd)
327 elif destinationNode.hasFn(OpenMaya.MFn.kLambert):
329 srcPlug = src.findPlug(
"outColor")
330 destPlug = dest.findPlug(
"color")
331 if (
not srcPlug.isNull())
and (
not destPlug.isNull()):
333 cmd =
"connectAttr -f %s %s" % (srcPlug.name(), destPlug.name())
335 cmd =
"connectAttr %s %s" % (srcPlug.name(), destPlug.name())
336 OpenMaya.MGlobal.executeCommand(cmd)
339 def connectNodeToAttr(self, sourceNode, destinationPlug, force):
341 Overloaded function from MPxDragAndDropBehavior
342 this method will assign the correct output from the slope shader
343 onto the given attribute.
351 if destinationPlug.node().hasFn(OpenMaya.MFn.kLambert):
352 if src.typeName() == kSlopeNodeName:
353 srcPlug = src.findPlug(
"outColor")
354 if (
not srcPlug.isNull())
and (
not destinationPlug.isNull()):
355 cmd =
"connectAttr %s %s" % (srcPlug.name(), destinationPlug.name())
356 OpenMaya.MGlobal.executeCommand(cmd)
361 destinationNode = destinationPlug.node()
362 self.connectNodeToNode(sourceNode, destinationNode, force)
365 def _findShadingEngine(self, node):
367 Given the material MObject this method will
368 return the shading group that it is assigned to.
369 if there is no shading group associated with
370 the material than a null MObject is passed back.
373 srcPlug = nodeFn.findPlug(
"outColor")
375 srcPlug.connectedTo(nodeConnections,
False,
True)
380 for i
in range(nodeConnections.length()):
381 theNode = nodeConnections[i].node()
382 if theNode.hasFn(OpenMaya.MFn.kShadingEngine):
395 return OpenMayaMPx.asMPxPtr(slopeShader())
398 def behaviourCreator():
399 return OpenMayaMPx.asMPxPtr(slopeShaderBehavior())
402 def nodeInitializer():
408 slopeShader.aAngle = nAttr.create(
"angle",
"ang", OpenMaya.MFnNumericData.kFloat )
409 nAttr.setDefault(30.0)
417 slopeShader.aColor1 = nAttr.createColor(
"walkableColor",
"w")
418 nAttr.setDefault(0.0, 1.0, 0.0)
421 nAttr.setUsedAsColor(1)
425 slopeShader.aColor2 = nAttr.createColor(
"nonWalkableColor",
"nw" )
426 nAttr.setDefault(1.0, 0.0, 0.0)
429 nAttr.setUsedAsColor(1)
435 slopeShader.aTriangleNormalCamera = nAttr.createPoint(
"triangleNormalCamera",
"n" )
443 slopeShader.aMatrixEyeToWorld = nMAttr.create(
"matrixEyeToWorld",
"mew", OpenMaya.MFnMatrixAttribute.kFloat )
445 nMAttr.setWritable(1)
449 slopeShader.aOutColor = nAttr.createColor(
"outColor",
"oc" )
459 slopeShader.aDirtyShaderAttr = nGAttr.create(
"dirtyShaderPlug",
"dsp")
462 nGAttr.setUsesArrayDataBuilder(1)
463 nGAttr.setReadable(0)
464 nGAttr.setStorable(1)
465 nGAttr.setIndexMatters(0)
470 slopeShader.addAttribute(slopeShader.aAngle)
471 slopeShader.addAttribute(slopeShader.aColor1)
472 slopeShader.addAttribute(slopeShader.aColor2)
473 slopeShader.addAttribute(slopeShader.aTriangleNormalCamera)
474 slopeShader.addAttribute(slopeShader.aOutColor)
475 slopeShader.addAttribute(slopeShader.aMatrixEyeToWorld)
476 slopeShader.addAttribute(slopeShader.aDirtyShaderAttr)
478 slopeShader.attributeAffects (slopeShader.aAngle, slopeShader.aOutColor)
479 slopeShader.attributeAffects (slopeShader.aColor1, slopeShader.aOutColor)
480 slopeShader.attributeAffects (slopeShader.aColor2, slopeShader.aOutColor)
481 slopeShader.attributeAffects (slopeShader.aTriangleNormalCamera, slopeShader.aOutColor)
482 slopeShader.attributeAffects (slopeShader.aDirtyShaderAttr, slopeShader.aOutColor)
486 def initializePlugin(mobject):
487 mplugin = OpenMayaMPx.MFnPlugin(mobject)
491 mplugin.registerNode(kSlopeNodeName, kSlopeNodeId, nodeCreator, nodeInitializer, OpenMayaMPx.MPxNode.kDependNode, kSlopeNodeClassify)
493 sys.stderr.write(
"Failed to register node: %s" % kSlopeNodeName )
498 mplugin.registerDragAndDropBehavior(kSlopeShaderBehaviourName, behaviourCreator)
500 sys.stderr.write(
"Failed to register behaviour: %s" % kSlopeShaderBehaviourName)
502 postCmd =
"if( `window -exists createRenderNodeWindow` ) {refreshCreateRenderNodeWindow(\"%s\");}\n" % kSlopeNodeClassify
503 OpenMaya.MGlobal.executeCommand(postCmd)
507 def uninitializePlugin(mobject):
508 mplugin = OpenMayaMPx.MFnPlugin(mobject,
"Autodesk",
"1.0",
"Any")
510 mplugin.deregisterNode(kSlopeNodeId)
512 sys.stderr.write(
"Failed to unregister node: %s" % kSlopeNodeName )
516 plugin.deregisterDragAndDropBehavior(kSlopeShaderBehaviourName)
518 sys.stderr.write(
"Failed to deregister behaviour: %s" % kSlopeShaderBehaviourName)
520 postCmd =
"if( `window -exists createRenderNodeWindow` ) {refreshCreateRenderNodeWindow(\"%s\");}\n" % kSlopeNodeClassify
521 OpenMaya.MGlobal.executeCommand(postCmd)