From eb2fbf0d99d233b9693b701304597a5812cd9444 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Mon, 22 Mar 2021 23:33:05 -0600 Subject: [PATCH] initial chasms mod --- chasms/LICENSE | 21 +++++++++ chasms/init.lua | 97 +++++++++++++++++++++++++++++++++++++++++ chasms/mod.conf | 2 + chasms/settingtypes.txt | 5 +++ 4 files changed, 125 insertions(+) create mode 100644 chasms/LICENSE create mode 100644 chasms/init.lua create mode 100644 chasms/mod.conf create mode 100644 chasms/settingtypes.txt diff --git a/chasms/LICENSE b/chasms/LICENSE new file mode 100644 index 0000000..646c3d5 --- /dev/null +++ b/chasms/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 FaceDeer + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/chasms/init.lua b/chasms/init.lua new file mode 100644 index 0000000..e1e9fe0 --- /dev/null +++ b/chasms/init.lua @@ -0,0 +1,97 @@ +local data = {} + +local maxy = tonumber(minetest.settings:get("chasms_maxy")) or -50 +local miny = tonumber(minetest.settings:get("chasms_miny")) or -3000 +local falloff = tonumber(minetest.settings:get("chasms_falloff")) or 100 + +local chasms_threshold = tonumber(minetest.settings:get("chasms_threshold")) or 1.0 +local np_chasms_default = { + offset = 0, + scale = 1, + spread = {x = 75, y = 500, z = 2000}, + seed = 94586, + octaves = 2, + persist = 0.63, + lacunarity = 2.0, +} +local np_chasms = minetest.settings:get_np_group("chasms_params") or np_chasms_default +-- For some reason, these numbers are returned as strings by get_np_group. +local tonumberize_params = function(params) + params.scale = tonumber(params.scale) + params.lacunarity = tonumber(params.lacunarity) + params.spread.x = tonumber(params.spread.x) + params.spread.y = tonumber(params.spread.y) + params.spread.z = tonumber(params.spread.z) + params.offset = tonumber(params.offset) + params.persistence = tonumber(params.persistence) +end +tonumberize_params(np_chasms) +local nobj_chasm +local chasm_data = {} + +local waver_strength = 8 +local waver_vector = {x=waver_strength, y=0, z=0} +local np_waver = { + offset = 0, + scale = waver_strength, + spread = {x = 50, y = 50, z = 50}, + seed = 49585, + octaves = 2, + persist = 0.63, + lacunarity = 2.0, +} +local nobj_waver +local waver_data = {} + +local minfalloff = miny + falloff +local maxfalloff = maxy - falloff +local get_intensity = function(y) + if y < miny or y > maxy then + return 0 + end + if y <= maxfalloff and y >= minfalloff then + return 1 + end + if y < minfalloff then + return (y-miny)/falloff + end +-- if y > maxfalloff then + return (maxy-y)/falloff +-- end +end + +local c_air = minetest.get_content_id("air") + +minetest.register_on_generated(function(minp, maxp, seed) + if minp.y >= maxy or maxp.y <= miny then + return + end + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + vm:get_data(data) + + nobj_chasm = nobj_chasm or minetest.get_perlin_map(np_chasms, {x = emax.x - emin.x + 1 + waver_strength*2, y = emax.y - emin.y + 1, z = emax.z - emin.z + 1}) + nobj_chasm:get_3d_map_flat(vector.subtract(emin, waver_vector), chasm_data) + + nobj_waver = nobj_waver or minetest.get_perlin_map(np_waver, {x = emax.x - emin.x + 1, y = emax.y - emin.y + 1, z = emax.z - emin.z + 1}) + nobj_waver:get_3d_map_flat(emin, waver_data) + + local chasm_area = VoxelArea:new{MinEdge = vector.subtract(emin, waver_vector), MaxEdge = vector.add(emax, waver_vector)} + local data_area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + +-- local count = {} + + for i, x, y, z in data_area:iterp_xyz(minp, maxp) do + local waver = math.min(math.max(math.floor(waver_data[i]+0.5), -waver_strength), waver_strength) +-- count[waver] = (count[waver] or 0) + 1 + local intensity = get_intensity(y) + if chasm_data[chasm_area:index(x+waver, y, z)]*intensity > chasms_threshold then + data[i] = c_air + end + end + vm:set_data(data) + vm:calc_lighting() + vm:write_to_map() + +-- minetest.debug(dump(count)) +end) diff --git a/chasms/mod.conf b/chasms/mod.conf new file mode 100644 index 0000000..360589f --- /dev/null +++ b/chasms/mod.conf @@ -0,0 +1,2 @@ +name=chasms +depends=mapgen_helper \ No newline at end of file diff --git a/chasms/settingtypes.txt b/chasms/settingtypes.txt new file mode 100644 index 0000000..ad72ba7 --- /dev/null +++ b/chasms/settingtypes.txt @@ -0,0 +1,5 @@ +chasms_params (Noise params for chasms) noise_params_3d 0, 1, (75, 500, 2000), 94586, 2, 0.63, 2.0 +chasms_threshold (Noise threshold for chasms) float 1.0 +chasms_maxy (Maximum Y) int -50 +chasms_miny (Minimum Y) int -3000 +chasms_falloff (Taper distance) int 100 \ No newline at end of file