## How much does the erosion actually contribute, before vs after Height wiring?
##
## Isolates it by baking each graph twice, ErosionStr 0.16 vs 0.0, and taking the
## largest vertex displacement between them. Also reports the height range, so
## "the erosion is weaker" can be separated from "the landform under it is
## bigger".
extends SceneTree
func _build(wire_height: bool, divisor: float, ero_str: float) -> ProcNodeGraph:
var g := ProcNodeGraph.new()
var grid := g.add_node(MeshGridNode.new())
g.get_node(grid).set_input_default(0, 40.0)
g.get_node(grid).set_input_default(1, 40.0)
g.get_node(grid).set_input_default(2, 300)
g.get_node(grid).set_input_default(3, 300)
var d := g.add_node(DisplaceNode.new())
g.get_node(d).set_input_default(1, 6.06)
g.get_node(d).set_input_default(2, 0.1)
g.get_node(d).set_input_default(3, 1)
g.get_node(d).set_input_default(4, 0.16)
g.get_node(d).set_input_default(5, 2.26)
var sl := g.add_node(SlopeGradientNode.new())
var e := g.add_node(ErosionNoiseNode.new())
g.get_node(e).set_input_default(2, ero_str)
g.get_node(e).set_input_default(9, divisor)
g.connect_sockets(grid, 0, d, 0)
g.connect_sockets(d, 0, sl, 0)
g.connect_sockets(sl, 0, e, 0)
g.connect_sockets(sl, 1, e, 8)
if wire_height:
g.connect_sockets(sl, 2, e, 7)
return g
func _bake(g: ProcNodeGraph) -> PackedVector3Array:
var h := ProcGeometryNode.new()
h.use_gpu = false
h.set_graph(g)
get_root().add_child(h)
var m: ArrayMesh = h.bake_mesh()
return m.surface_get_arrays(0)[Mesh.ARRAY_VERTEX] if m and m.get_surface_count() else PackedVector3Array()
func _report(label: String, wire: bool, div: float) -> void:
var on := _bake(_build(wire, div, 0.16))
var off := _bake(_build(wire, div, 0.0))
var d := 0.0
var lo := INF
var hi := -INF
for i in range(on.size()):
d = max(d, absf(on[i].y - off[i].y))
lo = min(lo, on[i].y); hi = max(hi, on[i].y)
print("%-34s erosion moves %8.4f terrain %8.3f .. %7.3f (span %.3f)"
% [label, d, lo, hi, hi - lo])
func _init() -> void:
_report("BEFORE (no Height) str 0.16", false, 0.6)
for st in [0.16, 0.3, 0.5, 0.8, 1.2]:
var on := _bake(_build(true, 2.0, st))
var off := _bake(_build(true, 2.0, 0.0))
var d := 0.0
var lo := INF
var hi := -INF
for i in range(on.size()):
d = max(d, absf(on[i].y - off[i].y))
lo = min(lo, on[i].y); hi = max(hi, on[i].y)
print("AFTER (Height) str %-5.2f erosion moves %8.4f span %7.3f erosion/span %5.1f%%"
% [st, d, hi - lo, 100.0 * d / (hi - lo)])
quit()