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.
This commit is contained in:
Dan Baker 2025-06-29 10:58:18 +01:00
parent ea5006e8a2
commit 3959333534
46 changed files with 559 additions and 77 deletions

View file

@ -0,0 +1,79 @@
extends GPUParticles3D
@onready var player: Node3D = get_node("%Player")
var last_player_position: Vector3
var update_distance: float = 1
func _ready():
setup_floating_particles()
func _process(delta):
if player:
var current_player_pos = player.global_position
var target_pos = Vector3(
current_player_pos.x,
1.0,
current_player_pos.z
)
global_position = global_position.lerp(target_pos, delta * 3.0)
func setup_floating_particles():
# Basic particle setup
emitting = true
amount = 100
lifetime = 8.0
visibility_aabb = AABB(Vector3(-20, 0, -20), Vector3(40, 10, 40))
# Create material
var material = ParticleProcessMaterial.new()
# Emission
material.emission_shape = ParticleProcessMaterial.EMISSION_SHAPE_BOX
material.emission_box_extents = Vector3(5, 2, 5)
# Movement
material.direction = Vector3(0.1, 0.8, 0.1)
material.initial_velocity_min = 0.2
material.initial_velocity_max = 0.8
material.gravity = Vector3(0, -0.3, 0)
# Floating motion
material.orbit_velocity_min = 0.1
material.orbit_velocity_max = 0.3
material.radial_velocity_min = -0.2
material.radial_velocity_max = 0.2
# Size and fade
material.scale_min = 0.01
material.scale_max = 0.03
material.scale_over_velocity_min = 0.0
material.scale_over_velocity_max = 2.0
# Color (golden dust particles)
var gradient = Gradient.new()
gradient.add_point(0.0, Color(1.0, 0.9, 0.6, 0.0)) # Fade in
gradient.add_point(0.2, Color(1.0, 0.9, 0.6, 0.5)) # Full opacity
gradient.add_point(0.8, Color(1.0, 0.8, 0.4, 0.3)) # Slight color shift
gradient.add_point(1.0, Color(1.0, 0.7, 0.3, 0.0)) # Fade out
var gradient_texture = GradientTexture1D.new()
gradient_texture.gradient = gradient
material.color_ramp = gradient_texture
# Assign the material to the particle system
process_material = material
# Create and assign visual mesh (small billboard)
var quad_mesh = QuadMesh.new()
quad_mesh.size = Vector2(0.01, 0.01)
draw_pass_1 = quad_mesh
# Create a basic material for the particles to be visible
var particle_material = StandardMaterial3D.new()
particle_material.albedo_color = ColorData.grass_materials[Season.current]['top']
particle_material.flags_transparent = true
particle_material.flags_unshaded = true
particle_material.billboard_mode = BaseMaterial3D.BILLBOARD_ENABLED
material_override = particle_material