1 from __future__
import division
13 import maya.api.OpenMaya
as om
14 import maya.api.OpenMayaRender
as omr
26 The presence of this function tells Maya that the plugin produces, and
27 expects to be passed, objects created using the Maya Python API 2.0.
34 class depthShader(om.MPxNode):
36 id = om.MTypeId( 0x81002 )
54 nAttr = om.MFnNumericAttribute()
58 depthShader.aColorNear = nAttr.createColor(
"color",
"c")
63 nAttr.default = (0.0, 1.0, 0.0)
66 depthShader.aColorFar = nAttr.createColor(
"colorFar",
"cf")
71 nAttr.default = (0.0, 0.0, 1.0)
73 depthShader.aNear = nAttr.create(
"near",
"n", om.MFnNumericData.kFloat)
79 nAttr.setSoftMax(1000.0)
81 depthShader.aFar = nAttr.create(
"far",
"f", om.MFnNumericData.kFloat)
87 nAttr.setSoftMax(1000.0)
90 depthShader.aPointCamera = nAttr.createPoint(
"pointCamera",
"p")
98 depthShader.aOutColor = nAttr.createColor(
"outColor",
"oc")
100 nAttr.storable =
False
101 nAttr.readable =
True
102 nAttr.writable =
False
104 om.MPxNode.addAttribute(depthShader.aColorNear)
105 om.MPxNode.addAttribute(depthShader.aColorFar)
106 om.MPxNode.addAttribute(depthShader.aNear)
107 om.MPxNode.addAttribute(depthShader.aFar)
108 om.MPxNode.addAttribute(depthShader.aPointCamera)
109 om.MPxNode.addAttribute(depthShader.aOutColor)
111 om.MPxNode.attributeAffects(depthShader.aColorNear, depthShader.aOutColor)
112 om.MPxNode.attributeAffects(depthShader.aColorFar, depthShader.aOutColor)
113 om.MPxNode.attributeAffects(depthShader.aNear, depthShader.aOutColor)
114 om.MPxNode.attributeAffects(depthShader.aFar, depthShader.aOutColor)
115 om.MPxNode.attributeAffects(depthShader.aPointCamera, depthShader.aOutColor)
118 om.MPxNode.__init__(self)
120 def compute(self, plug, block):
122 if (plug != depthShader.aOutColor)
and (plug.parent() != depthShader.aOutColor):
126 pCamera = block.inputValue(depthShader.aPointCamera).asFloatVector()
127 cNear = block.inputValue(depthShader.aColorNear).asFloatVector()
128 cFar = block.inputValue(depthShader.aColorFar).asFloatVector()
129 nearClip = block.inputValue(depthShader.aNear).asFloat()
130 farClip = block.inputValue(depthShader.aFar).asFloat()
134 dist = farClip - nearClip
136 ratio = (farClip + pCamera.z) / dist
137 resultColor = cNear * ratio + cFar*(1.0 - ratio)
140 outColorHandle = block.outputValue( depthShader.aOutColor )
141 outColorHandle.setMFloatVector( resultColor )
142 outColorHandle.setClean()
147 def postConstructor(self):
153 class depthShaderOverride(omr.MPxSurfaceShadingNodeOverride):
156 return depthShaderOverride(obj)
158 def __init__(self, obj):
159 omr.MPxSurfaceShadingNodeOverride.__init__(self, obj)
162 fragmentMgr = omr.MRenderer.getFragmentManager()
163 if fragmentMgr !=
None:
164 if not fragmentMgr.hasFragment(
"depthShaderPluginFragment"):
165 fragmentBody = textwrap.dedent(
"""
166 <fragment uiName=\"depthShaderPluginFragment\" name=\"depthShaderPluginFragment\" type=\"plumbing\" class=\"ShadeFragment\" version=\"1.0\">
167 <description><![CDATA[Depth shader fragment]]></description>
169 <float name=\"depthValue\" />
170 <float3 name=\"color\" />
171 <float3 name=\"colorFar\" />
172 <float name=\"near\" />
173 <float name=\"far\" />
176 <float name=\"depthValue\" value=\"0.0\" />
177 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
178 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
179 <float name=\"near\" value=\"0.0\" />
180 <float name=\"far\" value=\"2.0\" />
183 <float3 name=\"outColor\" />
186 <implementation render=\"OGSRenderer\" language=\"Cg\" lang_version=\"2.1\">
187 <function_name val=\"depthShaderPluginFragment\" />
189 float3 depthShaderPluginFragment(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip) \n
191 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
192 return cNear*ratio + cFar*(1.0f - ratio); \n
196 <implementation render=\"OGSRenderer\" language=\"HLSL\" lang_version=\"11.0\">
197 <function_name val=\"depthShaderPluginFragment\" />
199 float3 depthShaderPluginFragment(float depthValue, float3 cNear, float3 cFar, float nearClip, float farClip) \n
201 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
202 return cNear*ratio + cFar*(1.0f - ratio); \n
206 <implementation render=\"OGSRenderer\" language=\"GLSL\" lang_version=\"3.0\">
207 <function_name val=\"depthShaderPluginFragment\" />
209 vec3 depthShaderPluginFragment(float depthValue, vec3 cNear, vec3 cFar, float nearClip, float farClip) \n
211 float ratio = (farClip + depthValue)/(farClip - nearClip); \n
212 return cNear*ratio + cFar*(1.0f - ratio); \n
219 fragmentMgr.addShadeFragmentFromBuffer(fragmentBody.encode(
'utf-8'),
False)
221 if not fragmentMgr.hasFragment(
"depthShaderPluginInterpolantFragment"):
222 vertexFragmentBody = textwrap.dedent(
"""
223 <fragment uiName=\"depthShaderPluginInterpolantFragment\" name=\"depthShaderPluginInterpolantFragment\" type=\"interpolant\" class=\"ShadeFragment\" version=\"1.0\">
224 <description><![CDATA[Depth shader vertex fragment]]></description>
226 <float3 name=\"Pm\" semantic=\"Pm\" flags=\"varyingInputParam\" />
227 <float4x4 name=\"worldViewProj\" semantic=\"worldviewprojection\" />
232 <float name=\"outDepthValue\" ^1s/>
235 <implementation render=\"OGSRenderer\" language=\"Cg\" lang_version=\"2.1\">
236 <function_name val=\"depthShaderPluginInterpolantFragment\" />
238 float depthShaderPluginInterpolantFragment(float depthValue) \n
240 return depthValue; \n
243 <vertex_source><![CDATA[
244 float idepthShaderPluginInterpolantFragment(float3 Pm, float4x4 worldViewProj) \n
246 float4 pCamera = mul(worldViewProj, float4(Pm, 1.0f)); \n
247 return (pCamera.z - pCamera.w*2.0f); \n
251 <implementation render=\"OGSRenderer\" language=\"HLSL\" lang_version=\"11.0\">
252 <function_name val=\"depthShaderPluginInterpolantFragment\" />
254 float depthShaderPluginInterpolantFragment(float depthValue) \n
256 return depthValue; \n
259 <vertex_source><![CDATA[
260 float idepthShaderPluginInterpolantFragment(float3 Pm, float4x4 worldViewProj) \n
262 float4 pCamera = mul(float4(Pm, 1.0f), worldViewProj); \n
263 return (pCamera.z - pCamera.w*2.0f); \n
267 <implementation render=\"OGSRenderer\" language=\"GLSL\" lang_version=\"3.0\">
268 <function_name val=\"depthShaderPluginInterpolantFragment\" />
270 float depthShaderPluginInterpolantFragment(float depthValue) \n
272 return depthValue; \n
275 <vertex_source><![CDATA[
276 float idepthShaderPluginInterpolantFragment(vec3 Pm, mat4 worldViewProj) \n
278 vec4 pCamera = worldViewProj * vec4(Pm, 1.0f); \n
279 return (pCamera.z - pCamera.w*2.0f); \n
287 if omr.MRenderer.drawAPI() == omr.MRenderer.kDirectX11:
288 vertexFragmentBody = vertexFragmentBody.replace(
"^1s",
"semantic=\"extraDepth\" ")
290 vertexFragmentBody = vertexFragmentBody.replace(
"^1s",
" ")
292 fragmentMgr.addShadeFragmentFromBuffer(vertexFragmentBody.encode(
'utf-8'),
False)
294 if not fragmentMgr.hasFragment(
"depthShaderPluginGraph"):
295 fragmentGraphBody = textwrap.dedent(
"""
296 <fragment_graph name=\"depthShaderPluginGraph\" ref=\"depthShaderPluginGraph\" class=\"FragmentGraph\" version=\"1.0\">
298 <fragment_ref name=\"depthShaderPluginFragment\" ref=\"depthShaderPluginFragment\" />
299 <fragment_ref name=\"depthShaderPluginInterpolantFragment\" ref=\"depthShaderPluginInterpolantFragment\" />
302 <connect from=\"depthShaderPluginInterpolantFragment.outDepthValue\" to=\"depthShaderPluginFragment.depthValue\" />
305 <float3 name=\"Pm\" ref=\"depthShaderPluginInterpolantFragment.Pm\" semantic=\"Pm\" flags=\"varyingInputParam\" />
306 <float4x4 name=\"worldViewProj\" ref=\"depthShaderPluginInterpolantFragment.worldViewProj\" semantic=\"worldviewprojection\" />
307 <float3 name=\"color\" ref=\"depthShaderPluginFragment.color\" />
308 <float3 name=\"colorFar\" ref=\"depthShaderPluginFragment.colorFar\" />
309 <float name=\"near\" ref=\"depthShaderPluginFragment.near\" />
310 <float name=\"far\" ref=\"depthShaderPluginFragment.far\" />
313 <float3 name=\"color\" value=\"0.0,1.0,0.0\" />
314 <float3 name=\"colorFar\" value=\"0.0,0.0,1.0\" />
315 <float name=\"near\" value=\"0.0\" />
316 <float name=\"far\" value=\"2.0\" />
319 <float3 name=\"outColor\" ref=\"depthShaderPluginFragment.outColor\" />
321 </fragment_graph>""")
323 fragmentMgr.addFragmentGraphFromBuffer(fragmentGraphBody.encode(
'utf-8'))
325 def supportedDrawAPIs(self):
326 return omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11
328 def fragmentName(self):
329 return "depthShaderPluginGraph"
334 sRegistrantId =
"depthShaderPlugin_py"
336 def initializePlugin(obj):
337 plugin = om.MFnPlugin(obj,
"Autodesk",
"4.5",
"Any")
339 userClassify =
"shader/surface:drawdb/shader/surface/depthShader_py"
340 plugin.registerNode(
"depthShader_py", depthShader.id, depthShader.creator, depthShader.initialize, om.MPxNode.kDependNode, userClassify)
342 sys.stderr.write(
"Failed to register node\n")
347 omr.MDrawRegistry.registerSurfaceShadingNodeOverrideCreator(
"drawdb/shader/surface/depthShader_py", sRegistrantId, depthShaderOverride.creator)
349 sys.stderr.write(
"Failed to register override\n")
352 def uninitializePlugin(obj):
353 plugin = om.MFnPlugin(obj)
355 plugin.deregisterNode(depthShader.id)
357 sys.stderr.write(
"Failed to deregister node\n")
362 omr.MDrawRegistry.deregisterSurfaceShadingNodeOverrideCreator(
"drawdb/shader/surface/depthShader_py", sRegistrantId)
364 sys.stderr.write(
"Failed to deregister override\n")