nature-sim/Entities/GroundTile/scripts/flower_multimesh.gd
Dan Baker 3959333534 Adds bushes and flowers to ground tiles
Implements bush and flower spawning on ground tiles based on vegetation density.
Adds new assets for bushes and flowers, and introduces multi-mesh rendering for optimized performance.
Introduces seasonal color variations for vegetation using a shader for bushes and materials for flowers and grass.
Refactors material application into a MaterialManager to handle material assignments over multiple frames.
Moves ground tile scripts into a subfolder.
Adds floating particles to test scene.
2025-06-29 10:58:18 +01:00

59 lines
1.6 KiB
GDScript

extends MultiMeshInstance3D
var mm: MultiMesh
var parent_node: FlowerController
static var flower_mesh: Mesh = null
var material: StandardMaterial3D
func _ready() -> void:
parent_node = get_parent() as FlowerController
if parent_node == null:
Log.pr("Error: Parent node is not a FlowerController!")
# Load mesh once and reuse
if flower_mesh == null:
flower_mesh = load("res://Entities/Plant/assets/flower_tall.res")
func setup_multimesh() -> void:
if parent_node == null:
return
if flower_mesh == null:
Log.pr("Error: Could not load flower mesh")
return
# Reuse existing MultiMesh if possible, or create new one
if mm == null:
mm = MultiMesh.new()
mm.transform_format = MultiMesh.TRANSFORM_3D
mm.mesh = flower_mesh
var flower_material = ColorData.flower_materials[Season.current]["flower"]
var stem_material = ColorData.flower_materials[Season.current]["stem"]
mm.mesh.surface_set_material(0, stem_material)
mm.mesh.surface_set_material(1, flower_material)
# Configure instance count
mm.instance_count = parent_node.flower_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(
rng.randf_range(-1.0, 1.0),
0.0,
rng.randf_range(-1.0, 1.0)
)
var random_rotation = rng.randf_range(0.0, TAU)
var basis = Basis(Vector3.UP, random_rotation)
var random_scale = rng.randf_range(0.2, 0.4)
basis = basis.scaled(Vector3(random_scale, random_scale, random_scale))
var tx = Transform3D(basis, random_pos)
mm.set_instance_transform(i, tx)
multimesh = mm