72 lines
1.7 KiB
GDScript
72 lines
1.7 KiB
GDScript
@icon("uid://dek4dvcv5fyh5")
|
|
extends RigidBody3D
|
|
class_name BoatBody3D
|
|
|
|
@export var float_force := 1.0
|
|
@export var water_drag := 0.05
|
|
@export var water_angular_drag := 0.05
|
|
|
|
@onready var gravity:float = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
|
|
@onready var probes = $ProbeContainer.get_children()
|
|
|
|
var submerged := false
|
|
|
|
var is_docked: bool = false
|
|
|
|
@onready var ocean : Ocean = get_tree().get_nodes_in_group("ocean")[0]
|
|
|
|
@export var max_thrust_force: float = 1024
|
|
@export var max_steering: float = 128
|
|
|
|
var steering: float = 0 # steering rudder angle in radians
|
|
var thrust_force: float = 0 # forward thrust force in Newtons
|
|
|
|
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready():
|
|
add_to_group("boats")
|
|
|
|
|
|
|
|
func _physics_process(delta):
|
|
submerged = false
|
|
for p in probes:
|
|
var depth = ocean.get_water_level(p.global_position) - p.global_position.y
|
|
if depth > 0:
|
|
submerged = true
|
|
apply_force(Vector3.UP * float_force * gravity * depth, p.global_position - global_position)
|
|
|
|
apply_central_force(-self.global_transform.basis.z.normalized() * Vector3(1, 0, 1) * thrust_force)
|
|
apply_torque(Vector3.UP * steering)
|
|
|
|
##apply_torque(-global_transform.basis.z.normalized() * steering * 0.05) # for sideways motion
|
|
|
|
print("Submerged" + str(submerged))
|
|
reset_forces()
|
|
|
|
func _integrate_forces(state: PhysicsDirectBodyState3D):
|
|
if submerged:
|
|
state.linear_velocity *= 1 - water_drag
|
|
state.angular_velocity *= 1 - water_angular_drag
|
|
|
|
|
|
|
|
func thrust():
|
|
if not is_docked:
|
|
thrust_force = max_thrust_force
|
|
|
|
func steer_right():
|
|
if not is_docked:
|
|
steering = -PI * max_steering
|
|
|
|
func steer_left():
|
|
if not is_docked:
|
|
steering = PI * max_steering
|
|
|
|
|
|
func reset_forces():
|
|
thrust_force = 0
|
|
steering = 0
|