X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Fbump.c;fp=src%2Fbump.c;h=0000000000000000000000000000000000000000;hb=ba648ddfc62fc6d3f47294aa8bfc10ea6ca3f479;hp=b82594ba536a0e46b6a20395b2b7662bd182c0d4;hpb=3398fc6c4188104048f99b650a6cb90beda9b6ed;p=dosdemo diff --git a/src/bump.c b/src/bump.c deleted file mode 100644 index b82594b..0000000 --- a/src/bump.c +++ /dev/null @@ -1,328 +0,0 @@ -// Bump effect (not moving yet of course, I have many ideas on this to commit before it's ready) - -#include -#include -#include -#include - -#include "demo.h" -#include "screen.h" - -static int init(void); -static void destroy(void); -static void start(long trans_time); -static void draw(void); - -static struct screen scr = { - "bump", - init, - destroy, - start, - 0, - draw -}; - -struct point { - int x, y; -}; - -#define NUM_BIG_LIGHTS 3 -#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; -static unsigned short *lightmap; -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; -} - -static int init(void) -{ - int i, j, x, y, c, r, g, b; - - 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 - // if every light uses it's own channel bits, it's better - const float rgbMul[9] = { 1.0f, 0.0f, 0.0f, - 0.0f, 1.0f, 0.0f, - 0.0f, 0.0f, 1.0f}; - - heightmap = malloc(sizeof(*heightmap) * fb_size); - lightmap = malloc(sizeof(*lightmap) * fb_size); - bumpOffset = malloc(sizeof(*bumpOffset) * fb_size); - - 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++) - heightmap[i] = rand() & 255; - - // Blur to smooth - for (j = 0; j < numBlurs; j++) - for (i = 0; i < fb_size; i++) - heightmap[i] = (heightmap[abs((i - 1) % fb_size)] + heightmap[abs((i + 1) % fb_size)] + heightmap[abs((i - fb_width) % fb_size)] + heightmap[abs((i + fb_width) % fb_size)]) >> 2; - - // Inclination precalculation - i = 0; - for (y = 0; y < fb_height; y++) - { - for (x = 0; x < fb_width; x++) - { - const float offsetPower = 0.75f; - int dx, dy, xp, yp; - - dx = i < fb_size - 1 ? (int)((heightmap[i] - heightmap[i + 1]) * offsetPower) : 0; - dy = i < fb_size - fb_width ? (int)((heightmap[i] - heightmap[i + fb_width]) * offsetPower) : 0; - - xp = x + dx; - if (xp < 0) xp = 0; - if (xp > fb_width - 1) xp = fb_width - 1; - - yp = y + dy; - if (yp < 0) yp = 0; - if (yp > fb_height - 1) yp = fb_height - 1; - - bumpOffset[i++] = yp * fb_width + xp; - } - } - - // Generate three lights - i = 0; - for (y = 0; y < BIG_LIGHT_HEIGHT; y++) - { - int yc = y - (BIG_LIGHT_HEIGHT / 2); - for (x = 0; x < BIG_LIGHT_WIDTH; x++) - { - int xc = x - (BIG_LIGHT_WIDTH / 2); - float d = (float)sqrt(xc * xc + yc * yc); - float invDist = ((float)lightRadius - (float)sqrt(xc * xc + yc * yc)) / (float)lightRadius; - if (invDist < 0.0f) invDist = 0.0f; - - c = (int)(invDist * 63); - r = c >> 1; - g = c; - b = c >> 1; - - for (j = 0; j < NUM_BIG_LIGHTS; j++) - { - bigLight[j][i] = ((int)(r * rgbMul[j * 3]) << 11) | ((int)(g * rgbMul[j * 3 + 1]) << 5) | (int)(b * rgbMul[j * 3 + 2]); - } - i++; - } - } - - 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; -} - -static void destroy(void) -{ -} - -static void start(long trans_time) -{ - startingTime = time_msec; -} - -static void eraseArea(struct point *p, int width, int height) -{ - int x, y, dx; - unsigned short *dst; - - int x0 = p->x; - int y0 = p->y; - int x1 = p->x + width; - int y1 = p->y + height; - - if (x0 < 0) x0 = 0; - if (y0 < 0) y0 = 0; - if (x1 > fb_width) x1 = fb_width; - if (y1 > fb_height) y1 = fb_height; - - dx = x1 - x0; - - dst = lightmap + y0 * fb_width + x0; - - for (y = y0; y < y1; y++) - { - for (x = x0; x < x1; x++) - { - *dst++ = 0; - } - dst += fb_width - dx; - } -} - - -static void renderLight(struct point *p, int width, int height, unsigned short *light) -{ - int x, y, dx; - unsigned short *src, *dst; - - int x0 = p->x; - int y0 = p->y; - int x1 = p->x + width; - int y1 = p->y + height; - - int xl = 0; - int yl = 0; - - if (x0 < 0) - { - xl = -x0; - x0 = 0; - } - - if (y0 < 0) - { - yl = -y0; - y0 = 0; - } - - if (x1 > fb_width) x1 = fb_width; - if (y1 > fb_height) y1 = fb_height; - - dx = x1 - x0; - - dst = lightmap + y0 * fb_width + x0; - src = light + yl * width + xl; - - for (y = y0; y < y1; y++) - { - for (x = x0; x < x1; x++) - { - *dst++ |= *src++; - } - dst += fb_width - dx; - src += width - dx; - } -} - -static void eraseLights() -{ - int i; - for (i = 0; i < NUM_BIG_LIGHTS; i++) - eraseArea(&bigLightPoint[i], BIG_LIGHT_WIDTH, BIG_LIGHT_HEIGHT); -} - -static void renderLights() -{ - int i; - for (i = 0; i < NUM_BIG_LIGHTS; i++) - 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 + disperse); - bigLightPoint[0].y = center.y + sin(0.8f * dt) * (148.0f + disperse); - - 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 + disperse); - bigLightPoint[2].y = center.y + sin(1.3f * dt) * (136.0f + disperse); -} - -static void renderBump(unsigned short *vram) -{ - int i; - for (i = 0; i < fb_width * fb_height; i++) - { - unsigned short c = lightmap[bumpOffset[i]]; - *vram++ = c; - } -} - -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) -{ - memset(lightmap, 0, fb_width * fb_height * sizeof(*lightmap)); - - //eraseLights(); - animateLights(); - renderLights(); - - animateParticles(); - renderParticles(); - - renderBump((unsigned short*)fb_pixels); - - swap_buffers(0); -}