From 0fe56bd0a980e0791d129498e2eb60ade6a0506d Mon Sep 17 00:00:00 2001 From: Gyedo Jeon Date: Fri, 27 Jul 2007 18:38:00 +0000 Subject: [PATCH] Made Maya-like widget scaling --- direct/src/directtools/DirectManipulation.py | 13 +++++++++--- direct/src/directtools/DirectSession.py | 21 +++++++++++++------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/direct/src/directtools/DirectManipulation.py b/direct/src/directtools/DirectManipulation.py index 24af957c9c..894448bbad 100644 --- a/direct/src/directtools/DirectManipulation.py +++ b/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') diff --git a/direct/src/directtools/DirectSession.py b/direct/src/directtools/DirectSession.py index f8cace2ae1..b8f4774192 100644 --- a/direct/src/directtools/DirectSession.py +++ b/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