biplan.gd 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. class_name Biplan
  2. extends SeatedVehicle
  3. const PLANE_FORWARD := Vector3.BACK # z increases when moving forward
  4. @export var thrust_power: float = 3500.0
  5. @export var turn_to_torque: float = 1000.0
  6. @export var move_to_pitch: float = 2000.0
  7. @export var wing_resistance: float = 2500.0
  8. @export var foil_resistance: float = 250.0
  9. @export var lift: float = 25.0
  10. var target_torque: float = 0.0
  11. var target_pitch: float = 0.0
  12. var target_rotation := Vector3.ZERO
  13. var target_thrust := Vector3.ZERO
  14. # Physics logs
  15. var vertical_speed: float = 0.0
  16. var horizontal_speed: float = 0.0
  17. var local_wing_force := Vector3.ZERO
  18. var local_foil_force := Vector3.ZERO
  19. var local_lift_force := Vector3.ZERO
  20. @onready var VerticalFoil : Node3D = $VerticalFoil
  21. func _register_custom_monitors() -> void:
  22. Performance.add_custom_monitor("plane/torque", func(): return abs(target_torque))
  23. Performance.add_custom_monitor("plane/pitch", func(): return abs(target_pitch))
  24. Performance.add_custom_monitor("plane/rotation", func(): return target_rotation.length())
  25. Performance.add_custom_monitor("plane/thrust", func(): return target_thrust.length())
  26. Performance.add_custom_monitor("plane/vertical_speed", func(): return abs(vertical_speed))
  27. Performance.add_custom_monitor("plane/horizontal_speed", func(): return abs(horizontal_speed))
  28. Performance.add_custom_monitor("plane/wing_force", func(): return local_wing_force.length())
  29. Performance.add_custom_monitor("plane/foil_force", func(): return local_foil_force.length())
  30. Performance.add_custom_monitor("plane/lift_force", func(): return local_lift_force.length())
  31. func _ready() -> void:
  32. _register_custom_monitors()
  33. func trigger_thrust(activate: bool) -> void:
  34. if activate:
  35. target_thrust = PLANE_FORWARD * thrust_power
  36. else:
  37. target_thrust = Vector3.ZERO
  38. func trigger_direction(dir: Vector2) -> void:
  39. target_torque = dir.x * turn_to_torque
  40. target_pitch = dir.y * move_to_pitch
  41. func get_free_seat() -> Node3D:
  42. return $DrivingSeat
  43. func _physics_process(_delta) -> void:
  44. # Command part
  45. _apply_plane_rotation()
  46. _apply_plane_thrust()
  47. # Air simulation part
  48. if is_sleeping():
  49. return
  50. _apply_wing_resistance()
  51. _apply_foil_resistance()
  52. _apply_lift()
  53. transform = transform.orthonormalized()
  54. func _apply_plane_rotation() -> void:
  55. var torque: Vector3 = transform.basis * Vector3(target_pitch, 0.0, target_torque)
  56. apply_torque(torque)
  57. func _apply_plane_thrust() -> void:
  58. var force: Vector3 = transform.basis * target_thrust
  59. apply_central_force(force)
  60. func _apply_wing_resistance() -> void:
  61. vertical_speed = linear_velocity.dot(transform.basis * Vector3.UP)
  62. local_wing_force = Vector3.UP * -wing_resistance * vertical_speed
  63. var wing_force = transform.basis * local_wing_force
  64. apply_central_force(wing_force)
  65. func _apply_foil_resistance() -> void:
  66. var foil_position : Vector3 = VerticalFoil.get_position()
  67. horizontal_speed = linear_velocity.dot(transform.basis * Vector3.RIGHT)
  68. local_foil_force = Vector3.RIGHT * -foil_resistance * horizontal_speed
  69. apply_force(local_foil_force, foil_position)
  70. func _apply_lift() -> void:
  71. var forward_speed = linear_velocity.dot(transform.basis * PLANE_FORWARD)
  72. if forward_speed < 0.0 :
  73. forward_speed = 0.0
  74. local_lift_force = Vector3.UP * lift * forward_speed
  75. var lift_force = transform.basis * local_lift_force
  76. apply_central_force(lift_force)
  77. func _on_dir_changed(dir: Vector2) -> void:
  78. trigger_direction(dir)
  79. func _on_main_action(pressed: bool) -> void:
  80. trigger_thrust(pressed)