1 from __future__
import division
13 import maya.api.OpenMaya
as om
14 import maya.api.OpenMayaRender
as omr
27 The presence of this function tells Maya that the plugin produces, and
28 expects to be passed, objects created using the Maya Python API 2.0.
35 class depthCheckerboardShader(om.MPxNode):
37 id = om.MTypeId( 0x81167 )
53 return depthCheckerboardShader()
57 nAttr = om.MFnNumericAttribute()
61 depthCheckerboardShader.aColorNear = nAttr.createColor(
"color",
"c")
66 nAttr.default = (0.0, 1.0, 0.0)
69 depthCheckerboardShader.aColorFar = nAttr.createColor(
"colorFar",
"cf")
74 nAttr.default = (0.0, 0.0, 1.0)
76 depthCheckerboardShader.aNear = nAttr.create(
"near",
"n", om.MFnNumericData.kFloat)
82 nAttr.setSoftMax(1000.0)
84 depthCheckerboardShader.aFar = nAttr.create(
"far",
"f", om.MFnNumericData.kFloat)
90 nAttr.setSoftMax(1000.0)
93 depthCheckerboardShader.aScale = nAttr.create(
"scale",
"sc", om.MFnNumericData.kFloat)
99 nAttr.setSoftMax(1000.0)
102 child1 = nAttr.create(
"uCoord",
"u", om.MFnNumericData.kFloat)
103 child2 = nAttr.create( "vCoord",
"v", om.MFnNumericData.kFloat)
104 depthCheckerboardShader.aUVCoord = nAttr.create(
"uvCoord",
"uv", child1, child2)
106 nAttr.storable =
True
107 nAttr.readable =
True
108 nAttr.writable =
True
111 depthCheckerboardShader.aPointCamera = nAttr.createPoint(
"pointCamera",
"p")
113 nAttr.storable =
True
114 nAttr.readable =
True
115 nAttr.writable =
True
119 depthCheckerboardShader.aOutColor = nAttr.createColor(
"outColor",
"oc")
120 nAttr.keyable =
False
121 nAttr.storable =
False
122 nAttr.readable =
True
123 nAttr.writable =
False
125 om.MPxNode.addAttribute(depthCheckerboardShader.aColorNear)
126 om.MPxNode.addAttribute(depthCheckerboardShader.aColorFar)
127 om.MPxNode.addAttribute(depthCheckerboardShader.aNear)
128 om.MPxNode.addAttribute(depthCheckerboardShader.aFar)
129 om.MPxNode.addAttribute(depthCheckerboardShader.aScale)
130 om.MPxNode.addAttribute(depthCheckerboardShader.aUVCoord)
131 om.MPxNode.addAttribute(depthCheckerboardShader.aPointCamera)
132 om.MPxNode.addAttribute(depthCheckerboardShader.aOutColor)
134 om.MPxNode.attributeAffects(depthCheckerboardShader.aColorNear, depthCheckerboardShader.aOutColor)
135 om.MPxNode.attributeAffects(depthCheckerboardShader.aColorFar, depthCheckerboardShader.aOutColor)
136 om.MPxNode.attributeAffects(depthCheckerboardShader.aNear, depthCheckerboardShader.aOutColor)
137 om.MPxNode.attributeAffects(depthCheckerboardShader.aFar, depthCheckerboardShader.aOutColor)
138 om.MPxNode.attributeAffects(depthCheckerboardShader.aScale, depthCheckerboardShader.aOutColor)
139 om.MPxNode.attributeAffects(depthCheckerboardShader.aUVCoord, depthCheckerboardShader.aOutColor)
140 om.MPxNode.attributeAffects(depthCheckerboardShader.aPointCamera, depthCheckerboardShader.aOutColor)
143 om.MPxNode.__init__(self)
145 def compute(self, plug, block):
147 if (plug != depthCheckerboardShader.aOutColor)
and (plug.parent() != depthCheckerboardShader.aOutColor):
151 pCamera = block.inputValue(depthCheckerboardShader.aPointCamera).asFloatVector()
152 cNear = block.inputValue(depthCheckerboardShader.aColorNear).asFloatVector()
153 cFar = block.inputValue(depthCheckerboardShader.aColorFar).asFloatVector()
154 nearClip = block.inputValue(depthCheckerboardShader.aNear).asFloat()
155 farClip = block.inputValue(depthCheckerboardShader.aFar).asFloat()
156 scale = block.inputValue(depthCheckerboardShader.aScale).asFloat()
157 uv = block.inputValue(depthCheckerboardShader.aUVCoord).asFloat2()
161 dist = farClip - nearClip
163 ratio = (farClip + pCamera.z) / dist
164 resultColor = cNear * ratio + cFar*(1.0 - ratio)
167 fractUVx = (uv[0] * scale) % 1
168 fractUVy = (uv[1] * scale) % 1
169 if (fractUVx > 0.5) == (fractUVy > 0.5):
170 resultColor = om.MFloatVector(0.0,0.0,0.0)
173 outColorHandle = block.outputValue( depthCheckerboardShader.aOutColor )
174 outColorHandle.setMFloatVector( resultColor )
175 outColorHandle.setClean()
180 def postConstructor(self):
186 class depthCheckerboardShaderOverride(omr.MPxSurfaceShadingNodeOverride):
189 return depthCheckerboardShaderOverride(obj)
191 def __init__(self, obj):
192 omr.MPxSurfaceShadingNodeOverride.__init__(self, obj)
195 fragmentMgr = omr.MRenderer.getFragmentManager()
196 if fragmentMgr !=
None:
197 if not fragmentMgr.hasFragment(
"depthCheckerboardShaderPluginFragmentTextured"):
198 fragmentBody = textwrap.dedent(
"""
199 <fragment uiName=\"depthCheckerboardShaderPluginFragmentTextured\" name=\"depthCheckerboardShaderPluginFragmentTextured\" type=\"plumbing\" class=\"ShadeFragment\" version=\"1.0\">
200 <description><![CDATA[Depth shader fragment]]></description>
202 <float name=\"depthValue\" />
203 <float3 name=\"color\" />
204 <float3 name=\"colorFar\" />
205 <float name=\"near\" />
206 <float name=\"far\" />
207 <float name=\"scale\" />
208 <float2 name=\"uvCoord\" semantic=\"mayaUvCoordSemantic\" flags=\"varyingInputParam\" />
211 <float name=\"depthValue\" value=\"0.0\" />
212 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
213 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
214 <float name=\"near\" value=\"0.0\" />
215 <float name=\"far\" value=\"2.0\" />
216 <float name=\"scale\" value=\"2.0\" />
219 <float3 name=\"outColor\" />
222 <implementation render=\"OGSRenderer\" language=\"Cg\" lang_version=\"2.1\">
223 <function_name val=\"depthCheckerboardShaderPluginFragmentTextured\" />
225 float3 depthCheckerboardShaderPluginFragmentTextured(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip, float scale, float2 uvCoord) \n
227 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
228 float2 scaledUV = uvCoord * scale; \n
229 float3 outColor = cNear*ratio + cFar*(1.0f - ratio); \n
230 if ((frac(scaledUV.x) > 0.5) == (frac(scaledUV.y) > 0.5)) { \n
231 outColor = float3(1.0, 0.0, 0.0); \n
237 <implementation render=\"OGSRenderer\" language=\"HLSL\" lang_version=\"11.0\">
238 <function_name val=\"depthCheckerboardShaderPluginFragmentTextured\" />
240 float3 depthCheckerboardShaderPluginFragmentTextured(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip, float scale, float2 uvCoord) \n
242 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
243 float2 scaledUV = uvCoord * scale; \n
244 float3 outColor = cNear*ratio + cFar*(1.0f - ratio); \n
245 if ((frac(scaledUV.x) > 0.5) == (frac(scaledUV.y) > 0.5)) { \n
246 outColor = float3(1.0, 0.0, 0.0); \n
252 <implementation render=\"OGSRenderer\" language=\"GLSL\" lang_version=\"3.0\">
253 <function_name val=\"depthCheckerboardShaderPluginFragmentTextured\" />
255 vec3 depthCheckerboardShaderPluginFragmentTextured(float depthValue, vec3 cNear, vec3 cFar, float nearClip, float farClip, float scale, vec2 uvCoord) \n
257 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
258 vec2 scaledUV = uvCoord * scale; \n
259 vec3 outColor = cNear*ratio + cFar*(1.0f - ratio); \n
260 if ((fract(scaledUV.x) > 0.5) == (fract(scaledUV.y) > 0.5)) { \n
261 outColor = vec3(1.0, 0.0, 0.0); \n
270 fragmentMgr.addShadeFragmentFromBuffer(fragmentBody.encode(
'utf-8'),
False)
272 if not fragmentMgr.hasFragment(
"depthCheckerboardShaderPluginFragmentUntextured"):
273 fragmentBody = textwrap.dedent(
"""
274 <fragment uiName=\"depthCheckerboardShaderPluginFragmentUntextured\" name=\"depthCheckerboardShaderPluginFragmentUntextured\" type=\"plumbing\" class=\"ShadeFragment\" version=\"1.0\">
275 <description><![CDATA[Depth shader fragment]]></description>
277 <float name=\"depthValue\" />
278 <float3 name=\"color\" />
279 <float3 name=\"colorFar\" />
280 <float name=\"near\" />
281 <float name=\"far\" />
284 <float name=\"depthValue\" value=\"0.0\" />
285 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
286 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
287 <float name=\"near\" value=\"0.0\" />
288 <float name=\"far\" value=\"2.0\" />
291 <float3 name=\"outColor\" />
294 <implementation render=\"OGSRenderer\" language=\"Cg\" lang_version=\"2.1\">
295 <function_name val=\"depthCheckerboardShaderPluginFragmentUntextured\" />
297 float3 depthCheckerboardShaderPluginFragmentUntextured(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip) \n
299 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
300 return cNear*ratio + cFar*(1.0f - ratio); \n
304 <implementation render=\"OGSRenderer\" language=\"HLSL\" lang_version=\"11.0\">
305 <function_name val=\"depthCheckerboardShaderPluginFragmentUntextured\" />
307 float3 depthCheckerboardShaderPluginFragmentUntextured(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip) \n
309 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
310 return cNear*ratio + cFar*(1.0f - ratio); \n
314 <implementation render=\"OGSRenderer\" language=\"GLSL\" lang_version=\"3.0\">
315 <function_name val=\"depthCheckerboardShaderPluginFragmentUntextured\" />
317 vec3 depthCheckerboardShaderPluginFragmentUntextured(float depthValue, vec3 cNear, vec3 cFar, float nearClip, float farClip) \n
319 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
320 return cNear*ratio + cFar*(1.0f - ratio); \n
327 fragmentMgr.addShadeFragmentFromBuffer(fragmentBody.encode(
'utf-8'),
False)
329 if not fragmentMgr.hasFragment(
"depthCheckerboardShaderPluginInterpolantFragment"):
330 vertexFragmentBody = textwrap.dedent(
"""
331 <fragment uiName=\"depthCheckerboardShaderPluginInterpolantFragment\" name=\"depthCheckerboardShaderPluginInterpolantFragment\" type=\"interpolant\" class=\"ShadeFragment\" version=\"1.0\">
332 <description><![CDATA[Depth shader vertex fragment]]></description>
334 <float3 name=\"Pm\" semantic=\"Pm\" flags=\"varyingInputParam\" />
335 <float4x4 name=\"worldViewProj\" semantic=\"worldviewprojection\" />
340 <float name=\"outDepthValue\" ^1s/>
343 <implementation render=\"OGSRenderer\" language=\"Cg\" lang_version=\"2.1\">
344 <function_name val=\"depthCheckerboardShaderPluginInterpolantFragment\" />
346 float depthCheckerboardShaderPluginInterpolantFragment(float depthValue) \n
348 return depthValue; \n
351 <vertex_source><![CDATA[
352 float idepthCheckerboardShaderPluginInterpolantFragment(float3 Pm, float4x4 worldViewProj) \n
354 float4 pCamera = mul(worldViewProj, float4(Pm, 1.0f)); \n
355 return (pCamera.z - pCamera.w*2.0f); \n
359 <implementation render=\"OGSRenderer\" language=\"HLSL\" lang_version=\"11.0\">
360 <function_name val=\"depthCheckerboardShaderPluginInterpolantFragment\" />
362 float depthCheckerboardShaderPluginInterpolantFragment(float depthValue) \n
364 return depthValue; \n
367 <vertex_source><![CDATA[
368 float idepthCheckerboardShaderPluginInterpolantFragment(float3 Pm, float4x4 worldViewProj) \n
370 float4 pCamera = mul(float4(Pm, 1.0f), worldViewProj); \n
371 return (pCamera.z - pCamera.w*2.0f); \n
375 <implementation render=\"OGSRenderer\" language=\"GLSL\" lang_version=\"3.0\">
376 <function_name val=\"depthCheckerboardShaderPluginInterpolantFragment\" />
378 float depthCheckerboardShaderPluginInterpolantFragment(float depthValue) \n
380 return depthValue; \n
383 <vertex_source><![CDATA[
384 float idepthCheckerboardShaderPluginInterpolantFragment(vec3 Pm, mat4 worldViewProj) \n
386 vec4 pCamera = worldViewProj * vec4(Pm, 1.0f); \n
387 return (pCamera.z - pCamera.w*2.0f); \n
395 if omr.MRenderer.drawAPI() == omr.MRenderer.kDirectX11:
396 vertexFragmentBody = vertexFragmentBody.replace(
"^1s",
"semantic=\"extraDepth\" ")
398 vertexFragmentBody = vertexFragmentBody.replace(
"^1s",
" ")
400 fragmentMgr.addShadeFragmentFromBuffer(vertexFragmentBody.encode(
'utf-8'),
False)
402 if not fragmentMgr.hasFragment(
"depthCheckerboardShaderPluginGraphTextured"):
403 fragmentGraphBody = textwrap.dedent(
"""
404 <fragment_graph name=\"depthCheckerboardShaderPluginGraphTextured\" ref=\"depthCheckerboardShaderPluginGraphTextured\" class=\"FragmentGraph\" version=\"1.0\">
406 <fragment_ref name=\"depthCheckerboardShaderPluginFragmentTextured\" ref=\"depthCheckerboardShaderPluginFragmentTextured\" />
407 <fragment_ref name=\"depthCheckerboardShaderPluginInterpolantFragment\" ref=\"depthCheckerboardShaderPluginInterpolantFragment\" />
410 <connect from=\"depthCheckerboardShaderPluginInterpolantFragment.outDepthValue\" to=\"depthCheckerboardShaderPluginFragmentTextured.depthValue\" />
413 <float3 name=\"Pm\" ref=\"depthCheckerboardShaderPluginInterpolantFragment.Pm\" semantic=\"Pm\" flags=\"varyingInputParam\" />
414 <float4x4 name=\"worldViewProj\" ref=\"depthCheckerboardShaderPluginInterpolantFragment.worldViewProj\" semantic=\"worldviewprojection\" />
415 <float3 name=\"color\" ref=\"depthCheckerboardShaderPluginFragmentTextured.color\" />
416 <float3 name=\"colorFar\" ref=\"depthCheckerboardShaderPluginFragmentTextured.colorFar\" />
417 <float name=\"near\" ref=\"depthCheckerboardShaderPluginFragmentTextured.near\" />
418 <float name=\"far\" ref=\"depthCheckerboardShaderPluginFragmentTextured.far\" />
419 <float name=\"scale\" ref=\"depthCheckerboardShaderPluginFragmentTextured.scale\" />
420 <float2 name=\"uvCoord\" ref=\"depthCheckerboardShaderPluginFragmentTextured.uvCoord\" semantic=\"mayaUvCoordSemantic\" flags=\"varyingInputParam\" />
423 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
424 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
425 <float name=\"near\" value=\"0.0\" />
426 <float name=\"far\" value=\"2.0\" />
427 <float name=\"scale\" value=\"2.0\" />
430 <float3 name=\"outColor\" ref=\"depthCheckerboardShaderPluginFragmentTextured.outColor\" />
432 </fragment_graph>""")
434 fragmentMgr.addFragmentGraphFromBuffer(fragmentGraphBody.encode(
'utf-8'))
436 if not fragmentMgr.hasFragment(
"depthCheckerboardShaderPluginGraphUntextured"):
437 fragmentGraphBody = textwrap.dedent(
"""
438 <fragment_graph name=\"depthCheckerboardShaderPluginGraphUntextured\" ref=\"depthCheckerboardShaderPluginGraphUntextured\" class=\"FragmentGraph\" version=\"1.0\">
440 <fragment_ref name=\"depthCheckerboardShaderPluginFragmentUntextured\" ref=\"depthCheckerboardShaderPluginFragmentUntextured\" />
441 <fragment_ref name=\"depthCheckerboardShaderPluginInterpolantFragment\" ref=\"depthCheckerboardShaderPluginInterpolantFragment\" />
444 <connect from=\"depthCheckerboardShaderPluginInterpolantFragment.outDepthValue\" to=\"depthCheckerboardShaderPluginFragmentUntextured.depthValue\" />
447 <float3 name=\"Pm\" ref=\"depthCheckerboardShaderPluginInterpolantFragment.Pm\" semantic=\"Pm\" flags=\"varyingInputParam\" />
448 <float4x4 name=\"worldViewProj\" ref=\"depthCheckerboardShaderPluginInterpolantFragment.worldViewProj\" semantic=\"worldviewprojection\" />
449 <float3 name=\"color\" ref=\"depthCheckerboardShaderPluginFragmentUntextured.color\" />
450 <float3 name=\"colorFar\" ref=\"depthCheckerboardShaderPluginFragmentUntextured.colorFar\" />
451 <float name=\"near\" ref=\"depthCheckerboardShaderPluginFragmentUntextured.near\" />
452 <float name=\"far\" ref=\"depthCheckerboardShaderPluginFragmentUntextured.far\" />
455 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
456 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
457 <float name=\"near\" value=\"0.0\" />
458 <float name=\"far\" value=\"2.0\" />
461 <float3 name=\"outColor\" ref=\"depthCheckerboardShaderPluginFragmentUntextured.outColor\" />
463 </fragment_graph>""")
465 fragmentMgr.addFragmentGraphFromBuffer(fragmentGraphBody.encode(
'utf-8'))
468 def supportedDrawAPIs():
469 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
472 def fragmentName(isTexturedShading):
473 if isTexturedShading:
474 return "depthCheckerboardShaderPluginGraphTextured"
475 return "depthCheckerboardShaderPluginGraphUntextured"
480 sRegistrantId =
"depthCheckerboardShaderPlugin_py"
482 def initializePlugin(obj):
483 plugin = om.MFnPlugin(obj,
"Autodesk",
"4.5",
"Any")
485 userClassify =
"shader/surface:drawdb/shader/surface/depthCheckerboardShader_py"
486 plugin.registerNode(
"depthCheckerboardShader_py", depthCheckerboardShader.id, depthCheckerboardShader.creator, depthCheckerboardShader.initialize, om.MPxNode.kDependNode, userClassify)
488 sys.stderr.write(
"Failed to register node\n")
493 omr.MDrawRegistry.registerSurfaceShadingNodeOverrideCreator(
"drawdb/shader/surface/depthCheckerboardShader_py", sRegistrantId, depthCheckerboardShaderOverride.creator)
495 sys.stderr.write(
"Failed to register override\n")
498 def uninitializePlugin(obj):
499 plugin = om.MFnPlugin(obj)
501 plugin.deregisterNode(depthCheckerboardShader.id)
503 sys.stderr.write(
"Failed to deregister node\n")
508 omr.MDrawRegistry.deregisterSurfaceShadingNodeOverrideCreator(
"drawdb/shader/surface/depthCheckerboardShader_py", sRegistrantId)
510 sys.stderr.write(
"Failed to deregister override\n")