polyadvent

A game engine from scratch in C
git clone git://jb55.com/polyadvent
Log | Files | Refs | README

commit b380877091f7ed31136eac2701161dda4b47f124
parent ea6844914790f2c9a00fde33352c62e3fabce4a5
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 25 Apr 2018 22:01:56 -0700

terrain search

Diffstat:
Msrc/main.c | 4++++
Msrc/terrain.c | 34++++++++++++++++++++++++++--------
Msrc/terrain.h | 3+++
Msrc/update.c | 27++++++++++++++++++++-------
Msrc/vec3/vec3.h | 1+
5 files changed, 54 insertions(+), 15 deletions(-)

diff --git a/src/main.c b/src/main.c @@ -42,7 +42,11 @@ int main(void) struct perlin_settings terrain_settings = { .depth = 1, .freq = 0.02, + .o1 = 2.0, .o1s = 0.5, + .o2 = 4.0, .o2s = 0.25, .amplitude = 1.0, + .ox = 0, + .oy = 0, .exp = 7.3 }; diff --git a/src/terrain.c b/src/terrain.c @@ -20,9 +20,9 @@ static const u32 plane_indices[] = { double old_noisy_boi(void *data, double x, double y) { struct perlin_settings *s = (struct perlin_settings*)data; - double e = 1.0 * perlin2d(x, y, s->freq, s->depth) - + 0.5 * perlin2d(2 * x, 2 * y, s->freq, s->depth) - + 0.25 * perlin2d(4 * x, 4 * y, s->freq, s->depth); + double e = perlin2d(x, y, s->freq, s->depth) + + s->o1s * perlin2d(s->o1 * x, s->o1 * y, s->freq, s->depth) + + s->o2s * perlin2d(s->o2 * x, s->o2 * y, s->freq, s->depth); return pow(e, s->exp) * s->amplitude; } @@ -48,19 +48,34 @@ terrain_create(struct terrain *terrain, struct perlin_settings *perlin) { const double size = 200; const double hsize = size/2; const int num_verts = hsize*hsize; + static int first = 1; + static float samples_x[40000]; + static float samples_y[40000]; float tmp2[3]; del_point2d_t *points = calloc(num_verts, sizeof(*points)); float *verts = calloc(num_verts * 3, sizeof(*verts)); float *normals = calloc(num_verts * 3, sizeof(*normals)); + double ox = perlin->ox; + double oy = perlin->oy; // 100 random samples from our noise function for (i = 0; i < (u32)num_verts; i++) { int n = i*3; - double dx, dy; - double x = rand_0to1() * size; - double y = rand_0to1() * size; - double z = old_noisy_boi((void*)perlin, x, y); - deriv(old_noisy_boi, (void*)perlin, x, y, z, &dx, &dy); + double dx, dy, x, y; + + if (first) { + x = rand_0to1() * size; + y = rand_0to1() * size; + samples_x[i] = x; + samples_y[i] = y; + } + else { + x = samples_x[i]; + y = samples_y[i]; + } + + double z = old_noisy_boi((void*)perlin, ox+x, oy+y); + deriv(old_noisy_boi, (void*)perlin, ox+x, oy+y, z, &dx, &dy); points[i].x = x; points[i].y = y; @@ -81,6 +96,9 @@ terrain_create(struct terrain *terrain, struct perlin_settings *perlin) { normals[n+2] = tmp2[2]; } + first = 0; + + delaunay2d_t *del = delaunay2d_from(points, num_verts); tri_delaunay2d_t *tri = tri_delaunay2d_from(del); diff --git a/src/terrain.h b/src/terrain.h @@ -9,6 +9,9 @@ struct perlin_settings { double freq; int depth; double amplitude; + double ox, oy; + double o1, o1s; + double o2, o2s; double exp; }; diff --git a/src/update.c b/src/update.c @@ -4,6 +4,7 @@ #include "terrain.h" #include "util.h" #include "mat4/mat4.h" +#include "vec3/vec3.h" void movement(struct game *game, float *obj) { float amt = 0.25; @@ -54,6 +55,13 @@ void update (struct game *game, u32 dt) { struct resources *res = &game->test_resources; static struct perlin_settings terrain_settings = { .depth = 1, + .freq = 0.04, + .amplitude = 1.0, + .ox = 0, + .oy = 0, + .o1 = 2.0, .o1s = 0.5, + .o2 = 4.0, .o2s = 0.25, + .exp = 7.3 }; float *light = res->light_dir; @@ -68,17 +76,22 @@ void update (struct game *game, u32 dt) { printf("light_dir %f %f %f\n", light[0], light[1], light[2]); } - if (passed < last_gen_time) { + int space_down = game->input.keystates[SDL_SCANCODE_SPACE]; + + if (space_down || passed < last_gen_time) { passed += dt; } else { passed = 0; - terrain_settings.depth = 1; - - terrain_settings.amplitude = sin(n); - terrain_settings.exp = fabs(sin(n) * 10.0); - terrain_settings.freq = fabs(cos(n) * 0.04); - + terrain_settings.oy += 1.0; + terrain_settings.ox += 1.0; + /* terrain_settings.o1s = fabs(sin(1/n) * 0.25); */ + /* terrain_settings.o1 = fabs(cos(n*0.2) * 0.5); */ + /* terrain_settings.o2s = fabs(cos(n+2) * 0.5); */ + /* terrain_settings.o2 = fabs(sin(n*0.02) * 2); */ + /* terrain_settings.freq = fabs(-sin(n)*0.002 * cos(-n)) + 0.02; */ + terrain_settings.exp = fabs(cos(n)*2.0*cos(n)) + 5.0; + terrain_settings.amplitude = cos(1/n)*2.0*cos(n) + 0.5; terrain_destroy(game->terrain); terrain_init(game->terrain); diff --git a/src/vec3/vec3.h b/src/vec3/vec3.h @@ -2,6 +2,7 @@ typedef float vec3; #define V3(x,y,z) ((float[3]){x,y,z}) +vec3 *vec3_scale(vec3 *vec, double val, vec3 *dest); vec3 *vec3_subtract(vec3 *vec, vec3 *vec2, vec3 *dest); vec3 *vec3_cross (vec3 *vec, vec3 *vec2, vec3 *dest); vec3 *vec3_multiply(vec3 *vec, vec3 *vec2, vec3 *dest);