From 229e0e4e808eaedf43b094323f86a2aaf23ac3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Brada?= Date: Fri, 3 Apr 2015 21:32:20 +0200 Subject: [PATCH] Experimental vein generator based on sphere deformed vith 3D noise. The nyan cat is a bonus :) --- ign.lua | 18 ++++++++++++++++++ mapgen.lua | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/ign.lua b/ign.lua index 4bb27b7..3579a56 100644 --- a/ign.lua +++ b/ign.lua @@ -55,8 +55,26 @@ rocks.register_igneous=reg reg("rocks:diorite", { spread=40, height=32, treshold=0.23}) reg("rocks:gabbro", { spread=40, height=32, treshold=0.36}) +-- vein stuff +local sample_vein_col={ + { primary="default:nyancat", + wherein="rocks:granite", + miny=-160, maxy=20, + radius=10, + --radius={ average=15, amplitude=6 }, + density=1, + rarity=0.025, -- this^3*mapblock_volume veins per mapblock + localized={ + { primary="rocks:pegmatite_diamond", size=3, count=5, + rarity=0.3 -- (this/count) chance of spawning cluster in the vein + } + } + } +} + minetest.register_on_generated(function(minp, maxp, seed) rocksl.layergen(ign,minp,maxp,seed) + rocksl.veingen(sample_vein_col,minp,maxp,seed) end) minetest.register_on_shutdown(function() diff --git a/mapgen.lua b/mapgen.lua index 68aba29..4550d85 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -101,4 +101,37 @@ rocksl.layergen=function(layer, minp, maxp, seed) end end +rocksl.veingen=function(veins,minp,maxp,seed) + local side_length=(maxp.y-minp.y) + local random=PseudoRandom(seed-79) + local noise=minetest.get_perlin(-79,1,0.7,8) + print("begin veingen") + for _,vein in ipairs(veins) do + if (minp.yvein.maxy) then + local iterations_count= (vein.rarity*side_length)^3 + iterations_count=iterations_count+random:next(-1,1) + for iteration=1, iterations_count do + local x0=minp.x+ random:next(0,side_length) + local y0=minp.y+ random:next(0,side_length) + local z0=minp.z+ random:next(0,side_length) + if true or (minetest.get_node({x0,y0,z0}).name==vein.wherein) then + print("vein "..vein.primary.." @ "..x0..","..y0..","..z0) + for x=-vein.radius, vein.radius do + for y=-vein.radius, vein.radius do + for z=-vein.radius, vein.radius do + p={x=x+x0,y=y+y0,z=z+z0} + local nv=noise:get3d(p)*5 + if ((x^2)+(y^2)+(z^2))<((vein.radius+nv)^2) then + minetest.set_node(p, {name=vein.primary}) + end + end end end + else + print("vein "..vein.primary.." bad environmnent") + end + end + end + end + print("end veingen") +end + -- ~ Tomas Brod \ No newline at end of file