From 788ad1f6a65b81150e41e6f5b4a39d81e1b1e6bb Mon Sep 17 00:00:00 2001 From: MihailRis Date: Wed, 25 Sep 2024 15:45:45 +0300 Subject: [PATCH] add core:obstacle block & move cameras from base to core & add new generator --- res/content/base/generators/demo.lua | 86 +++++++++++++++++ .../base/generators/demo}/biomes.json | 0 .../base/generators/demo}/coal_ore0.vox | Bin .../base/generators/demo}/structures.json | 0 .../base/generators/demo}/tower.vox | Bin .../base/generators/demo}/tree0.vox | Bin .../base/generators/demo}/tree1.vox | Bin .../base/generators/demo}/tree2.vox | Bin res/content/base/preload.json | 7 -- res/generators/default.lua | 91 +++--------------- res/preload.json | 7 +- res/{content/base => }/resources.json | 0 res/textures/blocks/obstacle.png | Bin 0 -> 6849 bytes src/constants.hpp | 1 + src/content/ContentLoader.cpp | 24 ++--- src/core_defs.cpp | 35 +++++-- src/core_defs.hpp | 1 + .../scripting/scripting_world_generation.cpp | 3 +- src/objects/Player.cpp | 6 +- 19 files changed, 147 insertions(+), 114 deletions(-) create mode 100644 res/content/base/generators/demo.lua rename res/{generators/default => content/base/generators/demo}/biomes.json (100%) rename res/{generators/default => content/base/generators/demo}/coal_ore0.vox (100%) rename res/{generators/default => content/base/generators/demo}/structures.json (100%) rename res/{generators/default => content/base/generators/demo}/tower.vox (100%) rename res/{generators/default => content/base/generators/demo}/tree0.vox (100%) rename res/{generators/default => content/base/generators/demo}/tree1.vox (100%) rename res/{generators/default => content/base/generators/demo}/tree2.vox (100%) rename res/{content/base => }/resources.json (100%) create mode 100644 res/textures/blocks/obstacle.png diff --git a/res/content/base/generators/demo.lua b/res/content/base/generators/demo.lua new file mode 100644 index 00000000..a8e0a365 --- /dev/null +++ b/res/content/base/generators/demo.lua @@ -0,0 +1,86 @@ +sea_level = 64 + +-- 1 - temperature +-- 2 - humidity +biome_parameters = 2 + +biomes = json.parse(file.read("base:generators/demo/biomes.json")) + +function place_structures(x, z, w, d, seed, hmap) + local placements = {} + for i=1,10 do + local sx = math.random() * w + local sz = math.random() * d + local sy = math.random() * 128 + if sy < hmap:at(sx, sz) * 256 - 6 then + table.insert(placements, {"coal_ore0", {sx, sy, sz}, math.random()*4}) + end + end + return placements +end + +local function _generate_heightmap(x, y, w, h, seed, s) + local umap = Heightmap(w, h) + local vmap = Heightmap(w, h) + umap.noiseSeed = seed + vmap.noiseSeed = seed + vmap:noise({x+521, y+70}, 0.1*s, 3, 25.8) + vmap:noise({x+95, y+246}, 0.15*s, 3, 25.8) + + local map = Heightmap(w, h) + map.noiseSeed = seed + map:noise({x, y}, 0.8*s, 4, 0.02) + map:cellnoise({x, y}, 0.1*s, 3, 0.3, umap, vmap) + map:add(0.4) + + local rivermap = Heightmap(w, h) + rivermap.noiseSeed = seed + rivermap:noise({x+21, y+12}, 0.1*s, 4) + rivermap:abs() + rivermap:mul(2.0) + rivermap:pow(0.15) + rivermap:max(0.3) + map:add(0.3) + map:mul(rivermap) + return map +end + +function generate_heightmap(x, y, w, h, seed) + -- blocks per dot + -- 8 - linear interpolation is visible, but not so much + -- 4 - high quality, but slower + -- 2 - you really don't need it + -- 1 - please have mercy on your CPU + local bpd = 4 + local map = _generate_heightmap( + math.floor(x/bpd), math.floor(y/bpd), + math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) + map:resize(w+bpd, h+bpd, 'linear') + map:crop(0, 0, w, h) + return map +end + +local function _generate_biome_parameters(x, y, w, h, seed, s) + local tempmap = Heightmap(w, h) + tempmap.noiseSeed = seed + 5324 + tempmap:noise({x, y}, 0.04*s, 6) + local hummap = Heightmap(w, h) + hummap.noiseSeed = seed + 953 + hummap:noise({x, y}, 0.04*s, 6) + tempmap:pow(3) + hummap:pow(3) + return tempmap, hummap +end + +function generate_biome_parameters(x, y, w, h, seed) + local bpd = 8 + local tmap, hmap = _generate_biome_parameters( + math.floor(x/bpd), math.floor(y/bpd), + math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) + tmap:resize(w+bpd, h+bpd, 'linear') + tmap:crop(0, 0, w, h) + + hmap:resize(w+bpd, h+bpd, 'linear') + hmap:crop(0, 0, w, h) + return tmap, hmap +end diff --git a/res/generators/default/biomes.json b/res/content/base/generators/demo/biomes.json similarity index 100% rename from res/generators/default/biomes.json rename to res/content/base/generators/demo/biomes.json diff --git a/res/generators/default/coal_ore0.vox b/res/content/base/generators/demo/coal_ore0.vox similarity index 100% rename from res/generators/default/coal_ore0.vox rename to res/content/base/generators/demo/coal_ore0.vox diff --git a/res/generators/default/structures.json b/res/content/base/generators/demo/structures.json similarity index 100% rename from res/generators/default/structures.json rename to res/content/base/generators/demo/structures.json diff --git a/res/generators/default/tower.vox b/res/content/base/generators/demo/tower.vox similarity index 100% rename from res/generators/default/tower.vox rename to res/content/base/generators/demo/tower.vox diff --git a/res/generators/default/tree0.vox b/res/content/base/generators/demo/tree0.vox similarity index 100% rename from res/generators/default/tree0.vox rename to res/content/base/generators/demo/tree0.vox diff --git a/res/generators/default/tree1.vox b/res/content/base/generators/demo/tree1.vox similarity index 100% rename from res/generators/default/tree1.vox rename to res/content/base/generators/demo/tree1.vox diff --git a/res/generators/default/tree2.vox b/res/content/base/generators/demo/tree2.vox similarity index 100% rename from res/generators/default/tree2.vox rename to res/content/base/generators/demo/tree2.vox diff --git a/res/content/base/preload.json b/res/content/base/preload.json index 1e519ca2..33f38f36 100644 --- a/res/content/base/preload.json +++ b/res/content/base/preload.json @@ -7,13 +7,6 @@ "models": [ "drop-item" ], - "shaders": [ - "ui3d", - "entity", - "screen", - "background", - "skybox_gen" - ], "textures": [ "misc/moon", "misc/sun", diff --git a/res/generators/default.lua b/res/generators/default.lua index a5bd50bf..c88a6135 100644 --- a/res/generators/default.lua +++ b/res/generators/default.lua @@ -1,84 +1,15 @@ -sea_level = 64 +biome_parameters = 0 --- 1 - temperature --- 2 - humidity -biome_parameters = 2 - -biomes = json.parse(file.read("core:generators/default/biomes.json")) - -function place_structures(x, z, w, d, seed, hmap) - local placements = {} - for i=1,10 do - local sx = math.random() * w - local sz = math.random() * d - local sy = math.random() * hmap:at(sx, sz)*256 - 6 - table.insert(placements, {"coal_ore0", {sx, sy, sz}, math.random()*4}) - end - return placements -end - -local function _generate_heightmap(x, y, w, h, seed, s) - local umap = Heightmap(w, h) - local vmap = Heightmap(w, h) - umap.noiseSeed = seed - vmap.noiseSeed = seed - vmap:noise({x+521, y+70}, 0.1*s, 3, 25.8) - vmap:noise({x+95, y+246}, 0.15*s, 3, 25.8) - - local map = Heightmap(w, h) - map.noiseSeed = seed - map:noise({x, y}, 0.8*s, 4, 0.02) - map:cellnoise({x, y}, 0.1*s, 3, 0.3, umap, vmap) - map:add(0.4) - - local rivermap = Heightmap(w, h) - rivermap.noiseSeed = seed - rivermap:noise({x+21, y+12}, 0.1*s, 4) - rivermap:abs() - rivermap:mul(2.0) - rivermap:pow(0.15) - rivermap:max(0.3) - map:add(0.3) - map:mul(rivermap) - return map -end +biomes = {flat = { + parameters = {}, + layers = { + {height=-1, block="core:obstacle"}, + }, + sea_layers = { + {height=-1, block="core:obstacle"} + } +}} function generate_heightmap(x, y, w, h, seed) - -- blocks per dot - -- 8 - linear interpolation is visible, but not so much - -- 4 - high quality, but slower - -- 2 - you really don't need it - -- 1 - please have mercy on your CPU - local bpd = 4 - local map = _generate_heightmap( - math.floor(x/bpd), math.floor(y/bpd), - math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) - map:resize(w+bpd, h+bpd, 'linear') - map:crop(0, 0, w, h) - return map -end - -local function _generate_biome_parameters(x, y, w, h, seed, s) - local tempmap = Heightmap(w, h) - tempmap.noiseSeed = seed + 5324 - tempmap:noise({x, y}, 0.04*s, 6) - local hummap = Heightmap(w, h) - hummap.noiseSeed = seed + 953 - hummap:noise({x, y}, 0.04*s, 6) - tempmap:pow(3) - hummap:pow(3) - return tempmap, hummap -end - -function generate_biome_parameters(x, y, w, h, seed) - local bpd = 8 - local tmap, hmap = _generate_biome_parameters( - math.floor(x/bpd), math.floor(y/bpd), - math.floor(w/bpd)+1, math.floor(h/bpd)+1, seed, bpd) - tmap:resize(w+bpd, h+bpd, 'linear') - tmap:crop(0, 0, w, h) - - hmap:resize(w+bpd, h+bpd, 'linear') - hmap:crop(0, 0, w, h) - return tmap, hmap + return Heightmap(w, h) end diff --git a/res/preload.json b/res/preload.json index 92d371cf..72f96c6b 100644 --- a/res/preload.json +++ b/res/preload.json @@ -1,8 +1,13 @@ { "shaders": [ "ui", + "ui3d", "main", - "lines" + "lines", + "entity", + "screen", + "background", + "skybox_gen" ], "textures": [ "gui/menubg", diff --git a/res/content/base/resources.json b/res/resources.json similarity index 100% rename from res/content/base/resources.json rename to res/resources.json diff --git a/res/textures/blocks/obstacle.png b/res/textures/blocks/obstacle.png new file mode 100644 index 0000000000000000000000000000000000000000..a15d3bde42d12b763ad4ed84ffbf1639e9ffe502 GIT binary patch literal 6849 zcmeHMc~nzZ8V{%-2ve(4aV19DO7SIc&09)T3Xw%a8Aw$WmA55C$CHWsQ@tC8B-A2I;)s^v-Ew#T{MruPRsCMmnW~Iw8(Xpqqu6_U%62u6Jatl~ zzUZ#V^b%54R6&4Haq;w+LLx7Bao3nh*$v+7t*Q%tg^6`mWKuIT@6zWfGi&#k1T2ZJ zTb$*YvA4M%e=Z~Y^=*#8*p!F z@vPI=7ah8BrzLI1hI%peo4!jg8PD(Ry`V{3)HrqYzjuaYn9TRR)i>3@-}!lO!W!Fw z;W_W;F(px|B2?A*I=tWiRQEgo8uM$ncO!QQeX5E}3cpKC^^C5sbx&NaBIRd(TeZ`w z&Y2RE-!)==&XLh|feFP^T4Q&OaX(SyQIg6vy_PNyS@3nqw*$Y1t-RfDG<+aaI*^ zFyryV^m5CzU`gPY$J`EXnyE5X8nU1l(d^GH4$2MN9;hjZ zi$pdEK^wVg=jN!#=sw&c9Lx#BF0Y8+xylygze8%RJl$nkfHTiOwRh(ZI;ghiwfK?I_ZNMX8J+8~Cm_G&$c;f|$`N6yy~@*m?0F(6ZR-1x z2XY2h7YF1nyK{2Vhf@ZOD4XT2z108g`11|*`l>TuHe~JCn4TP=oaJqAruNSU(Qe=%6rcEv$*S0*Q?%P+Aw`PyX*H1hpJ^I{Lw~o3$rNCgA z8xlXrH56J9w9L#XVoI;CPYv+=GN5p5n|s7(_1p9niH9T-w|5O; zVX;wRVGj}%q~)rtrK-rPQ3I=|##e96nLDVM5;ny^3v;MxemSv2j(cxmRwOoe)AY~p z(>J2B?81c_?nGsE!g$Z|p*>qAZ>L$}>`QyKecxx|euw4E`{_-C({D-Ej^kFIK>n7z z$N0)61X-QnS3c#NxkDO<%*m@A&d22Ux;=1e)9pL=w<26VFHsF!hZp+zTB}~T?^#h^X8lKRQ=HVp{sncUX4tW^9>+h$}412gP@X)Cp56e5+)`aB4=2| z_!%);e#Ug37Gxtwc!xL`0ALjDtkhvlG1(Z0O6J04z_oK&A(Og9?9)}U37S}GnAs{y zaXBuBA+^JhhRQ~GOGB)Jj)@B&-2nl9sbtA^yM<9G($mxB>6qMX)hiI1rWG)%Kv4)t zK(-8%opnGa+fXM&J4U!@qD~v|P<11`-bs7Na*w7!YuxY`$qlgo2=2R;$s?$W1edyy50{?KmCDoeZq9gDM zF-0^2Q5(>TJfSioN)!8Vh0_FjgVEwz1&sZKq}`x z3@XZGv$G~%bV31exdGrPbudB*Ivqq~90B1h$w4eF3J}e*Btg?SOAyFo5N}!yAS&6E z$9Ls~5&#rR5j=roBE*VH8p2_MgjkLvAxdCj7)MzVq1tyN@XTnl)yM*O8jP%7R9H-U zmky`Fnb6oMl?;``k49osSi24^P|3y`OsS4X6Iz2&jJLB+Ya%2{qDovz(gcDkY2_oK zaiY}*BGHM7z;dh|*Xb4pkO78eopA~PTq^(FhmPV4AQ|EDzbtOhCw-aLb1)Pv!}CGF;owj0yZFkTx_Jn zT&4_qQaU|ZblM3p zz<&tRd0xbn1TK;S1t^LlgyS3naTG>C;JCtYgr+b7X)gs2)8LuBNNW+A!3hRIJC7o* z)8Ra+gdqV1g$_rRN{C{CD?$9SFvY@3K>FDOwe$F3I*~wW5r=SREaC(L>Nw5ukdDVh zlA}qQr?_Y5^Psk%h!#biE`#aLqsWT{3zG-|u`HqliAPZohY2F2qeucH1d*f&{MjjX z9v_tFcm&pAkSO99I1VUq9N>Tt!YfIhAW5B)!~UQ6fUKc-n4}?6NwJ`TKt+fnL7yp# zIst)k5vK{_+4;1GAPT{tYETS_LX_$}m*JqL!f0@^p(1G8a2QrXtdip(B?&4e=wXyN z@#oZj9PoosaDw9ujx*SQWm$;A*_S`)Swa;5)77*KJl4pAlfQio+#rDa4aLJ7j*gbV z*$DlGua2hXFVp~_pDTGP`#v|e4V@NR2ij?2`_mgY0iHDfP`fk literal 0 HcmV?d00001 diff --git a/src/constants.hpp b/src/constants.hpp index 15b3e732..63aa840b 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -17,6 +17,7 @@ inline constexpr bool ENGINE_DEBUG_BUILD = true; inline const std::string ENGINE_VERSION_STRING = "0.23"; inline constexpr blockid_t BLOCK_AIR = 0; +inline constexpr blockid_t BLOCK_OBSTACLE = 1; inline constexpr itemid_t ITEM_EMPTY = 0; inline constexpr entityid_t ENTITY_NONE = 0; diff --git a/src/content/ContentLoader.cpp b/src/content/ContentLoader.cpp index 0844503d..907e8388 100644 --- a/src/content/ContentLoader.cpp +++ b/src/content/ContentLoader.cpp @@ -528,6 +528,18 @@ void ContentLoader::load() { } } + fs::path resourcesFile = folder / fs::u8path("resources.json"); + if (fs::exists(resourcesFile)) { + auto resRoot = files::read_json(resourcesFile); + for (const auto& [key, arr] : resRoot.asObject()) { + if (auto resType = ResourceType_from(key)) { + loadResources(*resType, arr); + } else { + logger.warning() << "unknown resource type: " << key; + } + } + } + if (!fs::is_regular_file(pack->getContentFile())) return; auto root = files::read_json(pack->getContentFile()); @@ -723,18 +735,6 @@ void ContentLoader::load() { } } } - - fs::path resourcesFile = folder / fs::u8path("resources.json"); - if (fs::exists(resourcesFile)) { - auto resRoot = files::read_json(resourcesFile); - for (const auto& [key, arr] : resRoot.asObject()) { - if (auto resType = ResourceType_from(key)) { - loadResources(*resType, arr); - } else { - logger.warning() << "unknown resource type: " << key; - } - } - } } void ContentLoader::loadResources(ResourceType type, const dv::value& list) { diff --git a/src/core_defs.cpp b/src/core_defs.cpp index cf8dc1f4..b56b3cc8 100644 --- a/src/core_defs.cpp +++ b/src/core_defs.cpp @@ -12,17 +12,19 @@ // All in-game definitions (blocks, items, etc..) void corecontent::setup(EnginePaths* paths, ContentBuilder* builder) { - Block& block = builder->blocks.create("core:air"); - block.replaceable = true; - block.drawGroup = 1; - block.lightPassing = true; - block.skyLightPassing = true; - block.obstacle = false; - block.selectable = false; - block.model = BlockModel::none; - block.pickingItem = "core:empty"; + { + Block& block = builder->blocks.create(CORE_AIR); + block.replaceable = true; + block.drawGroup = 1; + block.lightPassing = true; + block.skyLightPassing = true; + block.obstacle = false; + block.selectable = false; + block.model = BlockModel::none; + block.pickingItem = CORE_EMPTY; + } - ItemDef& item = builder->items.create("core:empty"); + ItemDef& item = builder->items.create(CORE_EMPTY); item.iconType = item_icon_type::none; auto bindsFile = paths->getResourcesFolder()/fs::path("bindings.toml"); @@ -31,4 +33,17 @@ void corecontent::setup(EnginePaths* paths, ContentBuilder* builder) { bindsFile.u8string(), files::read_string(bindsFile) ); } + + { + Block& block = builder->blocks.create(CORE_OBSTACLE); + for (uint i = 0; i < 6; i++) { + block.textureFaces[i] = "obstacle"; + } + block.hitboxes = {AABB()}; + ItemDef& item = builder->items.create(CORE_OBSTACLE+".item"); + item.iconType = item_icon_type::block; + item.icon = CORE_OBSTACLE; + item.placingBlock = CORE_OBSTACLE; + item.caption = block.caption; + } } diff --git a/src/core_defs.hpp b/src/core_defs.hpp index 32b2424c..ccfa2e69 100644 --- a/src/core_defs.hpp +++ b/src/core_defs.hpp @@ -3,6 +3,7 @@ #include inline const std::string CORE_EMPTY = "core:empty"; +inline const std::string CORE_OBSTACLE = "core:obstacle"; inline const std::string CORE_AIR = "core:air"; inline const std::string TEXTURE_NOTFOUND = "notfound"; diff --git a/src/logic/scripting/scripting_world_generation.cpp b/src/logic/scripting/scripting_world_generation.cpp index eeeeb1c5..da6e63a4 100644 --- a/src/logic/scripting/scripting_world_generation.cpp +++ b/src/logic/scripting/scripting_world_generation.cpp @@ -286,7 +286,8 @@ std::unique_ptr scripting::load_generator( lua::pop(L); uint biomeParameters = root["biome_parameters"].asInteger(); - uint seaLevel = root["sea_level"].asInteger(); + uint seaLevel = 0; + root.at("sea_level").get(seaLevel); std::vector biomes; diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 2acbdf46..a2f854ee 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -37,9 +37,9 @@ Player::Player( position(position), inventory(std::move(inv)), eid(eid), - camera(level->getCamera("base:first-person")), - spCamera(level->getCamera("base:third-person-front")), - tpCamera(level->getCamera("base:third-person-back")), + camera(level->getCamera("core:first-person")), + spCamera(level->getCamera("core:third-person-front")), + tpCamera(level->getCamera("core:third-person-back")), currentCamera(camera) { camera->setFov(glm::radians(90.0f)); spCamera->setFov(glm::radians(90.0f));