seForceGroup.py 5.3 KB

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