mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
Made Maya-like widget scaling
This commit is contained in:
parent
181d891578
commit
0fe56bd0a9
@ -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')
|
||||||
|
@ -473,6 +473,18 @@ 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):
|
||||||
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user