ForceGroup.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from pandac.PandaModules import *
  2. from direct.showbase.DirectObject import DirectObject
  3. from direct.showbase.PhysicsManagerGlobal import *
  4. from direct.directnotify import DirectNotifyGlobal
  5. import sys
  6. class ForceGroup(DirectObject):
  7. notify = DirectNotifyGlobal.directNotify.newCategory('ForceGroup')
  8. id = 1
  9. def __init__(self, name=None):
  10. if (name == None):
  11. self.name = 'ForceGroup-%d' % ForceGroup.id
  12. ForceGroup.id += 1
  13. else:
  14. self.name = name
  15. self.node = ForceNode(self.name)
  16. self.nodePath = NodePath(self.node)
  17. self.fEnabled = 0
  18. self.particleEffect = None
  19. def cleanup(self):
  20. self.node.clear()
  21. self.nodePath.removeNode()
  22. del self.nodePath
  23. del self.node
  24. del self.particleEffect
  25. def enable(self):
  26. """Convenience function to enable all forces in force group"""
  27. for i in range(self.node.getNumForces()):
  28. f = self.node.getForce(i)
  29. f.setActive(1)
  30. self.fEnabled = 1
  31. def disable(self):
  32. """Convenience function to disable all forces in force group"""
  33. for i in range(self.node.getNumForces()):
  34. f = self.node.getForce(i)
  35. f.setActive(0)
  36. self.fEnabled = 0
  37. def isEnabled(self):
  38. return self.fEnabled
  39. def addForce(self, force):
  40. self.node.addForce(force)
  41. if (self.particleEffect):
  42. self.particleEffect.addForce(force)
  43. def removeForce(self, force):
  44. self.node.removeForce(force)
  45. if (self.particleEffect != None):
  46. self.particleEffect.removeForce(force)
  47. # Get/set
  48. def getName(self):
  49. return self.name
  50. def getNode(self):
  51. return self.node
  52. def getNodePath(self):
  53. return self.nodePath
  54. # Utility functions
  55. def __getitem__(self, index):
  56. numForces = self.node.getNumForces()
  57. if ((index < 0) or (index >= numForces)):
  58. raise IndexError
  59. return self.node.getForce(index)
  60. def __len__(self):
  61. return self.node.getNumForces()
  62. def asList(self):
  63. l = []
  64. for i in range(self.node.getNumForces()):
  65. l.append(self.node.getForce(i))
  66. return l
  67. def printParams(self, file = sys.stdout, targ = 'self'):
  68. file.write('# Force parameters\n')
  69. for i in range(self.node.getNumForces()):
  70. f = self.node.getForce(i)
  71. fname = 'force%d' % i
  72. if isinstance(f, LinearForce):
  73. amplitude = f.getAmplitude()
  74. massDependent = f.getMassDependent()
  75. if isinstance(f, LinearCylinderVortexForce):
  76. file.write(fname + ' = LinearCylinderVortexForce(%.4f, %.4f, %.4f, %.4f, %d)\n' % (f.getRadius(), f.getLength(), f.getCoef(), amplitude, massDependent))
  77. elif isinstance(f, LinearDistanceForce):
  78. radius = f.getRadius()
  79. falloffType = f.getFalloffType()
  80. ftype = 'FTONEOVERR'
  81. if (falloffType == LinearDistanceForce.FTONEOVERR):
  82. ftype = 'FTONEOVERR'
  83. elif (falloffType == LinearDistanceForce.FTONEOVERRSQUARED):
  84. ftype = 'FTONEOVERRSQUARED'
  85. elif (falloffType == LinearDistanceForce.FTONEOVERRCUBED):
  86. ftype = 'FTONEOVERRCUBED'
  87. forceCenter = f.getForceCenter()
  88. if isinstance(f, LinearSinkForce):
  89. file.write(fname + ' = LinearSinkForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
  90. elif isinstance(f, LinearSourceForce):
  91. file.write(fname + ' = LinearSourceForce(Point3(%.4f, %.4f, %.4f), LinearDistanceForce.%s, %.4f, %.4f, %d)\n' % (forceCenter[0], forceCenter[1], forceCenter[2], ftype, radius, amplitude, massDependent))
  92. elif isinstance(f, LinearFrictionForce):
  93. file.write(fname + ' = LinearFrictionForce(%.4f, %.4f, %d)\n' % (f.getCoef(), amplitude, massDependent))
  94. elif isinstance(f, LinearJitterForce):
  95. file.write(fname + ' = LinearJitterForce(%.4f, %d)\n' % (amplitude, massDependent))
  96. elif isinstance(f, LinearNoiseForce):
  97. file.write(fname + ' = LinearNoiseForce(%.4f, %d)\n' % (amplitude, massDependent))
  98. elif isinstance(f, LinearVectorForce):
  99. vec = f.getLocalVector()
  100. file.write(fname + ' = LinearVectorForce(Vec3(%.4f, %.4f, %.4f), %.4f, %d)\n' % (vec[0], vec[1], vec[2], amplitude, massDependent))
  101. elif isinstance(f, AngularForce):
  102. if isinstance(f, AngularVectorForce):
  103. vec = f.getQuat()
  104. file.write(fname + ' = AngularVectorForce(Quat(%.4f, %.4f, %.4f))\n' % (vec[0], vec[1], vec[2], vec[3]))
  105. file.write(fname + '.setActive(%d)\n' % f.getActive())
  106. file.write(targ + '.addForce(%s)\n' % fname)