def test_coord_set_weights(self): from lepton.texturizer import SpriteTexturizer coord_set1 = ((0.5,0.5), (1,0.5), (1,1), (0.5,1)) coord_set2 = (0,0.5, 0.5,0.5, 0.5,1, 0,1) coord_set3 = (0.5,0, 1,0, 1,0.5, 0.5,0.5) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2, coord_set3), weights=(20, 30, 50)) coord_sets = tex.tex_coords self.assertEqual(coord_sets, ( (0.5,0.5, 1,0.5, 1,1, 0.5,1), (0,0.5, 0.5,0.5, 0.5,1, 0,1), (0.5,0, 1,0, 1,0.5, 0.5,0.5)) ) self.assertEqual(len(tex.weights), 3) self.assertAlmostEqual(tex.weights[0], 0.20) self.assertAlmostEqual(tex.weights[1], 0.30) self.assertAlmostEqual(tex.weights[2], 0.50) group = self._make_group(1000) coords = tuple(tex.generate_tex_coords(group)) self.failUnless(len(coords) >= 8000, (len(coords), len(group))) counts = {coord_sets[0]: 0, coord_sets[1]: 0, coord_sets[2]: 0} for i in range(1000): cset = coords[i*8:i*8+8] self.failUnless(cset in counts, cset) counts[cset] += 1 self.assertEqual(sum(counts.values()), 1000) self.failUnless(250 > counts[coord_sets[0]] > 150, counts[coord_sets[0]]) self.failUnless(375 > counts[coord_sets[1]] > 225, counts[coord_sets[1]]) self.failUnless(600 > counts[coord_sets[2]] > 400, counts[coord_sets[2]])
def test_coord_set_weights(self): from lepton.texturizer import SpriteTexturizer coord_set1 = ((0.5, 0.5), (1, 0.5), (1, 1), (0.5, 1)) coord_set2 = (0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1) coord_set3 = (0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2, coord_set3), weights=(20, 30, 50)) coord_sets = tex.tex_coords self.assertEqual(coord_sets, ((0.5, 0.5, 1, 0.5, 1, 1, 0.5, 1), (0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1), (0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5))) self.assertEqual(len(tex.weights), 3) self.assertAlmostEqual(tex.weights[0], 0.20) self.assertAlmostEqual(tex.weights[1], 0.30) self.assertAlmostEqual(tex.weights[2], 0.50) group = self._make_group(1000) coords = tuple(tex.generate_tex_coords(group)) self.failUnless(len(coords) >= 8000, (len(coords), len(group))) counts = {coord_sets[0]: 0, coord_sets[1]: 0, coord_sets[2]: 0} for i in range(1000): cset = coords[i * 8:i * 8 + 8] self.failUnless(cset in counts, cset) counts[cset] += 1 self.assertEqual(sum(counts.values()), 1000) self.failUnless(250 > counts[coord_sets[0]] > 150, counts[coord_sets[0]]) self.failUnless(375 > counts[coord_sets[1]] > 225, counts[coord_sets[1]]) self.failUnless(600 > counts[coord_sets[2]] > 400, counts[coord_sets[2]])
def test_default_coords(self): from lepton.texturizer import SpriteTexturizer tex = SpriteTexturizer(0) self.assertEqual(tex.tex_dimension, 2) expected = (0,0, 1,0, 1,1, 0,1) self.assertEqual(tex.tex_coords, None) self.assertEqual(tex.weights, None) group = self._make_group(4) coords = tex.generate_tex_coords(group) self.failUnless(len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(tuple(coords), expected * (len(coords) // 8)) return tex, group
def test_coord_set_weights_deterministic(self): from lepton.texturizer import SpriteTexturizer coord_set1 = ((0.5,0.5), (1,0.5), (1,1), (0.5,1)) coord_set2 = (0,0.5, 0.5,0.5, 0.5,1, 0,1) coord_set3 = (0.5,0, 1,0, 1,0.5, 0.5,0.5) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2, coord_set3), weights=(20, 70, 10)) coord_sets = tex.tex_coords group = self._make_group(20) coords = [tuple(tex.generate_tex_coords(group)) for i in range(20)] for cs in coords: self.assertEqual(cs, coords[0])
def test_single_coord_set(self): from lepton.texturizer import SpriteTexturizer coord_set = (0,0, 0.5,0, 0.5,0.5, 0,0.5) tex = SpriteTexturizer(0, coords=[coord_set]) self.assertEqual(tex.tex_dimension, 2) self.assertEqual(tex.tex_coords, (coord_set,)) self.assertEqual(tex.weights, None) group = self._make_group(4) coords = tex.generate_tex_coords(group) self.failUnless(len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(tuple(coords), coord_set * (len(coords) // 8)) return coord_set, tex, group
def test_default_coords(self): from lepton.texturizer import SpriteTexturizer tex = SpriteTexturizer(0) self.assertEqual(tex.tex_dimension, 2) expected = (0, 0, 1, 0, 1, 1, 0, 1) self.assertEqual(tex.tex_coords, None) self.assertEqual(tex.weights, None) group = self._make_group(4) coords = tex.generate_tex_coords(group) self.failUnless( len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(tuple(coords), expected * (len(coords) // 8)) return tex, group
def test_coord_set_weights_deterministic(self): from lepton.texturizer import SpriteTexturizer coord_set1 = ((0.5, 0.5), (1, 0.5), (1, 1), (0.5, 1)) coord_set2 = (0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1) coord_set3 = (0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2, coord_set3), weights=(20, 70, 10)) coord_sets = tex.tex_coords group = self._make_group(20) coords = [tuple(tex.generate_tex_coords(group)) for i in range(20)] for cs in coords: self.assertEqual(cs, coords[0])
def test_single_coord_set(self): from lepton.texturizer import SpriteTexturizer coord_set = (0, 0, 0.5, 0, 0.5, 0.5, 0, 0.5) tex = SpriteTexturizer(0, coords=[coord_set]) self.assertEqual(tex.tex_dimension, 2) self.assertEqual(tex.tex_coords, (coord_set, )) self.assertEqual(tex.weights, None) group = self._make_group(4) coords = tex.generate_tex_coords(group) self.failUnless( len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(tuple(coords), coord_set * (len(coords) // 8)) return coord_set, tex, group
def test_set_state_restore_state(self): from lepton.texturizer import SpriteTexturizer texture = (ctypes.c_ulong * 1)() glGenTextures(1, texture) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, 0) sprite_tex = SpriteTexturizer(texture[0]) self.failIf(self._glGet(GL_TEXTURE_2D)) self.assertEqual(self._glGet(GL_TEXTURE_BINDING_2D), 0) sprite_tex.set_state() self.failUnless(self._glGet(GL_TEXTURE_2D)) self.assertEqual(self._glGet(GL_TEXTURE_BINDING_2D), texture[0]) sprite_tex.restore_state() self.failIf(self._glGet(GL_TEXTURE_2D))
class Impact: lifetime = 0.5 color = (0.9, 0.6, 0.2, 0.3) spark_tex = pyglet.resource.texture('bullet.png') spark_texturizer = SpriteTexturizer(spark_tex.id) sparks = ParticleGroup(controllers=[ Lifetime(lifetime), Movement(), ColorBlender([(0, (1, 1, 1, 1)), (lifetime * 0.8, color), (lifetime, (0, 0, 0, 0))]), ], renderer=BillboardRenderer(spark_texturizer)) @classmethod def emit(cls, position, velocity): x, y = position + velocity * 0.3 emitter = StaticEmitter(template=Particle(position=(x, y, 0), size=(5, ) * 3, color=cls.color), deviation=Particle(age=0.2), velocity=domain.Disc((*-2 * velocity, 0), (0, 0, 1), 100)) emitter.emit(10, cls.sparks)
class Debris: lifetime = 0.5 color = (1.0, 1.0, 1.0, 1.0) fragment_tex = pyglet.resource.texture('fragment.png') fragment_texturizer = SpriteTexturizer(fragment_tex.id) fragments = ParticleGroup(controllers=[ Lifetime(lifetime), Movement(), ], renderer=BillboardRenderer(fragment_texturizer), system=diffuse_system) @classmethod def emit(cls, position): emitter = StaticEmitter(template=Particle(position=(*position, 0), size=(16, ) * 3, rotation=(0, 0, 1), color=cls.color), deviation=Particle(age=0.2, rotation=(0, 0, 2)), velocity=domain.Disc((0, 0, 0), (0, 0, 1), 100)) emitter.emit(20, cls.fragments)
def create_group(self, controllers, texture): particlegroup = ParticleGroup(controllers=controllers, system=self.system) texturizer = SpriteTexturizer(texture.id) particlegroup.renderer = BillboardRenderer(texturizer) self.textures.add( texture) # hold a reference to this, otherwise it will get deleted return particlegroup
def explosion(self, pos, magnitude): sparks = ParticleGroup( controllers=[ Lifetime(3), Movement(damping=0.93), Fader(fade_out_start=0.75, fade_out_end=3.0), ], renderer=BillboardRenderer(SpriteTexturizer(self.particle1_tex.id))) spark_emitter = StaticEmitter( template=Particle( position=(pos[0], pos[1], 0), color=(1, 1, 1)), deviation=Particle( position=(1, 1, 0), velocity=(300, 300, 0), age=1.5), size=[(3, 3, 0), (4, 4, 0), (5, 5, 0), (5, 5, 0), (6, 6, 0), (7, 7, 0)]) spark_emitter.emit(magnitude, sparks) fire = ParticleGroup( controllers=[ Lifetime(2), Movement(damping=0.95), Growth(60), Fader(fade_in_start=0, start_alpha=0, fade_in_end=0.5, max_alpha=0.6, fade_out_start=1.0, fade_out_end=2.0) ], renderer=BillboardRenderer(SpriteTexturizer(self.smoke1_tex.id))) fire_emitter = StaticEmitter( template=Particle( position=(pos[0], pos[1], 0), size=(50, 50, 0)), deviation=Particle( position=(0.5, 0.5, 0), velocity=(70, 70, 0), size=(20, 20, 0), up=(0, 0, math.pi * 2), rotation=(0, 0, math.pi * 0.06), age=2, ), color=[(0.5, 0, 0), (0.5, 0.5, 0.5), (0.4, 0.1, 0.1), (0.85, 0.3, 0)], ) fire_emitter.emit(400, fire)
class Kaboom: lifetime = 0.6 color = (0.9, 0.6, 0.2, 0.3) spark_tex = pyglet.resource.texture('bullet.png') spark_texturizer = SpriteTexturizer(spark_tex.id) sparks = ParticleGroup(controllers=[ Lifetime(lifetime), Movement(damping=0.93), ColorBlender([(0, (1, 1, 1, 1)), (lifetime * 0.8, color), (lifetime, color)]), Fader(fade_out_start=0.3, fade_out_end=lifetime), ], renderer=BillboardRenderer(spark_texturizer)) trails = ParticleGroup(controllers=[ Lifetime(lifetime * 1.5), Movement(damping=0.83), ColorBlender([(0, (1, 1, 1, 1)), (1, color), (lifetime, color)]), Fader(max_alpha=0.75, fade_out_start=0, fade_out_end=lifetime), ], renderer=BillboardRenderer(spark_texturizer)) splosions = set() def __init__(self, position): x, y = position spark_emitter = StaticEmitter( template=Particle(position=(uniform(x - 5, x + 5), uniform(y - 5, y + 5), 0), size=(10, ) * 3, color=self.color), deviation=Particle(velocity=(gauss(0, 5), gauss(0, 5), 0), age=1.5), velocity=domain.Sphere((0, gauss(40, 20), 0), 60, 60)) spark_emitter.emit(int(gauss(60, 40)) + 50, self.sparks) spread = abs(gauss(0.4, 1.0)) self.trail_emitter = PerParticleEmitter( self.sparks, rate=uniform(5, 30), template=Particle(size=(6, ) * 3, color=self.color), deviation=Particle(velocity=(spread, spread, spread), age=self.lifetime * 0.75)) self.trails.bind_controller(self.trail_emitter) self.splosions.add(self) pyglet.clock.schedule_once(self.die, self.lifetime) def die(self, dt=None): self.trails.unbind_controller(self.trail_emitter) self.splosions.remove(self)
def test_mutiple_coord_sets(self): from lepton.texturizer import SpriteTexturizer coord_set1 = (0.5, 0.5, 1, 0.5, 1, 1, 0.5, 1) coord_set2 = ((0, 0.5), (0.5, 0.5), (0.5, 1), (0, 1)) coord_set3 = (0.5, 0, 0, 1, 0, 0, 1, 0.5, 0, 0.5, 0.5, 0) tex = SpriteTexturizer(0, coords=[coord_set1, coord_set2, coord_set3]) coord_sets = tex.tex_coords self.assertEqual(coord_sets, ((0.5, 0.5, 1, 0.5, 1, 1, 0.5, 1), (0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1), (0.5, 0, 1, 0, 1, 0.5, 0.5, 0.5))) self.assertEqual(tex.weights, None) group = self._make_group(6) coords = tuple(tex.generate_tex_coords(group)) self.failUnless( len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(coords[:8], coord_sets[0]) self.assertEqual(coords[8:16], coord_sets[1]) self.assertEqual(coords[16:24], coord_sets[2]) self.assertEqual(coords[24:32], coord_sets[0]) self.assertEqual(coords[32:40], coord_sets[1]) self.assertEqual(coords[40:48], coord_sets[2])
def test_mutiple_coord_sets(self): from lepton.texturizer import SpriteTexturizer coord_set1 = (0.5,0.5, 1,0.5, 1,1, 0.5,1) coord_set2 = ((0,0.5), (0.5,0.5), (0.5,1), (0,1)) coord_set3 = (0.5,0,0, 1,0,0, 1,0.5,0, 0.5,0.5,0) tex = SpriteTexturizer(0, coords=[coord_set1, coord_set2, coord_set3]) coord_sets = tex.tex_coords self.assertEqual(coord_sets, ( (0.5,0.5, 1,0.5, 1,1, 0.5,1), (0,0.5, 0.5,0.5, 0.5,1, 0,1), (0.5,0, 1,0, 1,0.5, 0.5,0.5)) ) self.assertEqual(tex.weights, None) group = self._make_group(6) coords = tuple(tex.generate_tex_coords(group)) self.failUnless(len(coords) >= len(group) * 8, (len(coords), len(group))) self.assertEqual(coords[:8], coord_sets[0]) self.assertEqual(coords[8:16], coord_sets[1]) self.assertEqual(coords[16:24], coord_sets[2]) self.assertEqual(coords[24:32], coord_sets[0]) self.assertEqual(coords[32:40], coord_sets[1]) self.assertEqual(coords[40:48], coord_sets[2])
def test_aspect_adjust(self): from lepton.texturizer import SpriteTexturizer coord_set1 = (0,0, 1,0, 1,0.5, 0,0.5) coord_set2 = (0,0.5, 0.5,0.5, 0.5,1, 0,1) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2)) self.failIf(tex.aspect_adjust_width) self.failIf(tex.aspect_adjust_height) sizes = [ (1, 1, 0), (2, 3, 0), ] group = self._make_group(2) for size, p in zip(sizes, group): p.size = size self.assertEqual([tuple(p.size) for p in group], sizes) tex.generate_tex_coords(group) self.assertEqual([tuple(p.size) for p in group], sizes) tex.aspect_adjust_width = True expected = [ (2, 1, 0), (3, 3, 0), ] tex.generate_tex_coords(group) for p, b in zip(group, expected): self.assertVector(p.size, b) for size, p in zip(sizes, group): p.size = size self.assertEqual([tuple(p.size) for p in group], sizes) tex.aspect_adjust_width = False tex.aspect_adjust_height = True expected = [ (1, 0.5, 0), (2, 2, 0), ] tex.generate_tex_coords(group) for p, b in zip(group, expected): self.assertVector(p.size, b)
class Trail: LIFETIME = 0.2 sprite = pyglet.resource.texture('trail.png') group = ParticleGroup( controllers=[ Lifetime(LIFETIME), #Fader(start_alpha=1.0, fade_out_start=0, fade_out_end=LIFETIME), Growth(-50), Movement(), ], renderer=BillboardRenderer(SpriteTexturizer(sprite.id))) def __init__(self, player, viewport, level): self.player = player self.viewport = viewport self.level = level self.emitter = StaticEmitter( rate=player.body.velocity.length, template=Particle( position=(*level.map_to_world(player.position), 0), color=(1.0, 1.0, 1.0, 1.0), size=(16.0, ) * 3, ), ) self.group.bind_controller(self.emitter) pyglet.clock.schedule(self.update) def destroy(self): self.group.unbind_controller(self.emitter) def update(self, *_): level = self.level dir = self.player.body.velocity l = dir.length self.emitter.rate = l * 2 if self.player.health > 0 else 0 if l: back = self.player.position - dir.normalized() * 0.1 backwards = -0.1 * dir self.emitter.template.position = (*level.map_to_world(back), 0) self.emitter.template.velocity = (*level.map_to_world(backwards), 0) self.emitter.template.up = (0, 0, dir.get_angle() - self.viewport.angle)
def emit_sparks(self, pos, count): sparks = ParticleGroup( controllers=[ Lifetime(1), Movement(damping=0.93), Fader(fade_out_start=0.75, fade_out_end=1.0), ], renderer=BillboardRenderer(SpriteTexturizer(self.particle1_tex.id))) spark_emitter = StaticEmitter( template=Particle( position=(pos[0], pos[1], 0), color=(1, 1, 1)), deviation=Particle( position=(1, 1, 0), velocity=(100, 100, 0), age=1.5), size=[(6, 6, 0), (7, 7, 0), (12, 12, 0)]) spark_emitter.emit(count, sparks)
def test_set_state_restore_state(self): from lepton.texturizer import SpriteTexturizer texture = (ctypes.c_uint * 1)() glGenTextures(1, texture) glDisable(GL_TEXTURE_2D) glBindTexture(GL_TEXTURE_2D, 0) sprite_tex = SpriteTexturizer(texture[0]) self.failIf(self._glGet(GL_TEXTURE_2D)) self.assertEqual(self._glGet(GL_TEXTURE_BINDING_2D), 0) sprite_tex.set_state() self.failUnless(self._glGet(GL_TEXTURE_2D)) self.assertEqual(self._glGet(GL_TEXTURE_BINDING_2D), texture[0]) sprite_tex.restore_state() self.failIf(self._glGet(GL_TEXTURE_2D))
class Smoke: LIFETIME = 0.8 sprite = pyglet.resource.texture('smoke.png') group = ParticleGroup(controllers=[ Lifetime(LIFETIME), Fader(start_alpha=0.3, fade_out_start=0, fade_out_end=LIFETIME), Growth(100), Movement(), ], renderer=BillboardRenderer( SpriteTexturizer(sprite.id)), system=diffuse_system) def __init__(self, wpos): self.last_pos = wpos self.domain = Cylinder((*wpos, -10), (*wpos, 0), 5) self.emitter = StaticEmitter(rate=600, position=self.domain, template=Particle( color=(1.0, 1.0, 1.0, 0.3), size=(2.0, ) * 3, rotation=(0, 0, 1), velocity=(0, 0, 0), ), deviation=Particle( rotation=(0, 0, 0.5), angle=(0, 0, 6), )) self.group.bind_controller(self.emitter) def destroy(self): self.group.unbind_controller(self.emitter) def set_world_position(self, wpos, velocity): pos = Vec2d(wpos) back = pos - velocity self.domain.end_point1 = (*back, 0) self.domain.end_point0 = (*pos, 0) self.emitter.template.velocity = (*(-2 * velocity), 0)
glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(70, 1.0 * widthWindow / heightWindow, 0.001, 10000.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() win.on_resize = resize electron_lifetime = 22 max_electrons = 6 trail_lifetime = 4.5 texture = image.load(os.path.join(os.path.dirname(__file__), 'flare3.png')).get_texture() texturizer = SpriteTexturizer(texture.id) nucleus = Sphere((0, 0, 0), 5) protons = ParticleGroup(renderer=BillboardRenderer(texturizer), controllers=[ Movement(), ]) proton_emitter = StaticEmitter(template=Particle( size=(30, 30, 0), color=(0.5, 1.0, 0.2, 0.5), ), size=[(26, 26, 0), (30, 30, 0), (34, 34, 0)], deviation=Particle(rotation=(0, 0, math.pi / 6), )) proton_emitter.emit(3, protons)
def test_aspect_adjust(self): from lepton.texturizer import SpriteTexturizer coord_set1 = (0, 0, 1, 0, 1, 0.5, 0, 0.5) coord_set2 = (0, 0.5, 0.5, 0.5, 0.5, 1, 0, 1) tex = SpriteTexturizer(0, coords=(coord_set1, coord_set2)) self.failIf(tex.aspect_adjust_width) self.failIf(tex.aspect_adjust_height) sizes = [ (1, 1, 0), (2, 3, 0), ] group = self._make_group(2) for size, p in zip(sizes, group): p.size = size self.assertEqual([tuple(p.size) for p in group], sizes) tex.generate_tex_coords(group) self.assertEqual([tuple(p.size) for p in group], sizes) tex.aspect_adjust_width = True expected = [ (2, 1, 0), (3, 3, 0), ] tex.generate_tex_coords(group) for p, b in zip(group, expected): self.assertVector(p.size, b) for size, p in zip(sizes, group): p.size = size self.assertEqual([tuple(p.size) for p in group], sizes) tex.aspect_adjust_width = False tex.aspect_adjust_height = True expected = [ (1, 0.5, 0), (2, 2, 0), ] tex.generate_tex_coords(group) for p, b in zip(group, expected): self.assertVector(p.size, b)
velocity=(0,5,0), ) ) default_system.add_global_controller( Movement(), Collector(Plane((0, 0, 0), (0, 0, -1))), Fader(fade_in_end=15.0), ) font = pyglet.font.load(size=72) # Try to force all glyphs into a single texture font.texture_width = font.texture_height = 1024 letter_textures = font.get_glyphs(string.ascii_lowercase) texturizer = SpriteTexturizer( letter_textures[0].texture.id, coords=[tex.tex_coords for tex in letter_textures], aspect_adjust_width=True) group = ParticleGroup(controllers=[emitter], renderer=BillboardRenderer(texturizer)) win.set_visible(True) pyglet.clock.schedule_interval(default_system.update, (1.0/40.0)) pyglet.clock.set_fps_limit(None) @win.event def on_draw(): win.clear() glLoadIdentity() default_system.draw()
velocity=(0.7,0.7,0.7), up=(0,0,math.pi), rotation=(0,0,math.pi), color=(0.5, 0.5, 0.5)) ) default_system.add_global_controller( Lifetime(3.0), Movement(min_velocity=5), Fader(max_alpha=0.7, fade_out_start=1, fade_out_end=3.0), ) images = [image.load(os.path.join(os.path.dirname(__file__), 'flare%s.png' % (i+1))) for i in range(4)] group = ParticleGroup(controllers=[comet], renderer=BillboardRenderer(SpriteTexturizer.from_images(images))) pyglet.clock.schedule_interval(default_system.update, (1.0/30.0)) pyglet.clock.set_fps_limit(None) arc_radius = 150 angle = math.pi * 0.7 speed = 1.0 def move_comet(td): global angle, arc_radius, speed comet.template.position = ( -math.sin(angle) * arc_radius * 0.3, math.sin(angle * 0.7) * arc_radius * 0.03, -math.cos(angle) * arc_radius - arc_radius * 1.05) comet.template.velocity = ( comet.template.position.x*0.05 - comet.template.last_position.x,
velocity=(0,35,0), color=(0.8,0.8,0.8,0.005), ), deviation=Particle( position=(10,5,0), velocity=(3,6,0), color=(0.05,0.05,0.05,0.0), ) ) default_system.add_global_controller( Lifetime(20), Gravity((0, -2, 0)), Movement(), Fader(fade_in_end=1.5, max_alpha=0.05, fade_out_start=12, fade_out_end=20), ) group1 = ParticleGroup(controllers=[smoke], renderer=PointRenderer(64, SpriteTexturizer(create_point_texture(64, 1)))) win.set_visible(True) pyglet.clock.schedule_interval(default_system.update, (1.0/30.0)) @win.event def on_draw(): win.clear() glLoadIdentity() default_system.draw() if __name__ == '__main__': pyglet.app.run()
Movement(), ColorBlender([ (0, (0, 0, 0.5, 0)), (0.5, (0, 0, 0.5, 0.2)), (0.75, (0, 0.5, 1, 0.6)), (1.5, (1, 1, 0, 0.2)), (2.7, (0.9, 0.2, 0, 0.4)), (3.2, (0.6, 0.1, 0.05, 0.2)), (4.0, (0.8, 0.8, 0.8, 0.1)), (6.0, (0.8, 0.8, 0.8, 0)), ]), ) group = ParticleGroup(controllers=[flame], renderer=PointRenderer( 64, SpriteTexturizer(create_point_texture(64, 5)))) win.set_visible(True) pyglet.clock.schedule_interval(default_system.update, (1.0 / 30.0)) pyglet.clock.set_fps_limit(None) @win.event def on_draw(): win.clear() glLoadIdentity() default_system.draw() if __name__ == '__main__': default_system.run_ahead(2, 30)
# We should now be able to define all the particle engine stuff # without code changes to the rest of the game exhaust = load_texture('exhaust.png') exhaust_particles = ParticleGroup( controllers=[ controller.Movement(), controller.Lifetime(1), controller.ColorBlender([ (0.0, (1.0, 0.3, 0.3, 0.3)), (0.2, (1.0, 0.8, 0.3, 0.3)), (0.5, (1.0, 1.0, 1.0, 0.2)), (1.0, (1.0, 1.0, 1.0, 0.0)), ]), controller.Growth(-3) ], renderer=BillboardRenderer(SpriteTexturizer(exhaust.id)), ) explosion_particles = ParticleGroup( controllers=[ controller.Movement(), controller.Lifetime(2), controller.Fader(start_alpha=1, fade_out_start=1, fade_out_end=2, end_alpha=0.0) ], renderer=BillboardRenderer(SpriteTexturizer(exhaust.id)), )
glEnable(GL_BLEND) glShadeModel(GL_SMOOTH) glBlendFunc(GL_SRC_ALPHA, GL_ONE) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glDisable(GL_DEPTH_TEST) spark_tex = image.load(os.path.join(os.path.dirname(__file__), 'flare3.png')).get_texture() sparks = ParticleGroup(controllers=[ Lifetime(3), Movement(damping=0.93), Fader(fade_out_start=0.75, fade_out_end=3.0), ], renderer=BillboardRenderer( SpriteTexturizer(spark_tex.id))) spark_emitter = StaticEmitter(template=Particle(position=(win.width / 2, win.height / 2, 0), color=(1, 1, 1)), deviation=Particle(position=(1, 1, 0), velocity=(300, 300, 0), age=1.5), size=[(3, 3, 0), (4, 4, 0), (5, 5, 0), (5, 5, 0), (6, 6, 0), (7, 7, 0)]) spark_emitter.emit(400, sparks) fire_tex = image.load(os.path.join(os.path.dirname(__file__), 'puff.png')).get_texture() fire = ParticleGroup(controllers=[
import os import math from random import expovariate, uniform, gauss from pyglet import image from pyglet.gl import * from lepton import Particle, ParticleGroup, default_system, domain from lepton.renderer import PointRenderer from lepton.texturizer import SpriteTexturizer, create_point_texture from lepton.emitter import StaticEmitter, PerParticleEmitter from lepton.controller import Gravity, Lifetime, Movement, Fader, ColorBlender spark_tex = image.load(os.path.join(os.path.dirname(__file__), 'flare3.png')).get_texture() spark_texturizer = SpriteTexturizer(spark_tex.id) trail_texturizer = SpriteTexturizer(create_point_texture(8, 50)) class Kaboom: lifetime = 5 def __init__(self): color = (uniform(0, 1), uniform(0, 1), uniform(0, 1), 1) while max(color[:3]) < 0.9: color = (uniform(0, 1), uniform(0, 1), uniform(0, 1), 1) spark_emitter = StaticEmitter( template=Particle(position=(uniform(-50, 50), uniform(-30, 30), uniform(-30, 30)),
def resize(widthWindow, heightWindow): glViewport(0, 0, widthWindow, heightWindow) glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(70, 1.0 * widthWindow / heightWindow, 0.001, 10000.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() win.on_resize = resize texture = image.load(os.path.join(os.path.dirname(__file__), 'flare3.png')).get_texture() texturizer = SpriteTexturizer(texture.id) texture2 = image.load(os.path.join(os.path.dirname(__file__), 'dot1.png')).get_texture() texturizer2 = SpriteTexturizer(texture2.id) controls = { 'fw': False, 'bk': False, 'lf': False, 'rt': False, 'f1': False, 'f2': False, 'strl': False, 'strr': False, 'act1': False, 'act2': False
rotation=(0, 0, math.pi), color=(0.5, 0.5, 0.5))) default_system.add_global_controller( Lifetime(3.0), Movement(min_velocity=5), Fader(max_alpha=0.7, fade_out_start=1, fade_out_end=3.0), ) images = [ image.load(os.path.join(os.path.dirname(__file__), 'flare%s.png' % (i + 1))) for i in range(4) ] group = ParticleGroup(controllers=[comet], renderer=BillboardRenderer( SpriteTexturizer.from_images(images))) pyglet.clock.schedule_interval(default_system.update, (1.0 / 30.0)) pyglet.clock.set_fps_limit(None) arc_radius = 150 angle = math.pi * 0.7 speed = 1.0 def move_comet(td): global angle, arc_radius, speed comet.template.position = (-math.sin(angle) * arc_radius * 0.3, math.sin(angle * 0.7) * arc_radius * 0.03, -math.cos(angle) * arc_radius - arc_radius * 1.05) comet.template.velocity = (comet.template.position.x * 0.05 -
deviation=Particle(velocity=(0, 0, 15), up=(0, 0, math.pi), color=(0.1, 0.1, 0.1))) default_system.add_global_controller( Movement(max_velocity=10), Collector(viewer_plane), Gravity((0, 0, 15)), Growth(0.17), Fader(fade_in_end=0, max_alpha=0.3, fade_out_start=0, fade_out_end=8.0), ) texture = image.load(os.path.join(os.path.dirname(__file__), 'Particle.bmp')).get_texture() group = ParticleGroup(controllers=[jet], renderer=BillboardRenderer(SpriteTexturizer(texture.id))) default_system.run_ahead(5, 40) pyglet.clock.schedule_interval(default_system.update, (1.0 / 30.0)) pyglet.clock.set_fps_limit(None) time = 0 def ring(dt): """Emit a ring of particles periodically""" jet.emit(1000, group) pyglet.clock.schedule_interval(ring, 5)
glMatrixMode(GL_PROJECTION) glLoadIdentity() gluPerspective(30, 1.0 * width / height, 0.1, 1000.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() win.on_resize = on_resize glEnable(GL_BLEND) glShadeModel(GL_SMOOTH) glBlendFunc(GL_SRC_ALPHA, GL_ONE) glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST) glDisable(GL_DEPTH_TEST) renderer = PointRenderer(7, SpriteTexturizer(create_point_texture(16, 10))) domains = [ domain.Sphere((0, 0, 0), 1), domain.Disc((0, 0, 0), (-1, 0, 0), 1), domain.Cylinder((-0.5, 0, 0), (0.5, 0, 0), 1), domain.Cone((-0.5, 0, 0), (0.5, 0, 0), 1), ] groups = [ ParticleGroup(controllers=[ StaticEmitter(rate=15000, position=domain, template=Particle( color=(1, 1, 1), size=(.1, .1, 0),