def test_PerParticleEmitter_template(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(Particle(position=(1, 1, 1))) source_group.new(Particle(position=(2, 2, 2))) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1, template=Particle(position=(1.0, 1.0, 1.0), velocity=(0, 5, 2), color=(0.5, 0.5, 0.5, 1.0))) group = ParticleGroup() count = emitter(1, group) group.update(0) self.assertEqual(count, len(source_group)) self.assertEqual(len(group), len(source_group)) particle = list(group)[0] self.assertVector(particle.position, (1, 1, 1)) self.assertVector(particle.velocity, (0, 5, 2)) self.assertColor(particle.color, (0.5, 0.5, 0.5, 1.0)) particle = list(group)[1] self.assertVector(particle.position, (2, 2, 2)) self.assertVector(particle.velocity, (0, 5, 2)) self.assertColor(particle.color, (0.5, 0.5, 0.5, 1.0))
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle(position=(0, 1.0, 0), velocity=(0, 0, 0))), g.new(Particle(position=(0, 0, 1.0), velocity=(0, 0, 0))), g.update(0) p = list(g) p[0].position = (10.0, 0, 0) p[1].position = (0, 0.0, 10.0) return g
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle(position=(0, 1.0, 0), velocity=(0, 0, 0))), g.new(Particle(position=(0, 0, 1.0), velocity=(0, 0, 0))), g.update(0) p = list(g) p[0].position = (10.0, 0, 0) p[1].position = (0, 0.0, 10.0) return g
def test_len(self): from lepton import ParticleGroup group = ParticleGroup() self.assertEqual(len(group), 0) group.new(TestParticle()) self.assertEqual(len(group), 0) group.new(TestParticle()) self.assertEqual(len(group), 0) # New particles become visible on update group.update(0) self.assertEqual(len(group), 2)
def test_len(self): from lepton import ParticleGroup group = ParticleGroup() self.assertEqual(len(group), 0) group.new(TestParticle()) self.assertEqual(len(group), 0) group.new(TestParticle()) self.assertEqual(len(group), 0) # New particles become visible on update group.update(0) self.assertEqual(len(group), 2)
def test_new_particle_kwargs(self): from lepton import ParticleGroup, Particle group = ParticleGroup() self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 0) p = group.new(position=(1,-1,2), age=2) self.assertEqual(tuple(p.position), (1, -1, 2)) self.assertEqual(p.age, 2) tmpl_p = Particle(age=3, velocity=(-1,2,3)) p = group.new(tmpl_p, age=5) self.assertEqual(tuple(p.velocity), (-1,2,3)) self.assertEqual(p.age, 5) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 2) self.failIf(list(group)) group.update(0) # incorporate new particles self.assertEqual(len(group), 2) self.assertEqual(group.new_count(), 0)
def test_new_particle_kwargs(self): from lepton import ParticleGroup, Particle group = ParticleGroup() self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 0) p = group.new(position=(1, -1, 2), age=2) self.assertEqual(tuple(p.position), (1, -1, 2)) self.assertEqual(p.age, 2) tmpl_p = Particle(age=3, velocity=(-1, 2, 3)) p = group.new(tmpl_p, age=5) self.assertEqual(tuple(p.velocity), (-1, 2, 3)) self.assertEqual(p.age, 5) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 2) self.failIf(list(group)) group.update(0) # incorporate new particles self.assertEqual(len(group), 2) self.assertEqual(group.new_count(), 0)
def test_PerParticleEmitter_partial(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1) group = ParticleGroup() # It should take four quarter second updates to emit any self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), len(source_group)) group.update(0) self.assertEqual(len(group), len(source_group))
def test_PerParticleEmitter_partial(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1) group = ParticleGroup() # It should take four quarter second updates to emit any self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), 0) self.assertEqual(emitter(0.25, group), len(source_group)) group.update(0) self.assertEqual(len(group), len(source_group))
def test_particle_vector_clamp(self): from lepton import ParticleGroup group = ParticleGroup() p = TestParticle() p.color = (2,0.5,-1,5) p.size = (0, 2, 0) newp = group.new(p) self.assertEqual(tuple(newp.color), p.color) self.assertEqual(tuple(newp.size), p.size) self.assertEqual(tuple(newp.color.clamp(0, 1)), (1, 0.5, 0, 1)) self.assertEqual(tuple(newp.size.clamp(1, 1.5)), (1, 1.5, 1))
def test_particle_vector_clamp(self): from lepton import ParticleGroup group = ParticleGroup() p = TestParticle() p.color = (2, 0.5, -1, 5) p.size = (0, 2, 0) newp = group.new(p) self.assertEqual(tuple(newp.color), p.color) self.assertEqual(tuple(newp.size), p.size) self.assertEqual(tuple(newp.color.clamp(0, 1)), (1, 0.5, 0, 1)) self.assertEqual(tuple(newp.size.clamp(1, 1.5)), (1, 1.5, 1))
def test_PerParticleEmitter_emit(self): from lepton import ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group) group = ParticleGroup() self.assertEqual(len(group), 0) emitter.emit(10, group) group.update(0) expected = 10 * len(source_group) self.assertEqual(len(group), expected) # Negative emit value is equivilant to zero emitter.emit(-10, group) group.update(0) self.assertEqual(len(group), expected)
def test_PerParticleEmitter_emit(self): from lepton import ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group) group = ParticleGroup() self.assertEqual(len(group), 0) emitter.emit(10, group) group.update(0) expected = 10 * len(source_group) self.assertEqual(len(group), expected) # Negative emit value is equivilant to zero emitter.emit(-10, group) group.update(0) self.assertEqual(len(group), expected)
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle((0, 0, 0), (0, 0, 0))) g.new(Particle((0, 0, 0), (1, 1, 1), size=(2, 2, 2))) g.new(Particle((1, 1, 1), (-2, -2, -2), size=(3, 2, 0))) g.update(0) return g
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle((0,0,0), (0,0,0))) g.new(Particle((0,0,0), (1,1,1), size=(2,2,2))) g.new(Particle((1,1,1), (-2,-2,-2), size=(3,2,0))) g.update(0) return g
def test_PerParticleEmitter_time_to_live(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1, time_to_live=3.0) group = ParticleGroup(controllers=[emitter]) count = emitter(2, group) self.assertEqual(count, 2 * len(source_group)) self.assertEqual(emitter.time_to_live, 1) self.failUnless(emitter in group.controllers) count = emitter(2, group) # Since only one second remained before expiring # only one particle per should be emitted self.assertEqual(count, len(source_group)) self.assertEqual(emitter.time_to_live, 0) self.failUnless(emitter not in group.controllers)
def test_PerParticleEmitter_time_to_live(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.new(object()) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1, time_to_live=3.0) group = ParticleGroup(controllers=[emitter]) count = emitter(2, group) self.assertEqual(count, 2 * len(source_group)) self.assertEqual(emitter.time_to_live, 1) self.failUnless(emitter in group.controllers) count = emitter(2, group) # Since only one second remained before expiring # only one particle per should be emitted self.assertEqual(count, len(source_group)) self.assertEqual(emitter.time_to_live, 0) self.failUnless(emitter not in group.controllers)
def test_new_particle(self): from lepton import ParticleGroup, Particle group = ParticleGroup() self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 0) p1 = Particle(age=1) p2 = Particle(age=2) group.new(p1) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 1) self.failIf(list(group)) group.new(p2) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 2) self.failIf(list(group)) group.update(0) # incorporate new particles self.assertEqual(len(group), 2) self.assertEqual(group.new_count(), 0) particles = list(group) self.assertEqual(len(particles), 2) self.assertEqual(particles[0].age, 1) self.assertEqual(particles[1].age, 2) return group, particles
def test_new_particle(self): from lepton import ParticleGroup, Particle group = ParticleGroup() self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 0) p1 = Particle(age=1) p2 = Particle(age=2) group.new(p1) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 1) self.failIf(list(group)) group.new(p2) self.assertEqual(len(group), 0) self.assertEqual(group.new_count(), 2) self.failIf(list(group)) group.update(0) # incorporate new particles self.assertEqual(len(group), 2) self.assertEqual(group.new_count(), 0) particles = list(group) self.assertEqual(len(particles), 2) self.assertEqual(particles[0].age, 1) self.assertEqual(particles[1].age, 2) return group, particles
def test_PerParticleEmitter_template(self): from lepton import Particle, ParticleGroup from lepton.emitter import PerParticleEmitter source_group = ParticleGroup() source_group.new(Particle(position=(1,1,1))) source_group.new(Particle(position=(2,2,2))) source_group.update(0) emitter = PerParticleEmitter(source_group, rate=1, template=Particle( position=(1.0, 1.0, 1.0), velocity=(0, 5, 2), color=(0.5, 0.5, 0.5, 1.0))) group = ParticleGroup() count = emitter(1, group) group.update(0) self.assertEqual(count, len(source_group)) self.assertEqual(len(group), len(source_group)) particle = list(group)[0] self.assertVector(particle.position, (1,1,1)) self.assertVector(particle.velocity, (0,5,2)) self.assertColor(particle.color, (0.5, 0.5, 0.5, 1.0)) particle = list(group)[1] self.assertVector(particle.position, (2,2,2)) self.assertVector(particle.velocity, (0,5,2)) self.assertColor(particle.color, (0.5, 0.5, 0.5, 1.0))
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle(position=(0, 1, 0), velocity=(0, -1, 0))), g.new(Particle(position=(0, 1, 0), velocity=(0, -1.5, 0))), g.new(Particle(position=(-1, -1, 1), velocity=(2, 2, 0))), g.new(Particle(position=(1, 1, 1), velocity=(0, 1, 0))) g.update(0) p = list(g) p[0].position = (0, 0, 0) p[1].position = (0, -0.5, 0) p[2].position = (1, 1, 1) p[3].position = (1, 2, 1) return g
def _make_group(self): from lepton import Particle, ParticleGroup g = ParticleGroup() g.new(Particle(position=(0, 1, 0), velocity=(0, -1, 0))), g.new(Particle(position=(0, 1, 0), velocity=(0, -1.5, 0))), g.new(Particle(position=(-1, -1, 1), velocity=(2, 2, 0))), g.new(Particle(position=(1, 1, 1), velocity=(0, 1, 0))) g.update(0) p = list(g) p[0].position = (0, 0, 0) p[1].position = (0, -0.5, 0) p[2].position = (1, 1, 1) p[3].position = (1, 2, 1) return g
def test_particle_vector_swizzle(self): from lepton import ParticleGroup group = ParticleGroup() newp = group.new(TestParticle()) self.assertEqual(tuple(newp.velocity), (0,0,0)) self.assertEqual(newp.velocity.x, 0) self.assertEqual(newp.velocity.y, 0) self.assertEqual(newp.velocity.z, 0) newp.velocity.x = 2 newp.velocity.y = -2 newp.velocity.z = 1 self.assertEqual(tuple(newp.velocity), (2,-2,1)) self.assertEqual(newp.velocity.x, 2) self.assertEqual(newp.velocity.y, -2) self.assertEqual(newp.velocity.z, 1) newp.velocity = (3,4,5) self.assertEqual(tuple(newp.velocity), (3,4,5)) self.assertEqual(newp.velocity.x, 3) self.assertEqual(newp.velocity.y, 4) self.assertEqual(newp.velocity.z, 5) self.assertEqual(tuple(newp.color), (0,0,0,0)) self.assertEqual(newp.color.r, 0) self.assertEqual(newp.color.g, 0) self.assertEqual(newp.color.b, 0) self.assertEqual(newp.color.a, 0) newp.color.r = 1 newp.color.g = -2 newp.color.b = 3 newp.color.a = -1 self.assertEqual(tuple(newp.color), (1,-2,3,-1)) self.assertEqual(newp.color.r, 1) self.assertEqual(newp.color.g, -2) self.assertEqual(newp.color.b, 3) self.assertEqual(newp.color.a, -1) newp.color = (5,4,3,2) self.assertEqual(tuple(newp.color), (5,4,3,2)) self.assertEqual(newp.color.r, 5) self.assertEqual(newp.color.g, 4) self.assertEqual(newp.color.b, 3) self.assertEqual(newp.color.a, 2) newp.color = (6,5,4) # alpha defaults to 1 self.assertEqual(tuple(newp.color), (6,5,4,1)) self.assertEqual(newp.color.r, 6) self.assertEqual(newp.color.g, 5) self.assertEqual(newp.color.b, 4) self.assertEqual(newp.color.a, 1)
def test_particle_vector_swizzle(self): from lepton import ParticleGroup group = ParticleGroup() newp = group.new(TestParticle()) self.assertEqual(tuple(newp.velocity), (0, 0, 0)) self.assertEqual(newp.velocity.x, 0) self.assertEqual(newp.velocity.y, 0) self.assertEqual(newp.velocity.z, 0) newp.velocity.x = 2 newp.velocity.y = -2 newp.velocity.z = 1 self.assertEqual(tuple(newp.velocity), (2, -2, 1)) self.assertEqual(newp.velocity.x, 2) self.assertEqual(newp.velocity.y, -2) self.assertEqual(newp.velocity.z, 1) newp.velocity = (3, 4, 5) self.assertEqual(tuple(newp.velocity), (3, 4, 5)) self.assertEqual(newp.velocity.x, 3) self.assertEqual(newp.velocity.y, 4) self.assertEqual(newp.velocity.z, 5) self.assertEqual(tuple(newp.color), (0, 0, 0, 0)) self.assertEqual(newp.color.r, 0) self.assertEqual(newp.color.g, 0) self.assertEqual(newp.color.b, 0) self.assertEqual(newp.color.a, 0) newp.color.r = 1 newp.color.g = -2 newp.color.b = 3 newp.color.a = -1 self.assertEqual(tuple(newp.color), (1, -2, 3, -1)) self.assertEqual(newp.color.r, 1) self.assertEqual(newp.color.g, -2) self.assertEqual(newp.color.b, 3) self.assertEqual(newp.color.a, -1) newp.color = (5, 4, 3, 2) self.assertEqual(tuple(newp.color), (5, 4, 3, 2)) self.assertEqual(newp.color.r, 5) self.assertEqual(newp.color.g, 4) self.assertEqual(newp.color.b, 3) self.assertEqual(newp.color.a, 2) newp.color = (6, 5, 4) # alpha defaults to 1 self.assertEqual(tuple(newp.color), (6, 5, 4, 1)) self.assertEqual(newp.color.r, 6) self.assertEqual(newp.color.g, 5) self.assertEqual(newp.color.b, 4) self.assertEqual(newp.color.a, 1)
def test_mass_new_particles(self): from lepton import ParticleGroup count = 12345 group = ParticleGroup() p = TestParticle() for i in xrange(count): p.mass = i newp = group.new(p) self.assertEqual(newp.mass, p.mass) group.update(0) piter = iter(group) for i in xrange(count): newp = piter.next() self.assertEqual(newp.mass, i) self.assertEqual(len(group), count) self.assertEqual(group.killed_count(), 0) self.assertRaises(StopIteration, piter.next)
def test_mass_new_particles(self): from lepton import ParticleGroup count = 12345 group = ParticleGroup() p = TestParticle() for i in xrange(count): p.mass = i newp = group.new(p) self.assertEqual(newp.mass, p.mass) group.update(0) piter = iter(group) for i in xrange(count): newp = piter.next() self.assertEqual(newp.mass, i) self.assertEqual(len(group), count) self.assertEqual(group.killed_count(), 0) self.assertRaises(StopIteration, piter.next)
def test_Lifetime_controller(self): from lepton import controller, Particle, ParticleGroup g = ParticleGroup() g.new(Particle(age=0)) g.new(Particle(age=0.8)) g.new(Particle(age=1.0)) g.new(Particle(age=0.75)) lifetime = controller.Lifetime(max_age=0.75) g.update(0) lifetime(0, g) p = list(g) self.assertEqual(len(g), 2) self.assertFloatEqiv(p[0].age, 0.0) self.assertFloatEqiv(p[1].age, 0.75)
def test_Lifetime_controller(self): from lepton import controller, Particle, ParticleGroup g = ParticleGroup() g.new(Particle(age=0)) g.new(Particle(age=0.8)) g.new(Particle(age=1.0)) g.new(Particle(age=0.75)) lifetime = controller.Lifetime(max_age=0.75) g.update(0) lifetime(0, g) p = list(g) self.assertEqual(len(g), 2) self.assertFloatEqiv(p[0].age, 0.0) self.assertFloatEqiv(p[1].age, 0.75)
def test_particle_attrs(self): from lepton import ParticleGroup p = TestParticle() p.position = (1, 2, 3) p.velocity = (4, 5, 6) p.color = (7, 8, 9, 10) p.size = (11, 12, 13) p.up = (-1, -2, -3) p.rotation = (-4, -5, -6) p.age = 111 p.mass = 2 group = ParticleGroup() newp = group.new(p) self.assertEqual(tuple(newp.position), p.position) self.assertEqual(tuple(newp.velocity), p.velocity) self.assertEqual(tuple(newp.color), p.color) self.assertEqual(tuple(newp.size), p.size) self.assertEqual(tuple(newp.up), p.up) self.assertEqual(tuple(newp.rotation), p.rotation) self.assertEqual(newp.age, p.age) self.assertEqual(newp.mass, p.mass)
def test_particle_attrs(self): from lepton import ParticleGroup p = TestParticle() p.position=(1,2,3) p.velocity=(4,5,6) p.color=(7,8,9,10) p.size=(11,12,13) p.up=(-1,-2,-3) p.rotation=(-4,-5,-6) p.age=111 p.mass=2 group = ParticleGroup() newp = group.new(p) self.assertEqual(tuple(newp.position), p.position) self.assertEqual(tuple(newp.velocity), p.velocity) self.assertEqual(tuple(newp.color), p.color) self.assertEqual(tuple(newp.size), p.size) self.assertEqual(tuple(newp.up), p.up) self.assertEqual(tuple(newp.rotation), p.rotation) self.assertEqual(newp.age, p.age) self.assertEqual(newp.mass, p.mass)
logo_files = glob.glob( os.path.join(os.path.dirname(__file__), 'logo_frames/logo*.png')) images = [pyglet.image.load(f) for f in sorted(logo_files)] texturizer = FlipBookTexturizer.from_images(images + images[-1::-1], 0.075) group = ParticleGroup( controllers=[Fader(fade_out_start=50.0, fade_out_end=58.5)], renderer=BillboardRenderer(texturizer)) template = Particle( size=(1, 1, 0), color=(1, 1, 1, 1), ) positions = set([((x - 25) * 1.4 + (y % 2.0) * 0.7, (y - 25) * 1.4, (z - 25) * 1.4 + (y % 2.0) * 0.7) for x in range(50) for y in range(50) for z in range(50)]) group.new(template) for i in range(12000): group.new(template, position=positions.pop(), age=49.35) win.set_visible(True) pyglet.clock.schedule_interval(default_system.update, (1.0 / 40.0)) pyglet.clock.set_fps_limit(None) label = pyglet.text.Label("Lepton", font_name="Helvetica", font_size=72, bold=True, color=(0, 0, 0, 0), anchor_x="center", x=0, y=-200)
texturizer = FlipBookTexturizer.from_images(images + images[-1::-1], 0.075) group = ParticleGroup( controllers=[ Fader(fade_out_start=50.0, fade_out_end=58.5) ], renderer=BillboardRenderer(texturizer)) template = Particle( size=(1,1,0), color=(1,1,1,1), ) positions = set([((x - 25) * 1.4 + (y % 2.0) * 0.7, (y - 25) * 1.4, (z - 25) * 1.4 + (y % 2.0) * 0.7) for x in range(50) for y in range(50) for z in range(50)]) group.new(template) for i in xrange(12000): group.new(template, position=positions.pop(), age=49.35) win.set_visible(True) pyglet.clock.schedule_interval(default_system.update, (1.0/40.0)) pyglet.clock.set_fps_limit(None) label = pyglet.text.Label("Lepton", font_name="Helvetica", font_size=72, bold=True, color=(0,0,0,0), anchor_x="center", x=0, y=-200) def fade_in_label(dt): global label alpha = label.color[-1] + 2 label.color = label.color[:-1] + (min(alpha, 255),) pyglet.clock.schedule_once(fade_in_label, 1.0/40.0)