small worldgen reorg
parent
468a78873c
commit
1c72255e09
|
@ -3,6 +3,8 @@ set(SRCS ${SRCS}
|
||||||
world/blocks.c
|
world/blocks.c
|
||||||
world/perlin.c
|
world/perlin.c
|
||||||
world/world.c
|
world/world.c
|
||||||
|
|
||||||
|
world/worldgen/worldgen_test.c
|
||||||
)
|
)
|
||||||
include_directories(../modules . world)
|
include_directories(../modules . world)
|
||||||
add_library(eco2d-common STATIC ${SRCS})
|
add_library(eco2d-common STATIC ${SRCS})
|
|
@ -5,31 +5,13 @@
|
||||||
#include "modules/physics.h"
|
#include "modules/physics.h"
|
||||||
#include "world/world.h"
|
#include "world/world.h"
|
||||||
#include "entity_view.h"
|
#include "entity_view.h"
|
||||||
|
#include "worldgen/worldgen.h"
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
#include "packets/pkt_send_librg_update.h"
|
#include "packets/pkt_send_librg_update.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t *data;
|
|
||||||
uint32_t seed;
|
|
||||||
uint32_t size;
|
|
||||||
uint16_t block_size;
|
|
||||||
uint16_t chunk_size;
|
|
||||||
uint16_t chunk_amount;
|
|
||||||
uint16_t dim;
|
|
||||||
uint64_t tracker_update[3];
|
|
||||||
uint8_t active_layer_id;
|
|
||||||
ecs_world_t *ecs;
|
|
||||||
ecs_query_t *ecs_update;
|
|
||||||
librg_world *tracker;
|
|
||||||
world_pkt_reader_proc *reader_proc;
|
|
||||||
world_pkt_writer_proc *writer_proc;
|
|
||||||
} world_data;
|
|
||||||
|
|
||||||
static world_data world = {0};
|
static world_data world = {0};
|
||||||
|
|
||||||
int32_t world_gen();
|
|
||||||
|
|
||||||
entity_view world_build_entity_view(int64_t e) {
|
entity_view world_build_entity_view(int64_t e) {
|
||||||
ECS_IMPORT(world_ecs(), General);
|
ECS_IMPORT(world_ecs(), General);
|
||||||
ECS_IMPORT(world_ecs(), Physics);
|
ECS_IMPORT(world_ecs(), Physics);
|
||||||
|
@ -76,8 +58,8 @@ int32_t tracker_write_create(librg_world *w, librg_event *e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tracker_write_remove(librg_world *w, librg_event *e) {
|
int32_t tracker_write_remove(librg_world *w, librg_event *e) {
|
||||||
zpl_unused(e);
|
(void)e;
|
||||||
zpl_unused(w);
|
(void)w;
|
||||||
#ifdef WORLD_LAYERING
|
#ifdef WORLD_LAYERING
|
||||||
if (world.active_layer_id != WORLD_TRACKER_LAYERS-1) {
|
if (world.active_layer_id != WORLD_TRACKER_LAYERS-1) {
|
||||||
// NOTE(zaklaus): reject updates from smaller layers
|
// NOTE(zaklaus): reject updates from smaller layers
|
||||||
|
@ -153,7 +135,7 @@ int32_t world_init(int32_t seed, uint16_t block_size, uint16_t chunk_size, uint1
|
||||||
ECS_IMPORT(world.ecs, Net);
|
ECS_IMPORT(world.ecs, Net);
|
||||||
world.ecs_update = ecs_query_new(world.ecs, "net.ClientInfo, general.Position");
|
world.ecs_update = ecs_query_new(world.ecs, "net.ClientInfo, general.Position");
|
||||||
|
|
||||||
int32_t world_build_status = world_gen();
|
int32_t world_build_status = worldgen_test(&world);
|
||||||
ZPL_ASSERT(world_build_status >= 0);
|
ZPL_ASSERT(world_build_status >= 0);
|
||||||
|
|
||||||
for (int i = 0; i < world.chunk_amount * world.chunk_amount; ++i) {
|
for (int i = 0; i < world.chunk_amount * world.chunk_amount; ++i) {
|
||||||
|
@ -211,7 +193,7 @@ static void world_tracker_update(uint8_t ticker, uint32_t freq, uint8_t radius)
|
||||||
zpl_printf("[error] an error happened writing the world %d\n", result);
|
zpl_printf("[error] an error happened writing the world %d\n", result);
|
||||||
}
|
}
|
||||||
|
|
||||||
pkt_send_librg_update((void*)p[i].peer, p[i].view_id, ticker, buffer, datalen);
|
pkt_send_librg_update((uint64_t)p[i].peer, p[i].view_id, ticker, buffer, datalen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -271,5 +253,3 @@ uint16_t world_chunk_amount(void) {
|
||||||
uint16_t world_dim(void) {
|
uint16_t world_dim(void) {
|
||||||
return world.block_size * world.chunk_size * world.chunk_amount;
|
return world.block_size * world.chunk_size * world.chunk_amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "world_gen.c"
|
|
||||||
|
|
|
@ -23,6 +23,23 @@ typedef WORLD_PKT_READER(world_pkt_reader_proc);
|
||||||
#define WORLD_PKT_WRITER(name) int32_t name(pkt_header *pkt, void *udata)
|
#define WORLD_PKT_WRITER(name) int32_t name(pkt_header *pkt, void *udata)
|
||||||
typedef WORLD_PKT_WRITER(world_pkt_writer_proc);
|
typedef WORLD_PKT_WRITER(world_pkt_writer_proc);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t *data;
|
||||||
|
uint32_t seed;
|
||||||
|
uint32_t size;
|
||||||
|
uint16_t block_size;
|
||||||
|
uint16_t chunk_size;
|
||||||
|
uint16_t chunk_amount;
|
||||||
|
uint16_t dim;
|
||||||
|
uint64_t tracker_update[3];
|
||||||
|
uint8_t active_layer_id;
|
||||||
|
ecs_world_t *ecs;
|
||||||
|
ecs_query_t *ecs_update;
|
||||||
|
librg_world *tracker;
|
||||||
|
world_pkt_reader_proc *reader_proc;
|
||||||
|
world_pkt_writer_proc *writer_proc;
|
||||||
|
} world_data;
|
||||||
|
|
||||||
void world_setup_pkt_handlers(world_pkt_reader_proc *reader_proc, world_pkt_writer_proc *writer_proc);
|
void world_setup_pkt_handlers(world_pkt_reader_proc *reader_proc, world_pkt_writer_proc *writer_proc);
|
||||||
int32_t world_init(int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t chunk_amount);
|
int32_t world_init(int32_t seed, uint16_t block_size, uint16_t chunk_size, uint16_t chunk_amount);
|
||||||
int32_t world_destroy(void);
|
int32_t world_destroy(void);
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
#pragma once
|
||||||
|
#include "system.h"
|
||||||
|
|
||||||
|
int32_t worldgen_test(void *world);
|
|
@ -13,12 +13,14 @@ typedef WORLD_BLOCK_OBSERVER(world_block_observer_proc);
|
||||||
#define WORLD_PERLIN_FREQ 1.0
|
#define WORLD_PERLIN_FREQ 1.0
|
||||||
#define WORLD_PERLIN_OCTAVES 1
|
#define WORLD_PERLIN_OCTAVES 1
|
||||||
|
|
||||||
|
static world_data *world;
|
||||||
|
|
||||||
static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) {
|
static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) {
|
||||||
for (uint32_t cy=y; cy<y+h; cy++) {
|
for (uint32_t cy=y; cy<y+h; cy++) {
|
||||||
for (uint32_t cx=x; cx<x+w; cx++) {
|
for (uint32_t cx=x; cx<x+w; cx++) {
|
||||||
if (cx < 0 || cx >= world.dim) continue;
|
if (cx < 0 || cx >= world->dim) continue;
|
||||||
if (cy < 0 || cy >= world.dim) continue;
|
if (cy < 0 || cy >= world->dim) continue;
|
||||||
uint32_t i = (cy*world.dim) + cx;
|
uint32_t i = (cy*world->dim) + cx;
|
||||||
|
|
||||||
if (proc) {
|
if (proc) {
|
||||||
uint8_t new_id = (*proc)(id, i);
|
uint8_t new_id = (*proc)(id, i);
|
||||||
|
@ -28,7 +30,7 @@ static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint
|
||||||
else continue;
|
else continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
world.data[i] = id;
|
world->data[i] = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,9 +38,9 @@ static void world_fill_rect(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint
|
||||||
static void world_fill_circle(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) {
|
static void world_fill_circle(uint8_t id, uint32_t x, uint32_t y, uint32_t w, uint32_t h, world_block_observer_proc *proc) {
|
||||||
for (uint32_t cy=y; cy<y+h; cy++) {
|
for (uint32_t cy=y; cy<y+h; cy++) {
|
||||||
for (uint32_t cx=x; cx<x+w; cx++) {
|
for (uint32_t cx=x; cx<x+w; cx++) {
|
||||||
if (cx < 0 || cx >= world.dim) continue;
|
if (cx < 0 || cx >= world->dim) continue;
|
||||||
if (cy < 0 || cy >= world.dim) continue;
|
if (cy < 0 || cy >= world->dim) continue;
|
||||||
uint32_t i = (cy*world.dim) + cx;
|
uint32_t i = (cy*world->dim) + cx;
|
||||||
|
|
||||||
if (proc) {
|
if (proc) {
|
||||||
uint8_t new_id = (*proc)(id, i);
|
uint8_t new_id = (*proc)(id, i);
|
||||||
|
@ -48,7 +50,7 @@ static void world_fill_circle(uint8_t id, uint32_t x, uint32_t y, uint32_t w, ui
|
||||||
else continue;
|
else continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
world.data[i] = id;
|
world->data[i] = id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,8 +64,8 @@ static void world_fill_rect_anchor(uint8_t id, uint32_t x, uint32_t y, uint32_t
|
||||||
static WORLD_BLOCK_OBSERVER(shaper) {
|
static WORLD_BLOCK_OBSERVER(shaper) {
|
||||||
uint32_t biome = blocks_get_biome(id);
|
uint32_t biome = blocks_get_biome(id);
|
||||||
uint32_t kind = blocks_get_kind(id);
|
uint32_t kind = blocks_get_kind(id);
|
||||||
uint32_t old_biome = blocks_get_biome(world.data[block_idx]);
|
uint32_t old_biome = blocks_get_biome(world->data[block_idx]);
|
||||||
uint32_t old_kind = blocks_get_kind(world.data[block_idx]);
|
uint32_t old_kind = blocks_get_kind(world->data[block_idx]);
|
||||||
|
|
||||||
if (biome == old_biome) {
|
if (biome == old_biome) {
|
||||||
if (kind == BLOCK_KIND_WALL && kind == old_kind) {
|
if (kind == BLOCK_KIND_WALL && kind == old_kind) {
|
||||||
|
@ -78,10 +80,10 @@ static WORLD_BLOCK_OBSERVER(shaper) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t world_perlin_cond(uint32_t block_idx, double chance) {
|
static uint8_t world_perlin_cond(uint32_t block_idx, double chance) {
|
||||||
uint32_t x = block_idx % world.dim;
|
uint32_t x = block_idx % world->dim;
|
||||||
uint32_t y = block_idx / world.dim;
|
uint32_t y = block_idx / world->dim;
|
||||||
|
|
||||||
return perlin_fbm(world.seed, x, y, WORLD_PERLIN_FREQ, WORLD_PERLIN_OCTAVES) < chance;
|
return perlin_fbm(world->seed, x, y, WORLD_PERLIN_FREQ, WORLD_PERLIN_OCTAVES) < chance;
|
||||||
}
|
}
|
||||||
|
|
||||||
static WORLD_BLOCK_OBSERVER(shaper_noise80) {
|
static WORLD_BLOCK_OBSERVER(shaper_noise80) {
|
||||||
|
@ -104,31 +106,34 @@ static void world_fill_mountain(uint32_t x, uint32_t y) {
|
||||||
|
|
||||||
#define RAND_RANGE(x,y) (x + (int)rand()%(y-(x)))
|
#define RAND_RANGE(x,y) (x + (int)rand()%(y-(x)))
|
||||||
|
|
||||||
int32_t world_gen() {
|
int32_t worldgen_test(world_data *wld) {
|
||||||
|
// TODO(zaklaus): pass world as an arg instead
|
||||||
|
world = wld;
|
||||||
|
|
||||||
// TODO: perform world gen
|
// TODO: perform world gen
|
||||||
// atm, we will fill the world with ground and surround it by walls
|
// atm, we will fill the world with ground and surround it by walls
|
||||||
uint8_t wall_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_WALL);
|
uint8_t wall_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_WALL);
|
||||||
uint8_t grnd_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_GROUND);
|
uint8_t grnd_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_GROUND);
|
||||||
uint8_t watr_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_WATER);
|
uint8_t watr_id = blocks_find(BLOCK_BIOME_DEV, BLOCK_KIND_WATER);
|
||||||
|
|
||||||
srand(world.seed);
|
srand(world->seed);
|
||||||
|
|
||||||
// walls
|
// walls
|
||||||
world_fill_rect(wall_id, 0, 0, world.dim, world.dim, NULL);
|
world_fill_rect(wall_id, 0, 0, world->dim, world->dim, NULL);
|
||||||
|
|
||||||
// ground
|
// ground
|
||||||
world_fill_rect(grnd_id, 1, 1, world.dim-2, world.dim-2, NULL);
|
world_fill_rect(grnd_id, 1, 1, world->dim-2, world->dim-2, NULL);
|
||||||
|
|
||||||
// water
|
// water
|
||||||
for (int i=0; i<RAND_RANGE(0, 12); i++) {
|
for (int i=0; i<RAND_RANGE(0, 12); i++) {
|
||||||
world_fill_rect_anchor(watr_id, RAND_RANGE(0, world.dim), RAND_RANGE(0, world.dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise33);
|
world_fill_rect_anchor(watr_id, RAND_RANGE(0, world->dim), RAND_RANGE(0, world->dim), 4+RAND_RANGE(0,3), 4+RAND_RANGE(0,3), 0.5f, 0.5f, shaper_noise33);
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint32_t HILLS_SIZE = 21;
|
const uint32_t HILLS_SIZE = 21;
|
||||||
|
|
||||||
// hills
|
// hills
|
||||||
for (int i=0; i<RAND_RANGE(8, 224); i++) {
|
for (int i=0; i<RAND_RANGE(8, 224); i++) {
|
||||||
world_fill_rect_anchor(wall_id, RAND_RANGE(0, world.dim), RAND_RANGE(0, world.dim), RAND_RANGE(0,HILLS_SIZE), RAND_RANGE(0,HILLS_SIZE), 0.5f, 0.5f, shaper_noise33);
|
world_fill_rect_anchor(wall_id, RAND_RANGE(0, world->dim), RAND_RANGE(0, world->dim), RAND_RANGE(0,HILLS_SIZE), RAND_RANGE(0,HILLS_SIZE), 0.5f, 0.5f, shaper_noise33);
|
||||||
}
|
}
|
||||||
|
|
||||||
return WORLD_ERROR_NONE;
|
return WORLD_ERROR_NONE;
|
Loading…
Reference in New Issue