Package slumMaya :: Module customGLView
[hide private]
[frames] | no frames]

Source Code for Module slumMaya.customGLView

  1  # 
  2  # customGLView.py - a custom GL Viewport that doesnt draw any geometry. 
  3  #                                       Basically its a way     for slum to have a gl canvas 
  4  #                                       in maya UI to draw whatever we want. 
  5  # 
  6  #    Copyright (C) 2008 - Roberto Hradec 
  7  # 
  8  # --------------------------------------------------------------------------- 
  9  #        This file is part of SLUM. 
 10  # 
 11  #    SLUM is free software: you can redistribute it and/or modify 
 12  #    it under the terms of the GNU General Public License as published by 
 13  #    the Free Software Foundation, either version 3 of the License, or 
 14  #    (at your option) any later version. 
 15  # 
 16  #    SLUM is distributed in the hope that it will be useful, 
 17  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
 18  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 19  #    GNU General Public License for more details. 
 20  # 
 21  #    You should have received a copy of the GNU General Public License 
 22  #    along with SLUM.  If not, see <http://www.gnu.org/licenses/>. 
 23  # --------------------------------------------------------------------------- 
 24   
 25   
 26   
 27  import sys 
 28  import math 
 29  import maya.OpenMaya as OpenMaya 
 30  import maya.OpenMayaMPx as OpenMayaMPx 
 31  import maya.OpenMayaUI as OpenMayaUI 
 32  import maya.OpenMayaRender as OpenMayaRender 
 33   
 34  glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer() 
 35  glFT = glRenderer.glFunctionTable() 
 36   
 37  kPluginCmdName = "customGLView" 
 38   
 39  kInitFlag = "-in" 
 40  kInitFlagLong = "-init" 
 41   
 42  kResultsFlag = "-r" 
 43  kResultsFlagLong = "-results" 
 44   
 45  kClearFlag = "-cl" 
 46  kClearFlagLong = "-clear" 
 47   
 48  kToleranceFlag = "-tol" 
 49  kToleranceFlagLong = "-tolerance" 
 50   
51 -class customGLView(OpenMayaMPx.MPx3dModelView):
52 - def __init__(self):
53 OpenMayaMPx.MPx3dModelView.__init__(self) 54 55 self.fOldCamera = OpenMaya.MDagPath() 56 self.fCameraList = OpenMaya.MDagPathArray() 57 self.fCurrentPass = 0 58 self.fDrawManips = True 59 self.fOldDisplayStyle = OpenMayaUI.M3dView.kWireFrame 60 self.fLightTest = False 61 self.fListList = OpenMaya.MDagPathArray() 62 self.tol = 10.0 63 64 self.setMultipleDrawEnable(True)
65
66 - def multipleDrawPassCount(self):
67 return self.fCameraList.length() + 1
68
69 - def setCameraList(self, cameraList):
70 setMultipleDrawEnable(True) 71 self.fCameraList.clear() 72 73 for i in range(cameraList.length()): 74 self.fCameraList.append(cameraList[i]) 75 76 self.refresh()
77
78 - def removeAllCameras(self):
79 self.fCameraList.clear() 80 self.refresh()
81
82 - def getCameraHUDName(self):
83 cameraPath = OpenMaya.MDagPath() 84 self.getCamera(cameraPath) 85 86 cameraPath.pop() 87 88 hudName = "spNarrowPolyViewer: " + cameraPath.partialPathName() 89 return hudName
90
91 - def setIsolateSelect(self, list):
92 self.setViewSelected(True) 93 return self.setObjectsToView(list)
94
95 - def setIsolateSelectOff(self):
96 return self.setViewSelected(False)
97
98 - def preMultipleDraw(self):
99 self.fCurrentPass = 0 100 self.fDrawManips = False 101 102 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, False) 103 104 self.setDrawAdornments(False) 105 self.setDisplayHUD(False) 106 self.setDisplayAxis(False) 107 self.setDisplayAxisAtOrigin(False) 108 self.setDisplayCameraAnnotation(False) 109 self.setViewSelected(True) 110 111 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, True) 112 113 ''' 114 115 dagPath = OpenMaya.MDagPath() 116 try: 117 oldCamera = OpenMaya.MDagPath() 118 self.getCamera(oldCamera) 119 120 self.fOldCamera = oldCamera 121 122 #if self.isColorIndexMode(): 123 # self.setColorIndexMode(False) 124 125 displayHUD(False) 126 127 sList = OpenMaya.MSelectionList() 128 OpenMaya.MGlobal.getActiveSelectionList(sList) 129 130 sList.getDagPath(0, dagPath) 131 except: 132 # sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw b\n") 133 pass 134 135 try: 136 itMeshPolygon = OpenMaya.MItMeshPolygon(dagPath, OpenMaya.cvar.MObject_kNullObj) 137 138 if None == itMeshPolygon: 139 return; 140 141 self.beginGL() 142 while not itMeshPolygon.isDone(): 143 points = OpenMaya.MPointArray() 144 itMeshPolygon.getPoints(points, OpenMaya.MSpace.kWorld) 145 length = points.length() 146 147 if length == 3: 148 for i in range(length): 149 p = points[i] 150 p1 = points[(i+1)%length] 151 p2 = points[(i+2)%length] 152 153 v1 = OpenMaya.MVector(p1 - p) 154 v2 = OpenMaya.MVector(p2 - p) 155 156 angle = v1.angle(v2) * 180.0 / math.pi 157 158 if math.fabs(angle - self.tol) < 0.0001 or angle < self.tol: 159 glFT.glBegin( OpenMayaRender.MGL_POLYGON ) 160 glFT.glVertex3f(points[0].x, points[0].y, points[0].z) 161 glFT.glVertex3f(points[1].x, points[1].y, points[1].z) 162 glFT.glVertex3f(points[2].x, points[2].y, points[2].z) 163 164 glFT.glNormal3f(points[0].x, points[0].y, points[0].z) 165 glFT.glNormal3f(points[1].x, points[1].y, points[1].z) 166 glFT.glNormal3f(points[2].x, points[2].y, points[2].z) 167 168 glFT.glTexCoord3f(points[0].x, points[0].y, points[0].z) 169 glFT.glTexCoord3f(points[1].x, points[1].y, points[1].z) 170 glFT.glTexCoord3f(points[2].x, points[2].y, points[2].z) 171 glFT.glEnd() 172 173 itMeshPolygon.next() 174 self.endGL() 175 except: 176 #sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDraw c\n") 177 pass 178 '''
179
180 - def postMultipleDraw(self):
181 try: 182 #self.setCamera(self.fOldCamera) 183 self.fDrawManips = False 184 #self.updateViewingParameters() 185 except: 186 sys.stderr.write("ERROR: spNarrowPolyViewer.postMultipleDraw\n") 187 raise
188
189 - def preMultipleDrawPass(self, index):
190 self.fCurrentPass = index 191 ''' 192 try: 193 self.setDrawAdornments(False) 194 self.setDisplayHUD(False) 195 self.setDisplayAxis(False) 196 self.setDisplayAxisAtOrigin(False) 197 self.setDisplayCameraAnnotation(False) 198 self.setViewSelected(True) 199 200 dagPath = OpenMaya.MDagPath() 201 202 if self.fCurrentPass == 0: 203 self.getCamera(dagPath) 204 else: 205 nCameras = self.fCameraList.length() 206 if self.fCurrentPass <= nCameras: 207 dagPath = self.fCameraList[self.fCurrentPass-1] 208 else: 209 sys.stderr.write("ERROR: ...too many passes specified\n") 210 return 211 212 self.setCameraInDraw(dagPath) 213 214 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, False) 215 216 if dagPath == self.fOldCamera: 217 self.fDrawManips = False 218 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, True) 219 220 self.setFogEnabled(False) 221 222 self.setBackgroundFogEnabled(False) 223 224 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights, False) 225 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras, False) 226 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles, False) 227 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions, False) 228 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles, False) 229 230 textPos = OpenMaya.MPoint(0.0, 0.0, 0.0) 231 str = "Main View" 232 self.drawText(str, textPos, OpenMayaUI.M3dView.kLeft) 233 else: 234 self.fDrawManips = False 235 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayGrid, True) 236 237 self.setFogEnabled(False) 238 239 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayLights, False) 240 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayCameras, False) 241 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayIkHandles, False) 242 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayDimensions, False) 243 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplaySelectHandles, False) 244 except: 245 sys.stderr.write("ERROR: spNarrowPolyViewer.preMultipleDrawPass\n") 246 raise 247 248 # note do not have light test in here 249 250 # self.setLightingMode(OpenMayaUI.kLightDefault) 251 252 if ((self.fCurrentPass % 2) == 0): 253 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsSurfaces, True ); 254 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayNurbsCurves, True ); 255 256 #self.updateViewingParameters() 257 '''
258
259 - def postMultipleDrawPass(self, index):
260 self.setObjectDisplay(OpenMayaUI.M3dView.kDisplayEverything, False)
261
262 - def okForMultipleDraw(self, dagPath):
263 if not self.fDrawManips and dagPath.hasFn(OpenMaya.MFn.kManipulator3D): 264 return False 265 return True
266
267 - def multipleDrawPassCount(self):
268 return self.fCameraList.length() + 1
269
270 - def viewType(self):
271 return kPluginCmdName;
272 273 274 275
276 -class customGLViewCmd(OpenMayaMPx.MPxModelEditorCommand):
277 - def __init__(self):
278 OpenMayaMPx.MPxModelEditorCommand.__init__(self) 279 self.fCameraList = OpenMaya.MDagPathArray()
280
281 - def appendSyntax(self):
282 try: 283 theSyntax = self._syntax() 284 theSyntax.addFlag(kInitFlag, kInitFlagLong) 285 theSyntax.addFlag(kResultsFlag, kResultsFlagLong) 286 theSyntax.addFlag(kClearFlag, kClearFlagLong) 287 theSyntax.addFlag(kToleranceFlag, kToleranceFlagLong, OpenMaya.MSyntax.kDouble) 288 289 except: 290 sys.stderr.write( "ERROR: creating syntax for model editor command: %s" % kPluginCmdName )
291
292 - def doEditFlags(self):
293 try: 294 user3dModelView = self.modelView() 295 296 if user3dModelView.viewType() == kPluginCmdName: 297 argData = self._parser() 298 299 if argData.isFlagSet(kInitFlag): 300 self.initTests(user3dModelView) 301 elif argData.isFlagSet(kResultsFlag): 302 self.testResults(user3dModelView) 303 elif argData.isFlagSet(kClearFlag): 304 self.clearResults(user3dModelView) 305 elif argData.isFlagSet(kToleranceFlag): 306 tol = argData.flagArgumentDouble(kToleranceFlag, 0) 307 user3dModelView.tol = tol 308 user3dModelView.refresh(True, True) 309 else: 310 return OpenMaya.kUnknownParameter 311 except: 312 sys.stderr.write( "ERROR: in doEditFlags for model editor command: %s" % kPluginCmdName )
313
314 - def initTests(self, view):
315 clearResults(self, view) 316 317 # Add every camera into the scene. Don't change the main camera, 318 # it is OK that it gets reused. 319 # 320 cameraPath = OpenMaya.MDagPath() 321 dagIterator = OpenMaya.MItDag(OpenMaya.MItDag.kDepthFirst, OpenMaya.MFn.kCamera) 322 323 while not dagIterator.isDone(): 324 try: 325 dagIterator.getPath(cameraPath) 326 camera = OpenMaya.MFnCamera(cameraPath) 327 except: 328 continue 329 330 OpenMaya.MGlobal.displayInfo(camera.fullPathName()) 331 self.fCameraList.append(cameraPath) 332 333 dagIterator.next() 334 335 try: 336 view.setCameraList(self.fCameraList) 337 except: 338 OpenMaya.MGlobal.displayError("Could not set list of cameras\n") 339 raise 340 341 view.refresh()
342
343 - def testResults(self, view):
344 print "fCameraLIst.length() = %d " % (self.fCameraList.length(), ) 345 length = self.fCameraList.length()
346
347 - def clearResults(self, view):
348 view.removeAllCameras() 349 self.fCameraList.clear()
350 351 352
353 -def cmdCreator():
354 return OpenMayaMPx.asMPxPtr( customGLViewCmd() )
355
356 -def viewerCreator():
357 return OpenMayaMPx.asMPxPtr( customGLView() )
358 359 # initialize the script plug-in
360 -def initializePlugin(mpluginObj):
361 mplugin = OpenMayaMPx.MFnPlugin(mpluginObj) 362 mplugin.registerModelEditorCommand( kPluginCmdName, cmdCreator, viewerCreator)
363 364 365 # uninitialize the script plug-in
366 -def uninitializePlugin(mpluginObj):
367 mplugin = OpenMayaMPx.MFnPlugin(mpluginObj) 368 mplugin.deregisterModelEditorCommand( kPluginCmdName )
369 370
371 -def test(customCamera=False):
372 import maya 373 import slumMaya 374 375 376 window = maya.cmds.window() 377 form = maya.cmds.formLayout() 378 editor = maya.cmds.customGLView() 379 380 maya.cmds.formLayout(form,edit=True,attachForm=(editor, "top", 0)) 381 maya.cmds.formLayout(form,edit=True,attachForm=(editor, "bottom", 0)) 382 maya.cmds.formLayout(form,edit=True,attachForm=(editor, "right", 0)) 383 maya.cmds.formLayout(form,edit=True,attachForm=(editor, "left", 0)) 384 385 if customCamera: 386 camera = maya.cmds.camera(centerOfInterest=2.450351, position=(1.535314,1.135712,1.535314), rotation=(-27.612504,45,0), worldUp=(-0.1290301,0.3488592,-0.1290301)) 387 maya.cmds.customGLView(editor,edit=True,camera=camera[0]) 388 maya.cmds.currentTime(10.0,edit=True) 389 maya.cmds.customGLView(editor,edit=True,i=True) 390 maya.cmds.refresh() 391 maya.cmds.customGLView(editor,edit=True,r=True) 392 393 maya.cmds.showWindow(window)
394