seForceGroup.py 5.5 KB

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