| 80 | |
| 81 | |
| 82 | class ParticleSystem(object): |
| 83 | def __init__(self): |
| 84 | super(ParticleSystem, self).__init__() |
| 85 | self.time = -1 |
| 86 | self._states = list() |
| 87 | self.addState() |
| 88 | self.clear() |
| 89 | |
| 90 | def clear(self): |
| 91 | self.particles = list() |
| 92 | mscreen.clear() |
| 93 | |
| 94 | def addPoint(self, state=0): |
| 95 | p = Particle() |
| 96 | p.id = len(self.particles) |
| 97 | p.state = state |
| 98 | self.particles.append(p) |
| 99 | return p |
| 100 | |
| 101 | def addState(self): |
| 102 | index = len(self._states) |
| 103 | forces = list() |
| 104 | emitters = list() |
| 105 | ageLimit = None |
| 106 | self._states.append([forces, emitters, ageLimit]) |
| 107 | return index |
| 108 | |
| 109 | def addForce(self, force, state=0): |
| 110 | self._states[state][0].append(force) |
| 111 | |
| 112 | def addEmitter(self, emitter, state=0): |
| 113 | self._states[state][1].append(emitter) |
| 114 | |
| 115 | def setAgeLimit(self, value, state=0): |
| 116 | self._states[state][2] = value |
| 117 | |
| 118 | def simulate(self, time): |
| 119 | if time == 1 and time != self.time: |
| 120 | self.clear() |
| 121 | self.time = 1 |
| 122 | return |
| 123 | if time <= self.time: |
| 124 | return |
| 125 | |
| 126 | for state in self._states: |
| 127 | emitters = state[1] |
| 128 | for e in emitters: |
| 129 | for _ in range(e.rate): |
| 130 | p = self.addPoint() |
| 131 | p.position = om2.MVector(e.position) |
| 132 | p.velocity = om2.MVector(e.initialVelocity) |
| 133 | |
| 134 | for p in self.particles: |
| 135 | if p is None: |
| 136 | continue |
| 137 | # update velocity |
| 138 | forces = self._states[p.state][0] |
| 139 | for f in forces: |