diff options
author | Vito Caputo <vcaputo@gnugeneration.com> | 2017-01-18 19:12:41 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-01-18 19:12:41 -0800 |
commit | 467137113c8b3d6bcb73ecff8c76f23793f25cb7 (patch) | |
tree | ecf3064d6587ec875d5c021d46d44855dc814212 /src/modules/sparkler/spark.c | |
parent | ee2073d4e411555aba878277131b56f7eb562c84 (diff) | |
parent | 404a356b2b22a134aea151145d1baabf253ee491 (diff) |
Merge build system cleanups
- Move source to src/ subdir
- Use $(top_srcdir)/src instead of ../../
Diffstat (limited to 'src/modules/sparkler/spark.c')
-rw-r--r-- | src/modules/sparkler/spark.c | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/modules/sparkler/spark.c b/src/modules/sparkler/spark.c new file mode 100644 index 0000000..ea68ac2 --- /dev/null +++ b/src/modules/sparkler/spark.c @@ -0,0 +1,63 @@ +#include <stdlib.h> + +#include "draw.h" +#include "particle.h" +#include "particles.h" + +/* a "spark" particle type, emitted from behind rockets */ +#define SPARK_MAX_DECAY_RATE 20 +#define SPARK_MIN_DECAY_RATE 2 +#define SPARK_MAX_LIFETIME 150 +#define SPARK_MIN_LIFETIME 1 + +typedef struct _spark_ctxt_t { + int decay_rate; + int longevity; + int lifetime; +} spark_ctxt_t; + + +static int spark_init(particles_t *particles, particle_t *p) +{ + spark_ctxt_t *ctxt = p->ctxt; + + p->props->drag = 20.0; + p->props->mass = 0.1; + ctxt->decay_rate = rand_within_range(SPARK_MIN_DECAY_RATE, SPARK_MAX_DECAY_RATE); + ctxt->lifetime = ctxt->longevity = rand_within_range(SPARK_MIN_LIFETIME, SPARK_MAX_LIFETIME); + + return 1; +} + + +static particle_status_t spark_sim(particles_t *particles, particle_t *p) +{ + spark_ctxt_t *ctxt = p->ctxt; + + if (!ctxt->longevity || (ctxt->longevity -= ctxt->decay_rate) <= 0) { + ctxt->longevity = 0; + return PARTICLE_DEAD; + } + + return PARTICLE_ALIVE; +} + + +static void spark_draw(particles_t *particles, particle_t *p, int x, int y, fb_fragment_t *f) +{ + spark_ctxt_t *ctxt = p->ctxt; + + if (!draw_pixel(f, x, y, makergb(0xff, 0xa0, 0x20, ((float)ctxt->longevity / ctxt->lifetime)))) { + /* offscreen */ + ctxt->longevity = 0; + } +} + + +particle_ops_t spark_ops = { + .context_size = sizeof(spark_ctxt_t), + .sim = spark_sim, + .init = spark_init, + .draw = spark_draw, + .cleanup = NULL, + }; |