Tree collisions and highlights
This commit is contained in:
parent
57602adddb
commit
7255cbdf64
17 changed files with 231 additions and 2251 deletions
|
|
@ -21,14 +21,16 @@ func spawn_grass_for_cell(value):
|
|||
grass_multimesh.setup_multimesh()
|
||||
|
||||
func update_grass_density() -> void:
|
||||
if parent_node == null or parent_node.rng == null:
|
||||
if parent_node == null:
|
||||
return
|
||||
|
||||
|
||||
var rng = parent_node.get_rng()
|
||||
|
||||
if grass_density > 0.8:
|
||||
grass_instance_range = parent_node.rng.randi_range(100, 500)
|
||||
grass_instance_range = rng.randi_range(100, 500)
|
||||
elif grass_density > 0.6:
|
||||
grass_instance_range = parent_node.rng.randi_range(30, 50)
|
||||
grass_instance_range = rng.randi_range(30, 50)
|
||||
elif grass_density > 0.3:
|
||||
grass_instance_range = parent_node.rng.randi_range(5, 20)
|
||||
grass_instance_range = rng.randi_range(5, 20)
|
||||
else:
|
||||
grass_instance_range = parent_node.rng.randi_range(0, 1)
|
||||
grass_instance_range = rng.randi_range(0, 1)
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
extends MultiMeshInstance3D
|
||||
var mm: MultiMesh
|
||||
var parent_node: GrassController
|
||||
|
||||
static var grass_mesh: Mesh = null
|
||||
|
||||
func _ready() -> void:
|
||||
|
|
@ -16,7 +15,7 @@ func _ready() -> void:
|
|||
func setup_multimesh() -> void:
|
||||
if parent_node == null:
|
||||
return
|
||||
|
||||
|
||||
if grass_mesh == null:
|
||||
Log.pr("Error: Could not load grass mesh")
|
||||
return
|
||||
|
|
@ -30,18 +29,21 @@ func setup_multimesh() -> void:
|
|||
# Configure instance count
|
||||
mm.instance_count = parent_node.grass_instance_range
|
||||
|
||||
# Get shared RNG from GroundTile
|
||||
var rng = parent_node.parent_node.get_rng()
|
||||
|
||||
# Generate positions using shared RNG
|
||||
for i in range(mm.instance_count):
|
||||
var random_pos = Vector3(
|
||||
parent_node.parent_node.rng.randf_range(-1.0, 1.0),
|
||||
rng.randf_range(-1.0, 1.0),
|
||||
0.0,
|
||||
parent_node.parent_node.rng.randf_range(-1.0, 1.0)
|
||||
rng.randf_range(-1.0, 1.0)
|
||||
)
|
||||
|
||||
var random_rotation = parent_node.parent_node.rng.randf_range(0.0, TAU)
|
||||
var random_rotation = rng.randf_range(0.0, TAU)
|
||||
var basis = Basis(Vector3.UP, random_rotation)
|
||||
|
||||
var random_scale = parent_node.parent_node.rng.randf_range(0.05, 0.3)
|
||||
var random_scale = rng.randf_range(0.05, 0.3)
|
||||
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
|
||||
|
||||
var tx = Transform3D(basis, random_pos)
|
||||
|
|
|
|||
|
|
@ -11,29 +11,14 @@ func _ready():
|
|||
|
||||
func spawn_trees_for_cell(cell_info: CellDataResource):
|
||||
if not cell_info:
|
||||
return
|
||||
|
||||
# Use parent's RNG instead of creating new one
|
||||
if not parent_ground_tile or not parent_ground_tile.rng:
|
||||
return
|
||||
|
||||
return
|
||||
|
||||
if not parent_ground_tile:
|
||||
return
|
||||
|
||||
var tree_count = max(0, cell_info.trees.size())
|
||||
spawn_trees(tree_count)
|
||||
|
||||
# Update all rng calls to use parent_ground_tile.rng:
|
||||
func get_random_position() -> Vector3:
|
||||
var x = parent_ground_tile.rng.randf_range(-spawn_area_size.x / 2, spawn_area_size.x / 2)
|
||||
var z = parent_ground_tile.rng.randf_range(-spawn_area_size.y / 2, spawn_area_size.y / 2)
|
||||
return Vector3(x, 0, z)
|
||||
|
||||
func spawn_tree_at_position(pos: Vector3):
|
||||
var random_index = parent_ground_tile.rng.randi() % tree_scenes.size()
|
||||
var random_tree_scene = tree_scenes[random_index]
|
||||
var tree_instance = random_tree_scene.instantiate()
|
||||
add_child(tree_instance)
|
||||
tree_instance.position = pos
|
||||
tree_instance.rotation.y = parent_ground_tile.rng.randf() * TAU
|
||||
|
||||
func spawn_trees(tree_count: int):
|
||||
if tree_scenes.is_empty() or tree_count == 0:
|
||||
return
|
||||
|
|
@ -56,6 +41,21 @@ func spawn_trees(tree_count: int):
|
|||
|
||||
attempts += 1
|
||||
|
||||
func get_random_position() -> Vector3:
|
||||
var rng = parent_ground_tile.get_rng()
|
||||
var x = rng.randf_range(-spawn_area_size.x / 2, spawn_area_size.x / 2)
|
||||
var z = rng.randf_range(-spawn_area_size.y / 2, spawn_area_size.y / 2)
|
||||
return Vector3(x, 0, z)
|
||||
|
||||
func spawn_tree_at_position(pos: Vector3):
|
||||
var rng = parent_ground_tile.get_rng()
|
||||
var random_index = rng.randi() % tree_scenes.size()
|
||||
var random_tree_scene = tree_scenes[random_index]
|
||||
var tree_instance = random_tree_scene.instantiate()
|
||||
add_child(tree_instance)
|
||||
tree_instance.position = pos
|
||||
tree_instance.rotation.y = rng.randf() * TAU
|
||||
|
||||
func is_position_valid(pos: Vector3) -> bool:
|
||||
for existing_pos in spawned_positions:
|
||||
if pos.distance_to(existing_pos) < min_distance:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue