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
|
|
|
|
}
|
|
|
|
|
2025-02-19 23:40:48 -05:00
|
|
|
@export var buoyancy: float = 1
|
2025-02-19 15:09:30 -05:00
|
|
|
@export var samplePoints: Array[Node3D]
|
|
|
|
|
2025-02-19 23:40:48 -05:00
|
|
|
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:
|
2025-02-19 23:40:48 -05:00
|
|
|
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
|
2025-02-19 23:40:48 -05:00
|
|
|
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:
|
2025-02-19 23:40:48 -05:00
|
|
|
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)
|