2 import maya.api.OpenMaya
as om
3 import maya.api.OpenMayaRender
as omr
4 import maya.api.OpenMayaUI
as omui
5 import maya.cmds
as cmds
10 The presence of this function tells Maya that the plugin produces, and
11 expects to be passed, objects created using the Maya Python API 2.0.
24 class ObjectSetSceneRender(omr.MSceneRender):
25 def __init__(self, name, setName, clearMask):
26 omr.MSceneRender.__init__(self, name)
27 self.mSetName = setName
28 self.mClearMask = clearMask
31 self.mExcludeFilters = [ ]
34 def objectSetOverride(self):
36 Return filtered list of items to draw
39 selList = om.MSelectionList()
40 selList.add( self.mSetName )
42 obj = selList.getDependNode( 0 )
44 selSet = om.MFnSet( obj )
45 self.mFilterSet = selSet.getMembers(
True )
47 return self.mFilterSet
58 mView = omui.M3dView.getM3dViewFromModelPanel(self.mPanelName)
59 for excl
in self.mExcludeFilters:
60 mView.setPluginObjectDisplay( excl,
False )
71 mView = omui.M3dView.getM3dViewFromModelPanel(self.mPanelName)
72 for excl
in self.mExcludeFilters:
73 mView.setPluginObjectDisplay( excl,
True )
75 def clearOperation(self):
76 self.mClearOperation.setMask( self.mClearMask )
78 self.mClearOperation.setClearColor( [ 0.0, 0.2, 0.8, 1.0 ] )
79 self.mClearOperation.setClearColor2( [ 0.5, 0.4, 0.1, 1.0 ] )
80 self.mClearOperation.setClearGradient(
True )
82 return self.mClearOperation
84 def pluginDisplayFilterExclusions(self):
86 The list of displayFilters to exclude
88 return self.mExcludeFilters
91 return self.mPanelName
93 def setPanelName(self, name):
94 self.mPanelName = name
97 class viewObjectSetOverride(omr.MRenderOverride):
98 """Render override which draws three sets of objects in multiple "passes"
99 (MSceneRenders) by using a filtered draw for each pass.
101 Additionaly, as a demonstration of how to filter out specific types of
102 plugin geometry from each MSceneRender "pass":
104 "Render Set 1" excludes nodes of type "apiMesh" by using the displayFilter
105 named "apiMeshFilter"
107 "Render Set 2" excludes nodes of type "footPrint_py" by using the
108 displayFilter named "footPrintFilter_py"
110 "Render Set 3" excludes nodes of both the "apiMesh" and "footPrint_py"
115 def __init__(self, name ):
116 omr.MRenderOverride.__init__(self, name)
117 self.mUIName =
"(PY) Multi-pass filtered object-set renderer"
119 self.supportApis = omr.MRenderer.kAllDevices
121 render1Name =
"Render Set 1"
122 render2Name =
"Render Set 2"
123 render3Name =
"Render Set 3"
129 presentName =
"Present Target"
132 self.mRenderSet1 = ObjectSetSceneRender( render1Name, set1Name, omr.MClearOperation.kClearAll )
133 exclusions1 = self.mRenderSet1.pluginDisplayFilterExclusions()
134 exclusions1.append(
"apiMeshFilter" )
137 self.mRenderSet2 = ObjectSetSceneRender( render2Name, set2Name, omr.MClearOperation.kClearNone )
138 exclusions2 = self.mRenderSet2.pluginDisplayFilterExclusions()
139 exclusions2.append(
"footPrintFilter_py" )
142 self.mRenderSet3 = ObjectSetSceneRender( render3Name, set3Name, omr.MClearOperation.kClearNone )
143 exclusions3 = self.mRenderSet3.pluginDisplayFilterExclusions()
144 exclusions3.append(
"apiMeshFilter" )
145 exclusions3.append(
"footPrintFilter_py" )
148 self.mPresentTarget = omr.MPresentTarget( presentName )
150 def setup(self, destination ):
151 self.mPanelName = destination
153 self.mRenderSet1.setPanelName( self.mPanelName )
154 self.mRenderSet2.setPanelName( self.mPanelName )
155 self.mRenderSet3.setPanelName( self.mPanelName )
158 self.mRenderSet1 =
None
159 self.mRenderSet2 =
None
160 self.mRenderSet3 =
None
161 self.mPresentTarget =
None
163 def supportedDrawAPIs(self):
165 return self.supportApis
167 def startOperationIterator(self):
171 def renderOperation(self):
172 if self.mOperation == 0:
173 return self.mRenderSet1
174 elif self.mOperation == 1:
175 return self.mRenderSet2
176 elif self.mOperation == 2 :
177 return self.mRenderSet3
178 elif self.mOperation == 3 :
179 return self.mPresentTarget
183 def nextRenderOperation(self):
185 return self.mOperation < 4
191 viewObjectSetOverrideInstance =
None
193 def initializePlugin(obj):
198 global viewObjectSetOverrideInstance
199 viewObjectSetOverrideInstance = viewObjectSetOverride(
"py_viewObjectSetOverride")
200 omr.MRenderer.registerOverride( viewObjectSetOverrideInstance )
202 sys.stderr.write(
"registerOverride")
206 cmds.pluginDisplayFilter(
"apiMeshFilter", register=
True, label=
"API Mesh Shape", classification=
"drawdb/geometry/apiMesh")
208 sys.stderr.write(
"Failed to register displayFilter apiMeshFilter\n")
212 cmds.pluginDisplayFilter(
"footPrintFilter_py", register=
True, label=
"Footprint (Python)", classification=
"drawdb/geometry/footPrint_py")
214 sys.stderr.write(
"Failed to register displayFilter footPrintFilter_py\n")
218 def uninitializePlugin(obj):
220 Deregister an override
223 global viewObjectSetOverrideInstance
224 if not viewObjectSetOverrideInstance
is None:
225 omr.MRenderer.deregisterOverride( viewObjectSetOverrideInstance )
226 viewObjectSetOverrideInstance =
None
227 except Exception
as e:
229 sys.stderr.write(
"deregisterOverride")
232 cmds.pluginDisplayFilter(
"apiMeshFilter", deregister =
True)
233 except Exception
as e:
235 sys.stderr.write(
"Failed to deregister displayFilter apiMeshFilter\n")
238 cmds.pluginDisplayFilter(
"footPrintFilter_py", deregister =
True)
239 except Exception
as e:
241 sys.stderr.write(
"Failed to deregister displayFilter footPrintFilter_py\n")