Python API 2.0 Reference
python/api2/py2ViewObjectSetOverride.py
1 import sys
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
6 
7 
8 def maya_useNewAPI():
9  """
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.
12  """
13 
14  pass
15 
16 
17 # Class which filters what to render in a scene draw by
18 # returning the objects in a named set as the object set filter.
19 
20 # Has the option of what to do as the clear operation.
21 # Usage can be to clear on first set draw, and not clear
22 # on subsequent draws.
23 
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
29  self.mFilterSet = ""
30  self.mPanelName = ""
31  self.mExcludeFilters = [ ]
32 
33  # Return filtered list of items to draw
34  def objectSetOverride(self):
35  """
36  Return filtered list of items to draw
37  """
38 
39  selList = om.MSelectionList()
40  selList.add( self.mSetName )
41 
42  obj = selList.getDependNode( 0 )
43 
44  selSet = om.MFnSet( obj )
45  self.mFilterSet = selSet.getMembers( True )
46 
47  return self.mFilterSet
48 
49  # Use the M3dView API to disable each registered displayFilter in
50  # this MSceneRender's exclusion list.
51 
52  # Note that this example does not consider the existing state of
53  # the displayFilter (i.e., the state displayed in the
54  # modelPanel's "Show > Viewport > Plugins" list of geometry
55  # filters) before disabling it.
56  def preRender(self):
57  if self.mPanelName:
58  mView = omui.M3dView.getM3dViewFromModelPanel(self.mPanelName)
59  for excl in self.mExcludeFilters:
60  mView.setPluginObjectDisplay( excl, False )
61 
62  # Use the M3dView API to re-enable each registered displayFilter
63  # in this's MSceneRender's exclusion list.
64  #
65  # Note that this example does not attempt to restore the
66  # displayFilters to the states they were in before preRender()
67  # disabled them.
68 
69  def postRender(self):
70  if self.mPanelName:
71  mView = omui.M3dView.getM3dViewFromModelPanel(self.mPanelName)
72  for excl in self.mExcludeFilters:
73  mView.setPluginObjectDisplay( excl, True )
74 
75  def clearOperation(self):
76  self.mClearOperation.setMask( self.mClearMask )
77 
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 )
81 
82  return self.mClearOperation
83 
84  def pluginDisplayFilterExclusions(self):
85  """
86  The list of displayFilters to exclude
87  """
88  return self.mExcludeFilters
89 
90  def panelName(self):
91  return self.mPanelName
92 
93  def setPanelName(self, name):
94  self.mPanelName = name
95 
96 
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.
100 
101  Additionaly, as a demonstration of how to filter out specific types of
102  plugin geometry from each MSceneRender "pass":
103 
104  "Render Set 1" excludes nodes of type "apiMesh" by using the displayFilter
105  named "apiMeshFilter"
106 
107  "Render Set 2" excludes nodes of type "footPrint_py" by using the
108  displayFilter named "footPrintFilter_py"
109 
110  "Render Set 3" excludes nodes of both the "apiMesh" and "footPrint_py"
111  types.
112 
113  """
114 
115  def __init__(self, name ):
116  omr.MRenderOverride.__init__(self, name)
117  self.mUIName = "(PY) Multi-pass filtered object-set renderer"
118  self.mOperation = 0
119  self.supportApis = omr.MRenderer.kAllDevices
120 
121  render1Name = "Render Set 1"
122  render2Name = "Render Set 2"
123  render3Name = "Render Set 3"
124 
125  set1Name = "set1"
126  set2Name = "set2"
127  set3Name = "set3"
128 
129  presentName = "Present Target"
130 
131  # Clear and render set 1 (excluding any apiMesh shapes)
132  self.mRenderSet1 = ObjectSetSceneRender( render1Name, set1Name, omr.MClearOperation.kClearAll )
133  exclusions1 = self.mRenderSet1.pluginDisplayFilterExclusions()
134  exclusions1.append( "apiMeshFilter" )
135 
136  # Don't clear and render set 2 (excluding any footPrint_py shapes)
137  self.mRenderSet2 = ObjectSetSceneRender( render2Name, set2Name, omr.MClearOperation.kClearNone )
138  exclusions2 = self.mRenderSet2.pluginDisplayFilterExclusions()
139  exclusions2.append( "footPrintFilter_py" )
140 
141  # Don't clear and render set 3 (excluding both apiMesh and footPrint_py shapes)
142  self.mRenderSet3 = ObjectSetSceneRender( render3Name, set3Name, omr.MClearOperation.kClearNone )
143  exclusions3 = self.mRenderSet3.pluginDisplayFilterExclusions()
144  exclusions3.append( "apiMeshFilter" )
145  exclusions3.append( "footPrintFilter_py" )
146 
147  # Present results
148  self.mPresentTarget = omr.MPresentTarget( presentName )
149 
150  def setup(self, destination ):
151  self.mPanelName = destination
152  # Update the attributes for the custom operations
153  self.mRenderSet1.setPanelName( self.mPanelName )
154  self.mRenderSet2.setPanelName( self.mPanelName )
155  self.mRenderSet3.setPanelName( self.mPanelName )
156 
157  def __del__(self):
158  self.mRenderSet1 = None
159  self.mRenderSet2 = None
160  self.mRenderSet3 = None
161  self.mPresentTarget = None
162 
163  def supportedDrawAPIs(self):
164  # this plugin supports both GL and DX
165  return self.supportApis
166 
167  def startOperationIterator(self):
168  self.mOperation = 0
169  return True
170 
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
180  else:
181  return None
182 
183  def nextRenderOperation(self):
184  self.mOperation += 1
185  return self.mOperation < 4
186 
187  def uiName(self):
188  # UI name to appear as renderer
189  return self.mUIName
190 
191 viewObjectSetOverrideInstance = None
192 
193 def initializePlugin(obj):
194  """
195  Register an override
196  """
197  try:
198  global viewObjectSetOverrideInstance
199  viewObjectSetOverrideInstance = viewObjectSetOverride("py_viewObjectSetOverride")
200  omr.MRenderer.registerOverride( viewObjectSetOverrideInstance )
201  except:
202  sys.stderr.write("registerOverride")
203  raise
204 
205  try:
206  cmds.pluginDisplayFilter("apiMeshFilter", register=True, label="API Mesh Shape", classification="drawdb/geometry/apiMesh")
207  except:
208  sys.stderr.write("Failed to register displayFilter apiMeshFilter\n")
209  raise
210 
211  try:
212  cmds.pluginDisplayFilter("footPrintFilter_py", register=True, label="Footprint (Python)", classification="drawdb/geometry/footPrint_py")
213  except:
214  sys.stderr.write("Failed to register displayFilter footPrintFilter_py\n")
215  raise
216 
217 
218 def uninitializePlugin(obj):
219  """
220  Deregister an override
221  """
222  try:
223  global viewObjectSetOverrideInstance
224  if not viewObjectSetOverrideInstance is None:
225  omr.MRenderer.deregisterOverride( viewObjectSetOverrideInstance )
226  viewObjectSetOverrideInstance = None
227  except Exception as e:
228  print(e)
229  sys.stderr.write("deregisterOverride")
230 
231  try:
232  cmds.pluginDisplayFilter("apiMeshFilter", deregister = True)
233  except Exception as e:
234  print(e)
235  sys.stderr.write("Failed to deregister displayFilter apiMeshFilter\n")
236 
237  try:
238  cmds.pluginDisplayFilter("footPrintFilter_py", deregister = True)
239  except Exception as e:
240  print(e)
241  sys.stderr.write("Failed to deregister displayFilter footPrintFilter_py\n")