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 
6 def maya_useNewAPI():
7  """
8  The presence of this function tells Maya that the plugin produces, and
9  expects to be passed, objects created using the Maya Python API 2.0.
10  """
11 
12  pass
13 
14 
15 class ObjectSetSceneRender(omr.MSceneRender):
16  def __init__(self, name, setName, clearMask):
17  omr.MSceneRender.__init__(self, name)
18  self.mSetName = setName
19  self.mClearMask = clearMask
20  self.mFilterSet = ""
21  self.mExcludeFilters = [ ]
22 
23  def objectSetOverride(self):
24  """
25  Return filtered list of items to draw
26  """
27 
28  list = om.MSelectionList()
29  list.add( self.mSetName )
30 
31  obj = list.getDependNode( 0 )
32 
33  set = om.MFnSet( obj )
34  self.mFilterSet = set.getMembers( True )
35 
36  return self.mFilterSet
37 
38 
39  def pluginDisplayFilterExclusions(self):
40  """
41  The list of displayFilters to exclude
42  """
43  return self.mExcludeFilters
44 
45  def clearOperation(self):
46  self.mClearOperation.setMask( self.mClearMask )
47 
48  self.mClearOperation.setClearColor( [ 0.0, 0.2, 0.8, 1.0 ] )
49  self.mClearOperation.setClearColor2( [ 0.5, 0.4, 0.1, 1.0 ] )
50  self.mClearOperation.setClearGradient( True )
51 
52  return self.mClearOperation
53 
54 class viewObjectSetOverride(omr.MRenderOverride):
55  """Render override which draws three sets of objects in multiple "passes"
56  (MSceneRenders) by using a filtered draw for each pass.
57 
58  Additionaly, as a demonstration of how to filter out specific types of
59  plugin geometry from each MSceneRender "pass":
60 
61  "Render Set 1" excludes nodes of type "apiMesh" by using the displayFilter
62  named "apiMeshFilter", which is registered by the devkit "apiMeshShape"
63  C++ plug-in.
64 
65  "Render Set 2" excludes nodes of type "footPrint_py" by using the
66  displayFilter named "footPrintFilter_py", which is registered by the devkit
67  "py2FootPrintNode.py" Python plug-in.
68 
69  "Render Set 3" excludes nodes of both the "apiMesh" and "footPrint_py"
70  types.
71 
72  """
73 
74  def __init__(self, name ):
75  omr.MRenderOverride.__init__(self, name)
76  self.mUIName = "(PY) Multi-pass filtered object-set renderer"
77  self.mOperation = 0
78 
79  render1Name = "Render Set 1"
80  render2Name = "Render Set 2"
81  render3Name = "Render Set 3"
82 
83  set1Name = "set1"
84  set2Name = "set2"
85  set3Name = "set3"
86 
87  presentName = "Present Target"
88 
89  # Clear and render set 1 (excluding any apiMesh shapes)
90  self.mRenderSet1 = ObjectSetSceneRender( render1Name, set1Name, omr.MClearOperation.kClearAll )
91  exclusions1 = self.mRenderSet1.pluginDisplayFilterExclusions()
92  exclusions1.append( "apiMeshFilter" )
93 
94  # Don't clear and render set 2 (excluding any footPrint_py shapes)
95  self.mRenderSet2 = ObjectSetSceneRender( render2Name, set2Name, omr.MClearOperation.kClearNone )
96  exclusions2 = self.mRenderSet2.pluginDisplayFilterExclusions()
97  exclusions2.append( "footPrintFilter_py" )
98 
99  # Don't clear and render set 3 (excluding both apiMesh and footPrint_py shapes)
100  self.mRenderSet3 = ObjectSetSceneRender( render3Name, set3Name, omr.MClearOperation.kClearNone )
101  exclusions3 = self.mRenderSet3.pluginDisplayFilterExclusions()
102  exclusions3.append( "apiMeshFilter" )
103  exclusions3.append( "footPrintFilter_py" )
104 
105  # Present results
106  self.mPresentTarget = omr.MPresentTarget( presentName )
107 
108  def __del__(self):
109  self.mRenderSet1 = None
110  self.mRenderSet2 = None
111  self.mRenderSet3 = None
112  self.mPresentTarget = None
113 
114  def supportedDrawAPIs(self):
115  # this plugin supports both GL and DX
116  return ( omr.MRenderer.kOpenGL | omr.MRenderer.kOpenGLCoreProfile | omr.MRenderer.kDirectX11 )
117 
118  def startOperationIterator(self):
119  self.mOperation = 0
120  return True
121 
122  def renderOperation(self):
123  match self.mOperation:
124  case 0 :
125  return self.mRenderSet1
126  case 1 :
127  return self.mRenderSet2
128  case 2 :
129  return self.mRenderSet3
130  case 3 :
131  return self.mPresentTarget
132  case _:
133  return None
134 
135  def nextRenderOperation(self):
136  self.mOperation += 1
137  return self.mOperation < 4
138 
139  def uiName(self):
140  # UI name to appear as renderer
141  return self.mUIName
142 
143 viewObjectSetOverrideInstance = None
144 
145 def initializePlugin(obj):
146  """
147  Register an override
148  """
149  plugin = om.MFnPlugin(obj, "Autodesk", "1.0", "Any")
150 
151  try:
152  global viewObjectSetOverrideInstance
153  viewObjectSetOverrideInstance = viewObjectSetOverride("py_viewObjectSetOverride")
154  omr.MRenderer.registerOverride( viewObjectSetOverrideInstance )
155  except:
156  sys.stderr.write("registerOverride")
157  raise
158 
159 
160 def uninitializePlugin(obj):
161  """
162  Deregister an override
163  """
164  plugin = om.MFnPlugin(obj)
165 
166  try:
167  global viewObjectSetOverrideInstance
168  if not viewObjectSetOverrideInstance is None:
169  omr.MRenderer.deregisterOverride( viewObjectSetOverrideInstance )
170  viewOjectSetOverrideInstance = None
171 
172  except:
173  sys.stderr.write("deregisterOverride")
174  pass
175