diff --git a/demo/demo.gd b/demo/demo.gd new file mode 100644 index 0000000..d11ee2a --- /dev/null +++ b/demo/demo.gd @@ -0,0 +1,4 @@ +extends Node3D + +func _ready() -> void: + RegionOrigin.anchor = $FixedWingAircraft/RegionTransform diff --git a/demo/demo.gd.uid b/demo/demo.gd.uid new file mode 100644 index 0000000..c8d8c9d --- /dev/null +++ b/demo/demo.gd.uid @@ -0,0 +1 @@ +uid://cdk7y1rat3juk diff --git a/demo/demo.tscn b/demo/demo.tscn index a162ea0..fff3dea 100644 --- a/demo/demo.tscn +++ b/demo/demo.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=18 format=3 uid="uid://d20jwlre5rc5m"] +[gd_scene load_steps=20 format=3 uid="uid://d20jwlre5rc5m"] +[ext_resource type="Script" uid="uid://cdk7y1rat3juk" path="res://demo/demo.gd" id="1_oeqrt"] [ext_resource type="Texture2D" uid="uid://bruwqvb6qrsfn" path="res://demo/textures/untexture.png" id="1_ytiva"] [ext_resource type="Script" uid="uid://bddnsq0h2tpf" path="res://scripts/aircraft/nodes/fixed_wing_aircraft.gd" id="2_dar0o"] [ext_resource type="Resource" uid="uid://dpk3bgq54ajul" path="res://demo/airfoils/symmetric.tres" id="3_u10mr"] @@ -7,6 +8,7 @@ [ext_resource type="Resource" uid="uid://p2i7a806s6gs" path="res://demo/propulsion/electric_motor.tres" id="4_s1s6j"] [ext_resource type="Script" uid="uid://pc3j1c6e1ra7" path="res://scripts/aircraft/nodes/flight_sim_controller.gd" id="5_s1s6j"] [ext_resource type="Script" uid="uid://tgj0rvn5wj8t" path="res://demo/hud.gd" id="6_onu7k"] +[ext_resource type="Script" uid="uid://ddh4omp23xc58" path="res://scripts/origin/region_transform.gd" id="7_onvmd"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_j5lb4"] albedo_texture = ExtResource("1_ytiva") @@ -14,7 +16,8 @@ uv1_scale = Vector3(100, 100, 100) [sub_resource type="PlaneMesh" id="PlaneMesh_5hjng"] material = SubResource("StandardMaterial3D_j5lb4") -size = Vector2(2000, 2000) +size = Vector2(1000, 1000) +center_offset = Vector3(500, 0, 500) [sub_resource type="Curve" id="Curve_s1s6j"] _limits = [0.0, 0.5, 0.0, 20.0] @@ -72,6 +75,7 @@ ambient_light_source = 3 ambient_light_color = Color(1, 1, 1, 1) [node name="Demo" type="Node3D"] +script = ExtResource("1_oeqrt") [node name="Ground" type="MeshInstance3D" parent="."] mesh = SubResource("PlaneMesh_5hjng") @@ -96,6 +100,11 @@ metadata/_custom_type_script = "uid://pc3j1c6e1ra7" [node name="Camera3D" type="Camera3D" parent="FixedWingAircraft"] +[node name="RegionTransform" type="Node" parent="FixedWingAircraft" node_paths=PackedStringArray("target")] +script = ExtResource("7_onvmd") +target = NodePath("..") +metadata/_custom_type_script = "uid://ddh4omp23xc58" + [node name="CanvasLayer" type="CanvasLayer" parent="."] [node name="HUD" type="Control" parent="CanvasLayer" node_paths=PackedStringArray("source")] diff --git a/project.godot b/project.godot index 22d44f4..d503924 100644 --- a/project.godot +++ b/project.godot @@ -18,6 +18,7 @@ config/icon="res://icon.svg" [autoload] Atmosphere="*res://scripts/aircraft/nodes/atmosphere.gd" +RegionOrigin="*res://scripts/origin/region_origin.gd" [debug] diff --git a/scripts/aircraft/nodes/fixed_wing_aircraft.gd b/scripts/aircraft/nodes/fixed_wing_aircraft.gd index c4b03e6..6b9aa4a 100644 --- a/scripts/aircraft/nodes/fixed_wing_aircraft.gd +++ b/scripts/aircraft/nodes/fixed_wing_aircraft.gd @@ -17,6 +17,8 @@ var m_relative_velocity: Vector3 var m_is_landed := false +@onready var m_region_transform: RegionTransform = $RegionTransform + func _ready() -> void: velocity = -global_basis.z * initial_speed m_relative_velocity = transform.basis.inverse() * velocity @@ -77,6 +79,7 @@ func _physics_process(delta: float) -> void: rotate_object_local(steering_axis.normalized(), steering_axis.length()) move_and_slide() + m_region_transform.sync_from_transform() #if !is_landed: # _fly() #else: diff --git a/scripts/origin/region_origin.gd b/scripts/origin/region_origin.gd new file mode 100644 index 0000000..c197ca0 --- /dev/null +++ b/scripts/origin/region_origin.gd @@ -0,0 +1,25 @@ +# no name - meant to be an autoload +# Handles regional origin. +extends Node + +@export var region_size := 1000.0 +@export var origin := Vector3i.ZERO +@export var anchor: RegionTransform + +var nodes_to_move: Dictionary[Node3D, bool] + +func _physics_process(_delta: float) -> void: + if (anchor and anchor.region != origin): + move_origin(anchor.region) + +func add_node(new_node: Node3D) -> void: + nodes_to_move[new_node] = true + +func remove_node(old_node: Node3D) -> void: + nodes_to_move.erase(old_node) + +func move_origin(new_origin: Vector3i) -> void: + origin = new_origin + var move_amount := Vector3(new_origin - origin * 1000) + for node in nodes_to_move: + node.transform.origin += move_amount diff --git a/scripts/origin/region_origin.gd.uid b/scripts/origin/region_origin.gd.uid new file mode 100644 index 0000000..b01dced --- /dev/null +++ b/scripts/origin/region_origin.gd.uid @@ -0,0 +1 @@ +uid://dlrk82k15q6w3 diff --git a/scripts/origin/region_transform.gd b/scripts/origin/region_transform.gd new file mode 100644 index 0000000..08d185f --- /dev/null +++ b/scripts/origin/region_transform.gd @@ -0,0 +1,36 @@ +class_name RegionTransform +extends Node + +@export var offset: Vector3 +@export var region: Vector3i +@export var target: Node3D + +func _enter_tree() -> void: + if not target: + target = get_parent() + RegionOrigin.add_node(target) + +func _exit_tree() -> void: + RegionOrigin.remove_node(target) + +func move_offset(delta_offset: Vector3) -> void: + set_offset(offset + delta_offset) + +func set_offset(new_offset: Vector3) -> void: + offset = new_offset + var delta_sector: Vector3i = _floor_ftoi(new_offset / 1000.0) + region += delta_sector + offset -= Vector3(delta_sector) * 1000.0 + sync_to_transform() + +func altitude() -> float: + return offset.y + float(region.y) * 1000.0 + +func sync_to_transform() -> void: + target.transform.origin = offset + Vector3(region - RegionOrigin.origin) + +func sync_from_transform() -> void: + set_offset(target.transform.origin) + +static func _floor_ftoi(vec: Vector3) -> Vector3i: + return Vector3i(int(floorf(vec.x)), int(floorf(vec.y)), int(floorf(vec.z))) diff --git a/scripts/origin/region_transform.gd.uid b/scripts/origin/region_transform.gd.uid new file mode 100644 index 0000000..3a64785 --- /dev/null +++ b/scripts/origin/region_transform.gd.uid @@ -0,0 +1 @@ +uid://ddh4omp23xc58