seForceGroup.py 5.4 KB

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