From 68694a9c9d7d27d3b79c7b96bb67f56db2f75c45 Mon Sep 17 00:00:00 2001 From: untodesu Date: Thu, 11 Sep 2025 18:18:08 +0500 Subject: Metadata voxels! --- game/shared/game_voxels.cc | 141 +++++++++++++++++++-------------------------- 1 file changed, 58 insertions(+), 83 deletions(-) (limited to 'game/shared/game_voxels.cc') diff --git a/game/shared/game_voxels.cc b/game/shared/game_voxels.cc index 51de1a1..59d035d 100644 --- a/game/shared/game_voxels.cc +++ b/game/shared/game_voxels.cc @@ -2,41 +2,71 @@ #include "shared/game_voxels.hh" +#include "shared/world/voxels/generic.hh" + #include "shared/world/voxel_registry.hh" -voxel_id game_voxels::cobblestone = NULL_VOXEL_ID; -voxel_id game_voxels::dirt = NULL_VOXEL_ID; -voxel_id game_voxels::grass = NULL_VOXEL_ID; -voxel_id game_voxels::stone = NULL_VOXEL_ID; -voxel_id game_voxels::vtest = NULL_VOXEL_ID; -voxel_id game_voxels::vtest_ck = NULL_VOXEL_ID; -voxel_id game_voxels::oak_leaves = NULL_VOXEL_ID; -voxel_id game_voxels::oak_planks = NULL_VOXEL_ID; -voxel_id game_voxels::oak_log = NULL_VOXEL_ID; -voxel_id game_voxels::glass = NULL_VOXEL_ID; -voxel_id game_voxels::slime = NULL_VOXEL_ID; -voxel_id game_voxels::mud = NULL_VOXEL_ID; +const world::Voxel* game_voxels::cobblestone = nullptr; +const world::Voxel* game_voxels::dirt = nullptr; +const world::Voxel* game_voxels::grass = nullptr; +const world::Voxel* game_voxels::stone = nullptr; +const world::Voxel* game_voxels::vtest = nullptr; +const world::Voxel* game_voxels::vtest_ck = nullptr; +const world::Voxel* game_voxels::oak_leaves = nullptr; +const world::Voxel* game_voxels::oak_planks = nullptr; +const world::Voxel* game_voxels::oak_log = nullptr; +const world::Voxel* game_voxels::glass = nullptr; +const world::Voxel* game_voxels::slime = nullptr; +const world::Voxel* game_voxels::mud = nullptr; void game_voxels::populate(void) { - // Stone; the backbone of the generated world - game_voxels::stone = - world::voxel_registry::construct("stone", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/stone_01.png") - .add_texture_default("textures/voxel/stone_02.png") - .add_texture_default("textures/voxel/stone_03.png") - .add_texture_default("textures/voxel/stone_04.png") - .set_surface(world::voxel_surface::STONE) - .build(); + using namespace world; + using namespace world::voxels; + using world::voxel_registry::register_voxel; + + stone = register_voxel(GenericCube("stone", VRENDER_OPAQUE, false, VMAT_STONE, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/stone_01.png", "textures/voxel/stone_02.png", "textures/voxel/stone_03.png", "textures/voxel/stone_04.png")); + + cobblestone = register_voxel(GenericCube("cobblestone", VRENDER_OPAQUE, false, VMAT_STONE, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/cobblestone_01.png", "textures/voxel/cobblestone_02.png")); + + vtest = register_voxel(GenericCube("vtest", VRENDER_OPAQUE, true, VMAT_DEFAULT, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/vtest_F1.png", "textures/voxel/vtest_F2.png", "textures/voxel/vtest_F3.png", "textures/voxel/vtest_F4.png")); + + vtest_ck = register_voxel(GenericCube("vtest_ck", VRENDER_OPAQUE, false, VMAT_DEFAULT, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/chromakey.png")); + + oak_leaves = register_voxel(GenericCube("oak_leaves", VRENDER_BLEND, false, VMAT_GRASS, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/oak_leaves.png")); - // Cobblestone; should drop when a stone is broken, might also be present in surface features - game_voxels::cobblestone = - world::voxel_registry::construct("cobblestone", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/cobblestone_01.png") - .add_texture_default("textures/voxel/cobblestone_02.png") - .set_surface(world::voxel_surface::STONE) + oak_planks = register_voxel(GenericCube("oak_planks", VRENDER_OPAQUE, false, VMAT_WOOD, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/oak_planks_01.png", "textures/voxel/oak_planks_02.png")); + + glass = register_voxel(GenericCube("glass", VRENDER_BLEND, false, VMAT_GLASS, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), + "textures/voxel/glass_01.png")); + + slime = register_voxel(GenericCube("slime", VRENDER_BLEND, false, VMAT_SLOSH, VTOUCH_BOUNCE, glm::fvec3(0.00f, 0.60f, 0.00f), + "textures/voxel/slime_01.png")); + +#if 0 + + // Oak logs; greenery. TODO: add trees as surface features + game_voxels::oak_log = + world::voxel_registry::construct("oak_log", world::voxel_type::CUBE, false, false) + .add_texture_default("textures/voxel/oak_wood_01.png") + .add_texture_default("textures/voxel/oak_wood_02.png") + .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/oak_wood_top.png") + .add_texture(world::voxel_face::CUBE_TOP, "textures/voxel/oak_wood_top.png") + .set_surface(world::voxel_surface::WOOD) .build(); + // Glass; blend rendering test + game_voxels::glass = world::voxel_registry::construct("glass", world::voxel_type::CUBE, false, true) + .add_texture_default("textures/voxel/glass_01.png") + .set_surface(world::voxel_surface::GLASS) + .build(); + // Dirt with a grass layer on top; the top layer of plains biome game_voxels::grass = world::voxel_registry::construct("grass", world::voxel_type::CUBE, false, false) @@ -60,60 +90,5 @@ void game_voxels::populate(void) .add_texture_default("textures/voxel/dirt_04.png") .set_surface(world::voxel_surface::DIRT) .build(); - - // VTest; a test voxel to ensure animations work - game_voxels::vtest = world::voxel_registry::construct("vtest", world::voxel_type::CUBE, true, false) - .add_texture_default("textures/voxel/vtest_F1.png") - .add_texture_default("textures/voxel/vtest_F2.png") - .add_texture_default("textures/voxel/vtest_F3.png") - .add_texture_default("textures/voxel/vtest_F4.png") - .build(); - - // VTest-CK; a pure blue chromakey I used to make the game's logo - game_voxels::vtest_ck = world::voxel_registry::construct("vtest_ck", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/chromakey.png") - .build(); - - // Oak leaves; greenery. TODO: add trees as surface features - game_voxels::oak_leaves = world::voxel_registry::construct("oak_leaves", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/oak_leaves.png") - .set_surface(world::voxel_surface::GRASS) - .build(); - - // Oak planks; the thing that comes out of oak logs - game_voxels::oak_planks = world::voxel_registry::construct("oak_planks", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/oak_planks_01.png") - .add_texture_default("textures/voxel/oak_planks_02.png") - .set_surface(world::voxel_surface::WOOD) - .build(); - - // Oak logs; greenery. TODO: add trees as surface features - game_voxels::oak_log = - world::voxel_registry::construct("oak_log", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/oak_wood_01.png") - .add_texture_default("textures/voxel/oak_wood_02.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/oak_wood_top.png") - .add_texture(world::voxel_face::CUBE_TOP, "textures/voxel/oak_wood_top.png") - .set_surface(world::voxel_surface::WOOD) - .build(); - - // Glass; blend rendering test - game_voxels::glass = world::voxel_registry::construct("glass", world::voxel_type::CUBE, false, true) - .add_texture_default("textures/voxel/glass_01.png") - .set_surface(world::voxel_surface::GLASS) - .build(); - - // Slime; it's bouncy! - game_voxels::slime = world::voxel_registry::construct("slime", world::voxel_type::CUBE, false, true) - .set_touch(world::voxel_touch::BOUNCE, glm::fvec3(0.00f, 0.60f, 0.00f)) - .add_texture_default("textures/voxel/slime_01.png") - .build(); - - // Mud; you sink in it - game_voxels::mud = world::voxel_registry::construct("mud", world::voxel_type::CUBE, false, false) - .set_touch(world::voxel_touch::SINK, glm::fvec3(0.50f, 0.75f, 0.50f)) - .add_texture_default("textures/voxel/mud_01.png") - .add_texture_default("textures/voxel/mud_02.png") - .set_surface(world::voxel_surface::DIRT) - .build(); +#endif } -- cgit From e9076f22fe2a49d1cd8933e54b7b00c5dd943269 Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 13:33:52 +0500 Subject: It compiles --- game/shared/game_voxels.cc | 193 ++++++++++++++++++++++++++++----------------- 1 file changed, 120 insertions(+), 73 deletions(-) (limited to 'game/shared/game_voxels.cc') diff --git a/game/shared/game_voxels.cc b/game/shared/game_voxels.cc index 59d035d..75c56c7 100644 --- a/game/shared/game_voxels.cc +++ b/game/shared/game_voxels.cc @@ -2,10 +2,11 @@ #include "shared/game_voxels.hh" -#include "shared/world/voxels/generic.hh" - +#include "shared/world/dimension.hh" #include "shared/world/voxel_registry.hh" +#include "shared/const.hh" + const world::Voxel* game_voxels::cobblestone = nullptr; const world::Voxel* game_voxels::dirt = nullptr; const world::Voxel* game_voxels::grass = nullptr; @@ -17,78 +18,124 @@ const world::Voxel* game_voxels::oak_planks = nullptr; const world::Voxel* game_voxels::oak_log = nullptr; const world::Voxel* game_voxels::glass = nullptr; const world::Voxel* game_voxels::slime = nullptr; -const world::Voxel* game_voxels::mud = nullptr; + +static void dirt_tick(world::Dimension* dimension, const voxel_pos& vpos) +{ + auto grass_found = false; + auto air_above = false; + + for(voxel_pos::value_type dx = -1; dx <= 1 && !grass_found; ++dx) { + for(voxel_pos::value_type dy = -1; dy <= 1 && !grass_found; ++dy) { + for(voxel_pos::value_type dz = -1; dz <= 1 && !grass_found; ++dz) { + if(dx == 0 && dy == 0 && dz == 0) { + // Skip self + continue; + } + + auto neighbour_vpos = vpos + voxel_pos(dx, dy, dz); + auto neighbour_voxel = dimension->get_voxel(neighbour_vpos); + + // Voxel pointers returned by get_voxel() are the exact same + // returned by the voxel registry, so we can compare pointers directly + // and not bother with voxel_id property comparisons + if(neighbour_voxel == game_voxels::grass) { + grass_found = true; + break; + } + } + } + } + + auto above_vpos = vpos + voxel_pos(0, 1, 0); + auto above_voxel = dimension->get_voxel(above_vpos); + + if(above_voxel == nullptr || above_voxel->is_surface_material()) { + air_above = true; + } + + if(grass_found && air_above) { + // Replace itself with the grass voxel + dimension->set_voxel(game_voxels::grass, vpos); + } +} void game_voxels::populate(void) { - using namespace world; - using namespace world::voxels; - using world::voxel_registry::register_voxel; - - stone = register_voxel(GenericCube("stone", VRENDER_OPAQUE, false, VMAT_STONE, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/stone_01.png", "textures/voxel/stone_02.png", "textures/voxel/stone_03.png", "textures/voxel/stone_04.png")); - - cobblestone = register_voxel(GenericCube("cobblestone", VRENDER_OPAQUE, false, VMAT_STONE, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/cobblestone_01.png", "textures/voxel/cobblestone_02.png")); - - vtest = register_voxel(GenericCube("vtest", VRENDER_OPAQUE, true, VMAT_DEFAULT, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/vtest_F1.png", "textures/voxel/vtest_F2.png", "textures/voxel/vtest_F3.png", "textures/voxel/vtest_F4.png")); - - vtest_ck = register_voxel(GenericCube("vtest_ck", VRENDER_OPAQUE, false, VMAT_DEFAULT, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/chromakey.png")); - - oak_leaves = register_voxel(GenericCube("oak_leaves", VRENDER_BLEND, false, VMAT_GRASS, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/oak_leaves.png")); - - oak_planks = register_voxel(GenericCube("oak_planks", VRENDER_OPAQUE, false, VMAT_WOOD, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/oak_planks_01.png", "textures/voxel/oak_planks_02.png")); - - glass = register_voxel(GenericCube("glass", VRENDER_BLEND, false, VMAT_GLASS, VTOUCH_SOLID, glm::fvec3(0.0f, 0.0f, 0.0f), - "textures/voxel/glass_01.png")); - - slime = register_voxel(GenericCube("slime", VRENDER_BLEND, false, VMAT_SLOSH, VTOUCH_BOUNCE, glm::fvec3(0.00f, 0.60f, 0.00f), - "textures/voxel/slime_01.png")); - -#if 0 - - // Oak logs; greenery. TODO: add trees as surface features - game_voxels::oak_log = - world::voxel_registry::construct("oak_log", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/oak_wood_01.png") - .add_texture_default("textures/voxel/oak_wood_02.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/oak_wood_top.png") - .add_texture(world::voxel_face::CUBE_TOP, "textures/voxel/oak_wood_top.png") - .set_surface(world::voxel_surface::WOOD) - .build(); - - // Glass; blend rendering test - game_voxels::glass = world::voxel_registry::construct("glass", world::voxel_type::CUBE, false, true) - .add_texture_default("textures/voxel/glass_01.png") - .set_surface(world::voxel_surface::GLASS) - .build(); - - // Dirt with a grass layer on top; the top layer of plains biome - game_voxels::grass = - world::voxel_registry::construct("grass", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/grass_side_01.png") - .add_texture_default("textures/voxel/grass_side_02.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/dirt_01.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/dirt_02.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/dirt_03.png") - .add_texture(world::voxel_face::CUBE_BOTTOM, "textures/voxel/dirt_04.png") - .add_texture(world::voxel_face::CUBE_TOP, "textures/voxel/grass_01.png") - .add_texture(world::voxel_face::CUBE_TOP, "textures/voxel/grass_02.png") - .set_surface(world::voxel_surface::GRASS) - .build(); - - // Dirt; the under-surface layer of some biomes - game_voxels::dirt = - world::voxel_registry::construct("dirt", world::voxel_type::CUBE, false, false) - .add_texture_default("textures/voxel/dirt_01.png") - .add_texture_default("textures/voxel/dirt_02.png") - .add_texture_default("textures/voxel/dirt_03.png") - .add_texture_default("textures/voxel/dirt_04.png") - .set_surface(world::voxel_surface::DIRT) - .build(); -#endif + world::VoxelBuilder builder; + + builder = world::VoxelBuilder("stone"); + builder.add_default_texture("textures/voxel/stone_01.png") + .add_default_texture("textures/voxel/stone_02.png") + .add_default_texture("textures/voxel/stone_03.png") + .add_default_texture("textures/voxel/stone_04.png"); + stone = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("cobblestone"); + builder.add_default_texture("textures/voxel/cobblestone_01.png").add_default_texture("textures/voxel/cobblestone_02.png"); + cobblestone = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("dirt"); + builder.add_default_texture("textures/voxel/dirt_01.png") + .add_default_texture("textures/voxel/dirt_02.png") + .add_default_texture("textures/voxel/dirt_03.png") + .add_default_texture("textures/voxel/dirt_04.png"); + builder.set_surface_material(world::VMAT_DIRT); + builder.set_on_tick(&dirt_tick); + dirt = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("grass"); + builder.add_default_texture("textures/voxel/grass_side_01.png") + .add_default_texture("textures/voxel/grass_side_02.png") + .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_01.png") + .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_02.png") + .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_03.png") + .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_04.png") + .add_face_texture(world::VFACE_TOP, "textures/voxel/grass_01.png") + .add_face_texture(world::VFACE_TOP, "textures/voxel/grass_02.png"); + builder.set_surface_material(world::VMAT_GRASS); + grass = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("vtest"); + builder.add_default_texture("textures/voxel/vtest_F1.png") + .add_default_texture("textures/voxel/vtest_F2.png") + .add_default_texture("textures/voxel/vtest_F3.png") + .add_default_texture("textures/voxel/vtest_F4.png"); + builder.set_animated(true); + vtest = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("vtest_ck"); + builder.add_default_texture("textures/voxel/chromakey.png"); + vtest_ck = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("oak_leaves"); + builder.add_default_texture("textures/voxel/oak_leaves.png"); + builder.set_render_mode(world::VRENDER_BLEND); + builder.set_surface_material(world::VMAT_GRASS); + oak_leaves = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("oak_planks"); + builder.add_default_texture("textures/voxel/oak_planks_01.png").add_default_texture("textures/voxel/oak_planks_02.png"); + builder.set_surface_material(world::VMAT_WOOD); + oak_planks = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("oak_log"); + builder.add_default_texture("textures/voxel/oak_wood_01.png") + .add_default_texture("textures/voxel/oak_wood_02.png") + .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/oak_wood_top.png") + .add_face_texture(world::VFACE_TOP, "textures/voxel/oak_wood_top.png"); + builder.set_surface_material(world::VMAT_WOOD); + oak_log = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("glass"); + builder.add_default_texture("textures/voxel/glass_01.png"); + builder.set_render_mode(world::VRENDER_BLEND); + builder.set_surface_material(world::VMAT_GLASS); + glass = world::voxel_registry::register_voxel(builder); + + builder = world::VoxelBuilder("slime"); + builder.add_default_texture("textures/voxel/slime_01.png"); + builder.set_render_mode(world::VRENDER_BLEND); + builder.set_surface_material(world::VMAT_SLOSH); + builder.set_touch_type(world::VTOUCH_BOUNCE).set_touch_values({ 0.00f, 0.60f, 0.00f }); + slime = world::voxel_registry::register_voxel(builder); } -- cgit From 73cbcdd6e8c849e32abbf9757e603e6a6654e870 Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 14:09:34 +0500 Subject: Metaitems --- game/shared/game_voxels.cc | 154 ++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 77 deletions(-) (limited to 'game/shared/game_voxels.cc') diff --git a/game/shared/game_voxels.cc b/game/shared/game_voxels.cc index 75c56c7..f262c23 100644 --- a/game/shared/game_voxels.cc +++ b/game/shared/game_voxels.cc @@ -61,81 +61,81 @@ static void dirt_tick(world::Dimension* dimension, const voxel_pos& vpos) void game_voxels::populate(void) { - world::VoxelBuilder builder; - - builder = world::VoxelBuilder("stone"); - builder.add_default_texture("textures/voxel/stone_01.png") - .add_default_texture("textures/voxel/stone_02.png") - .add_default_texture("textures/voxel/stone_03.png") - .add_default_texture("textures/voxel/stone_04.png"); - stone = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("cobblestone"); - builder.add_default_texture("textures/voxel/cobblestone_01.png").add_default_texture("textures/voxel/cobblestone_02.png"); - cobblestone = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("dirt"); - builder.add_default_texture("textures/voxel/dirt_01.png") - .add_default_texture("textures/voxel/dirt_02.png") - .add_default_texture("textures/voxel/dirt_03.png") - .add_default_texture("textures/voxel/dirt_04.png"); - builder.set_surface_material(world::VMAT_DIRT); - builder.set_on_tick(&dirt_tick); - dirt = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("grass"); - builder.add_default_texture("textures/voxel/grass_side_01.png") - .add_default_texture("textures/voxel/grass_side_02.png") - .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_01.png") - .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_02.png") - .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_03.png") - .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_04.png") - .add_face_texture(world::VFACE_TOP, "textures/voxel/grass_01.png") - .add_face_texture(world::VFACE_TOP, "textures/voxel/grass_02.png"); - builder.set_surface_material(world::VMAT_GRASS); - grass = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("vtest"); - builder.add_default_texture("textures/voxel/vtest_F1.png") - .add_default_texture("textures/voxel/vtest_F2.png") - .add_default_texture("textures/voxel/vtest_F3.png") - .add_default_texture("textures/voxel/vtest_F4.png"); - builder.set_animated(true); - vtest = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("vtest_ck"); - builder.add_default_texture("textures/voxel/chromakey.png"); - vtest_ck = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("oak_leaves"); - builder.add_default_texture("textures/voxel/oak_leaves.png"); - builder.set_render_mode(world::VRENDER_BLEND); - builder.set_surface_material(world::VMAT_GRASS); - oak_leaves = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("oak_planks"); - builder.add_default_texture("textures/voxel/oak_planks_01.png").add_default_texture("textures/voxel/oak_planks_02.png"); - builder.set_surface_material(world::VMAT_WOOD); - oak_planks = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("oak_log"); - builder.add_default_texture("textures/voxel/oak_wood_01.png") - .add_default_texture("textures/voxel/oak_wood_02.png") - .add_face_texture(world::VFACE_BOTTOM, "textures/voxel/oak_wood_top.png") - .add_face_texture(world::VFACE_TOP, "textures/voxel/oak_wood_top.png"); - builder.set_surface_material(world::VMAT_WOOD); - oak_log = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("glass"); - builder.add_default_texture("textures/voxel/glass_01.png"); - builder.set_render_mode(world::VRENDER_BLEND); - builder.set_surface_material(world::VMAT_GLASS); - glass = world::voxel_registry::register_voxel(builder); - - builder = world::VoxelBuilder("slime"); - builder.add_default_texture("textures/voxel/slime_01.png"); - builder.set_render_mode(world::VRENDER_BLEND); - builder.set_surface_material(world::VMAT_SLOSH); - builder.set_touch_type(world::VTOUCH_BOUNCE).set_touch_values({ 0.00f, 0.60f, 0.00f }); - slime = world::voxel_registry::register_voxel(builder); + auto stone_builder = world::VoxelBuilder("stone"); + stone_builder.add_default_texture("textures/voxel/stone_01.png"); + stone_builder.add_default_texture("textures/voxel/stone_02.png"); + stone_builder.add_default_texture("textures/voxel/stone_03.png"); + stone_builder.add_default_texture("textures/voxel/stone_04.png"); + stone = world::voxel_registry::register_voxel(stone_builder); + + auto cobblestone_builder = world::VoxelBuilder("cobblestone"); + cobblestone_builder.add_default_texture("textures/voxel/cobblestone_01.png"); + cobblestone_builder.add_default_texture("textures/voxel/cobblestone_02.png"); + cobblestone = world::voxel_registry::register_voxel(cobblestone_builder); + + auto dirt_builder = world::VoxelBuilder("dirt"); + dirt_builder.add_default_texture("textures/voxel/dirt_01.png"); + dirt_builder.add_default_texture("textures/voxel/dirt_02.png"); + dirt_builder.add_default_texture("textures/voxel/dirt_03.png"); + dirt_builder.add_default_texture("textures/voxel/dirt_04.png"); + dirt_builder.set_surface_material(world::VMAT_DIRT); + dirt_builder.set_on_tick(&dirt_tick); + dirt = world::voxel_registry::register_voxel(dirt_builder); + + auto grass_builder = world::VoxelBuilder("grass"); + grass_builder.add_default_texture("textures/voxel/grass_side_01.png"); + grass_builder.add_default_texture("textures/voxel/grass_side_02.png"); + grass_builder.add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_01.png"); + grass_builder.add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_02.png"); + grass_builder.add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_03.png"); + grass_builder.add_face_texture(world::VFACE_BOTTOM, "textures/voxel/dirt_04.png"); + grass_builder.add_face_texture(world::VFACE_TOP, "textures/voxel/grass_01.png"); + grass_builder.add_face_texture(world::VFACE_TOP, "textures/voxel/grass_02.png"); + grass_builder.set_surface_material(world::VMAT_GRASS); + grass = world::voxel_registry::register_voxel(grass_builder); + + auto vtest_builder = world::VoxelBuilder("vtest"); + vtest_builder.add_default_texture("textures/voxel/vtest_F1.png"); + vtest_builder.add_default_texture("textures/voxel/vtest_F2.png"); + vtest_builder.add_default_texture("textures/voxel/vtest_F3.png"); + vtest_builder.add_default_texture("textures/voxel/vtest_F4.png"); + vtest_builder.set_animated(true); + vtest = world::voxel_registry::register_voxel(vtest_builder); + + auto vtest_ck_builder = world::VoxelBuilder("vtest_ck"); + vtest_ck_builder.add_default_texture("textures/voxel/chromakey.png"); + vtest_ck = world::voxel_registry::register_voxel(vtest_ck_builder); + + auto oak_leaves_builder = world::VoxelBuilder("oak_leaves"); + oak_leaves_builder.add_default_texture("textures/voxel/oak_leaves.png"); + oak_leaves_builder.set_surface_material(world::VMAT_GRASS); + oak_leaves = world::voxel_registry::register_voxel(oak_leaves_builder); + + auto oak_planks_builder = world::VoxelBuilder("oak_planks"); + oak_planks_builder.add_default_texture("textures/voxel/oak_planks_01.png"); + oak_planks_builder.add_default_texture("textures/voxel/oak_planks_02.png"); + oak_planks_builder.set_surface_material(world::VMAT_WOOD); + oak_planks = world::voxel_registry::register_voxel(oak_planks_builder); + + auto oak_log_builder = world::VoxelBuilder("oak_log"); + oak_log_builder.add_default_texture("textures/voxel/oak_wood_01.png"); + oak_log_builder.add_default_texture("textures/voxel/oak_wood_02.png"); + oak_log_builder.add_face_texture(world::VFACE_BOTTOM, "textures/voxel/oak_wood_top.png"); + oak_log_builder.add_face_texture(world::VFACE_TOP, "textures/voxel/oak_wood_top.png"); + oak_log_builder.set_surface_material(world::VMAT_WOOD); + oak_log = world::voxel_registry::register_voxel(oak_log_builder); + + auto glass_builder = world::VoxelBuilder("glass"); + glass_builder.add_default_texture("textures/voxel/glass_01.png"); + glass_builder.set_render_mode(world::VRENDER_BLEND); + glass_builder.set_surface_material(world::VMAT_GLASS); + glass = world::voxel_registry::register_voxel(glass_builder); + + auto slime_builder = world::VoxelBuilder("slime"); + slime_builder.add_default_texture("textures/voxel/slime_01.png"); + slime_builder.set_render_mode(world::VRENDER_BLEND); + slime_builder.set_surface_material(world::VMAT_SLOSH); + slime_builder.set_touch_type(world::VTOUCH_BOUNCE); + slime_builder.set_touch_values({ 0.00f, 0.60f, 0.00f }); + slime = world::voxel_registry::register_voxel(slime_builder); } -- cgit From f210a86c1406ccc6dfd6f14181dd7a1274ee0de4 Mon Sep 17 00:00:00 2001 From: untodesu Date: Fri, 12 Sep 2025 15:09:01 +0500 Subject: Random ticking? In my game?! Hell yeah! --- game/shared/game_voxels.cc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'game/shared/game_voxels.cc') diff --git a/game/shared/game_voxels.cc b/game/shared/game_voxels.cc index f262c23..51cf873 100644 --- a/game/shared/game_voxels.cc +++ b/game/shared/game_voxels.cc @@ -54,11 +54,21 @@ static void dirt_tick(world::Dimension* dimension, const voxel_pos& vpos) } if(grass_found && air_above) { - // Replace itself with the grass voxel dimension->set_voxel(game_voxels::grass, vpos); } } +static void grass_tick(world::Dimension* dimension, const voxel_pos& vpos) +{ + auto above_vpos = vpos + voxel_pos(0, 1, 0); + auto above_voxel = dimension->get_voxel(above_vpos); + + if(above_voxel && !above_voxel->is_surface_material()) { + // Decay into dirt if something is blocking airflow + dimension->set_voxel(game_voxels::dirt, vpos); + } +} + void game_voxels::populate(void) { auto stone_builder = world::VoxelBuilder("stone"); @@ -92,6 +102,7 @@ void game_voxels::populate(void) grass_builder.add_face_texture(world::VFACE_TOP, "textures/voxel/grass_01.png"); grass_builder.add_face_texture(world::VFACE_TOP, "textures/voxel/grass_02.png"); grass_builder.set_surface_material(world::VMAT_GRASS); + grass_builder.set_on_tick(&grass_tick); grass = world::voxel_registry::register_voxel(grass_builder); auto vtest_builder = world::VoxelBuilder("vtest"); -- cgit