Browse Source

more pure functional tile gen

opengl-renderer-broken
Martin Dørum 4 years ago
parent
commit
fa163b4bd3

BIN
core.mod/assets-src/tiles/leaves.xcf View File


BIN
core.mod/assets/tiles/leaves.png View File


+ 24
- 20
core.mod/src/WGDefault.cc View File

@@ -1,34 +1,37 @@
#include "WGDefault.h"

static int getHeightAt(const siv::PerlinNoise &perlin, int tilex) {
return (int)(perlin.noise(tilex / 50.0, 0) * 13);
static int grassLevel(const siv::PerlinNoise &perlin, int x) {
return (int)(perlin.noise(x / 50.0, 0) * 13);
}

static int getDepthAt(const siv::PerlinNoise &perlin, int tilex) {
return (int)(perlin.noise(tilex / 50.0, 10) * 10) + 10;
static int stoneLevel(const siv::PerlinNoise &perlin, int x) {
return (int)(perlin.noise(x / 50.0, 10) * 10) + 10;
}

void WGDefault::genChunk(Swan::WorldPlane &plane, Swan::Chunk &chunk) {
Swan::Tile::ID WGDefault::genTile(Swan::TilePos pos) {
int grass_level = grassLevel(perlin_, pos.x);
int stone_level = stoneLevel(perlin_, pos.x);

if (pos.y > stone_level)
return tStone_;
else if (pos.y > grass_level)
return tDirt_;
else if (pos.y == grass_level)
return tGrass_;
else
return tAir_;
}

void WGDefault::genChunk(Swan::WorldPlane &plane, Swan::Chunk &chunk) {
for (int cx = 0; cx < Swan::CHUNK_WIDTH; ++cx) {
int tilex = chunk.pos_.x * Swan::CHUNK_WIDTH + cx;

int height = getHeightAt(perlin_, tilex);
int depth = getDepthAt(perlin_, tilex);
if (depth <= height) depth = height + 1;

for (int cy = 0; cy < Swan::CHUNK_HEIGHT; ++cy) {
int tiley = chunk.pos_.y * Swan::CHUNK_HEIGHT + cy;
Swan::TilePos tpos = Swan::TilePos(tilex, tiley);

if (tpos.y == height)
chunk.setTileID(Swan::TilePos(cx, cy), tGrass_);
else if (tpos.y > height && tpos.y <= depth)
chunk.setTileID(Swan::TilePos(cx, cy), tDirt_);
else if (tpos.y > depth)
chunk.setTileID(Swan::TilePos(cx, cy), tStone_);
else
chunk.setTileID(Swan::TilePos(cx, cy), tAir_);

Swan::TilePos pos(tilex, tiley);
Swan::Chunk::RelPos rel(cx, cy);
chunk.setTileID(rel, genTile(pos));
}
}
}
@@ -36,5 +39,6 @@ void WGDefault::genChunk(Swan::WorldPlane &plane, Swan::Chunk &chunk) {
Swan::BodyTrait::HasBody *WGDefault::spawnPlayer(Swan::WorldPlane &plane) {
int x = 0;
return dynamic_cast<Swan::BodyTrait::HasBody *>(
plane.spawnEntity("core::player", Swan::SRFFloatArray{ (float)x, (float)getHeightAt(perlin_, x) - 4 }));
plane.spawnEntity("core::player", Swan::SRFFloatArray{
(float)x, (float)grassLevel(perlin_, x) - 4 }));
}

+ 5
- 3
core.mod/src/WGDefault.h View File

@@ -12,13 +12,15 @@ public:
};

WGDefault(Swan::World &world):
tGrass_(world.getTileID("core::tree-trunk")), tDirt_(world.getTileID("core::dirt")),
tStone_(world.getTileID("core::stone")), tAir_(world.getTileID("core::air")) {}
tGrass_(world.getTileID("core::grass")), tDirt_(world.getTileID("core::dirt")),
tStone_(world.getTileID("core::stone")), tAir_(world.getTileID("core::air")),
tTreeTrunk_(world.getTileID("core::tree-trunk")), tLeaves_(world.getTileID("core::leaves")) {}

void genChunk(Swan::WorldPlane &plane, Swan::Chunk &chunk) override;
Swan::BodyTrait::HasBody *spawnPlayer(Swan::WorldPlane &plane) override;

private:
Swan::Tile::ID tGrass_, tDirt_, tStone_, tAir_;
Swan::Tile::ID genTile(Swan::TilePos pos);
Swan::Tile::ID tGrass_, tDirt_, tStone_, tAir_, tTreeTrunk_, tLeaves_;
siv::PerlinNoise perlin_ = siv::PerlinNoise(100);
};

+ 5
- 0
core.mod/src/main.cc View File

@@ -12,6 +12,7 @@ extern "C" void mod_init(Swan::Mod &mod) {
mod.registerImage({ "dirt", "tiles/dirt.png" });
mod.registerImage({ "grass", "tiles/grass.png" });
mod.registerImage({ "tree-trunk", "tiles/tree-trunk.png" });
mod.registerImage({ "leaves", "tiles/leaves.png" });
mod.registerImage({ "player-running", "entities/player-running.png", 64 });
mod.registerImage({ "player-still", "entities/player-still.png", 64 });

@@ -40,6 +41,10 @@ extern "C" void mod_init(Swan::Mod &mod) {
.image = "core::tree-trunk",
.dropped_item = "core::tree-trunk",
});
mod.registerTile({
.name = "leaves",
.image = "core::leaves",
});

mod.registerItem({
.name = "stone",

Loading…
Cancel
Save