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)