@tool
extends ProcGeometryNode
func _ready():
_build_graph()
call_deferred("_apply_material")
func _apply_material():
var mesh_child = get_node_or_null("MeshOutput")
if mesh_child and mesh_child is MeshInstance3D:
var mat = StandardMaterial3D.new()
mat.albedo_color = Color(0.45, 0.55, 0.35)
mesh_child.material_override = mat
func _build_graph():
var g = ProcNodeGraph.new()
# 0: High-res grid — 20x20m, 200x200 verts (40K vertices)
var grid = MeshGridNode.new()
g.add_node(grid)
# 1-2: Grid size
var sx = ValueNode.new()
sx.value = 20.0
g.add_node(sx)
var sy = ValueNode.new()
sy.value = 20.0
g.add_node(sy)
# 3-4: Grid resolution
var vx = ValueNode.new()
vx.value = 200.0
g.add_node(vx)
var vy = ValueNode.new()
vy.value = 200.0
g.add_node(vy)
# 5: Displace with noise
var displace = DisplaceNode.new()
g.add_node(displace)
# 6: Noise strength
var strength = ValueNode.new()
strength.value = 2.0
g.add_node(strength)
# 7: Noise scale
var nscale = ValueNode.new()
nscale.value = 0.3
g.add_node(nscale)
# 8: Noise detail (octaves)
var ndetail = ValueNode.new()
ndetail.value = 6.0
g.add_node(ndetail)
# 9: Noise roughness
var nrough = ValueNode.new()
nrough.value = 0.5
g.add_node(nrough)
# --- Connections ---
# Grid size + resolution
g.connect_sockets(1, 0, 0, 0) # sx → grid.SizeX
g.connect_sockets(2, 0, 0, 1) # sy → grid.SizeY
g.connect_sockets(3, 0, 0, 2) # vx → grid.VertsX
g.connect_sockets(4, 0, 0, 3) # vy → grid.VertsY
# Grid → Displace
g.connect_sockets(0, 0, 5, 0) # grid → displace.geometry
g.connect_sockets(6, 0, 5, 1) # strength → displace.strength
g.connect_sockets(7, 0, 5, 2) # scale → displace.scale
g.connect_sockets(8, 0, 5, 3) # detail → displace.detail
g.connect_sockets(9, 0, 5, 4) # roughness → displace.roughness
self.graph = g
print("ProcNodes terrain: ", g.get_node_count(), " nodes, 40K vertices with noise displacement")