Improved tree placement
This commit is contained in:
40
client/world/generator/Generator.gd
Normal file
40
client/world/generator/Generator.gd
Normal file
@ -0,0 +1,40 @@
|
||||
class_name Generator
|
||||
extends Node3D
|
||||
|
||||
@export var scene: PackedScene
|
||||
@export var noise: Noise
|
||||
@export var size_x: float
|
||||
@export var size_z: float
|
||||
@export var step: float = 1
|
||||
@export var density: float
|
||||
|
||||
@export var scale_min := 1.0
|
||||
@export var scale_max := 1.0
|
||||
@export var tilt := 0.0
|
||||
|
||||
func _ready():
|
||||
if !visible:
|
||||
return
|
||||
|
||||
for x in range(-size_x, size_x, step):
|
||||
for z in range(-size_z, size_z, step):
|
||||
if noise.get_noise_2d(x, z) < 1 - density * 2:
|
||||
continue
|
||||
|
||||
var instance := generate(x, z)
|
||||
add_child(instance)
|
||||
|
||||
func generate(x: int, z: int) -> Node3D:
|
||||
var t := scene.instantiate() as Node3D
|
||||
t.position.x = x
|
||||
t.position.z = z
|
||||
|
||||
var angle_xz := randf() * TAU
|
||||
t.rotation.x = cos(angle_xz) * randf() * tilt
|
||||
t.rotation.y = randf() * TAU
|
||||
t.rotation.z = sin(angle_xz) * randf() * tilt
|
||||
|
||||
var uniform_scale := scale_min + randf() * (scale_max - scale_min)
|
||||
t.scale = Vector3(uniform_scale, uniform_scale, uniform_scale)
|
||||
|
||||
return t
|
22
client/world/generator/TreeGenerator.gd
Normal file
22
client/world/generator/TreeGenerator.gd
Normal file
@ -0,0 +1,22 @@
|
||||
class_name TreeGenerator
|
||||
extends Generator
|
||||
|
||||
@export var tree_materials: Array[Material]
|
||||
@export var leaf_materials: Array[Material]
|
||||
|
||||
func _ready():
|
||||
super._ready()
|
||||
|
||||
func generate(x: int, z: int) -> Node3D:
|
||||
var instance := super.generate(x, z)
|
||||
randomize_materials(instance)
|
||||
return instance
|
||||
|
||||
func randomize_materials(instance: Node):
|
||||
var tree := instance.find_child("tree") as MeshInstance3D
|
||||
var tree_material := tree_materials[randi_range(0, tree_materials.size()-1)]
|
||||
tree.set_surface_override_material(0, tree_material)
|
||||
|
||||
var leaves := instance.find_child("leaves") as MeshInstance3D
|
||||
var leaf_material := leaf_materials[randi_range(0, leaf_materials.size()-1)]
|
||||
leaves.set_surface_override_material(0, leaf_material)
|
Reference in New Issue
Block a user