diff --git a/samples/motion-trails/fireball.py b/samples/motion-trails/fireball.py new file mode 100755 index 0000000000..655f94d005 --- /dev/null +++ b/samples/motion-trails/fireball.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +from random import choice + +from panda3d.core import Point3, Vec4 +from direct.showbase.ShowBase import ShowBase +from direct.motiontrail.MotionTrail import MotionTrail +from direct.interval.LerpInterval import LerpPosInterval, LerpHprInterval +from direct.interval.LerpInterval import LerpScaleInterval +from direct.interval.LerpInterval import LerpTexOffsetInterval +from direct.interval.IntervalGlobal import Sequence + + +base = ShowBase() +base.set_background_color(0.1, 0.1, 0.1, 1) + +base.cam.set_pos(0, -128, 32) +base.cam.look_at(render) + +flame_colors = ( + Vec4(1.0, 0.0, 0.0, 1), + Vec4(1.0, 0.2, 0.0, 1), + Vec4(1.0, 0.7, 0.0, 1), + Vec4(0.0, 0.0, 0.2, 1), +) + +# A NodePath, rotating in empty space. +pivot = render.attach_new_node("pivot") +pivot.hprInterval(3, (360, 0, 0)).loop() +Sequence( # Bobs up and down + LerpPosInterval(pivot, 0.3, (0, 0,-2), (0, 0, 1), blendType="easeInOut"), + LerpPosInterval(pivot, 0.5, (0, 0, 1), (0, 0,-2), blendType="easeInOut") +).loop() + +# A little chunk of charcoal that rotates along the pivot with an offset. +charcoal = loader.load_model("models/smiley").copy_to(pivot) +charcoal.set_texture(loader.load_texture("models/plasma.png"), 1) +charcoal.set_color(flame_colors[0] * 1.5) +charcoal.set_x(-32) + +# It leaves a trail of flames. +fire_trail = MotionTrail("fire trail", charcoal) +fire_trail.register_motion_trail() +fire_trail.geom_node_path.reparent_to(render) +fire_trail.set_texture(loader.load_texture("models/plasma.png")) +fire_trail.time_window = 3 # Length of trail + +# A circle as the trail's shape, by plotting a NodePath in a circle. +center = render.attach_new_node("center") +around = center.attach_new_node("around") +around.set_z(1) +res = 8 # Amount of angles in "circle". Higher is smoother. +for i in range(res + 1): + center.set_r((360 / res) * i) + vertex_pos = around.get_pos(render) + fire_trail.add_vertex(vertex_pos) + + start_color = flame_colors[i % len(flame_colors)] * 1.7 + end_color = Vec4(1, 1, 0, 1) + fire_trail.set_vertex_color(i, start_color, end_color) + +''' +# A simple flat line, tron lightcycle-style, would be like so: + +fire_trail.add_vertex(Point3(0, 0, 1)) +fire_trail.add_vertex(Point3(0, 0,-1)) +fire_trail.set_vertex_color(0, flame_colors[0], flame_colors[0]) +fire_trail.set_vertex_color(1, flame_colors[1], flame_colors[1]) +''' + +fire_trail.update_vertices() + +# Adding intervals to the trail to give it swoops and bends. +LerpHprInterval(fire_trail, 2, (0, 0, -360)).loop() +LerpTexOffsetInterval(fire_trail.geom_node_path, 4, (1, 1), (1, 0)).loop() +Sequence( # Grow and shrink + LerpScaleInterval(fire_trail, 0.3, 1.4, 0.4, blendType="easeInOut"), + LerpScaleInterval(fire_trail, 0.5, 0.4, 1.4, blendType="easeInOut") +).loop() + +base.run() diff --git a/samples/motion-trails/main.py b/samples/motion-trails/framebuffer-feedback.py similarity index 100% rename from samples/motion-trails/main.py rename to samples/motion-trails/framebuffer-feedback.py diff --git a/samples/motion-trails/models/plasma.png b/samples/motion-trails/models/plasma.png new file mode 100644 index 0000000000..d5ec2c4600 Binary files /dev/null and b/samples/motion-trails/models/plasma.png differ