Vary walls of the Fracture

Added code to make the walls of the rift uneven... some of the time.
Still WIP, but best results so far are here.  Removed code for finite
bottom, as it is no longer used.  Commented out lines 53-56 to enable
wall varying.
This commit is contained in:
Chris N 2015-03-01 19:31:15 -10:00
parent bd6f0c5e62
commit e3fcaa70a9

View File

@ -4,8 +4,8 @@
--- constants
---
local fracrift_width=20 --how wide the rift will be
local fracrift_depth_air=33000 --how deep before the water
local fracrift_width=80 --how wide the rift will be
--local fracrift_depth_air=33000 --how deep before the water
local fracrift_depth_water=20 --how deep the water will be
local fracrift_top=100 --max height to scan for land to remove
local fracrift_bottomsmooth=0.995 --odds of bottom being smooth
@ -23,7 +23,15 @@ local fracrift_waterstart=-(fracrift_depth_air+1)
local c_air = minetest.get_content_id("air")
local c_water = minetest.get_content_id("default:water_source")
-- 3D noise for rift walls
local np_walls = {
offset = 0,
scale = 1,
spread = {x=192, y=512, z=512}, -- squashed 2:1
seed = 133742, --a LEET answer to life, the universe, and everything
octaves = 3,
persist = 0.67
}
--FRACTURE GENERATION
minetest.register_on_generated(function(minp, maxp, seed)
@ -42,10 +50,10 @@ minetest.register_on_generated(function(minp, maxp, seed)
local z0 = minp.z
--no need to scan outside the rift
if x0 < -fracrift_edge then x0=-fracrift_edge end
if x1 > fracrift_edge then x1=fracrift_edge end
if y0 < fracrift_depth then y0=fracrift_depth end
if y1 > fracrift_top then y1=fracrift_top end
--if x0 < -fracrift_edge then x0=-fracrift_edge end
--if x1 > fracrift_edge then x1=fracrift_edge end
--if y0 < fracrift_depth then y0=fracrift_depth end
--if y1 > fracrift_top then y1=fracrift_top end
print ("[fracrift_ure_gen] chunk minp ("..x0.." "..y0.." "..z0..")") --tell people you are generating a chunk
@ -54,37 +62,44 @@ minetest.register_on_generated(function(minp, maxp, seed)
local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax}
local data = vm:get_data()
local sidelen = x1 - x0 + 1 --length of a mapblock
local chulens = {x=sidelen, y=sidelen, z=sidelen} --table of chunk edges
local minposxyz = {x=x0, y=y0, z=z0} --bottom corner
local nvals_walls = minetest.get_perlin_map(np_walls, chulens):get3dMap_flat(minposxyz) -- Get the noise map for the rift walls
local changed=false
local nixyz = 1 --3D node index
for z = z0, z1 do -- for each xy plane progressing northwards
for y = y0, y1 do -- for each x row progressing upwards
for x = x0, x1 do -- for each node do
local vi = area:index(x, y, z) -- This accesses the node at a given position
if x > -fracrift_edge and x < fracrift_edge then
if y > fracrift_depth then
if y < fracrift_waterstart then -- air or water based on y
if data[vi] ~= c_water then --not water
if y > (fracrift_depth+1) then
data[vi]=c_water
changed=true
--roughen up very bottom layer a little bit
elseif math.random() < fracrift_bottomsmooth then
--leave a FEW bumps sticking up
data[vi]=c_water
changed=true
end -- if y > (fracrift_depth+1)
end -- if data[vi] ~= c_water
elseif y < fracrift_top and data[vi] ~= c_air then
data[vi]=c_air
changed=true
end --if y < fracrift_waterstart
end -- if y > -fracrift_depth
end -- if x > -fracrift_edge and x < fracrift_edge
if x == -fracrift_edge or x == fracrift_edge then -- x is on edge
if data[vi] == c_water and math.random() < fracrift_waterfallchance then
data[vi]=fracrift_material
changed=true
end -- change water to stone on edge
end -- if x == -fracrift_edge or x == fracrift_edge
local vi = area:index(x, y, z) -- This accesses the node at a given position
if x > -fracrift_edge and x < fracrift_edge then
local grad = math.abs(x / (fracrift_edge * 1.5))
if ((math.abs(nvals_walls[nixyz]) + grad) > 0.6) and (x < -fracrift_edge/3 or x > fracrift_edge/3) then
if data[vi] ~= c_air then
data[vi] = fracrift_material
end
else
data[vi] = c_air
end
changed = true
end -- if x > -fracrift_edge and x < fracrift_edge
if x == -fracrift_edge or x == fracrift_edge then -- x is on edge
if data[vi] == c_water and math.random() < fracrift_waterfallchance then
data[vi]=fracrift_material
changed=true
end -- change water to stone on edge
end -- if x == -fracrift_edge or x == fracrift_edge
nixyz = nixyz + 1
end -- end 'x' loop
end -- end 'y' loop
end -- end 'z' loop