nature-sim/stages/Test3D/particles.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

79 lines
2.3 KiB
GDScript

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