water-shader/Scripts/BuoyantBody.gd

36 lines
1.2 KiB
GDScript3
Raw Normal View History

2025-02-20 12:11:06 -05:00
class_name BuoyantBody extends RigidBody3D
2025-02-19 15:09:30 -05:00
enum WaveType{
SUM_E,
SUM_G
}
@export var buoyancy: float = 1
2025-02-19 15:09:30 -05:00
@export var samplePoints: Array[Node3D]
func TIME() -> float:
return fmod(float(Time.get_ticks_msec()) / 1000, 3600)
2025-02-19 15:09:30 -05:00
func getSumEHeight(x: float, y: float) -> float:
var amp: float = 1
var freq: float = 1
var offset: float = 0
2025-02-20 12:11:06 -05:00
for i: int in range(WaveManager.instance.waveCount):
offset += WaveManager.instance.amplitude * amp * pow(exp(1), sin(WaveManager.instance.frequency * freq * (WaveManager.instance.speed * TIME() + (WaveManager.instance.dirs[i].x * x) + (WaveManager.instance.dirs[i].y * y))))
amp *= WaveManager.instance.amplitudeScaleFactor
freq *= WaveManager.instance.frequencyScaleFactor
return offset
2025-02-19 15:09:30 -05:00
func getSumGHeight(x: float, y: float) -> float:
return 0
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
pass # Replace with function body.
func _physics_process(delta: float) -> void:
for i: int in range(samplePoints.size()):
var distance: float = clampf(getSumEHeight(samplePoints[i].global_position.x, samplePoints[i].global_position.z) - samplePoints[i].global_position.y, 0, 1);
if (distance > 0):
2025-02-20 12:11:06 -05:00
apply_force(abs(buoyancy * get_gravity()) * distance, samplePoints[i].position)