Refactors grass and tree spawning for seed consistency

Updates grass and tree spawning to use the parent's RNG,
ensuring consistent random generation based on the seed.

This removes redundant RNG instances and ensures that grass and
trees are generated predictably for a given cell.
This commit is contained in:
Dan Baker 2025-06-26 15:26:56 +01:00
parent e7337bede6
commit 33c525a3c0
2 changed files with 40 additions and 42 deletions

View file

@ -1,54 +1,51 @@
# GrassMultiMesh.gd
extends MultiMeshInstance3D
var mm: MultiMesh
var parent_node: GrassController
var rng: RandomClass = RandomClass.new()
static var grass_mesh: Mesh = null
func _ready() -> void:
parent_node = get_parent() as GrassController
if parent_node == null:
Log.pr("Error: Parent node is not a GrassController!")
# Load mesh once and reuse
if grass_mesh == null:
grass_mesh = load("res://Stages/Test3D/assets/stylizedGrassMeshes/grass2_mesh.res")
func setup_multimesh() -> void:
if parent_node == null:
Log.pr("Error: Parent node not available in setup_multimesh")
return
# Use the same RNG seed as the parent for consistency
if parent_node.parent_node and parent_node.parent_node.cell_info:
rng.set_seed(parent_node.parent_node.cell_info.cell_seed)
# Load the mesh resource directly
var mesh = load("res://Stages/Test3D/assets/stylizedGrassMeshes/grass2_mesh.res")
if mesh == null:
if grass_mesh == null:
Log.pr("Error: Could not load grass mesh")
return
# Create new MultiMesh instance
mm = MultiMesh.new()
# Reuse existing MultiMesh if possible, or create new one
if mm == null:
mm = MultiMesh.new()
mm.transform_format = MultiMesh.TRANSFORM_3D
mm.mesh = grass_mesh
# Configure the MultiMesh
mm.transform_format = MultiMesh.TRANSFORM_3D
# Configure instance count
mm.instance_count = parent_node.grass_instance_range
mm.mesh = mesh
# Generate random positions for grass using seeded RNG
# Generate positions using shared RNG
for i in range(mm.instance_count):
var random_pos = Vector3(
rng.randf_range(-1.0, 1.0),
parent_node.parent_node.rng.randf_range(-1.0, 1.0),
0.0,
rng.randf_range(-1.0, 1.0)
parent_node.parent_node.rng.randf_range(-1.0, 1.0)
)
var random_rotation = rng.randf_range(0.0, TAU)
var random_rotation = parent_node.parent_node.rng.randf_range(0.0, TAU)
var basis = Basis(Vector3.UP, random_rotation)
var random_scale = rng.randf_range(0.05, 0.3)
var random_scale = parent_node.parent_node.rng.randf_range(0.05, 0.3)
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
var tx = Transform3D(basis, random_pos)
mm.set_instance_transform(i, tx)
# Assign the MultiMesh to this node
multimesh = mm
cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF