OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / scripts / probe_erosion_strength.gd

68 lines · gd ref:
## 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()