historical/toontown-classic.git/panda/direct/extensions_native/NodePath_extensions.py

840 lines
33 KiB
Python
Raw Normal View History

2024-01-16 11:20:27 -06:00
####################################################################
#Dtool_funcToMethod(func, class)
#del func
#####################################################################
"""
NodePath-extensions module: contains methods to extend functionality
of the NodePath class
"""
from panda3d.core import NodePath
from .extension_native_helpers import Dtool_funcToMethod
####################################################################
def id(self):
"""Deprecated. Returns a unique id identifying the NodePath instance"""
print("Warning: NodePath.id() is deprecated. Use hash(NodePath) or NodePath.get_key() instead.")
return self.getKey()
Dtool_funcToMethod(id, NodePath)
del id
#####################################################################
def getChildrenAsList(self):
"""Deprecated. Converts a node path's child NodePathCollection into a list"""
print("Warning: NodePath.getChildrenAsList() is deprecated. Use get_children() instead.")
return list(self.getChildren())
Dtool_funcToMethod(getChildrenAsList, NodePath)
del getChildrenAsList
#####################################################################
def printChildren(self):
"""Deprecated. Prints out the children of the bottom node of a node path"""
print("Warning: NodePath.printChildren() is deprecated.")
for child in self.getChildren():
print(child.getName())
Dtool_funcToMethod(printChildren, NodePath)
del printChildren
#####################################################################
def removeChildren(self):
"""Deprecated. Deletes the children of the bottom node of a node path"""
print("Warning: NodePath.removeChildren() is deprecated. Use get_children().detach() instead.")
self.getChildren().detach()
Dtool_funcToMethod(removeChildren, NodePath)
del removeChildren
#####################################################################
def toggleVis(self):
"""Deprecated. Toggles visibility of a nodePath"""
print("Warning: NodePath.toggleVis() is deprecated. Use is_hidden(), show() and hide() instead.")
if self.isHidden():
self.show()
return 1
else:
self.hide()
return 0
Dtool_funcToMethod(toggleVis, NodePath)
del toggleVis
#####################################################################
def showSiblings(self):
"""Deprecated. Show all the siblings of a node path"""
print("Warning: NodePath.showSiblings() is deprecated.")
for sib in self.getParent().getChildren():
if sib.node() != self.node():
sib.show()
Dtool_funcToMethod(showSiblings, NodePath)
del showSiblings
#####################################################################
def hideSiblings(self):
"""Deprecated. Hide all the siblings of a node path"""
print("Warning: NodePath.hideSiblings() is deprecated.")
for sib in self.getParent().getChildren():
if sib.node() != self.node():
sib.hide()
Dtool_funcToMethod(hideSiblings, NodePath)
del hideSiblings
#####################################################################
def showAllDescendants(self):
"""Deprecated. Show the node path and all its children"""
print("Warning: NodePath.showAllDescendants() is deprecated.")
self.show()
for child in self.getChildren():
child.showAllDescendants()
Dtool_funcToMethod(showAllDescendants, NodePath)
del showAllDescendants
#####################################################################
def isolate(self):
"""Deprecated. Show the node path and hide its siblings"""
print("Warning: NodePath.isolate() is deprecated.")
self.showAllDescendants()
for sib in self.getParent().getChildren():
if sib.node() != self.node():
sib.hide()
Dtool_funcToMethod(isolate, NodePath)
del isolate
#####################################################################
def remove(self):
"""Deprecated. Remove a node path from the scene graph"""
print("Warning: NodePath.remove() is deprecated. Use remove_node() instead.")
# Send message in case anyone needs to do something
# before node is deleted
messenger.send('preRemoveNodePath', [self])
# Remove nodePath
self.removeNode()
Dtool_funcToMethod(remove, NodePath)
del remove
#####################################################################
def lsNames(self):
"""Deprecated. Walk down a tree and print out the path"""
print("Warning: NodePath.lsNames() is deprecated.")
if self.isEmpty():
print("(empty)")
else:
type = self.node().getType().getName()
name = self.getName()
print(type + " " + name)
self.lsNamesRecurse()
Dtool_funcToMethod(lsNames, NodePath)
del lsNames
#####################################################################
def lsNamesRecurse(self, indentString=' '):
"""Deprecated. Walk down a tree and print out the path"""
print("Warning: NodePath.lsNamesRecurse() is deprecated.")
for nodePath in self.getChildren():
type = nodePath.node().getType().getName()
name = nodePath.getName()
print(indentString + type + " " + name)
nodePath.lsNamesRecurse(indentString + " ")
Dtool_funcToMethod(lsNamesRecurse, NodePath)
del lsNamesRecurse
#####################################################################
def reverseLsNames(self):
"""Deprecated. Walk up a tree and print out the path to the root"""
print("Warning: NodePath.reverseLsNames() is deprecated.")
ancestors = list(self.getAncestors())
ancestry = ancestors.reverse()
indentString = ""
for nodePath in ancestry:
type = nodePath.node().getType().getName()
name = nodePath.getName()
print(indentString + type + " " + name)
indentString = indentString + " "
Dtool_funcToMethod(reverseLsNames, NodePath)
del reverseLsNames
#####################################################################
def getAncestry(self):
"""Deprecated. Get a list of a node path's ancestors"""
print("NodePath.getAncestry() is deprecated. Use get_ancestors() instead.")
ancestors = list(self.getAncestors())
ancestors.reverse()
return ancestors
Dtool_funcToMethod(getAncestry, NodePath)
del getAncestry
#####################################################################
def pPrintString(self, other = None):
"""
Deprecated. pretty print
"""
print("NodePath.pPrintString() is deprecated.")
if __debug__:
# Normally I would have put the if __debug__ around
# the entire funciton, the that doesn't seem to work
# with -extensions. Maybe someone will look into
# this further.
if other:
pos = self.getPos(other)
hpr = self.getHpr(other)
scale = self.getScale(other)
shear = self.getShear(other)
otherString = " 'other': %s,\n" % (other.getName(),)
else:
pos = self.getPos()
hpr = self.getHpr()
scale = self.getScale()
shear = self.getShear()
otherString = '\n'
return (
"%s = {"%(self.getName()) +
otherString +
" 'Pos': (%s),\n" % pos.pPrintValues() +
" 'Hpr': (%s),\n" % hpr.pPrintValues() +
" 'Scale': (%s),\n" % scale.pPrintValues() +
" 'Shear': (%s),\n" % shear.pPrintValues() +
"}")
Dtool_funcToMethod(pPrintString, NodePath)
del pPrintString
#####################################################################
def printPos(self, other = None, sd = 2):
""" Deprecated. Pretty print a node path's pos """
print("NodePath.printPos() is deprecated.")
formatString = '%0.' + '%d' % sd + 'f'
if other:
pos = self.getPos(other)
otherString = other.getName() + ', '
else:
pos = self.getPos()
otherString = ''
print((self.getName() + '.setPos(' + otherString +
formatString % pos[0] + ', ' +
formatString % pos[1] + ', ' +
formatString % pos[2] +
')\n'))
Dtool_funcToMethod(printPos, NodePath)
del printPos
#####################################################################
def printHpr(self, other = None, sd = 2):
""" Deprecated. Pretty print a node path's hpr """
print("NodePath.printHpr() is deprecated.")
formatString = '%0.' + '%d' % sd + 'f'
if other:
hpr = self.getHpr(other)
otherString = other.getName() + ', '
else:
hpr = self.getHpr()
otherString = ''
print((self.getName() + '.setHpr(' + otherString +
formatString % hpr[0] + ', ' +
formatString % hpr[1] + ', ' +
formatString % hpr[2] +
')\n'))
Dtool_funcToMethod(printHpr, NodePath)
del printHpr
#####################################################################
def printScale(self, other = None, sd = 2):
""" Deprecated. Pretty print a node path's scale """
print("NodePath.printScale() is deprecated.")
formatString = '%0.' + '%d' % sd + 'f'
if other:
scale = self.getScale(other)
otherString = other.getName() + ', '
else:
scale = self.getScale()
otherString = ''
print((self.getName() + '.setScale(' + otherString +
formatString % scale[0] + ', ' +
formatString % scale[1] + ', ' +
formatString % scale[2] +
')\n'))
Dtool_funcToMethod(printScale, NodePath)
del printScale
#####################################################################
def printPosHpr(self, other = None, sd = 2):
""" Deprecated. Pretty print a node path's pos and, hpr """
print("NodePath.printPosHpr() is deprecated.")
formatString = '%0.' + '%d' % sd + 'f'
if other:
pos = self.getPos(other)
hpr = self.getHpr(other)
otherString = other.getName() + ', '
else:
pos = self.getPos()
hpr = self.getHpr()
otherString = ''
print((self.getName() + '.setPosHpr(' + otherString +
formatString % pos[0] + ', ' +
formatString % pos[1] + ', ' +
formatString % pos[2] + ', ' +
formatString % hpr[0] + ', ' +
formatString % hpr[1] + ', ' +
formatString % hpr[2] +
')\n'))
Dtool_funcToMethod(printPosHpr, NodePath)
del printPosHpr
#####################################################################
def printPosHprScale(self, other = None, sd = 2):
""" Deprecated. Pretty print a node path's pos, hpr, and scale """
print("NodePath.printPosHprScale() is deprecated.")
formatString = '%0.' + '%d' % sd + 'f'
if other:
pos = self.getPos(other)
hpr = self.getHpr(other)
scale = self.getScale(other)
otherString = other.getName() + ', '
else:
pos = self.getPos()
hpr = self.getHpr()
scale = self.getScale()
otherString = ''
print((self.getName() + '.setPosHprScale(' + otherString +
formatString % pos[0] + ', ' +
formatString % pos[1] + ', ' +
formatString % pos[2] + ', ' +
formatString % hpr[0] + ', ' +
formatString % hpr[1] + ', ' +
formatString % hpr[2] + ', ' +
formatString % scale[0] + ', ' +
formatString % scale[1] + ', ' +
formatString % scale[2] +
')\n'))
Dtool_funcToMethod(printPosHprScale, NodePath)
del printPosHprScale
#####################################################################
def printTransform(self, other = None, sd = 2, fRecursive = 0):
"Deprecated."
print("NodePath.printTransform() is deprecated.")
from panda3d.core import Vec3
fmtStr = '%%0.%df' % sd
name = self.getName()
if other == None:
transform = self.getTransform()
else:
transform = self.getTransform(other)
if transform.hasPos():
pos = transform.getPos()
if not pos.almostEqual(Vec3(0)):
outputString = '%s.setPos(%s, %s, %s)' % (name, fmtStr, fmtStr, fmtStr)
print(outputString % (pos[0], pos[1], pos[2]))
if transform.hasHpr():
hpr = transform.getHpr()
if not hpr.almostEqual(Vec3(0)):
outputString = '%s.setHpr(%s, %s, %s)' % (name, fmtStr, fmtStr, fmtStr)
print(outputString % (hpr[0], hpr[1], hpr[2]))
if transform.hasScale():
if transform.hasUniformScale():
scale = transform.getUniformScale()
if scale != 1.0:
outputString = '%s.setScale(%s)' % (name, fmtStr)
print(outputString % scale)
else:
scale = transform.getScale()
if not scale.almostEqual(Vec3(1)):
outputString = '%s.setScale(%s, %s, %s)' % (name, fmtStr, fmtStr, fmtStr)
print(outputString % (scale[0], scale[1], scale[2]))
if fRecursive:
for child in self.getChildren():
child.printTransform(other, sd, fRecursive)
Dtool_funcToMethod(printTransform, NodePath)
del printTransform
#####################################################################
def iPos(self, other = None):
""" Deprecated. Set node path's pos to 0, 0, 0 """
print("NodePath.iPos() is deprecated.")
if other:
self.setPos(other, 0, 0, 0)
else:
self.setPos(0, 0, 0)
Dtool_funcToMethod(iPos, NodePath)
del iPos
#####################################################################
def iHpr(self, other = None):
""" Deprecated. Set node path's hpr to 0, 0, 0 """
print("NodePath.iHpr() is deprecated.")
if other:
self.setHpr(other, 0, 0, 0)
else:
self.setHpr(0, 0, 0)
Dtool_funcToMethod(iHpr, NodePath)
del iHpr
#####################################################################
def iScale(self, other = None):
""" Deprecated. Set node path's scale to 1, 1, 1 """
print("NodePath.iScale() is deprecated.")
if other:
self.setScale(other, 1, 1, 1)
else:
self.setScale(1, 1, 1)
Dtool_funcToMethod(iScale, NodePath)
del iScale
#####################################################################
def iPosHpr(self, other = None):
""" Deprecated. Set node path's pos and hpr to 0, 0, 0 """
print("NodePath.iPosHpr() is deprecated.")
if other:
self.setPosHpr(other, 0, 0, 0, 0, 0, 0)
else:
self.setPosHpr(0, 0, 0, 0, 0, 0)
Dtool_funcToMethod(iPosHpr, NodePath)
del iPosHpr
#####################################################################
def iPosHprScale(self, other = None):
""" Deprecated. Set node path's pos and hpr to 0, 0, 0 and scale to 1, 1, 1 """
print("NodePath.iPosHprScale() is deprecated.")
if other:
self.setPosHprScale(other, 0, 0, 0, 0, 0, 0, 1, 1, 1)
else:
self.setPosHprScale(0, 0, 0, 0, 0, 0, 1, 1, 1)
# private methods
Dtool_funcToMethod(iPosHprScale, NodePath)
del iPosHprScale
#####################################################################
def place(self):
base.startDirect(fWantTk = 1)
# Don't use a regular import, to prevent ModuleFinder from picking
# it up as a dependency when building a .p3d package.
import importlib
Placer = importlib.import_module('direct.tkpanels.Placer')
return Placer.place(self)
Dtool_funcToMethod(place, NodePath)
del place
#####################################################################
def explore(self):
base.startDirect(fWantTk = 1)
# Don't use a regular import, to prevent ModuleFinder from picking
# it up as a dependency when building a .p3d package.
import importlib
SceneGraphExplorer = importlib.import_module('direct.tkwidgets.SceneGraphExplorer')
return SceneGraphExplorer.explore(self)
Dtool_funcToMethod(explore, NodePath)
del explore
#####################################################################
def rgbPanel(self, cb = None):
base.startTk()
# Don't use a regular import, to prevent ModuleFinder from picking
# it up as a dependency when building a .p3d package.
import importlib
Slider = importlib.import_module('direct.tkwidgets.Slider')
return Slider.rgbPanel(self, cb)
Dtool_funcToMethod(rgbPanel, NodePath)
del rgbPanel
#####################################################################
def select(self):
base.startDirect(fWantTk = 0)
base.direct.select(self)
Dtool_funcToMethod(select, NodePath)
del select
#####################################################################
def deselect(self):
base.startDirect(fWantTk = 0)
base.direct.deselect(self)
Dtool_funcToMethod(deselect, NodePath)
del deselect
#####################################################################
def showCS(self, mask = None):
"""
Deprecated.
Shows the collision solids at or below this node. If mask is
not None, it is a BitMask32 object (e.g. WallBitmask,
CameraBitmask) that indicates which particular collision
solids should be made visible; otherwise, all of them will be.
"""
print("NodePath.showCS() is deprecated. Use findAllMatches('**/+CollisionNode').show() instead.")
npc = self.findAllMatches('**/+CollisionNode')
for p in range(0, npc.getNumPaths()):
np = npc[p]
if (mask == None or (np.node().getIntoCollideMask() & mask).getWord()):
np.show()
Dtool_funcToMethod(showCS, NodePath)
del showCS
#####################################################################
def hideCS(self, mask = None):
"""
Deprecated.
Hides the collision solids at or below this node. If mask is
not None, it is a BitMask32 object (e.g. WallBitmask,
CameraBitmask) that indicates which particular collision
solids should be hidden; otherwise, all of them will be.
"""
print("NodePath.hideCS() is deprecated. Use findAllMatches('**/+CollisionNode').hide() instead.")
npc = self.findAllMatches('**/+CollisionNode')
for p in range(0, npc.getNumPaths()):
np = npc[p]
if (mask == None or (np.node().getIntoCollideMask() & mask).getWord()):
np.hide()
Dtool_funcToMethod(hideCS, NodePath)
del hideCS
#####################################################################
def posInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosInterval(self, *args, **kw)
Dtool_funcToMethod(posInterval, NodePath)
del posInterval
#####################################################################
def hprInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpHprInterval(self, *args, **kw)
Dtool_funcToMethod(hprInterval, NodePath)
del hprInterval
#####################################################################
def quatInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpQuatInterval(self, *args, **kw)
Dtool_funcToMethod(quatInterval, NodePath)
del quatInterval
#####################################################################
def scaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpScaleInterval(self, *args, **kw)
Dtool_funcToMethod(scaleInterval, NodePath)
del scaleInterval
#####################################################################
def shearInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpShearInterval(self, *args, **kw)
Dtool_funcToMethod(shearInterval, NodePath)
del shearInterval
#####################################################################
def posHprInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosHprInterval(self, *args, **kw)
Dtool_funcToMethod(posHprInterval, NodePath)
del posHprInterval
#####################################################################
def posQuatInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosQuatInterval(self, *args, **kw)
Dtool_funcToMethod(posQuatInterval, NodePath)
del posQuatInterval
#####################################################################
def hprScaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpHprScaleInterval(self, *args, **kw)
Dtool_funcToMethod(hprScaleInterval, NodePath)
del hprScaleInterval
#####################################################################
def quatScaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpQuatScaleInterval(self, *args, **kw)
Dtool_funcToMethod(quatScaleInterval, NodePath)
del quatScaleInterval
#####################################################################
def posHprScaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosHprScaleInterval(self, *args, **kw)
Dtool_funcToMethod(posHprScaleInterval, NodePath)
del posHprScaleInterval
#####################################################################
def posQuatScaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosQuatScaleInterval(self, *args, **kw)
Dtool_funcToMethod(posQuatScaleInterval, NodePath)
del posQuatScaleInterval
#####################################################################
def posHprScaleShearInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosHprScaleShearInterval(self, *args, **kw)
Dtool_funcToMethod(posHprScaleShearInterval, NodePath)
del posHprScaleShearInterval
#####################################################################
def posQuatScaleShearInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpPosQuatScaleShearInterval(self, *args, **kw)
Dtool_funcToMethod(posQuatScaleShearInterval, NodePath)
del posQuatScaleShearInterval
#####################################################################
def colorInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpColorInterval(self, *args, **kw)
Dtool_funcToMethod(colorInterval, NodePath)
del colorInterval
#####################################################################
def colorScaleInterval(self, *args, **kw):
from direct.interval import LerpInterval
return LerpInterval.LerpColorScaleInterval(self, *args, **kw)
Dtool_funcToMethod(colorScaleInterval, NodePath)
del colorScaleInterval
#####################################################################
def attachCollisionSphere(self, name, cx, cy, cz, r, fromCollide, intoCollide):
from panda3d.core import CollisionSphere
from panda3d.core import CollisionNode
coll = CollisionSphere(cx, cy, cz, r)
collNode = CollisionNode(name)
collNode.addSolid(coll)
collNode.setFromCollideMask(fromCollide)
collNode.setIntoCollideMask(intoCollide)
collNodePath = self.attachNewNode(collNode)
return collNodePath
Dtool_funcToMethod(attachCollisionSphere, NodePath)
del attachCollisionSphere
#####################################################################
def attachCollisionSegment(self, name, ax, ay, az, bx, by, bz, fromCollide, intoCollide):
from panda3d.core import CollisionSegment
from panda3d.core import CollisionNode
coll = CollisionSegment(ax, ay, az, bx, by, bz)
collNode = CollisionNode(name)
collNode.addSolid(coll)
collNode.setFromCollideMask(fromCollide)
collNode.setIntoCollideMask(intoCollide)
collNodePath = self.attachNewNode(collNode)
return collNodePath
Dtool_funcToMethod(attachCollisionSegment, NodePath)
del attachCollisionSegment
#####################################################################
def attachCollisionRay(self, name, ox, oy, oz, dx, dy, dz, fromCollide, intoCollide):
from panda3d.core import CollisionRay
from panda3d.core import CollisionNode
coll = CollisionRay(ox, oy, oz, dx, dy, dz)
collNode = CollisionNode(name)
collNode.addSolid(coll)
collNode.setFromCollideMask(fromCollide)
collNode.setIntoCollideMask(intoCollide)
collNodePath = self.attachNewNode(collNode)
return collNodePath
Dtool_funcToMethod(attachCollisionRay, NodePath)
del attachCollisionRay
#####################################################################
def flattenMultitex(self, stateFrom = None, target = None,
useGeom = 0, allowTexMat = 0, win = None):
from panda3d.core import MultitexReducer
mr = MultitexReducer()
if target != None:
mr.setTarget(target)
mr.setUseGeom(useGeom)
mr.setAllowTexMat(allowTexMat)
if win == None:
win = base.win
if stateFrom == None:
mr.scan(self)
else:
mr.scan(self, stateFrom)
mr.flatten(win)
Dtool_funcToMethod(flattenMultitex, NodePath)
del flattenMultitex
#####################################################################
def getNumDescendants(self):
return len(self.findAllMatches('**')) - 1
Dtool_funcToMethod(getNumDescendants, NodePath)
del getNumDescendants
#####################################################################
def removeNonCollisions(self):
# remove anything that is not collision-related
print("NodePath.removeNonCollisions() is deprecated")
stack = [self]
while len(stack):
np = stack.pop()
# if there are no CollisionNodes under this node, remove it
if np.find('**/+CollisionNode').isEmpty():
np.detachNode()
else:
stack.extend(np.getChildren())
Dtool_funcToMethod(removeNonCollisions, NodePath)
del removeNonCollisions
#####################################################################
def subdivideCollisions(self, numSolidsInLeaves):
"""
expand CollisionNodes out into balanced trees, with a particular number
of solids in the leaves
TODO: better splitting logic at each level of the tree wrt spatial separation
and cost of bounding volume tests vs. cost of collision solid tests
"""
colNps = self.findAllMatches('**/+CollisionNode')
for colNp in colNps:
node = colNp.node()
numSolids = node.getNumSolids()
if numSolids <= numSolidsInLeaves:
# this CollisionNode doesn't need to be split
continue
solids = []
for i in range(numSolids):
solids.append(node.getSolid(i))
# recursively subdivide the solids into a spatial binary tree
solidTree = self.r_subdivideCollisions(solids, numSolidsInLeaves)
root = colNp.getParent().attachNewNode('%s-subDivRoot' % colNp.getName())
self.r_constructCollisionTree(solidTree, root, colNp.getName())
colNp.stash()
def r_subdivideCollisions(self, solids, numSolidsInLeaves):
# takes a list of solids, returns a list containing some number of lists,
# with the solids evenly distributed between them (recursively nested until
# the lists at the leaves contain no more than numSolidsInLeaves)
# if solids is already small enough, returns solids unchanged
if len(solids) <= numSolidsInLeaves:
return solids
origins = []
avgX = 0; avgY = 0; avgZ = 0
minX = None; minY = None; minZ = None
maxX = None; maxY = None; maxZ = None
for solid in solids:
origin = solid.getCollisionOrigin()
origins.append(origin)
x = origin.getX(); y = origin.getY(); z = origin.getZ()
avgX += x; avgY += y; avgZ += z
if minX is None:
minX = x; minY = y; minZ = z
maxX = x; maxY = y; maxZ = z
else:
minX = min(x, minX); minY = min(y, minY); minZ = min(z, minZ)
maxX = max(x, maxX); maxY = max(y, maxY); maxZ = max(z, maxZ)
avgX /= len(solids); avgY /= len(solids); avgZ /= len(solids)
extentX = maxX - minX; extentY = maxY - minY; extentZ = maxZ - minZ
maxExtent = max(max(extentX, extentY), extentZ)
# sparse octree
xyzSolids = []
XyzSolids = []
xYzSolids = []
XYzSolids = []
xyZSolids = []
XyZSolids = []
xYZSolids = []
XYZSolids = []
midX = avgX
midY = avgY
midZ = avgZ
# throw out axes that are not close to the max axis extent; try and keep
# the divisions square/spherical
if extentX < (maxExtent * .75) or extentX > (maxExtent * 1.25):
midX += maxExtent
if extentY < (maxExtent * .75) or extentY > (maxExtent * 1.25):
midY += maxExtent
if extentZ < (maxExtent * .75) or extentZ > (maxExtent * 1.25):
midZ += maxExtent
for i in range(len(solids)):
origin = origins[i]
x = origin.getX(); y = origin.getY(); z = origin.getZ()
if x < midX:
if y < midY:
if z < midZ:
xyzSolids.append(solids[i])
else:
xyZSolids.append(solids[i])
else:
if z < midZ:
xYzSolids.append(solids[i])
else:
xYZSolids.append(solids[i])
else:
if y < midY:
if z < midZ:
XyzSolids.append(solids[i])
else:
XyZSolids.append(solids[i])
else:
if z < midZ:
XYzSolids.append(solids[i])
else:
XYZSolids.append(solids[i])
newSolids = []
if len(xyzSolids):
newSolids.append(self.r_subdivideCollisions(xyzSolids, numSolidsInLeaves))
if len(XyzSolids):
newSolids.append(self.r_subdivideCollisions(XyzSolids, numSolidsInLeaves))
if len(xYzSolids):
newSolids.append(self.r_subdivideCollisions(xYzSolids, numSolidsInLeaves))
if len(XYzSolids):
newSolids.append(self.r_subdivideCollisions(XYzSolids, numSolidsInLeaves))
if len(xyZSolids):
newSolids.append(self.r_subdivideCollisions(xyZSolids, numSolidsInLeaves))
if len(XyZSolids):
newSolids.append(self.r_subdivideCollisions(XyZSolids, numSolidsInLeaves))
if len(xYZSolids):
newSolids.append(self.r_subdivideCollisions(xYZSolids, numSolidsInLeaves))
if len(XYZSolids):
newSolids.append(self.r_subdivideCollisions(XYZSolids, numSolidsInLeaves))
#import pdb;pdb.set_trace()
return newSolids
def r_constructCollisionTree(self, solidTree, parentNode, colName):
for item in solidTree:
if type(item[0]) == type([]):
newNode = parentNode.attachNewNode('%s-branch' % colName)
self.r_constructCollisionTree(item, newNode, colName)
else:
cn = CollisionNode('%s-leaf' % colName)
for solid in item:
cn.addSolid(solid)
parentNode.attachNewNode(cn)
Dtool_funcToMethod(subdivideCollisions, NodePath)
Dtool_funcToMethod(r_subdivideCollisions, NodePath)
Dtool_funcToMethod(r_constructCollisionTree, NodePath)
del subdivideCollisions
del r_subdivideCollisions
del r_constructCollisionTree
#####################################################################
def analyze(self):
"""
Analyzes the geometry below this node and reports the
number of vertices, triangles, etc. This is the same
information reported by the bam-info program.
"""
from panda3d.core import SceneGraphAnalyzer
sga = SceneGraphAnalyzer()
sga.addNode(self.node())
if sga.getNumLodNodes() == 0:
print(sga)
else:
print("At highest LOD:")
sga2 = SceneGraphAnalyzer()
sga2.setLodMode(sga2.LMHighest)
sga2.addNode(self.node())
print(sga2)
print("\nAt lowest LOD:")
sga2.clear()
sga2.setLodMode(sga2.LMLowest)
sga2.addNode(self.node())
print(sga2)
print("\nAll nodes:")
print(sga)
Dtool_funcToMethod(analyze, NodePath)
del analyze
#####################################################################