Browse Source

Brought object manipulation to MayaCam

Abhishek Nath 17 years ago
parent
commit
226b975642

+ 40 - 17
direct/src/directtools/DirectCameraControl.py

@@ -3,6 +3,7 @@ from DirectUtil import *
 from DirectGeometry import *
 from DirectGlobals import *
 from direct.interval.IntervalGlobal import Sequence, Func
+from direct.directnotify import DirectNotifyGlobal
 from direct.task import Task
 
 CAM_MOVE_DURATION = 1.2
@@ -10,6 +11,9 @@ COA_MARKER_SF = 0.0075
 Y_AXIS = Vec3(0, 1, 0)
 
 class DirectCameraControl(DirectObject):
+    
+    notify = DirectNotifyGlobal.directNotify.newCategory('DirectCameraControl')
+    
     def __init__(self):
         # Create the grid
         self.startT = 0.0
@@ -33,18 +37,18 @@ class DirectCameraControl(DirectObject):
         t = CAM_MOVE_DURATION
         self.actionEvents = [
             ['DIRECT-mouse1', self.mouseRotateStart],
-            ['DIRECT-mouse1Up', self.mouseFlyStop],
+            ['DIRECT-mouse1Up', self.mouseDollyStop],
             ['DIRECT-mouse2', self.mouseFlyStart],
             ['DIRECT-mouse2Up', self.mouseFlyStop],
             ['DIRECT-mouse3', self.mouseDollyStart],
-            ['DIRECT-mouse3Up', self.mouseFlyStop],
+            ['DIRECT-mouse3Up', self.mouseDollyStop],
             ]
         self.keyEvents = [
             ['c', self.centerCamIn, 0.5],
-            ['f', self.fitOnWidget],
+            # ['f', self.fitOnWidget],                  # Note: This function doesn't work as intended
             ['h', self.homeCam],
-            ['shift-v', self.toggleMarkerVis],
-            ['m', self.moveToFit],
+            ['shift-v', self.toggleMarkerVis],          
+            # ['m', self.moveToFit],                      # Note: This function doesn't work as intended; the object dissappears and screen flashes
             ['n', self.pickNextCOA],
             ['u', self.orbitUprightCam],
             ['shift-u', self.uprightCam],
@@ -68,16 +72,22 @@ class DirectCameraControl(DirectObject):
         self.lockRoll = False
         # NIK - flag to determine whether to use maya camera controls
         self.useMayaCamControls = 0
+        self.altDown = 0
 
     def toggleMarkerVis(self):
-        if base.direct.cameraControl.coaMarker.isHidden():
-            base.direct.cameraControl.coaMarker.show()
+##        if base.direct.cameraControl.coaMarker.isHidden():
+##            base.direct.cameraControl.coaMarker.show()
+##        else:
+##            base.direct.cameraControl.coaMarker.hide()
+            
+        if self.coaMarker.isHidden():
+            self.coaMarker.show()
         else:
-            base.direct.cameraControl.coaMarker.hide()
+            self.coaMarker.hide()
 
     def mouseRotateStart(self, modifiers):
-        if self.useMayaCamControls and modifiers == 4: # alt is pressed - use maya controls
-            base.direct.pushUndo([base.direct.camera])
+        if self.useMayaCamControls and modifiers == 4:          # alt is pressed - use maya controls
+            # base.direct.pushUndo([base.direct.camera])        # Wasteful use of undo
             self.spawnMouseRotateTask()
 
     def mouseDollyStart(self, modifiers):
@@ -89,11 +99,14 @@ class DirectCameraControl(DirectObject):
             self.startF = globalClock.getFrameCount()
             # Start manipulation
             self.spawnHPanYZoom()
+            
+    def mouseDollyStop(self):
+        taskMgr.remove('manipulateCamera')
 
     def mouseFlyStart(self, modifiers):
         # Record undo point
-        base.direct.pushUndo([base.direct.camera])
-        if self.useMayaCamControls and modifiers == 4: # alt is down, use maya controls
+        # base.direct.pushUndo([base.direct.camera])            # Wasteful use of undo
+        if self.useMayaCamControls and modifiers == 4:          # alt is down, use maya controls
             # Hide the marker for this kind of motion
             self.coaMarker.hide()
             # Record time of start of mouse interaction
@@ -101,7 +114,8 @@ class DirectCameraControl(DirectObject):
             self.startF = globalClock.getFrameCount()
             # Start manipulation
             self.spawnXZTranslate()
-        else:
+            self.altDown = 1
+        elif not self.useMayaCamControls:
             # Where are we in the display region?
             if ((abs(base.direct.dr.mouseX) < 0.9) and (abs(base.direct.dr.mouseY) < 0.9)):
                 # MOUSE IS IN CENTRAL REGION
@@ -121,6 +135,8 @@ class DirectCameraControl(DirectObject):
                 else:
                     # Mouse is in outer frame, spawn mouseRotateTask
                     self.spawnMouseRotateTask()
+        if not modifiers == 4:
+            self.altDown = 0
 
     def mouseFlyStop(self):
         taskMgr.remove('manipulateCamera')
@@ -128,7 +144,11 @@ class DirectCameraControl(DirectObject):
         deltaT = stopT - self.startT
         stopF = globalClock.getFrameCount()
         deltaF = stopF - self.startF
-        if not self.useMayaCamControls and (deltaT <= 0.25) or (deltaF <= 1):
+        ## No reason this shouldn't work with Maya cam on
+        # if not self.useMayaCamControls and (deltaT <= 0.25) or (deltaF <= 1):
+
+        # Do this when not trying to manipulate camera
+        if not self.altDown:
             # Check for a hit point based on
             # current mouse position
             # Allow intersection with unpickable objects
@@ -658,9 +678,12 @@ class DirectCameraControl(DirectObject):
 
         # How far do you move the camera to be this distance from the node?
         deltaMove = vWidget2Camera - centerVec
-
+        
         # Move a target there
-        self.camManipRef.setPos(base.direct.camera, deltaMove)
+        try:
+            self.camManipRef.setPos(base.direct.camera, deltaMove)
+        except Exception:
+            self.notify.debug
 
         parent = base.direct.camera.getParent()
         base.direct.camera.wrtReparentTo(self.camManipRef)
@@ -673,7 +696,7 @@ class DirectCameraControl(DirectObject):
         fitTask.uponDeath = self.reparentCam
 
     def moveToFit(self):
-        # How bit is the active widget?
+        # How big is the active widget?
         widgetScale = base.direct.widget.scalingNode.getScale(render)
         maxScale = max(widgetScale[0], widgetScale[1], widgetScale[2])
         # At what distance does the widget fill 50% of the screen?

+ 2 - 6
direct/src/directtools/DirectManipulation.py

@@ -49,7 +49,7 @@ class DirectManipulationControl(DirectObject):
 
         if base.direct.cameraControl.useMayaCamControls and modifiers == 4:
             self.mode = 'camera'
-
+        
         if self.fAllowSelectionOnly:
             return
 
@@ -63,12 +63,8 @@ class DirectManipulationControl(DirectObject):
             # Constraint determined by nodes name
             self.constraint = entry.getIntoNodePath().getName()
         else:
-            # Nope, off the widget, no constraint
             self.constraint = None
-            # [gjeon] to prohibit unwanted object movement while direct window doesn't have focus
-            if base.direct.cameraControl.useMayaCamControls and not base.direct.gotControl(modifiers):
-                return
-
+        
         if not base.direct.gotAlt(modifiers):
             # Check to see if we are moving the object
             # We are moving the object if we either wait long enough