mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
auto sync; removed button sync
This commit is contained in:
parent
0fd177564e
commit
50d8cb9244
@ -16,6 +16,7 @@ import os
|
|||||||
import __builtin__
|
import __builtin__
|
||||||
import whrandom
|
import whrandom
|
||||||
import Floater
|
import Floater
|
||||||
|
import EntryScale
|
||||||
|
|
||||||
# Colors used by all color menus
|
# Colors used by all color menus
|
||||||
DEFAULT_COLORS = [
|
DEFAULT_COLORS = [
|
||||||
@ -196,6 +197,16 @@ def DNARemoveAllChildrenOfClass(dnaNode, classType):
|
|||||||
dnaNode.remove(child)
|
dnaNode.remove(child)
|
||||||
#skyler? DNASTORE.removeDNAGroup(child)
|
#skyler? DNASTORE.removeDNAGroup(child)
|
||||||
|
|
||||||
|
def DNAGetChildren(dnaNode, classType=None):
|
||||||
|
""" Return the objects of that type """
|
||||||
|
children = []
|
||||||
|
for i in range(dnaNode.getNumChildren()):
|
||||||
|
child=dnaNode.at(i)
|
||||||
|
if ((not classType)
|
||||||
|
or DNAClassEqual(child, classType)):
|
||||||
|
children.append(child)
|
||||||
|
return children
|
||||||
|
|
||||||
def DNAGetChild(dnaObject, type = DNA_NODE, childNum = 0):
|
def DNAGetChild(dnaObject, type = DNA_NODE, childNum = 0):
|
||||||
childCount = 0
|
childCount = 0
|
||||||
for i in range(dnaObject.getNumChildren()):
|
for i in range(dnaObject.getNumChildren()):
|
||||||
@ -207,6 +218,22 @@ def DNAGetChild(dnaObject, type = DNA_NODE, childNum = 0):
|
|||||||
# Not found
|
# Not found
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def DNAGetChildRecursive(dnaObject, type = DNA_NODE, childNum = 0):
|
||||||
|
childCount = 0
|
||||||
|
for i in range(dnaObject.getNumChildren()):
|
||||||
|
child = dnaObject.at(i)
|
||||||
|
if DNAClassEqual(child, type):
|
||||||
|
if childCount == childNum:
|
||||||
|
return child
|
||||||
|
childCount = childCount + 1
|
||||||
|
else:
|
||||||
|
child = DNAGetChildRecursive(child, type, childNum-childCount)
|
||||||
|
if child:
|
||||||
|
return child
|
||||||
|
|
||||||
|
# Not found
|
||||||
|
return None
|
||||||
|
|
||||||
def DNAGetChildOfClass(dnaNode, classType):
|
def DNAGetChildOfClass(dnaNode, classType):
|
||||||
for i in range(dnaNode.getNumChildren()):
|
for i in range(dnaNode.getNumChildren()):
|
||||||
child = dnaNode.at(i)
|
child = dnaNode.at(i)
|
||||||
@ -3089,6 +3116,8 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
signPage = self.notebook.add('Signs')
|
signPage = self.notebook.add('Signs')
|
||||||
propsPage = self.notebook.add('Props')
|
propsPage = self.notebook.add('Props')
|
||||||
sceneGraphPage = self.notebook.add('SceneGraph')
|
sceneGraphPage = self.notebook.add('SceneGraph')
|
||||||
|
self.notebook['raisecommand'] = self.updateInfo
|
||||||
|
|
||||||
|
|
||||||
self.fPaths = IntVar()
|
self.fPaths = IntVar()
|
||||||
self.fPaths.set(0)
|
self.fPaths.set(0)
|
||||||
@ -3212,6 +3241,8 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.landmarkBuildingSelector.pack(expand = 1, fill = 'both')
|
self.landmarkBuildingSelector.pack(expand = 1, fill = 'both')
|
||||||
|
|
||||||
# Signs:
|
# Signs:
|
||||||
|
self.currentSignDNA=None
|
||||||
|
self.currentBaselineDNA=None
|
||||||
self.levelEditor.selectedNodePathHookHooks.append(self.updateSignPage)
|
self.levelEditor.selectedNodePathHookHooks.append(self.updateSignPage)
|
||||||
gridFrame = Frame(signPage)
|
gridFrame = Frame(signPage)
|
||||||
|
|
||||||
@ -3230,9 +3261,10 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
history = 0,
|
history = 0,
|
||||||
scrolledlist_items = ['<the sign>'])
|
scrolledlist_items = ['<the sign>'])
|
||||||
self.baselineMenu.selectitem(self.currentBaselineIndex)
|
self.baselineMenu.selectitem(self.currentBaselineIndex)
|
||||||
self.baselineMenu.grid(row=0, column=0)
|
self.baselineMenu.grid(row=0, column=0, columnspan=3)
|
||||||
|
|
||||||
self.baselineAddButton = Button(
|
self.baselineAddButton = Button(
|
||||||
gridFrame, text="Add", command=self.addBaseline)
|
gridFrame, text="Add Baseline", command=self.addBaseline)
|
||||||
self.baselineAddButton.grid(row=1, column=0, columnspan=3)
|
self.baselineAddButton.grid(row=1, column=0, columnspan=3)
|
||||||
|
|
||||||
fontList = [""]+self.styleManager.getCatalogCodes('font')
|
fontList = [""]+self.styleManager.getCatalogCodes('font')
|
||||||
@ -3268,41 +3300,42 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
maxVelocity=1.0,
|
maxVelocity=1.0,
|
||||||
command=self.setSignBaselineStomp)
|
command=self.setSignBaselineStomp)
|
||||||
self.addStompFloater.grid(row=8, column=0, rowspan=2, columnspan=3)
|
self.addStompFloater.grid(row=8, column=0, rowspan=2, columnspan=3)
|
||||||
self.addCurveFloater = Floater.Floater(
|
self.addCurveFloater = EntryScale.EntryScale(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='Curve',
|
text='Curve',
|
||||||
maxVelocity=1.0,
|
min = -1.0, max = 1.0,
|
||||||
|
resolution = .01,
|
||||||
command=self.setSignBaselineCurve)
|
command=self.setSignBaselineCurve)
|
||||||
self.addCurveFloater.grid(row=10, column=0, rowspan=2, columnspan=3)
|
self.addCurveFloater.grid(row=10, column=0, rowspan=2, columnspan=3)
|
||||||
self.addXFloater = Floater.Floater(
|
self.addXFloater = Floater.Floater(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='X',
|
text='X',
|
||||||
maxVelocity=1.0,
|
maxVelocity=1.0,
|
||||||
command=self.setSignBaselineX)
|
command=self.setDNATargetX)
|
||||||
self.addXFloater.grid(row=2, column=3, rowspan=2, columnspan=3)
|
self.addXFloater.grid(row=2, column=3, rowspan=2, columnspan=3)
|
||||||
self.addZFloater = Floater.Floater(
|
self.addZFloater = Floater.Floater(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='Z',
|
text='Z',
|
||||||
maxVelocity=1.0,
|
maxVelocity=1.0,
|
||||||
command=self.setSignBaselineZ)
|
command=self.setDNATargetZ)
|
||||||
self.addZFloater.grid(row=4, column=3, rowspan=2, columnspan=3)
|
self.addZFloater.grid(row=4, column=3, rowspan=2, columnspan=3)
|
||||||
self.addScaleXFloater = Floater.Floater(
|
self.addScaleXFloater = Floater.Floater(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='Scale X',
|
text='Scale X',
|
||||||
maxVelocity=1.0,
|
maxVelocity=1.0,
|
||||||
command=self.setSignBaselineScaleX)
|
command=self.setDNATargetScaleX)
|
||||||
self.addScaleXFloater.grid(row=6, column=3, rowspan=2, columnspan=3)
|
self.addScaleXFloater.grid(row=6, column=3, rowspan=2, columnspan=3)
|
||||||
self.addScaleZFloater = Floater.Floater(
|
self.addScaleZFloater = Floater.Floater(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='Scale Z',
|
text='Scale Z',
|
||||||
maxVelocity=1.0,
|
maxVelocity=1.0,
|
||||||
command=self.setSignBaselineScaleZ)
|
command=self.setDNATargetScaleZ)
|
||||||
self.addScaleZFloater.grid(row=8, column=3, rowspan=2, columnspan=3)
|
self.addScaleZFloater.grid(row=8, column=3, rowspan=2, columnspan=3)
|
||||||
self.addRollFloater = Floater.Floater(
|
self.addRollFloater = Floater.Floater(
|
||||||
gridFrame,
|
gridFrame,
|
||||||
text='Roll',
|
text='Roll',
|
||||||
maxVelocity=10.0,
|
maxVelocity=10.0,
|
||||||
command=self.setSignBaselineRoll)
|
command=self.setDNATargetRoll)
|
||||||
self.addRollFloater.grid(row=10, column=3, rowspan=2, columnspan=3)
|
self.addRollFloater.grid(row=10, column=3, rowspan=2, columnspan=3)
|
||||||
|
|
||||||
gridFrame.pack(fill='both')
|
gridFrame.pack(fill='both')
|
||||||
@ -3461,6 +3494,10 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
# Make sure input variables processed
|
# Make sure input variables processed
|
||||||
self.initialiseoptions(LevelEditorPanel)
|
self.initialiseoptions(LevelEditorPanel)
|
||||||
|
|
||||||
|
def updateInfo(self, page):
|
||||||
|
if page == 'Signs':
|
||||||
|
self.updateSignPage()
|
||||||
|
|
||||||
def toggleGrid(self):
|
def toggleGrid(self):
|
||||||
if self.fGrid.get():
|
if self.fGrid.get():
|
||||||
direct.grid.enable()
|
direct.grid.enable()
|
||||||
@ -3512,67 +3549,44 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.landmarkType = 'toon_landmark_' + name
|
self.landmarkType = 'toon_landmark_' + name
|
||||||
self.levelEditor.setCurrent('toon_landmark_texture', self.landmarkType)
|
self.levelEditor.setCurrent('toon_landmark_texture', self.landmarkType)
|
||||||
|
|
||||||
|
def signPanelSync(self):
|
||||||
|
self.baselineMenu.delete(0, END)
|
||||||
|
sign=self.findSignFromDNARoot()
|
||||||
|
if not sign:
|
||||||
|
return
|
||||||
|
baselineList = DNAGetChildren(sign, DNA_SIGN_BASELINE)
|
||||||
|
for baseline in baselineList:
|
||||||
|
s=DNAGetBaselineString(baseline)
|
||||||
|
self.baselineMenu.insert(END, s)
|
||||||
|
self.baselineMenu.selectitem(0)
|
||||||
|
self.selectSignBaseline(0)
|
||||||
|
|
||||||
def updateSignPage(self):
|
def updateSignPage(self):
|
||||||
#if (self.notebook.getcurselection() == 'Signs'):
|
if (self.notebook.getcurselection() == 'Signs'):
|
||||||
# self.baselineMenu.selectitem(0)
|
sign=self.findSignFromDNARoot()
|
||||||
# self.selectSignBaseline(0)
|
# Only update if it's not the current sign:
|
||||||
pass
|
if (self.currentSignDNA != sign):
|
||||||
|
self.currentSignDNA = sign
|
||||||
|
self.signPanelSync()
|
||||||
|
|
||||||
def findSign(self):
|
def findSignFromDNARoot(self):
|
||||||
target=self.levelEditor.DNATarget
|
dnaRoot=self.levelEditor.selectedDNARoot
|
||||||
if not target:
|
if not dnaRoot:
|
||||||
return
|
return
|
||||||
if DNAGetClassType(target).eq(DNA_SIGN):
|
if (DNAGetClassType(dnaRoot).eq(DNA_LANDMARK_BUILDING)):
|
||||||
|
target=DNAGetChildRecursive(dnaRoot, DNA_SIGN)
|
||||||
return target
|
return target
|
||||||
elif DNAGetClassType(target).eq(DNA_SIGN_BASELINE):
|
|
||||||
return target.getParent()
|
|
||||||
elif (DNAGetClassType(target).eq(DNA_SIGN_TEXT) or
|
|
||||||
DNAGetClassType(target).eq(DNA_SIGN_GRAPHIC)):
|
|
||||||
return (target.getParent()).getParent()
|
|
||||||
else:
|
|
||||||
print "findSign: That's not a DNA_SIGN* object"
|
|
||||||
|
|
||||||
def findAnySignTarget(self):
|
|
||||||
target=self.levelEditor.DNATarget
|
|
||||||
if target and (DNAGetClassType(target).eq(DNA_SIGN)
|
|
||||||
or DNAGetClassType(target).eq(DNA_SIGN_BASELINE)
|
|
||||||
or DNAGetClassType(target).eq(DNA_SIGN_TEXT)
|
|
||||||
or DNAGetClassType(target).eq(DNA_SIGN_GRAPHIC)):
|
|
||||||
return target
|
|
||||||
return None
|
|
||||||
|
|
||||||
def findBaseline(self):
|
|
||||||
parent=target=self.levelEditor.DNATarget
|
|
||||||
#childNum=int((self.baselineMenu.curselection())[0]) #skyler
|
|
||||||
childNum=self.currentBaselineIndex
|
|
||||||
if not target:
|
|
||||||
return
|
|
||||||
# Make parent point to the sign:
|
|
||||||
if DNAGetClassType(target).eq(DNA_SIGN):
|
|
||||||
pass
|
|
||||||
elif DNAGetClassType(target).eq(DNA_SIGN_BASELINE):
|
|
||||||
parent=target.getParent()
|
|
||||||
elif (DNAGetClassType(target).eq(DNA_SIGN_TEXT)
|
|
||||||
or DNAGetClassType(target).eq(DNA_SIGN_GRAPHIC)):
|
|
||||||
parent=(target.getParent()).getParent()
|
|
||||||
else:
|
|
||||||
print "findBaseline: That's not a DNA_SIGN* object"
|
|
||||||
return
|
|
||||||
# Ask the sign for the baseline:
|
|
||||||
target=DNAGetChild(parent, DNA_SIGN_BASELINE, childNum)
|
|
||||||
self.levelEditor.DNATarget=target
|
|
||||||
return target
|
|
||||||
|
|
||||||
def selectSignBaseline(self, val):
|
def selectSignBaseline(self, val):
|
||||||
self.currentBaselineIndex=int((self.baselineMenu.curselection())[0])
|
self.currentBaselineIndex=int((self.baselineMenu.curselection())[0])
|
||||||
print "selectSignBaseline() self.currentBaselineIndex",self.currentBaselineIndex
|
target=DNAGetChild(self.currentSignDNA, DNA_SIGN_BASELINE, self.currentBaselineIndex)
|
||||||
target=self.findBaseline()
|
|
||||||
if target:
|
if target:
|
||||||
# Temporarily undefine DNATarget (this will speed
|
# Temporarily undefine DNATarget (this will speed
|
||||||
# up setting the values, because the callbacks won't
|
# up setting the values, because the callbacks won't
|
||||||
# call self.levelEditor.replaceSelected() with each
|
# call self.levelEditor.replaceSelected() with each
|
||||||
# setting):
|
# setting):
|
||||||
self.levelEditor.DNATarget=None
|
self.levelEditor.DNATarget=None
|
||||||
|
self.currentBaselineDNA=None
|
||||||
# Update panel info:
|
# Update panel info:
|
||||||
self.baselineString.set(DNAGetBaselineString(target))
|
self.baselineString.set(DNAGetBaselineString(target))
|
||||||
self.fontMenu.selectitem(target.getCode())
|
self.fontMenu.selectitem(target.getCode())
|
||||||
@ -3589,14 +3603,11 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.addScaleZFloater.set(scale[2])
|
self.addScaleZFloater.set(scale[2])
|
||||||
hpr=target.getHpr()
|
hpr=target.getHpr()
|
||||||
self.addRollFloater.set(hpr[2])
|
self.addRollFloater.set(hpr[2])
|
||||||
# Set the DNATarget:
|
self.currentBaselineDNA=self.levelEditor.DNATarget=target
|
||||||
self.levelEditor.DNATarget=target
|
|
||||||
else:
|
|
||||||
print "\n\n selectSignBaseline(), no target"
|
|
||||||
|
|
||||||
def signBaselineTrace(self, a, b, mode):
|
def signBaselineTrace(self, a, b, mode):
|
||||||
#print self, a, b, mode, self.baselineString.get()
|
#print self, a, b, mode, self.baselineString.get()
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
s=self.baselineString.get()
|
s=self.baselineString.get()
|
||||||
DNASetBaselineString(baseline, s);
|
DNASetBaselineString(baseline, s);
|
||||||
@ -3606,7 +3617,7 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def addBaseline(self):
|
def addBaseline(self):
|
||||||
sign=self.findSign()
|
sign=self.findSignFromDNARoot()
|
||||||
if sign:
|
if sign:
|
||||||
baseline=DNASignBaseline()
|
baseline=DNASignBaseline()
|
||||||
text="Zoo"
|
text="Zoo"
|
||||||
@ -3617,7 +3628,6 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.baselineMenu.insert(END, text)
|
self.baselineMenu.insert(END, text)
|
||||||
current=self.baselineMenu.size()-1
|
current=self.baselineMenu.size()-1
|
||||||
self.baselineMenu.selectitem(current)
|
self.baselineMenu.selectitem(current)
|
||||||
self.baselineMenu.activate(current)
|
|
||||||
self.selectSignBaseline(current)
|
self.selectSignBaseline(current)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
@ -3625,7 +3635,7 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def selectSignBaselineItem(self, val):
|
def selectSignBaselineItem(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
baseline.setCode(val)
|
baseline.setCode(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
@ -3638,70 +3648,74 @@ class LevelEditorPanel(Pmw.MegaToplevel):
|
|||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineCurve(self, val):
|
def setSignBaselineCurve(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
|
try:
|
||||||
|
val=1.0/val
|
||||||
|
except ZeroDivisionError:
|
||||||
|
val=0
|
||||||
baseline.setWidth(val)
|
baseline.setWidth(val)
|
||||||
baseline.setHeight(val)
|
baseline.setHeight(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineKern(self, val):
|
def setSignBaselineKern(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
baseline.setKern(val)
|
baseline.setKern(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineWiggle(self, val):
|
def setSignBaselineWiggle(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
baseline.setWiggle(val)
|
baseline.setWiggle(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineStumble(self, val):
|
def setSignBaselineStumble(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
baseline.setStumble(val)
|
baseline.setStumble(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineStomp(self, val):
|
def setSignBaselineStomp(self, val):
|
||||||
baseline=self.findBaseline()
|
baseline=self.currentBaselineDNA
|
||||||
if baseline:
|
if baseline:
|
||||||
baseline.setStomp(val)
|
baseline.setStomp(val)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineX(self, val):
|
def setDNATargetX(self, val):
|
||||||
target=self.findAnySignTarget()
|
target=self.levelEditor.DNATarget
|
||||||
if target:
|
if target:
|
||||||
pos=target.getPos()
|
pos=target.getPos()
|
||||||
pos=VBase3(val, pos[1], pos[2])
|
pos=VBase3(val, pos[1], pos[2])
|
||||||
target.setPos(pos)
|
target.setPos(pos)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineZ(self, val):
|
def setDNATargetZ(self, val):
|
||||||
target=self.findAnySignTarget()
|
target=self.levelEditor.DNATarget
|
||||||
if target:
|
if target:
|
||||||
pos=target.getPos()
|
pos=target.getPos()
|
||||||
pos=VBase3(pos[0], pos[1], val)
|
pos=VBase3(pos[0], pos[1], val)
|
||||||
target.setPos(pos)
|
target.setPos(pos)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineScaleX(self, val):
|
def setDNATargetScaleX(self, val):
|
||||||
target=self.findAnySignTarget()
|
target=self.levelEditor.DNATarget
|
||||||
if target:
|
if target:
|
||||||
scale=target.getScale()
|
scale=target.getScale()
|
||||||
scale=VBase3(val, scale[1], scale[2])
|
scale=VBase3(val, scale[1], scale[2])
|
||||||
target.setScale(scale)
|
target.setScale(scale)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineScaleZ(self, val):
|
def setDNATargetScaleZ(self, val):
|
||||||
target=self.findAnySignTarget()
|
target=self.levelEditor.DNATarget
|
||||||
if target:
|
if target:
|
||||||
scale=target.getScale()
|
scale=target.getScale()
|
||||||
scale=VBase3(scale[0], scale[1], val)
|
scale=VBase3(scale[0], scale[1], val)
|
||||||
target.setScale(scale)
|
target.setScale(scale)
|
||||||
self.levelEditor.replaceSelected()
|
self.levelEditor.replaceSelected()
|
||||||
|
|
||||||
def setSignBaselineRoll(self, val):
|
def setDNATargetRoll(self, val):
|
||||||
target=self.findAnySignTarget()
|
target=self.levelEditor.DNATarget
|
||||||
if target:
|
if target:
|
||||||
hpr=target.getHpr()
|
hpr=target.getHpr()
|
||||||
hpr=VBase3(hpr[0], hpr[1], val)
|
hpr=VBase3(hpr[0], hpr[1], val)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user