45 lines
1.4 KiB
GDScript
45 lines
1.4 KiB
GDScript
extends Node2D
|
|
|
|
@export var max_droplets: int = 100
|
|
@export var spawn_rate: float = 0.1
|
|
var spawn_timer: float = 0.1
|
|
|
|
func _physics_process(delta):
|
|
var mm_node = $MultiMeshInstance2D
|
|
var mm = mm_node.multimesh
|
|
|
|
# 1. Get all current RigidBody2D children
|
|
var fluid_bodies = get_children().filter(func(node): return node is RigidBody2D)
|
|
|
|
# 2. FORCE MultiMesh to match the current body count
|
|
# This is why they weren't 'registering'—the MultiMesh slot didn't exist yet!
|
|
if mm.instance_count != fluid_bodies.size():
|
|
mm.instance_count = fluid_bodies.size()
|
|
|
|
# 3. Visual Sync
|
|
for i in range(fluid_bodies.size()):
|
|
var body = fluid_bodies[i]
|
|
# Subtract the container's position so particles don't "drift"
|
|
var t = Transform2D(0.0, body.global_position - global_position)
|
|
mm.set_instance_transform_2d(i, t)
|
|
|
|
# 4. Interaction (Surface Tension)
|
|
for i in range(fluid_bodies.size()):
|
|
for j in range(i + 1, fluid_bodies.size()):
|
|
var b1 = fluid_bodies[i]
|
|
var b2 = fluid_bodies[j]
|
|
var dist_vec = b1.global_position - b2.global_position
|
|
var dist = dist_vec.length()
|
|
|
|
if dist < 40.0:
|
|
var force = dist_vec.normalized() * 5.0
|
|
b1.apply_central_force(-force)
|
|
b2.apply_central_force(force)
|
|
|
|
# 5. Spawning
|
|
spawn_timer += delta
|
|
if spawn_timer >= spawn_rate and fluid_bodies.size() < max_droplets:
|
|
%SceneManager.addDropplet()
|
|
mm.instance_count = fluid_bodies.size()
|
|
spawn_timer = 0.0
|