extends Node var chunk_half_size setget _set_chunk_size var chunk_size func _set_chunk_size(val): chunk_half_size = val chunk_size = val * 2.0 onready var noise = OpenSimplexNoise.new() onready var rng = RandomNumberGenerator.new() var _seed func _ready(): randomize() self._seed = randi() self.noise.seed = self._seed self.noise.seed = 0 self.noise.period = 16 self.noise.persistence = 0 self.rng.seed = self._seed func rng_2dv(coords:Vector2): self.rng.seed = hash(coords) func gen_chunk(chunk): var gen_tree = Spatial.new() gen_tree.name = "gen_tree" chunk.add_child(gen_tree) iterate_chunk(chunk, Vector2(10.0,10.0), funcref(self,"gen_rocks")) func v2_coords(coords:Vector3): return Vector2(coords.x,coords.z) func v3_coords(coords:Vector2): return Vector3(coords.x,0.0,coords.y) func iterate_chunk(chunk,step:Vector2,cb:FuncRef): var chunk_size_rounded = Vector2(chunk_half_size,chunk_half_size).snapped(step) for x in range(-chunk_size_rounded.x,chunk_size_rounded.x,step.x): for y in range(-chunk_size_rounded.y,chunk_size_rounded.y,step.y): cb.call_func(chunk,Vector2(x,y)) onready var Rock = preload("res://world/obstacles/Rock.tscn") const rock_size = 5.0 func make_rock(chunk,xform:Transform): var rock = Rock.instance() rock.transform = xform chunk.get_node("gen_tree").add_child(rock) func gen_rocks(chunk,chunk_coords:Vector2): var coords = v3_coords(chunk_coords) var basis = Basis() var world_coords = chunk_coords + v2_coords(chunk.transform.origin) self.rng_2dv(world_coords) var rng_val = self.rng.randf_range(0.0,TAU) basis = Basis(Vector3.UP,rng_val) * basis var noise_val = self.noise.get_noise_2dv(world_coords * 0.125) if noise_val < 0.4: return noise_val = min(noise_val,0.6) noise_val -= 0.4 noise_val /= 0.2 noise_val = lerp(1.0,4.0,noise_val) basis = basis.scaled(Vector3.ONE*noise_val) coords.y += (noise_val*5.0)-5.0 make_rock(chunk,Transform(basis,coords))