From 0928b5cbbde02d4a6c58ca940040ae4a1c2ac2e4 Mon Sep 17 00:00:00 2001 From: citrons Date: Sat, 14 Oct 2023 00:20:50 -0500 Subject: give the terrain a texture --- random.c | 17 ++++++++++++++--- random.h | 1 + world.c | 16 +++++++++++++--- 3 files changed, 28 insertions(+), 6 deletions(-) diff --git a/random.c b/random.c index c53d378..90dc3b5 100644 --- a/random.c +++ b/random.c @@ -2,14 +2,25 @@ static Uint64 random = 0xbee; +Uint64 hash(Uint64 n) { + Uint64 h = 0; + for (int i = 0; i < 8; i++) { + h += (n >> i * 8) & 0xFF; + h += h << 10; + h ^= h >> 6; + } + h += h << 3; + h ^= h >> 11; + h += h << 15; + return h; +} + void seed_rand(Uint64 seed) { random ^= seed; } Uint64 get_rand() { - random ^= random >> 7; - random ^= random << 9; - random ^= random >> 13; + random = hash(random); return random; } diff --git a/random.h b/random.h index 18a032b..ed07bcd 100644 --- a/random.h +++ b/random.h @@ -1,6 +1,7 @@ #ifndef RANDOM_H #define RANDOM_H +Uint64 hash(Uint64 i); void seed_rand(Uint64 seed); Uint64 get_rand(void); int rand_int(void); diff --git a/world.c b/world.c index 2ab924e..8899ff6 100644 --- a/world.c +++ b/world.c @@ -12,7 +12,7 @@ SDL_Color tile_colors[] = { [TILE_BLUE] = {0x00, 0x00, 0xFF, 0xFF}, [TILE_LIGHT] = {0xFF, 0xFF, 0xFF, 0xFF}, [TILE_EMPTY] = {0x00, 0x00, 0x00, 0xFF}, - [TILE_WALL] = {0x50, 0x50, 0x50, 0xFF}, + [TILE_WALL] = {0x40, 0x40, 0x40, 0xFF}, [TILE_BLOCK_WHITE] = {0x80, 0x80, 0x80, 0xFF}, }; @@ -79,14 +79,24 @@ SDL_Texture *render_chunk(SDL_Renderer *rend, chunk *c) { SDL_assert(c->tex); c->dirty = SDL_TRUE; } + if (c->dirty) { int pitch; void *out; SDL_assert(SDL_LockTexture(c->tex, NULL, &out, &pitch) >= 0); SDL_Color *pixels = out; - for (int i = 0; i < CHUNK_DIM * CHUNK_DIM; i++) - pixels[i] = tile_colors[c->tiles[i]]; + for (int i = 0; i < CHUNK_DIM * CHUNK_DIM; i++) { + tile t = c->tiles[i]; + SDL_Color color = tile_colors[t]; + if (t == TILE_WALL) { + int variance = hash(i) % 5; + color.r += variance; + color.g += variance; + color.b += variance; + } + pixels[i] = color; + } SDL_UnlockTexture(c->tex); c->dirty = SDL_FALSE; -- cgit v1.2.3