Add Noodle, Isosurface and Blob caves

This commit is contained in:
seventeenthShulker 2023-07-31 18:24:25 +02:00
parent 76a248ae14
commit ab7a6b6efe
1 changed files with 133 additions and 7 deletions

140
init.lua
View File

@ -57,7 +57,7 @@ luamap.register_noise("surface_3d", {
spread = {x=32, y=32, z=32},
seed = 7195270625,
octaves = 4,
persist = 0.4,
persist = 0.5,
lacunarity = 2,
flags = "eased",
},
@ -65,6 +65,92 @@ luamap.register_noise("surface_3d", {
ymax = 512,
})
luamap.register_noise("caves_blob", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=16, y=12, z=16},
seed = 1100581792,
octaves = 4,
persist = 0.4,
lacunarity = 2,
flags = "eased",
},
ymax = 32,
})
luamap.register_noise("caves_blob_large", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=48, y=32, z=48},
seed = 8796758322,
octaves = 5,
persist = 0.35,
lacunarity = 2,
flags = "",
},
ymax = -256,
})
luamap.register_noise("caves_sheet", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=192, y=192, z=192},
seed = 968236844,
octaves = 6,
persist = 0.45,
lacunarity = 2,
flags = "",
},
ymax = 32
})
luamap.register_noise("caves_sheet2", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=32, y=24, z=32},
seed = 14137677187,
octaves = 5,
persist = 0.2,
lacunarity = 2,
flags = "",
},
ymax = 32
})
luamap.register_noise("caves_noodle1", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=64, y=80, z=64},
seed = 6579241763,
octaves = 6,
persist = 0.25,
lacunarity = 2,
flags = "",
},
})
luamap.register_noise("caves_noodle2", {
type = "3d",
np_vals = {
offset = 0,
scale = 1,
spread = {x=80, y=64, z=80},
seed = 8175385003,
octaves = 6,
persist = 0.25,
lacunarity = 2,
flags = "",
},
})
luamap.register_noise("shaper", {
type = "2d",
np_vals = {
@ -120,6 +206,7 @@ luamap.register_noise("ridge_depth", {
},
})
local c_air = minetest.get_content_id("air")
local c_stone = minetest.get_content_id("default:stone")
local c_sandstone = minetest.get_content_id("default:sandstone")
local c_water = minetest.get_content_id("default:water_source")
@ -131,10 +218,11 @@ local old_logic = luamap.logic
function luamap.logic(noise_vals,x,y,z,seed,original_content)
-- get any terrain defined in another mod
local content = old_logic(noise_vals,x,y,z,seed,original_content)
if y < water_level then
content = c_water
end
local empty_content = content
local terrain_height = 8
for i = 1, #recip_factors do
@ -171,21 +259,59 @@ function luamap.logic(noise_vals,x,y,z,seed,original_content)
if noise_vals.surface_3d > density_3d then
content = c_stone
end
else
elseif y >= water_level - 256 then
-- interpolate between 3d effect and 2d solid ground
if noise_vals.surface_3d > density_3d - luamap.remap(terrain_height - y, 8, 32, 0, 1.5) then
content = c_stone
end
else
content = c_stone
end
end
if y < water_level - 256 then
content = c_stone
end
-- if y == math.floor(terrain_height) and content == c_stone then
-- content = c_sandstone
-- end
-- caves test
local caves_blob = false
local caves_bloodle_factor = 0
local caves_blob_threshold = luamap.remap(y, -1024, 64, -0.85, -1.02)
if noise_vals.caves_blob < caves_blob_threshold then
caves_blob = true
else
-- noodles near blobs try to connect better
caves_bloodle_factor = caves_bloodle_factor + luamap.remap(noise_vals.caves_blob - caves_blob_threshold, 0, 1, 0.01, 0)
end
local caves_blob_large = false
local caves_blob_large_threshold = luamap.remap(y, -2048, -256, -0.5, -0.9)
if noise_vals.caves_blob_large < caves_blob_large_threshold then
caves_blob_large = true
else
caves_bloodle_factor = caves_bloodle_factor + luamap.remap(noise_vals.caves_blob_large - caves_blob_threshold, 0, 1, 0.012, 0)
end
local caves_sheet = noise_vals.caves_sheet2 > -0.2
local caves_sheet_margin = luamap.remap(y, -1024, 32, 0.014, 0.010)
local caves_sheet_offset = luamap.remap(y, -3072, 32, -0.3, 0.2)
local caves_noodle_margin = luamap.remap(y, -1024, 128, 0.026, 0.019) + caves_bloodle_factor
local caves_noodle_offset = luamap.remap(y, -2048, 128, -0.15, 0.2)
local caves_noodle = math.abs(noise_vals.caves_noodle1 - caves_noodle_offset) < caves_noodle_margin and
math.abs(noise_vals.caves_noodle2 - caves_noodle_offset) < caves_noodle_margin
if content == c_stone then
if caves_blob then
content = c_air
elseif caves_blob_large then
content = c_air
elseif caves_noodle then
content = c_air
elseif caves_sheet and math.abs(noise_vals.caves_sheet - caves_sheet_offset) < caves_sheet_margin then
content = c_air
end
end
return content
end