169 lines
6.1 KiB
Text
169 lines
6.1 KiB
Text
|
|
(local pxl8 (require :pxl8))
|
||
|
|
(local procgen (require :pxl8.procgen))
|
||
|
|
|
||
|
|
(local textures {})
|
||
|
|
|
||
|
|
(fn build-graph [seed builder]
|
||
|
|
(let [g (pxl8.create_graph 128)
|
||
|
|
x (g:add_node procgen.OP_INPUT_X 0 0 0 0 0)
|
||
|
|
y (g:add_node procgen.OP_INPUT_Y 0 0 0 0 0)
|
||
|
|
ctx {:graph g :x x :y y}]
|
||
|
|
(g:set_seed seed)
|
||
|
|
(let [output (builder ctx)]
|
||
|
|
(g:set_output output)
|
||
|
|
g)))
|
||
|
|
|
||
|
|
(fn const [ctx val]
|
||
|
|
(ctx.graph:add_node procgen.OP_CONST 0 0 0 0 val))
|
||
|
|
|
||
|
|
(fn add [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_ADD a b 0 0 0))
|
||
|
|
|
||
|
|
(fn sub [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_SUB a b 0 0 0))
|
||
|
|
|
||
|
|
(fn mul [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_MUL a b 0 0 0))
|
||
|
|
|
||
|
|
(fn div [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_DIV a b 0 0 0))
|
||
|
|
|
||
|
|
(fn min-op [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_MIN a b 0 0 0))
|
||
|
|
|
||
|
|
(fn max-op [ctx a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_MAX a b 0 0 0))
|
||
|
|
|
||
|
|
(fn abs [ctx a]
|
||
|
|
(ctx.graph:add_node procgen.OP_ABS a 0 0 0 0))
|
||
|
|
|
||
|
|
(fn floor [ctx a]
|
||
|
|
(ctx.graph:add_node procgen.OP_FLOOR a 0 0 0 0))
|
||
|
|
|
||
|
|
(fn fract [ctx a]
|
||
|
|
(ctx.graph:add_node procgen.OP_FRACT a 0 0 0 0))
|
||
|
|
|
||
|
|
(fn lerp [ctx a b t]
|
||
|
|
(ctx.graph:add_node procgen.OP_LERP a b t 0 0))
|
||
|
|
|
||
|
|
(fn clamp [ctx val lo hi]
|
||
|
|
(ctx.graph:add_node procgen.OP_CLAMP val lo hi 0 0))
|
||
|
|
|
||
|
|
(fn select [ctx cond a b]
|
||
|
|
(ctx.graph:add_node procgen.OP_SELECT a b cond 0 0))
|
||
|
|
|
||
|
|
(fn smoothstep [ctx edge0 edge1 x]
|
||
|
|
(ctx.graph:add_node procgen.OP_SMOOTHSTEP edge0 edge1 x 0 0))
|
||
|
|
|
||
|
|
(fn noise-value [ctx scale]
|
||
|
|
(let [s (const ctx scale)]
|
||
|
|
(ctx.graph:add_node procgen.OP_NOISE_VALUE ctx.x ctx.y s 0 0)))
|
||
|
|
|
||
|
|
(fn noise-perlin [ctx scale]
|
||
|
|
(let [s (const ctx scale)]
|
||
|
|
(ctx.graph:add_node procgen.OP_NOISE_PERLIN ctx.x ctx.y s 0 0)))
|
||
|
|
|
||
|
|
(fn noise-fbm [ctx octaves scale persistence]
|
||
|
|
(let [s (const ctx scale)
|
||
|
|
p (const ctx persistence)]
|
||
|
|
(ctx.graph:add_node procgen.OP_NOISE_FBM ctx.x ctx.y s p octaves)))
|
||
|
|
|
||
|
|
(fn noise-ridged [ctx octaves scale persistence]
|
||
|
|
(let [s (const ctx scale)
|
||
|
|
p (const ctx persistence)]
|
||
|
|
(ctx.graph:add_node procgen.OP_NOISE_RIDGED ctx.x ctx.y s p octaves)))
|
||
|
|
|
||
|
|
(fn noise-turbulence [ctx octaves scale persistence]
|
||
|
|
(let [s (const ctx scale)
|
||
|
|
p (const ctx persistence)]
|
||
|
|
(ctx.graph:add_node procgen.OP_NOISE_TURBULENCE ctx.x ctx.y s p octaves)))
|
||
|
|
|
||
|
|
(fn voronoi-cell [ctx scale]
|
||
|
|
(let [s (const ctx scale)]
|
||
|
|
(ctx.graph:add_node procgen.OP_VORONOI_CELL ctx.x ctx.y s 0 0)))
|
||
|
|
|
||
|
|
(fn voronoi-edge [ctx scale]
|
||
|
|
(let [s (const ctx scale)]
|
||
|
|
(ctx.graph:add_node procgen.OP_VORONOI_EDGE ctx.x ctx.y s 0 0)))
|
||
|
|
|
||
|
|
(fn voronoi-id [ctx scale]
|
||
|
|
(let [s (const ctx scale)]
|
||
|
|
(ctx.graph:add_node procgen.OP_VORONOI_ID ctx.x ctx.y s 0 0)))
|
||
|
|
|
||
|
|
(fn gradient-linear [ctx angle]
|
||
|
|
(let [a (const ctx angle)]
|
||
|
|
(ctx.graph:add_node procgen.OP_GRADIENT_LINEAR ctx.x ctx.y a 0 0)))
|
||
|
|
|
||
|
|
(fn gradient-radial [ctx cx cy]
|
||
|
|
(let [center-x (const ctx cx)
|
||
|
|
center-y (const ctx cy)]
|
||
|
|
(ctx.graph:add_node procgen.OP_GRADIENT_RADIAL ctx.x ctx.y center-x center-y 0)))
|
||
|
|
|
||
|
|
(fn quantize [ctx val base range]
|
||
|
|
(let [r (const ctx range)]
|
||
|
|
(ctx.graph:add_node procgen.OP_QUANTIZE val r 0 0 base)))
|
||
|
|
|
||
|
|
(fn textures.mossy-cobblestone [seed base-color moss-color]
|
||
|
|
(let [g (build-graph seed
|
||
|
|
(fn [ctx]
|
||
|
|
(let [cell (voronoi-cell ctx 6)
|
||
|
|
edge (voronoi-edge ctx 6)
|
||
|
|
mortar-threshold (const ctx 0.05)
|
||
|
|
is-mortar (sub ctx mortar-threshold edge)
|
||
|
|
mortar-color (const ctx (- base-color 2))
|
||
|
|
stone-detail (noise-value ctx 48)
|
||
|
|
stone-base (mul ctx cell (const ctx 0.6))
|
||
|
|
stone-combined (add ctx stone-base (mul ctx stone-detail (const ctx 0.4)))
|
||
|
|
stone-quant (quantize ctx stone-combined base-color 8)
|
||
|
|
moss-pattern (noise-fbm ctx 4 10 0.5)
|
||
|
|
moss-detail (noise-value ctx 64)
|
||
|
|
moss-var (add ctx (mul ctx moss-pattern (const ctx 0.7))
|
||
|
|
(mul ctx moss-detail (const ctx 0.3)))
|
||
|
|
moss-threshold (const ctx 0.55)
|
||
|
|
has-moss (sub ctx moss-pattern moss-threshold)
|
||
|
|
moss-quant (quantize ctx moss-var moss-color 6)
|
||
|
|
stone-or-moss (select ctx has-moss moss-quant stone-quant)]
|
||
|
|
(select ctx is-mortar mortar-color stone-or-moss))))]
|
||
|
|
(let [tex-id (g:eval_texture 64 64)]
|
||
|
|
(g:destroy)
|
||
|
|
tex-id)))
|
||
|
|
|
||
|
|
(fn textures.ashlar-wall [seed base-color moss-color]
|
||
|
|
(let [g (build-graph seed
|
||
|
|
(fn [ctx]
|
||
|
|
(let [cell (voronoi-cell ctx 5)
|
||
|
|
edge (voronoi-edge ctx 5)
|
||
|
|
cell-id (voronoi-id ctx 5)
|
||
|
|
mortar-threshold (const ctx 0.12)
|
||
|
|
is-mortar (sub ctx mortar-threshold edge)
|
||
|
|
stone-detail (noise-fbm ctx 3 32 0.5)
|
||
|
|
stone-tint (mul ctx cell-id (const ctx 0.4))
|
||
|
|
stone-shade (mul ctx cell (const ctx 0.3))
|
||
|
|
stone-combined (add ctx stone-detail (add ctx stone-tint stone-shade))
|
||
|
|
stone-quant (quantize ctx stone-combined base-color 10)
|
||
|
|
crack-moss (noise-fbm ctx 3 16 0.5)
|
||
|
|
moss-in-crack (mul ctx crack-moss (sub ctx (const ctx 0.2) edge))
|
||
|
|
moss-threshold (const ctx 0.06)
|
||
|
|
has-moss (sub ctx moss-in-crack moss-threshold)
|
||
|
|
moss-quant (quantize ctx crack-moss moss-color 4)
|
||
|
|
mortar-color (const ctx (+ base-color 1))
|
||
|
|
stone-or-moss (select ctx has-moss moss-quant stone-quant)]
|
||
|
|
(select ctx is-mortar mortar-color stone-or-moss))))]
|
||
|
|
(let [tex-id (g:eval_texture 64 64)]
|
||
|
|
(g:destroy)
|
||
|
|
tex-id)))
|
||
|
|
|
||
|
|
(fn textures.gradient-sky [seed zenith-color horizon-color]
|
||
|
|
(let [g (build-graph seed
|
||
|
|
(fn [ctx]
|
||
|
|
(let [grad (gradient-linear ctx (* math.pi 0.5))
|
||
|
|
zenith (const ctx zenith-color)
|
||
|
|
horizon (const ctx horizon-color)
|
||
|
|
range (const ctx (- horizon-color zenith-color))]
|
||
|
|
(quantize ctx grad zenith-color (- horizon-color zenith-color)))))]
|
||
|
|
(let [tex-id (g:eval_texture 64 64)]
|
||
|
|
(g:destroy)
|
||
|
|
tex-id)))
|
||
|
|
|
||
|
|
textures
|