Jelajahi Sumber

Made Maya-like widget scaling

Gyedo Jeon 18 tahun lalu
induk
melakukan
0fe56bd0a9

+ 10 - 3
direct/src/directtools/DirectManipulation.py

@@ -583,6 +583,7 @@ class ObjectHandles(NodePath, DirectObject):
         self.scalingNode = self.getChild(0)
         self.scalingNode.setName('ohScalingNode')
         self.ohScalingFactor = 1.0
+        self.directScalingFactor = 1.0
         # To avoid recreating a vec every frame
         self.hitPt = Vec3(0)
         # Get a handle on the components
@@ -796,9 +797,13 @@ class ObjectHandles(NodePath, DirectObject):
     def hideGuides(self):
         self.guideLines.hide()
 
+    def setDirectScalingFactor(self, factor):
+        self.directScalingFactor = factor
+        self.setScalingFactor(1)
+
     def setScalingFactor(self, scaleFactor):
-        self.ohScalingFactor = scaleFactor
-        self.scalingNode.setScale(self.ohScalingFactor)
+        self.ohScalingFactor = self.ohScalingFactor * scaleFactor
+        self.scalingNode.setScale(self.ohScalingFactor * self.directScalingFactor)
 
     def getScalingFactor(self):
         return self.scalingNode.getScale()
@@ -816,7 +821,8 @@ class ObjectHandles(NodePath, DirectObject):
 
     def multiplyScalingFactorBy(self, factor):
         taskMgr.remove('resizeObjectHandles')
-        sf = self.ohScalingFactor = self.ohScalingFactor * factor
+        self.ohScalingFactor = self.ohScalingFactor * factor
+        sf = self.ohScalingFactor * self.directScalingFactor
         self.scalingNode.lerpScale(sf, sf, sf, 0.5,
                                    blendType = 'easeInOut',
                                    task = 'resizeObjectHandles')
@@ -828,6 +834,7 @@ class ObjectHandles(NodePath, DirectObject):
         minDim = min(base.direct.dr.nearWidth, base.direct.dr.nearHeight)
         sf = 0.15 * minDim * (pos[1]/base.direct.dr.near)
         self.ohScalingFactor = sf
+        sf = sf * self.directScalingFactor
         self.scalingNode.lerpScale(sf, sf, sf, 0.5,
                                    blendType = 'easeInOut',
                                    task = 'resizeObjectHandles')

+ 14 - 7
direct/src/directtools/DirectSession.py

@@ -473,7 +473,19 @@ class DirectSession(DirectObject):
 
     def setFScaleWidgetByCam(self, flag):
         self.fScaleWidgetByCam = flag
-
+        if flag:
+            taskMgr.add(self.widgetResizeTask, 'DIRECTWidgetResize')
+        else:
+            taskMgr.remove('DIRECTWidgetResize')
+            
+    def widgetResizeTask(self, state):
+        dnp = self.selected.last
+        if dnp:
+            nodeCamDist = Vec3(dnp.getPos(direct.camera)).length()
+            sf = 0.075 * nodeCamDist * math.tan(deg2Rad(direct.drList.getCurrentDr().fovV))
+            self.widget.setDirectScalingFactor(sf)
+        return Task.cont
+    
     def select(self, nodePath, fMultiSelect = 0,
                fSelectTag = 1, fResetAncestry = 1):
         dnp = self.selected.select(nodePath, fMultiSelect, fSelectTag)
@@ -499,12 +511,7 @@ class DirectSession(DirectObject):
             # Adjust widgets size
             # This uses the additional scaling factor used to grow and
             # shrink the widget
-            if self.fScaleWidgetByCam: # [gjeon] for scaling widget by distance from camera
-                nodeCamDist = Vec3(dnp.getPos(direct.camera)).length()
-                sf = 0.075 * nodeCamDist * math.tan(deg2Rad(direct.drList.getCurrentDr().fovV))
-                sf = max(1.0,sf)
-                self.widget.setScalingFactor(sf)
-            else:
+            if not self.fScaleWidgetByCam: # [gjeon] for not scaling widget by distance from camera
                 self.widget.setScalingFactor(dnp.getRadius())
             
             # Spawn task to have object handles follow the selected object