Made Maya-like widget scaling

This commit is contained in:
Gyedo Jeon 2007-07-27 18:38:00 +00:00
parent 181d891578
commit 0fe56bd0a9
2 changed files with 24 additions and 10 deletions

View File

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

View File

@ -473,7 +473,19 @@ class DirectSession(DirectObject):
def setFScaleWidgetByCam(self, flag): def setFScaleWidgetByCam(self, flag):
self.fScaleWidgetByCam = 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, def select(self, nodePath, fMultiSelect = 0,
fSelectTag = 1, fResetAncestry = 1): fSelectTag = 1, fResetAncestry = 1):
dnp = self.selected.select(nodePath, fMultiSelect, fSelectTag) dnp = self.selected.select(nodePath, fMultiSelect, fSelectTag)
@ -499,12 +511,7 @@ class DirectSession(DirectObject):
# Adjust widgets size # Adjust widgets size
# This uses the additional scaling factor used to grow and # This uses the additional scaling factor used to grow and
# shrink the widget # shrink the widget
if self.fScaleWidgetByCam: # [gjeon] for scaling widget by distance from camera if not self.fScaleWidgetByCam: # [gjeon] for not 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:
self.widget.setScalingFactor(dnp.getRadius()) self.widget.setScalingFactor(dnp.getRadius())
# Spawn task to have object handles follow the selected object # Spawn task to have object handles follow the selected object