disabled dep-files when building on dos, because it goes into an infinite loop
[dosdemo] / src / bump.c
index dc53337..b82594b 100644 (file)
@@ -7,12 +7,10 @@
 
 #include "demo.h"
 #include "screen.h"
-#include "tinyfps.h"
 
 static int init(void);
 static void destroy(void);
 static void start(long trans_time);
-static void stop(long trans_time);
 static void draw(void);
 
 static struct screen scr = {
@@ -20,11 +18,11 @@ static struct screen scr = {
        init,
        destroy,
        start,
-       stop,
+       0,
        draw
 };
 
-static struct point {
+struct point {
        int x, y;
 };
 
@@ -32,6 +30,11 @@ static struct point {
 #define BIG_LIGHT_WIDTH 256
 #define BIG_LIGHT_HEIGHT BIG_LIGHT_WIDTH
 
+#define NUM_PARTICLES 64
+#define PARTICLE_LIGHT_WIDTH 32
+#define PARTICLE_LIGHT_HEIGHT 32
+
+
 static unsigned long startingTime;
 
 static unsigned char *heightmap;
@@ -41,6 +44,9 @@ static int *bumpOffset;
 static unsigned short *bigLight[NUM_BIG_LIGHTS];
 static struct point bigLightPoint[NUM_BIG_LIGHTS];
 
+static unsigned short *particleLight;
+static struct point particlePoint[NUM_PARTICLES];
+
 struct screen *bump_screen(void)
 {
        return &scr;
@@ -52,8 +58,10 @@ static int init(void)
 
        const int numBlurs = 3;
        const int lightRadius = BIG_LIGHT_WIDTH / 2;
+       const int particleRadius = PARTICLE_LIGHT_WIDTH / 2;
 
        const int bigLightSize = BIG_LIGHT_WIDTH * BIG_LIGHT_HEIGHT;
+       const int particleLightSize = PARTICLE_LIGHT_WIDTH * PARTICLE_LIGHT_HEIGHT;
        const int fb_size = fb_width * fb_height;
 
        // Just some parameters to temporary test the colors of 3 lights
@@ -61,7 +69,6 @@ static int init(void)
        const float rgbMul[9] = { 1.0f, 0.0f, 0.0f, 
                                                                  0.0f, 1.0f, 0.0f,
                                                                  0.0f, 0.0f, 1.0f};
-       initFpsFonts();
 
        heightmap = malloc(sizeof(*heightmap) * fb_size);
        lightmap = malloc(sizeof(*lightmap) * fb_size);
@@ -70,8 +77,11 @@ static int init(void)
        for (i = 0; i < NUM_BIG_LIGHTS; i++)
                bigLight[i] = malloc(sizeof(*bigLight[i]) * bigLightSize);
 
+       particleLight = malloc(sizeof(*particleLight) * particleLightSize);
+
        memset(lightmap, 0, sizeof(*lightmap) * fb_size);
        memset(bumpOffset, 0, sizeof(*bumpOffset) * fb_size);
+       memset(particlePoint, 0, sizeof(*particlePoint) * NUM_PARTICLES);
 
        // Create random junk
        for (i = 0; i < fb_size; i++)
@@ -88,7 +98,7 @@ static int init(void)
        {
                for (x = 0; x < fb_width; x++)
                {
-                       const float offsetPower = 2.0f;
+                       const float offsetPower = 0.75f;
                        int dx, dy, xp, yp;
 
                        dx = i < fb_size - 1 ? (int)((heightmap[i] - heightmap[i + 1]) * offsetPower) : 0;
@@ -131,6 +141,22 @@ static int init(void)
                }
        }
 
+       i = 0;
+       for (y = 0; y < PARTICLE_LIGHT_HEIGHT; y++)
+       {
+               int yc = y - (PARTICLE_LIGHT_HEIGHT / 2);
+               for (x = 0; x < PARTICLE_LIGHT_WIDTH; x++)
+               {
+                       int xc = x - (PARTICLE_LIGHT_WIDTH / 2);
+
+                       float invDist = ((float)particleRadius - (float)sqrt(xc * xc + yc * yc)) / (float)particleRadius;
+                       if (invDist < 0.0f) invDist = 0.0f;
+
+                       c = (int)(pow(invDist, 0.75f) * 63);
+                       particleLight[i++] = ((c >> 1) << 11) | (c << 5) | (c >> 1);
+               }
+       }
+
        return 0;
 }
 
@@ -143,10 +169,6 @@ static void start(long trans_time)
        startingTime = time_msec;
 }
 
-static void stop(long trans_time)
-{
-}
-
 static void eraseArea(struct point *p, int width, int height)
 {
        int x, y, dx;
@@ -235,22 +257,31 @@ static void renderLights()
                renderLight(&bigLightPoint[i], BIG_LIGHT_WIDTH, BIG_LIGHT_HEIGHT, bigLight[i]);
 }
 
+static void renderParticles()
+{
+       int i;
+       for (i = 0; i < NUM_PARTICLES; i++)
+               renderLight(&particlePoint[i], PARTICLE_LIGHT_WIDTH, PARTICLE_LIGHT_HEIGHT, particleLight);
+}
+
 static void animateLights()
 {
        struct point center;
        float dt = (float)(time_msec - startingTime) / 1000.0f;
+       float tt = 1.0f - sin(dt);
+       float disperse = tt * 64.0f;
 
        center.x = (fb_width >> 1) - (BIG_LIGHT_WIDTH / 2);
        center.y = (fb_height >> 1) - (BIG_LIGHT_HEIGHT / 2);
 
-       bigLightPoint[0].x = center.x + sin(1.2f * dt) * 144.0f;
-       bigLightPoint[0].y = center.y + sin(0.8f * dt) * 148.0f;
+       bigLightPoint[0].x = center.x + sin(1.2f * dt) * (144.0f + disperse);
+       bigLightPoint[0].y = center.y + sin(0.8f * dt) * (148.0f + disperse);
 
-       bigLightPoint[1].x = center.x + sin(1.5f * dt) * 156.0f;
-       bigLightPoint[1].y = center.y + sin(1.1f * dt) * 92.0f;
+       bigLightPoint[1].x = center.x + sin(1.5f * dt) * (156.0f + disperse);
+       bigLightPoint[1].y = center.y + sin(1.1f * dt) * (92.0f + disperse);
 
-       bigLightPoint[2].x = center.x + sin(2.0f * dt) * 112.0f;
-       bigLightPoint[2].y = center.y + sin(1.3f * dt) * 136.0f;
+       bigLightPoint[2].x = center.x + sin(2.0f * dt) * (112.0f + disperse);
+       bigLightPoint[2].y = center.y + sin(1.3f * dt) * (136.0f + disperse);
 }
 
 static void renderBump(unsigned short *vram)
@@ -263,14 +294,35 @@ static void renderBump(unsigned short *vram)
        }
 }
 
+static void animateParticles()
+{
+       int i;
+       struct point center;
+       float dt = (float)(time_msec - startingTime) / 2000.0f;
+       float tt = sin(dt);
+
+       center.x = (fb_width >> 1) - (PARTICLE_LIGHT_WIDTH / 2);
+       center.y = (fb_height >> 1) - (PARTICLE_LIGHT_HEIGHT / 2);
+
+       for (i = 0; i < NUM_PARTICLES; i++)
+       {
+               particlePoint[i].x = center.x + (sin(1.2f * (i*i*i + dt)) * 74.0f + sin(0.6f * (i + dt)) * 144.0f) * tt;
+               particlePoint[i].y = center.y + (sin(1.8f * (i + dt)) * 68.0f + sin(0.5f * (i*i + dt)) * 132.0f) * tt;
+       }
+}
+
 static void draw(void)
 {
-       eraseLights();
+       memset(lightmap, 0, fb_width * fb_height * sizeof(*lightmap));
+
+       //eraseLights();
        animateLights();
        renderLights();
-       renderBump((unsigned short*)vmem_back);
 
-       drawFps((unsigned short*)vmem_back);
+       animateParticles();
+       renderParticles();
+
+       renderBump((unsigned short*)fb_pixels);
 
        swap_buffers(0);
 }