from panda3d.core import *
from panda3d.physics import *
from direct.showbase.DirectObject import DirectObject
from direct.showbase.PhysicsManagerGlobal import *
from direct.directnotify import DirectNotifyGlobal
import sys
import warnings
[docs]class ForceGroup(DirectObject):
notify = DirectNotifyGlobal.directNotify.newCategory('ForceGroup')
id = 1
[docs] def __init__(self, name=None):
if name is None:
self.name = 'ForceGroup-%d' % ForceGroup.id
ForceGroup.id += 1
else:
self.name = name
self.node = ForceNode(self.name)
self.nodePath = NodePath(self.node)
self.fEnabled = 0
self.particleEffect = None
[docs] def cleanup(self):
self.node.clear()
self.nodePath.removeNode()
del self.nodePath
del self.node
del self.particleEffect
[docs] def enable(self):
"""Convenience function to enable all forces in force group"""
for i in range(self.node.getNumForces()):
f = self.node.getForce(i)
f.setActive(1)
self.fEnabled = 1
[docs] def disable(self):
"""Convenience function to disable all forces in force group"""
for i in range(self.node.getNumForces()):
f = self.node.getForce(i)
f.setActive(0)
self.fEnabled = 0
[docs] def isEnabled(self):
return self.fEnabled
[docs] def addForce(self, force):
self.node.addForce(force)
if self.particleEffect:
self.particleEffect.addForce(force)
[docs] def removeForce(self, force):
self.node.removeForce(force)
if self.particleEffect is not None:
self.particleEffect.removeForce(force)
# Get/set
[docs] def getName(self):
warnings.warn("Deprecated: access .name directly instead.", DeprecationWarning, stacklevel=2)
return self.name
[docs] def getNode(self):
return self.node
[docs] def getNodePath(self):
return self.nodePath
# Utility functions
def __getitem__(self, index):
numForces = self.node.getNumForces()
if index < 0 or index >= numForces:
raise IndexError
return self.node.getForce(index)
def __len__(self):
return self.node.getNumForces()
[docs] def asList(self):
l = []
for i in range(self.node.getNumForces()):
l.append(self.node.getForce(i))
return l
[docs] def printParams(self, file = sys.stdout, targ = 'self'):
file.write('# Force parameters\n')
for i in range(self.node.getNumForces()):
f = self.node.getForce(i)
fname = 'force%d' % i
if isinstance(f, LinearForce):
amplitude = f.getAmplitude()
massDependent = f.getMassDependent()
if isinstance(f, LinearCylinderVortexForce):
file.write(fname + ' = LinearCylinderVortexForce(%.4f, %.4f, %.4f, %.4f, %d)\n' % (f.getRadius(), f.getLength(), f.getCoef(), amplitude, massDependent))
elif isinstance(f, LinearDistanceForce):
radius = f.getRadius()
falloffType = f.getFalloffType()
ftype = 'FTONEOVERR'
if falloffType == LinearDistanceForce.FTONEOVERR:
ftype = 'FTONEOVERR'
elif falloffType == LinearDistanceForce.FTONEOVERRSQUARED:
ftype = 'FTONEOVERRSQUARED'
elif falloffType == LinearDistanceForce.FTONEOVERRCUBED:
ftype = 'FTONEOVERRCUBED'
forceCenter = f.getForceCenter()
if isinstance(f, LinearSinkForce):
file.write(fname + ' = LinearSinkForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
elif isinstance(f, LinearSourceForce):
file.write(fname + ' = LinearSourceForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
elif isinstance(f, LinearFrictionForce):
file.write(fname + ' = LinearFrictionForce(%.4f, %.4f, %d)\n' % (f.getCoef(), amplitude, massDependent))
elif isinstance(f, LinearJitterForce):
file.write(fname + ' = LinearJitterForce(%.4f, %d)\n' % (amplitude, massDependent))
elif isinstance(f, LinearNoiseForce):
file.write(fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
elif isinstance(f, LinearVectorForce):
vec = f.getLocalVector()
file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
mask = f.getVectorMasks()
file.write(fname + '.setVectorMasks(%d, %d, %d)\n' % (mask[0],mask[1],mask[2]))
elif isinstance(f, AngularForce):
if isinstance(f, AngularVectorForce):
vec = f.getQuat()
file.write(fname + ' = AngularVectorForce(Quat(%.4f, %.4f, %.4f, %.4f))\n' % (vec[0], vec[1], vec[2], vec[3]))
file.write(fname + '.setActive(%d)\n' % f.getActive())
file.write(targ + '.addForce(%s)\n' % fname)
is_enabled = isEnabled
get_node = getNode
get_node_path = getNodePath
as_list = asList
print_params = printParams