Compare commits
10 Commits
4e4fdb91e7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 052798f8d4 | |||
| 4d94b62ea3 | |||
| 369a0e2b52 | |||
| 84e22fe12e | |||
| 13bbef255a | |||
| 24a30fd4f4 | |||
| fa7bbacb22 | |||
| 3bf5338ede | |||
| 9188a97268 | |||
| 1e8ebb7567 |
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://ditcckm4p6trr"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bxu7kvlou3p6a" path="res://planets_whatnot/earth.glb" id="1_vtalr"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=343978544]
|
||||||
|
|
||||||
|
[node name="earth" parent="." unique_id=1567940005 instance=ExtResource("1_vtalr")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://copsfu6pmpnuu"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dfw2nwijt2v1f" path="res://planets_whatnot/SM_Jupiter.glb" id="1_jmycg"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1895679827]
|
||||||
|
|
||||||
|
[node name="SM_Jupiter2" parent="." unique_id=1950196769 instance=ExtResource("1_jmycg")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://bnj0kiimhmp0w"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cnkgiutgow12k" path="res://planets_whatnot/SM_Mercury.glb" id="1_bevoa"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1538303107]
|
||||||
|
|
||||||
|
[node name="SM_Mercury2" parent="." unique_id=2094884334 instance=ExtResource("1_bevoa")]
|
||||||
@@ -64,6 +64,7 @@ var culture_buttons: Array[Button] = []
|
|||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||||
|
GameplayInput.set_menu_open(self, true)
|
||||||
name_input = _find("NameInput") as LineEdit
|
name_input = _find("NameInput") as LineEdit
|
||||||
background_list = _find("BackgroundL") as Control
|
background_list = _find("BackgroundL") as Control
|
||||||
if background_list == null:
|
if background_list == null:
|
||||||
@@ -126,6 +127,20 @@ func _ready() -> void:
|
|||||||
if backgrounds.size() > 0:
|
if backgrounds.size() > 0:
|
||||||
_select_background(backgrounds[0])
|
_select_background(backgrounds[0])
|
||||||
_set_sex("male")
|
_set_sex("male")
|
||||||
|
if sex_male:
|
||||||
|
sex_male.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
## Controller cancel follows the existing back command without changing creation data.
|
||||||
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if event.is_action_pressed("ui_cancel"):
|
||||||
|
get_viewport().set_input_as_handled()
|
||||||
|
_on_back()
|
||||||
|
|
||||||
|
|
||||||
|
## Releases menu ownership when entering gameplay or returning to the main menu.
|
||||||
|
func _exit_tree() -> void:
|
||||||
|
GameplayInput.set_menu_open(self, false)
|
||||||
|
|
||||||
|
|
||||||
func _find(n: String) -> Node:
|
func _find(n: String) -> Node:
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ extends CharacterBody3D
|
|||||||
@onready var pause_menu: Control = get_node_or_null("/root/Node3D/HUD/PauseMenu")
|
@onready var pause_menu: Control = get_node_or_null("/root/Node3D/HUD/PauseMenu")
|
||||||
@onready var body_collision: CollisionShape3D = get_node_or_null("CollisionShape3D")
|
@onready var body_collision: CollisionShape3D = get_node_or_null("CollisionShape3D")
|
||||||
@onready var flight_label: Label = get_node_or_null("/root/Node3D/HUD/FlightLabel")
|
@onready var flight_label: Label = get_node_or_null("/root/Node3D/HUD/FlightLabel")
|
||||||
@onready var kestrel: Node3D = get_node_or_null("Kestrel")
|
@onready var kestrel: Node3D = get_node_or_null("kestrel_body")
|
||||||
|
|
||||||
var player_inside: bool = false
|
var player_inside: bool = false
|
||||||
var player_ref: CharacterBody3D = null
|
var player_ref: CharacterBody3D = null
|
||||||
@@ -64,6 +64,7 @@ var _hatch_crew_open: bool = false
|
|||||||
var _hatch_dock_open: bool = false
|
var _hatch_dock_open: bool = false
|
||||||
var _ladder_out: bool = false
|
var _ladder_out: bool = false
|
||||||
var _cabin_dim: bool = false
|
var _cabin_dim: bool = false
|
||||||
|
var _instruments_on: bool = false
|
||||||
var _v_was: bool = false
|
var _v_was: bool = false
|
||||||
|
|
||||||
|
|
||||||
@@ -92,14 +93,31 @@ func _ready() -> void:
|
|||||||
call_deferred("_update_crust_exception")
|
call_deferred("_update_crust_exception")
|
||||||
|
|
||||||
|
|
||||||
|
var _hull_driver: Node = null
|
||||||
|
|
||||||
|
|
||||||
func _bind_kestrel() -> void:
|
func _bind_kestrel() -> void:
|
||||||
if kestrel == null:
|
if kestrel == null:
|
||||||
kestrel = get_node_or_null("Kestrel")
|
for name in ["kestrel_body", "Kestrel", "KestrelBody"]:
|
||||||
print("Kestrel hull=", kestrel, " driver=", kestrel.get_script() if kestrel else null)
|
kestrel = get_node_or_null(name) as Node3D
|
||||||
|
if kestrel:
|
||||||
|
break
|
||||||
|
if kestrel == null:
|
||||||
|
for c in find_children("*", "Node", true, false):
|
||||||
|
if "abort_burn" in c and "gear_deploy" in c:
|
||||||
|
kestrel = c as Node3D
|
||||||
|
break
|
||||||
|
_hull_driver = kestrel
|
||||||
|
if kestrel and not ("abort_burn" in kestrel):
|
||||||
|
for c in kestrel.find_children("*", "Node", true, false):
|
||||||
|
if "abort_burn" in c and "gear_deploy" in c:
|
||||||
|
_hull_driver = c
|
||||||
|
break
|
||||||
|
print("Kestrel hull=", kestrel, " driver=", _hull_driver)
|
||||||
|
|
||||||
|
|
||||||
func _hull() -> Node:
|
func _hull() -> Node:
|
||||||
return kestrel if kestrel else null
|
return _hull_driver if _hull_driver else kestrel
|
||||||
|
|
||||||
|
|
||||||
func _set_hull(prop: String, value: Variant) -> void:
|
func _set_hull(prop: String, value: Variant) -> void:
|
||||||
@@ -108,6 +126,16 @@ func _set_hull(prop: String, value: Variant) -> void:
|
|||||||
h.set(prop, value)
|
h.set(prop, value)
|
||||||
|
|
||||||
|
|
||||||
|
func _drive_hull(thrusting: bool, pitch: float, yaw: float, roll: float) -> void:
|
||||||
|
_set_hull("abort_burn", thrusting)
|
||||||
|
_set_hull("att_pitch", pitch)
|
||||||
|
_set_hull("att_yaw", yaw)
|
||||||
|
_set_hull("att_roll", roll)
|
||||||
|
var h := _hull()
|
||||||
|
if h and h.has_method("drive"):
|
||||||
|
h.drive(thrusting, pitch, yaw, roll)
|
||||||
|
|
||||||
|
|
||||||
func _moon() -> Node3D:
|
func _moon() -> Node3D:
|
||||||
return get_node_or_null("/root/Node3D/SolarSystem/Moon") as Node3D
|
return get_node_or_null("/root/Node3D/SolarSystem/Moon") as Node3D
|
||||||
|
|
||||||
@@ -298,7 +326,8 @@ func _unhandled_input(event: InputEvent) -> void:
|
|||||||
_set_hull("hatch_ladder_deploy", 1.0 if _ladder_out else 0.0)
|
_set_hull("hatch_ladder_deploy", 1.0 if _ladder_out else 0.0)
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
elif _event_toggles(event, "capsule_instruments", KEY_I):
|
elif _event_toggles(event, "capsule_instruments", KEY_I):
|
||||||
_set_hull("instruments_demo", 1.0)
|
_instruments_on = not _instruments_on
|
||||||
|
_set_hull("instruments_demo", 1.0 if _instruments_on else 0.35)
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
elif _event_toggles(event, "capsule_cabin_light", KEY_K):
|
elif _event_toggles(event, "capsule_cabin_light", KEY_K):
|
||||||
_cabin_dim = not _cabin_dim
|
_cabin_dim = not _cabin_dim
|
||||||
@@ -590,11 +619,7 @@ func handle_flight(delta: float) -> void:
|
|||||||
rotate_object_local(Vector3.FORWARD, -input_yaw * rotation_speed * delta)
|
rotate_object_local(Vector3.FORWARD, -input_yaw * rotation_speed * delta)
|
||||||
rotate_object_local(Vector3.UP, input_roll * rotation_speed * delta)
|
rotate_object_local(Vector3.UP, input_roll * rotation_speed * delta)
|
||||||
var thrusting := Input.is_key_pressed(KEY_SPACE)
|
var thrusting := Input.is_key_pressed(KEY_SPACE)
|
||||||
_set_hull("abort_burn", thrusting)
|
_drive_hull(thrusting, input_pitch, input_yaw, input_roll)
|
||||||
_set_hull("att_pitch", input_pitch)
|
|
||||||
_set_hull("att_yaw", input_yaw)
|
|
||||||
_set_hull("att_roll", input_roll)
|
|
||||||
_set_hull("rcs_direction", 0)
|
|
||||||
var acceleration: Vector3 = _gravity_accel()
|
var acceleration: Vector3 = _gravity_accel()
|
||||||
if thrusting:
|
if thrusting:
|
||||||
acceleration += global_transform.basis.y * (thrust_force / mass)
|
acceleration += global_transform.basis.y * (thrust_force / mass)
|
||||||
|
|||||||
@@ -0,0 +1,287 @@
|
|||||||
|
extends Node
|
||||||
|
## Device-independent gameplay input. Bindings remain in Godot's InputMap.
|
||||||
|
|
||||||
|
signal command_requested(action: StringName, command_context: int)
|
||||||
|
signal transient_input_cleared
|
||||||
|
|
||||||
|
## Gameplay input context enumeration.
|
||||||
|
## ON_FOOT: Player is on foot and can perform standard movement actions.
|
||||||
|
## VEHICLE: Player is controlling a vehicle and movement actions are mapped accordingly.
|
||||||
|
enum Context { ON_FOOT, VEHICLE }
|
||||||
|
|
||||||
|
## Current gameplay input context.
|
||||||
|
var context: Context = Context.ON_FOOT
|
||||||
|
## Whether sprint is currently enabled.
|
||||||
|
var sprint_enabled: bool = false
|
||||||
|
## Controller turn speed for look input.
|
||||||
|
var controller_turn_speed: Vector2 = Vector2(2.5, 2.0)
|
||||||
|
## Whether the Y-axis of the controller look input is inverted.
|
||||||
|
var invert_controller_y: bool = false
|
||||||
|
## Deadzone for movement stick input.
|
||||||
|
var movement_deadzone: float = 0.2
|
||||||
|
## Deadzone for look stick input.
|
||||||
|
var look_deadzone: float = 0.2
|
||||||
|
## List of nodes that currently own the menu, blocking gameplay input.
|
||||||
|
var _menu_owners: Array[Node] = []
|
||||||
|
## Accumulated mouse displacement since the last frame.
|
||||||
|
var _mouse_displacement: Vector2 = Vector2.ZERO
|
||||||
|
## Whether a jump has been requested this frame.
|
||||||
|
var _jump_requested: bool = false
|
||||||
|
## Whether the input system is waiting for all controls to return to neutral.
|
||||||
|
var _awaiting_neutral: bool = false
|
||||||
|
## Whether the game window is currently focused.
|
||||||
|
var _window_focused: bool = true
|
||||||
|
## Dictionary tracking currently processed but not yet canceled: i.e. when you press the fire button and it has been handled but you have not yet released the button.
|
||||||
|
var _latched_commands: Dictionary = {}
|
||||||
|
## Outgoing/incoming controls monitored until an ownership handoff reaches neutral.
|
||||||
|
var _neutral_actions: Array[StringName] = []
|
||||||
|
|
||||||
|
## List of all trigger-based actions the player can perform.
|
||||||
|
const TRIGGER_ACTIONS: Array[StringName] = [
|
||||||
|
&"interact", &"combat_reload", &"character_toggle_inventory", &"toggle_view",
|
||||||
|
&"combat_toggle_weapon", &"character_toggle_mag_boots", &"character_sprint", &"character_jump", &"combat_fire",
|
||||||
|
&"vehicle_toggle_gear", &"vehicle_toggle_crew_hatch", &"vehicle_toggle_dock_hatch",
|
||||||
|
&"capsule_toggle_ladder", &"vehicle_activate_instruments", &"vehicle_toggle_cabin_lights",
|
||||||
|
]
|
||||||
|
## Explicit command membership; action prefixes are organizational only.
|
||||||
|
const CONTEXT_TRIGGER_ACTIONS: Dictionary = {
|
||||||
|
Context.ON_FOOT: [
|
||||||
|
&"interact", &"toggle_view", &"character_toggle_inventory", &"character_toggle_mag_boots",
|
||||||
|
&"character_sprint", &"character_jump", &"combat_fire", &"combat_reload", &"combat_toggle_weapon",
|
||||||
|
],
|
||||||
|
Context.VEHICLE: [
|
||||||
|
&"interact", &"toggle_view", &"vehicle_toggle_gear", &"vehicle_toggle_crew_hatch",
|
||||||
|
&"vehicle_toggle_dock_hatch", &"capsule_toggle_ladder", &"vehicle_activate_instruments",
|
||||||
|
&"vehicle_toggle_cabin_lights",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
## Commands requiring the controller auxiliary modifier, independent of their names.
|
||||||
|
const VEHICLE_AUXILIARY_ACTIONS: Array[StringName] = [
|
||||||
|
&"vehicle_toggle_gear", &"vehicle_toggle_crew_hatch", &"vehicle_toggle_dock_hatch",
|
||||||
|
&"capsule_toggle_ladder", &"vehicle_activate_instruments", &"vehicle_toggle_cabin_lights",
|
||||||
|
]
|
||||||
|
## List of all axis-based actions the player can perform.
|
||||||
|
const AXIS_ACTIONS: Array[StringName] = [
|
||||||
|
&"character_move_left", &"character_move_right", &"character_move_forward", &"character_move_back",
|
||||||
|
&"look_left", &"look_right", &"look_up", &"look_down",
|
||||||
|
&"eva_roll_left", &"eva_roll_right", &"vehicle_pitch_up", &"vehicle_pitch_down",
|
||||||
|
&"vehicle_yaw_left", &"vehicle_yaw_right", &"vehicle_roll_left", &"vehicle_roll_right",
|
||||||
|
]
|
||||||
|
## Look is shared; character/EVA and vehicle axes belong to distinct contexts.
|
||||||
|
const SHARED_AXIS_ACTIONS: Array[StringName] = [
|
||||||
|
&"look_left", &"look_right", &"look_up", &"look_down",
|
||||||
|
]
|
||||||
|
const CONTEXT_AXIS_ACTIONS: Dictionary = {
|
||||||
|
Context.ON_FOOT: [
|
||||||
|
&"character_move_left", &"character_move_right", &"character_move_forward", &"character_move_back",
|
||||||
|
&"eva_roll_left", &"eva_roll_right",
|
||||||
|
],
|
||||||
|
Context.VEHICLE: [
|
||||||
|
&"vehicle_pitch_up", &"vehicle_pitch_down", &"vehicle_yaw_left", &"vehicle_yaw_right",
|
||||||
|
&"vehicle_roll_left", &"vehicle_roll_right",
|
||||||
|
],
|
||||||
|
}
|
||||||
|
## Held controls are polled, not dispatched through command_requested.
|
||||||
|
const CONTEXT_HELD_ACTIONS: Dictionary = {
|
||||||
|
Context.ON_FOOT: [&"combat_aim", &"freelook", &"release_cursor"],
|
||||||
|
Context.VEHICLE: [&"vehicle_thrust", &"vehicle_freelook", &"vehicle_auxiliary", &"vehicle_release_cursor"],
|
||||||
|
}
|
||||||
|
|
||||||
|
## Connects device/focus boundaries; project defaults are never reapplied on spawn.
|
||||||
|
func _ready() -> void:
|
||||||
|
process_mode = Node.PROCESS_MODE_ALWAYS
|
||||||
|
Input.joy_connection_changed.connect(_on_controller_connection_changed)
|
||||||
|
get_tree().root.focus_entered.connect(_on_focus_entered)
|
||||||
|
get_tree().root.focus_exited.connect(_on_focus_exited)
|
||||||
|
|
||||||
|
|
||||||
|
## Updates neutral gating and ends sprint when the movement stick is released.
|
||||||
|
func _process(_delta: float) -> void:
|
||||||
|
for owner_index in range(_menu_owners.size() - 1, -1, -1):
|
||||||
|
if not is_instance_valid(_menu_owners[owner_index]):
|
||||||
|
_menu_owners.remove_at(owner_index)
|
||||||
|
if _awaiting_neutral and _controls_are_neutral():
|
||||||
|
_awaiting_neutral = false
|
||||||
|
_neutral_actions.clear()
|
||||||
|
if not gameplay_enabled() or read_movement().length_squared() < 0.0001:
|
||||||
|
sprint_enabled = false
|
||||||
|
|
||||||
|
|
||||||
|
## UI receives events first. Only the current gameplay context gets commands.
|
||||||
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
for action in _latched_commands.keys():
|
||||||
|
if event.is_action_released(action):
|
||||||
|
_latched_commands.erase(action)
|
||||||
|
if not gameplay_enabled():
|
||||||
|
return
|
||||||
|
if event is InputEventMouseMotion:
|
||||||
|
if Input.mouse_mode == Input.MOUSE_MODE_CAPTURED:
|
||||||
|
record_mouse_displacement(event.relative)
|
||||||
|
return
|
||||||
|
for action in CONTEXT_TRIGGER_ACTIONS[context]:
|
||||||
|
if event.is_action_pressed(action) and _command_is_available(action, event):
|
||||||
|
if _latched_commands.has(action):
|
||||||
|
return
|
||||||
|
_latched_commands[action] = true
|
||||||
|
get_viewport().set_input_as_handled()
|
||||||
|
if action == &"character_sprint":
|
||||||
|
sprint_enabled = not sprint_enabled
|
||||||
|
elif action == &"character_jump":
|
||||||
|
_jump_requested = true
|
||||||
|
else:
|
||||||
|
command_requested.emit(action, context)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
## Changes control ownership and discards commands from the previous owner.
|
||||||
|
func set_context(next_context: Context) -> void:
|
||||||
|
_monitor_context_for_neutral(context)
|
||||||
|
context = next_context
|
||||||
|
clear_transient_input()
|
||||||
|
|
||||||
|
|
||||||
|
## Blocks gameplay while an owning menu is open; nested menus are supported.
|
||||||
|
func set_menu_open(owner_node: Node, is_open: bool) -> void:
|
||||||
|
if is_open and not _menu_owners.has(owner_node):
|
||||||
|
_menu_owners.append(owner_node)
|
||||||
|
elif not is_open:
|
||||||
|
_menu_owners.erase(owner_node)
|
||||||
|
clear_transient_input()
|
||||||
|
|
||||||
|
|
||||||
|
## Clears held/queued state and requires neutral controls before gameplay resumes.
|
||||||
|
func clear_transient_input() -> void:
|
||||||
|
_monitor_context_for_neutral(context)
|
||||||
|
_mouse_displacement = Vector2.ZERO
|
||||||
|
_jump_requested = false
|
||||||
|
_latched_commands.clear()
|
||||||
|
sprint_enabled = false
|
||||||
|
_awaiting_neutral = true
|
||||||
|
transient_input_cleared.emit()
|
||||||
|
|
||||||
|
|
||||||
|
## Polling must use this gate: UI event consumption does not block Input state.
|
||||||
|
## Returns true if the window is focused, the game is not paused, no menus are open, and we are not awaiting neutral input.
|
||||||
|
func gameplay_enabled() -> bool:
|
||||||
|
return _window_focused and not get_tree().paused and _menu_owners.is_empty() and not _awaiting_neutral
|
||||||
|
|
||||||
|
|
||||||
|
## Checks explicit membership without relying on action naming prefixes.
|
||||||
|
func is_action_available(action: StringName) -> bool:
|
||||||
|
return (
|
||||||
|
CONTEXT_TRIGGER_ACTIONS[context].has(action)
|
||||||
|
or SHARED_AXIS_ACTIONS.has(action)
|
||||||
|
or CONTEXT_AXIS_ACTIONS[context].has(action)
|
||||||
|
or CONTEXT_HELD_ACTIONS[context].has(action)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
## Returns body-relative movement, with forward on negative Y and magnitude <= 1.
|
||||||
|
func read_movement() -> Vector2:
|
||||||
|
if not gameplay_enabled() or context != Context.ON_FOOT:
|
||||||
|
return Vector2.ZERO
|
||||||
|
return Input.get_vector("character_move_left", "character_move_right", "character_move_forward", "character_move_back", movement_deadzone)
|
||||||
|
|
||||||
|
|
||||||
|
## Returns signed analog strength without exposing device axes to gameplay.
|
||||||
|
func read_axis(negative_action: StringName, positive_action: StringName) -> float:
|
||||||
|
if not gameplay_enabled() or not is_action_available(negative_action) or not is_action_available(positive_action):
|
||||||
|
return 0.0
|
||||||
|
return Input.get_axis(negative_action, positive_action)
|
||||||
|
|
||||||
|
|
||||||
|
## Returns an unsigned analog command strength in the range 0..1.
|
||||||
|
func read_strength(action: StringName) -> float:
|
||||||
|
return Input.get_action_strength(action) if gameplay_enabled() and is_action_available(action) else 0.0
|
||||||
|
|
||||||
|
|
||||||
|
## Returns a held action; future automatic weapons can use this independently of presses.
|
||||||
|
func is_held(action: StringName) -> bool:
|
||||||
|
return gameplay_enabled() and is_action_available(action) and Input.is_action_pressed(action)
|
||||||
|
|
||||||
|
|
||||||
|
## Consumes one UI-aware jump request during the next physics update.
|
||||||
|
func consume_jump_request() -> bool:
|
||||||
|
var requested: bool = _jump_requested and gameplay_enabled()
|
||||||
|
_jump_requested = false
|
||||||
|
return requested
|
||||||
|
|
||||||
|
|
||||||
|
## Accumulates mouse pixels independently of the render/physics update rates.
|
||||||
|
func record_mouse_displacement(displacement: Vector2) -> void:
|
||||||
|
if gameplay_enabled():
|
||||||
|
_mouse_displacement += displacement
|
||||||
|
|
||||||
|
|
||||||
|
## Consumes mouse pixels, once per camera update, without time scaling.
|
||||||
|
func consume_mouse_displacement() -> Vector2:
|
||||||
|
var displacement := _mouse_displacement if gameplay_enabled() else Vector2.ZERO
|
||||||
|
_mouse_displacement = Vector2.ZERO
|
||||||
|
return displacement
|
||||||
|
|
||||||
|
|
||||||
|
## Returns stick angular displacement in radians for this frame; positive Y looks down.
|
||||||
|
func read_controller_look(delta: float) -> Vector2:
|
||||||
|
if not gameplay_enabled():
|
||||||
|
return Vector2.ZERO
|
||||||
|
var stick := Input.get_vector("look_left", "look_right", "look_up", "look_down", look_deadzone)
|
||||||
|
if invert_controller_y:
|
||||||
|
stick.y = -stick.y
|
||||||
|
return stick * controller_turn_speed * delta
|
||||||
|
|
||||||
|
|
||||||
|
## Returns a current-device binding label, with a fallback for unmapped actions.
|
||||||
|
func binding_label(action: StringName) -> String:
|
||||||
|
var helper := get_node_or_null("/root/InputHelper")
|
||||||
|
if helper == null:
|
||||||
|
return "Unbound"
|
||||||
|
var binding: InputEvent = helper.get_keyboard_or_joypad_input_for_action(action)
|
||||||
|
return helper.get_label_for_input(binding) if binding != null else "Unbound"
|
||||||
|
|
||||||
|
|
||||||
|
## Restricts contextual commands and routes modifier-layer controller buttons.
|
||||||
|
func _command_is_available(action: StringName, event: InputEvent) -> bool:
|
||||||
|
if not CONTEXT_TRIGGER_ACTIONS[context].has(action):
|
||||||
|
return false
|
||||||
|
if context == Context.VEHICLE and event is InputEventJoypadButton:
|
||||||
|
var auxiliary_layer := Input.is_action_pressed("vehicle_auxiliary")
|
||||||
|
return auxiliary_layer if VEHICLE_AUXILIARY_ACTIONS.has(action) else not auxiliary_layer
|
||||||
|
return true
|
||||||
|
|
||||||
|
|
||||||
|
## Adds only relevant controls to a handoff; unrelated future axes cannot block it.
|
||||||
|
func _monitor_context_for_neutral(monitored_context: Context) -> void:
|
||||||
|
var actions: Array = CONTEXT_TRIGGER_ACTIONS[monitored_context] + SHARED_AXIS_ACTIONS
|
||||||
|
actions.append_array(CONTEXT_AXIS_ACTIONS[monitored_context])
|
||||||
|
actions.append_array(CONTEXT_HELD_ACTIONS[monitored_context])
|
||||||
|
for action in actions:
|
||||||
|
if not _neutral_actions.has(action):
|
||||||
|
_neutral_actions.append(action)
|
||||||
|
|
||||||
|
|
||||||
|
## Waits for outgoing/incoming controls, including latched command releases.
|
||||||
|
func _controls_are_neutral() -> bool:
|
||||||
|
for action in _neutral_actions:
|
||||||
|
if not AXIS_ACTIONS.has(action) and Input.is_action_pressed(action):
|
||||||
|
return false
|
||||||
|
if Input.get_action_strength(action) > 0.2:
|
||||||
|
return false
|
||||||
|
return true
|
||||||
|
|
||||||
|
|
||||||
|
## Disconnects clear held commands; reconnects require neutral input too.
|
||||||
|
func _on_controller_connection_changed(_device: int, _connected: bool) -> void:
|
||||||
|
clear_transient_input()
|
||||||
|
|
||||||
|
|
||||||
|
## Window focus loss must not leave firing, look, or sprint latched.
|
||||||
|
func _on_focus_exited() -> void:
|
||||||
|
_window_focused = false
|
||||||
|
clear_transient_input()
|
||||||
|
|
||||||
|
|
||||||
|
## Focus restoration requires a fresh press rather than replaying held controls.
|
||||||
|
func _on_focus_entered() -> void:
|
||||||
|
_window_focused = true
|
||||||
|
clear_transient_input()
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
uid://bd26m8dx3k2pn
|
||||||
@@ -7,6 +7,7 @@ extends Control
|
|||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||||
|
GameplayInput.set_menu_open(self, true)
|
||||||
if new_game_button:
|
if new_game_button:
|
||||||
new_game_button.pressed.connect(_on_new_game)
|
new_game_button.pressed.connect(_on_new_game)
|
||||||
if continue_button:
|
if continue_button:
|
||||||
@@ -15,6 +16,12 @@ func _ready() -> void:
|
|||||||
quit_button.pressed.connect(_on_quit)
|
quit_button.pressed.connect(_on_quit)
|
||||||
if continue_button:
|
if continue_button:
|
||||||
continue_button.disabled = not GameState.has_save
|
continue_button.disabled = not GameState.has_save
|
||||||
|
new_game_button.grab_focus()
|
||||||
|
|
||||||
|
|
||||||
|
## Removes menu ownership when changing scenes so gameplay can resume.
|
||||||
|
func _exit_tree() -> void:
|
||||||
|
GameplayInput.set_menu_open(self, false)
|
||||||
|
|
||||||
|
|
||||||
func _on_new_game() -> void:
|
func _on_new_game() -> void:
|
||||||
|
|||||||
@@ -17,8 +17,11 @@ func _ready() -> void:
|
|||||||
quit_button.pressed.connect(_on_quit_to_menu)
|
quit_button.pressed.connect(_on_quit_to_menu)
|
||||||
|
|
||||||
|
|
||||||
|
## Pause has its own binding; menu cancel must not pause during gameplay.
|
||||||
func _input(event: InputEvent) -> void:
|
func _input(event: InputEvent) -> void:
|
||||||
if not event.is_action_pressed("ui_cancel"):
|
var pause_pressed := event.is_action_pressed("ui_pause")
|
||||||
|
var cancel_pressed := event.is_action_pressed("ui_cancel")
|
||||||
|
if not pause_pressed and not (visible and cancel_pressed):
|
||||||
return
|
return
|
||||||
var banner := get_node_or_null("/root/Node3D/HUD/ScrambleBanner")
|
var banner := get_node_or_null("/root/Node3D/HUD/ScrambleBanner")
|
||||||
if banner and banner.visible:
|
if banner and banner.visible:
|
||||||
@@ -27,6 +30,8 @@ func _input(event: InputEvent) -> void:
|
|||||||
_on_resume()
|
_on_resume()
|
||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
return
|
return
|
||||||
|
if not GameplayInput.gameplay_enabled():
|
||||||
|
return
|
||||||
var p := get_tree().get_first_node_in_group("player")
|
var p := get_tree().get_first_node_in_group("player")
|
||||||
if p == null:
|
if p == null:
|
||||||
p = get_node_or_null("/root/Node3D/Player")
|
p = get_node_or_null("/root/Node3D/Player")
|
||||||
@@ -35,16 +40,21 @@ func _input(event: InputEvent) -> void:
|
|||||||
get_viewport().set_input_as_handled()
|
get_viewport().set_input_as_handled()
|
||||||
|
|
||||||
|
|
||||||
|
## Blocks gameplay and selects a controller-accessible control before pausing.
|
||||||
func open_pause(player_ref: Node) -> void:
|
func open_pause(player_ref: Node) -> void:
|
||||||
player = player_ref
|
player = player_ref
|
||||||
visible = true
|
visible = true
|
||||||
|
GameplayInput.set_menu_open(self, true)
|
||||||
|
resume_button.grab_focus()
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||||
get_tree().paused = true
|
get_tree().paused = true
|
||||||
|
|
||||||
|
|
||||||
|
## Restores control only after currently held gameplay inputs return to neutral.
|
||||||
func _on_resume() -> void:
|
func _on_resume() -> void:
|
||||||
visible = false
|
visible = false
|
||||||
get_tree().paused = false
|
get_tree().paused = false
|
||||||
|
GameplayInput.set_menu_open(self, false)
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||||
|
|
||||||
|
|
||||||
@@ -59,5 +69,6 @@ func _on_save() -> void:
|
|||||||
|
|
||||||
func _on_quit_to_menu() -> void:
|
func _on_quit_to_menu() -> void:
|
||||||
get_tree().paused = false
|
get_tree().paused = false
|
||||||
|
GameplayInput.set_menu_open(self, false)
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||||
get_tree().change_scene_to_file("res://Scenes/main_menu.tscn")
|
get_tree().change_scene_to_file("res://Scenes/main_menu.tscn")
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
extends CharacterBody3D
|
extends CharacterBody3D
|
||||||
## PASTE 2026-09-27 — Station volume includes pads. Habitat trimesh collision + stair step.
|
## PASTE 2026-10-10 — Habitat trimesh. View stairs + port ring are floors.
|
||||||
|
|
||||||
|
|
||||||
@export var speed: float = 5.5
|
@export var speed: float = 5.5
|
||||||
@export var sprint_speed: float = 9.0
|
@export var sprint_speed: float = 9.0
|
||||||
@@ -75,6 +76,8 @@ const WALK_FLOORS: Array[String] = [
|
|||||||
"Yard_Bridges", "Yard_Stairs", "Yard_CollarWalk", "Yard_Piers",
|
"Yard_Bridges", "Yard_Stairs", "Yard_CollarWalk", "Yard_Piers",
|
||||||
"Dock_Gallery", "Dock_Threshold",
|
"Dock_Gallery", "Dock_Threshold",
|
||||||
"Elev_Landings", "Fusion_Basemat", "Fusion_AmbulatoryWide",
|
"Elev_Landings", "Fusion_Basemat", "Fusion_AmbulatoryWide",
|
||||||
|
"Fusion_HeaderStands",
|
||||||
|
"Port_Ring",
|
||||||
"Live_Terraces",
|
"Live_Terraces",
|
||||||
]
|
]
|
||||||
const WALK_WALLS: Array[String] = [
|
const WALK_WALLS: Array[String] = [
|
||||||
@@ -1282,4 +1285,3 @@ func _try_step(up: Vector3) -> void:
|
|||||||
if lift < 0.04 or lift > STEP_HEIGHT:
|
if lift < 0.04 or lift > STEP_HEIGHT:
|
||||||
return
|
return
|
||||||
global_position += up * (lift + 0.02)
|
global_position += up * (lift + 0.02)
|
||||||
|
|
||||||
|
|||||||
@@ -71,10 +71,14 @@ func _ready() -> void:
|
|||||||
|
|
||||||
visible = false
|
visible = false
|
||||||
|
|
||||||
|
## Claims menu input and gives controllers a predictable initial focus.
|
||||||
func open_menu(player_ref: Node) -> void:
|
func open_menu(player_ref: Node) -> void:
|
||||||
player = player_ref
|
player = player_ref
|
||||||
visible = true
|
visible = true
|
||||||
|
GameplayInput.set_menu_open(self, true)
|
||||||
|
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
|
||||||
_update_button_states()
|
_update_button_states()
|
||||||
|
close_button.grab_focus()
|
||||||
print("Vendor menu opened")
|
print("Vendor menu opened")
|
||||||
|
|
||||||
func _update_button_states() -> void:
|
func _update_button_states() -> void:
|
||||||
@@ -112,6 +116,15 @@ func _buy(item_name: String, price: int) -> void:
|
|||||||
else:
|
else:
|
||||||
print("Not enough credits")
|
print("Not enough credits")
|
||||||
|
|
||||||
|
## Cancels the vendor without allowing the same event to reach gameplay.
|
||||||
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if visible and event.is_action_pressed("ui_cancel"):
|
||||||
|
_on_close_pressed()
|
||||||
|
get_viewport().set_input_as_handled()
|
||||||
|
|
||||||
|
|
||||||
|
## Releases menu ownership; the adapter clears queued and held commands.
|
||||||
func _on_close_pressed() -> void:
|
func _on_close_pressed() -> void:
|
||||||
visible = false
|
visible = false
|
||||||
|
GameplayInput.set_menu_open(self, false)
|
||||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||||
|
|||||||
+9242
-4
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://b8y3aengdwocl"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://tr8nf8lfnu17" path="res://planets_whatnot/SM_Argonaut.glb" id="1_ry5ki"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1733269516]
|
||||||
|
|
||||||
|
[node name="SM_Argonaut2" parent="." unique_id=1143788198 instance=ExtResource("1_ry5ki")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://x6rn3alij5xn"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://fxb63xdux2ck" path="res://planets_whatnot/SM_LunarPathfinder.glb" id="1_wjvs3"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=476531828]
|
||||||
|
|
||||||
|
[node name="SM_LunarPathfinder2" parent="." unique_id=301867733 instance=ExtResource("1_wjvs3")]
|
||||||
+39
-9203
File diff suppressed because one or more lines are too long
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://ca1ng6ji6tf2w"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://2c7v4mq03by1" path="res://planets_whatnot/SM_Mars.glb" id="1_xn7oe"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=727006843]
|
||||||
|
|
||||||
|
[node name="SM_Mars2" parent="." unique_id=1017543924 instance=ExtResource("1_xn7oe")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://dkc7hc6ovxru"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dqh01pphoqxcf" path="res://planets_whatnot/moon.glb" id="1_4eue2"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1744434808]
|
||||||
|
|
||||||
|
[node name="moon" parent="." unique_id=802733849 instance=ExtResource("1_4eue2")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://csxmevxg7nrmo"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://bfgf0ibpg3j62" path="res://planets_whatnot/Satellite_LM2100_style.glb" id="1_06l82"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1048597782]
|
||||||
|
|
||||||
|
[node name="Satellite_LM2100_style2" parent="." unique_id=1804165031 instance=ExtResource("1_06l82")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://c1kfhlrmg2djl"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dgtcs2yl15jl3" path="res://planets_whatnot/SM_Saturn.glb" id="1_i5hrf"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=480200195]
|
||||||
|
|
||||||
|
[node name="SM_Saturn2" parent="." unique_id=1887248500 instance=ExtResource("1_i5hrf")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://beqqptwylaqc8"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://c6piu2kmiqwlb" path="res://planets_whatnot/sun.glb" id="1_iveel"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=817764565]
|
||||||
|
|
||||||
|
[node name="sun" parent="." unique_id=1468497573 instance=ExtResource("1_iveel")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://cv1uijj3b6cbw"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://sy53rgptcuup" path="res://planets_whatnot/SM_Uranus.glb" id="1_8q3j1"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=1605047630]
|
||||||
|
|
||||||
|
[node name="SM_Uranus2" parent="." unique_id=1482713817 instance=ExtResource("1_8q3j1")]
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
[gd_scene format=3 uid="uid://ccarj6maquw4s"]
|
||||||
|
|
||||||
|
[ext_resource type="PackedScene" uid="uid://dqbugk60c38qs" path="res://planets_whatnot/SM_Venus.glb" id="1_mg830"]
|
||||||
|
|
||||||
|
[node name="Node3D" type="Node3D" unique_id=926823776]
|
||||||
|
|
||||||
|
[node name="SM_Venus2" parent="." unique_id=525378127 instance=ExtResource("1_mg830")]
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://qj5pba1nqy2x"
|
||||||
|
path="res://.godot/imported/Young_2077 (1)_blast.png-03c6d58a9f5bd556300f2a6fe613a39a.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "d6aa4936eecbaaa962450eb3e1c70146"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_blast.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_blast.png-03c6d58a9f5bd556300f2a6fe613a39a.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://spi08lnpt7ip"
|
uid="uid://djne54xci5iqs"
|
||||||
path="res://.godot/imported/Young_2077_brick.png-5bd8d5b5b7f73ec03855fa602284c10b.ctex"
|
path="res://.godot/imported/Young_2077 (1)_brick.png-7b1942ef3e9607be457fb3b0d6a8596a.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -13,8 +13,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_brick.png"
|
source_file="res://Textures/Young_2077 (1)_brick.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_brick.png-5bd8d5b5b7f73ec03855fa602284c10b.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_brick.png-7b1942ef3e9607be457fb3b0d6a8596a.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://20f80n21d46j"
|
uid="uid://82ifmradciqo"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_core.png-e72e5e3deb547c04117a9ec816abec93.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_core.png-3f6f52094191fe33a0a81c1e9ff0682b.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_core.png"
|
source_file="res://Textures/Young_2077 (1)_core.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_core.png-e72e5e3deb547c04117a9ec816abec93.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_core.png-3f6f52094191fe33a0a81c1e9ff0682b.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://ca75rn0cohjl"
|
uid="uid://by23y35cqceo0"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_cyber.png-9c506a502f916ddac2efe6e19e6917bb.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_cyber.png-39a29d6337dbc62a469762dbe9386122.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_cyber.png"
|
source_file="res://Textures/Young_2077 (1)_cyber.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_cyber.png-9c506a502f916ddac2efe6e19e6917bb.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_cyber.png-39a29d6337dbc62a469762dbe9386122.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://dxsyl2preexp2"
|
uid="uid://ubc7yx0a1od5"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_cyber_emit.png-df6c0f98bc5e1718b500f219d9492002.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_cyber_emit.png-013b7fa22e3b552842bca8a549a00eed.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_cyber_emit.png"
|
source_file="res://Textures/Young_2077 (1)_cyber_emit.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_cyber_emit.png-df6c0f98bc5e1718b500f219d9492002.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_cyber_emit.png-013b7fa22e3b552842bca8a549a00eed.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bb47b3lobt6ob"
|
uid="uid://7tb628tmiqt0"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_elev.png-f073fc23f2a7ed2242a006b15a04f33a.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_elev.png-f3c39019d526562fae19e6aa42a76c3e.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_elev.png"
|
source_file="res://Textures/Young_2077 (1)_elev.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_elev.png-f073fc23f2a7ed2242a006b15a04f33a.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_elev.png-f3c39019d526562fae19e6aa42a76c3e.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://5571ygam76sn"
|
uid="uid://c4gkd4ft3x5bt"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_hab.png-98f1c86cd37466f995035871e568b19f.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_hab.png-776923a31f7a5772a1d1051771583420.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_hab.png"
|
source_file="res://Textures/Young_2077 (1)_hab.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_hab.png-98f1c86cd37466f995035871e568b19f.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_hab.png-776923a31f7a5772a1d1051771583420.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://cvkudulwacfv5"
|
uid="uid://w3jluul55dtq"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_landing.png-580f79ac1d84cdcf6026c083dab58a6e.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_landing.png-115ccfcaefffca49ab6e96230447f16d.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_landing.png"
|
source_file="res://Textures/Young_2077 (1)_landing.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_landing.png-580f79ac1d84cdcf6026c083dab58a6e.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_landing.png-115ccfcaefffca49ab6e96230447f16d.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://b00u6ue1l0dq2"
|
uid="uid://er3o0bw7ygcq"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_machine.png-ed5dad4accd44c63ee43273a867dfdf8.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_machine.png-bb62f2677c7ea3be93f8b77bb86ff6a3.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_machine.png"
|
source_file="res://Textures/Young_2077 (1)_machine.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_machine.png-ed5dad4accd44c63ee43273a867dfdf8.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_machine.png-bb62f2677c7ea3be93f8b77bb86ff6a3.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://c5dr10k3lhptk"
|
uid="uid://ss811cc2ihfh"
|
||||||
path="res://.godot/imported/Young_2077_marble.png-83b704b5d1e6327653959f27f34d7431.ctex"
|
path="res://.godot/imported/Young_2077 (1)_marble.png-473d093f109dd2c5cacb0893575aa3fa.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"vram_texture": false
|
"vram_texture": false
|
||||||
}
|
}
|
||||||
@@ -13,8 +13,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_marble.png"
|
source_file="res://Textures/Young_2077 (1)_marble.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_marble.png-83b704b5d1e6327653959f27f34d7431.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_marble.png-473d093f109dd2c5cacb0893575aa3fa.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://d1trkcen3ftf"
|
uid="uid://d2x7om4dvwmu3"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_panel.png-3bc818c4d058dd91ff53f23af7976a19.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_panel.png-ed9d0379a8400adf3347c00e98cc3615.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_panel.png"
|
source_file="res://Textures/Young_2077 (1)_panel.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_panel.png-3bc818c4d058dd91ff53f23af7976a19.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_panel.png-ed9d0379a8400adf3347c00e98cc3615.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://cd607o8u8rnoe"
|
uid="uid://bqkp3bduwjohg"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_pillar.png-181f4f5801bd3fb0749f2f8b9b2edcbd.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_pillar.png-71dd59615bdd26c39df039c2be05e55f.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_pillar.png"
|
source_file="res://Textures/Young_2077 (1)_pillar.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_pillar.png-181f4f5801bd3fb0749f2f8b9b2edcbd.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_pillar.png-71dd59615bdd26c39df039c2be05e55f.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bgyplv6rdgflo"
|
||||||
|
path.s3tc="res://.godot/imported/Young_2077 (1)_plate.png-b16e4731f1aa5dbf3abb36f5fb6d4a32.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "5b9ba292a904ed7cf06dad137b16cde3"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_plate.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_plate.png-b16e4731f1aa5dbf3abb36f5fb6d4a32.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bjgm0my8yem3m"
|
||||||
|
path.s3tc="res://.godot/imported/Young_2077 (1)_plate_l1.png-aff2c771c5f2efdbd93dec411193e1d9.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "b29ffbe757f119d54c7d462ea930cc77"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_plate_l1.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_plate_l1.png-aff2c771c5f2efdbd93dec411193e1d9.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bsssj0pbxifeh"
|
||||||
|
path.s3tc="res://.godot/imported/Young_2077 (1)_plate_l4.png-bb606b2f2dca6c65c36481a66a79d62c.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "e322360e5baadc6c332ba39df1f3dea9"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_plate_l4.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_plate_l4.png-bb606b2f2dca6c65c36481a66a79d62c.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://b6bbcpawt05xw"
|
||||||
|
path.s3tc="res://.godot/imported/Young_2077 (1)_plate_l5.png-20a70a48f613c824ca4d4c376a370716.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "a10c9b54f300420cd3efda1ffec7e8c6"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_plate_l5.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_plate_l5.png-20a70a48f613c824ca4d4c376a370716.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bqsegbrmbkqn0"
|
uid="uid://covdrcj2rhfa2"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_rib.png-20cb6beac176f488f2bc480ee52c8e51.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_rib.png-954e200776b8390838a7cc69d1dd227f.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_rib.png"
|
source_file="res://Textures/Young_2077 (1)_rib.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_rib.png-20cb6beac176f488f2bc480ee52c8e51.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_rib.png-954e200776b8390838a7cc69d1dd227f.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://15ilicb345pk"
|
uid="uid://dqy1hhuvcq1h"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_school.png-416a9d9b58fc0973e773fb09e02320f8.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_school.png-72b1409ab476099406fd74e41df9f58c.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_school.png"
|
source_file="res://Textures/Young_2077 (1)_school.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_school.png-416a9d9b58fc0973e773fb09e02320f8.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_school.png-72b1409ab476099406fd74e41df9f58c.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bs18lajcddph4"
|
uid="uid://1jlb3rvjl2o"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_soffit.png-20eed9b10c026b621e80aa7dcbfa7a76.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_soffit.png-8ffa9452e046c2080b67edf0ceb31d37.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_soffit.png"
|
source_file="res://Textures/Young_2077 (1)_soffit.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_soffit.png-20eed9b10c026b621e80aa7dcbfa7a76.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_soffit.png-8ffa9452e046c2080b67edf0ceb31d37.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bp74jds8n4ce8"
|
uid="uid://dslbplrpwmwej"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_street.png-d6fec24cdd742f3d7bb7390de10ed9a8.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_street.png-681d7ced10dd6db4d92bd5390759321a.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_street.png"
|
source_file="res://Textures/Young_2077 (1)_street.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_street.png-d6fec24cdd742f3d7bb7390de10ed9a8.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_street.png-681d7ced10dd6db4d92bd5390759321a.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://bimksgdbf1toc"
|
uid="uid://cults08a61iu7"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_street_emit.png-3e9ca62bdd797e7f860ab16a042cfdd3.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_street_emit.png-d6070d2362453123f33e42760c65da20.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_street_emit.png"
|
source_file="res://Textures/Young_2077 (1)_street_emit.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_street_emit.png-3e9ca62bdd797e7f860ab16a042cfdd3.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_street_emit.png-d6070d2362453123f33e42760c65da20.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://clrnbwgdfs57j"
|
uid="uid://cml82bakt433y"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_tread.png-441a0e32e9847091495aa6d16b8aeec8.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_tread.png-2b1c400ec977dc4e2b7c17f8adba6459.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_tread.png"
|
source_file="res://Textures/Young_2077 (1)_tread.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_tread.png-441a0e32e9847091495aa6d16b8aeec8.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_tread.png-2b1c400ec977dc4e2b7c17f8adba6459.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
importer="texture"
|
importer="texture"
|
||||||
type="CompressedTexture2D"
|
type="CompressedTexture2D"
|
||||||
uid="uid://dqkp7k533fddb"
|
uid="uid://i4aixbbct0ip"
|
||||||
path.s3tc="res://.godot/imported/Young_2077_yard.png-45f15ec3da2cd2ee01e105cea210a6cc.s3tc.ctex"
|
path.s3tc="res://.godot/imported/Young_2077 (1)_yard.png-e35e02a5d12c1216f3ef31b8d6011a92.s3tc.ctex"
|
||||||
metadata={
|
metadata={
|
||||||
"imported_formats": ["s3tc_bptc"],
|
"imported_formats": ["s3tc_bptc"],
|
||||||
"vram_texture": true
|
"vram_texture": true
|
||||||
@@ -14,8 +14,8 @@ generator_parameters={
|
|||||||
|
|
||||||
[deps]
|
[deps]
|
||||||
|
|
||||||
source_file="res://Young_2077_yard.png"
|
source_file="res://Textures/Young_2077 (1)_yard.png"
|
||||||
dest_files=["res://.godot/imported/Young_2077_yard.png-45f15ec3da2cd2ee01e105cea210a6cc.s3tc.ctex"]
|
dest_files=["res://.godot/imported/Young_2077 (1)_yard.png-e35e02a5d12c1216f3ef31b8d6011a92.s3tc.ctex"]
|
||||||
|
|
||||||
[params]
|
[params]
|
||||||
|
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://cef1xfq366mja"
|
||||||
|
path.s3tc="res://.godot/imported/Young_2077 (1)_yardfloor.png-e6910c8cc42a5c842768943b0a8950bd.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "a53d8efefa9742a8c85d3920999234da"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Textures/Young_2077 (1)_yardfloor.png"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1)_yardfloor.png-e6910c8cc42a5c842768943b0a8950bd.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
BIN
Binary file not shown.
@@ -0,0 +1,45 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://2f8ctlljoctl"
|
||||||
|
path="res://.godot/imported/Young_2077 (1).glb-d115b3b196cc7b5a6c0bcb6e2eaf2a63.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Young_2077 (1).glb"
|
||||||
|
dest_files=["res://.godot/imported/Young_2077 (1).glb-d115b3b196cc7b5a6c0bcb6e2eaf2a63.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
mesh_library/use_node_names_as_mesh_names=false
|
||||||
|
array_mesh/deduplicate_surfaces=true
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=2
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
|
gltf/texture_map_mode=1
|
||||||
LFS
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,44 +0,0 @@
|
|||||||
[remap]
|
|
||||||
|
|
||||||
importer="texture"
|
|
||||||
type="CompressedTexture2D"
|
|
||||||
uid="uid://6vsodm2wgqha"
|
|
||||||
path.s3tc="res://.godot/imported/Young_2077_plate.png-a671f10c81a24b0ce917c36a71378e17.s3tc.ctex"
|
|
||||||
metadata={
|
|
||||||
"imported_formats": ["s3tc_bptc"],
|
|
||||||
"vram_texture": true
|
|
||||||
}
|
|
||||||
generator_parameters={
|
|
||||||
"md5": "b69b538b9646c2643dd3a44e989afe6b"
|
|
||||||
}
|
|
||||||
|
|
||||||
[deps]
|
|
||||||
|
|
||||||
source_file="res://Young_2077_plate.png"
|
|
||||||
dest_files=["res://.godot/imported/Young_2077_plate.png-a671f10c81a24b0ce917c36a71378e17.s3tc.ctex"]
|
|
||||||
|
|
||||||
[params]
|
|
||||||
|
|
||||||
compress/mode=2
|
|
||||||
compress/high_quality=false
|
|
||||||
compress/lossy_quality=0.7
|
|
||||||
compress/uastc_level=0
|
|
||||||
compress/rdo_quality_loss=0.0
|
|
||||||
compress/hdr_compression=1
|
|
||||||
compress/normal_map=0
|
|
||||||
compress/channel_pack=0
|
|
||||||
mipmaps/generate=true
|
|
||||||
mipmaps/limit=-1
|
|
||||||
roughness/mode=0
|
|
||||||
roughness/src_normal=""
|
|
||||||
process/channel_remap/red=0
|
|
||||||
process/channel_remap/green=1
|
|
||||||
process/channel_remap/blue=2
|
|
||||||
process/channel_remap/alpha=3
|
|
||||||
process/fix_alpha_border=true
|
|
||||||
process/premult_alpha=false
|
|
||||||
process/normal_map_invert_y=false
|
|
||||||
process/hdr_as_srgb=false
|
|
||||||
process/hdr_clamp_exposure=false
|
|
||||||
process/size_limit=0
|
|
||||||
detect_3d/compress_to=0
|
|
||||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
|||||||
[gd_scene load_steps=2 format=3]
|
[gd_scene format=3 uid="uid://bu0ogftnp05bm"]
|
||||||
|
|
||||||
[ext_resource type="PackedScene" path="hongqi.glb" id="1_glb"]
|
[ext_resource type="PackedScene" uid="uid://do2qpkqynubyv" path="res://fleet_godot47/fleet_godot47/hongqi.glb" id="1_glb"]
|
||||||
|
|
||||||
[node name="Hongqi" instance=ExtResource("1_glb")]
|
[node name="Hongqi" unique_id=844692418 instance=ExtResource("1_glb")]
|
||||||
|
|||||||
+212
-91
@@ -1,3 +1,4 @@
|
|||||||
|
@tool
|
||||||
extends Node3D
|
extends Node3D
|
||||||
## Kestrel EC-01 plume driver. Godot 4.7.
|
## Kestrel EC-01 plume driver. Godot 4.7.
|
||||||
## Attach to the Kestrel child. Leave escape_capsule.gd on EscapeCapsule.
|
## Attach to the Kestrel child. Leave escape_capsule.gd on EscapeCapsule.
|
||||||
@@ -7,21 +8,27 @@ extends Node3D
|
|||||||
## listen_keys is off so walking the player does not light jets or shove the craft.
|
## listen_keys is off so walking the player does not light jets or shove the craft.
|
||||||
## Capsule sets abort_burn, att_pitch/yaw/roll, rcs_direction, hatches, cabin_dim.
|
## Capsule sets abort_burn, att_pitch/yaw/roll, rcs_direction, hatches, cabin_dim.
|
||||||
|
|
||||||
@export var listen_keys := false
|
@export var listen_keys := false # leave off; capsule owns G H J L K Space
|
||||||
@export_range(0.0, 1.0) var gear_deploy := 1.0
|
@export_range(0.0, 1.0) var gear_deploy := 1.0
|
||||||
@export_range(0.0, 1.0) var hatch_crew_open := 0.0
|
@export_range(0.0, 1.0) var hatch_crew_open := 0.0
|
||||||
@export_range(0.0, 1.0) var hatch_ladder_deploy := 0.0
|
@export_range(0.0, 1.0) var hatch_ladder_deploy := 0.0
|
||||||
@export_range(0.0, 1.0) var hatch_dock_open := 0.0
|
@export_range(0.0, 1.0) var hatch_dock_open := 0.0
|
||||||
@export_range(0.0, 1.0) var instruments_demo := 0.4
|
@export_range(0.0, 1.0) var instruments_demo := 0.4
|
||||||
@export var cabin_lights := true
|
@export var cabin_lights := true:
|
||||||
@export var cabin_dim := false
|
set(value):
|
||||||
|
cabin_lights = value
|
||||||
|
if is_inside_tree():
|
||||||
|
_apply_cabin()
|
||||||
|
@export var cabin_dim := false:
|
||||||
|
set(value):
|
||||||
|
cabin_dim = value
|
||||||
|
if is_inside_tree():
|
||||||
|
_apply_cabin()
|
||||||
@export_enum("Off", "Nose", "Tail", "Starboard", "Port", "Dorsal", "Ventral") var rcs_direction := 0
|
@export_enum("Off", "Nose", "Tail", "Starboard", "Port", "Dorsal", "Ventral") var rcs_direction := 0
|
||||||
@export var att_pitch := 0.0
|
@export var att_pitch := 0.0
|
||||||
@export var att_yaw := 0.0
|
@export var att_yaw := 0.0
|
||||||
@export var att_roll := 0.0
|
@export var att_roll := 0.0
|
||||||
@export var abort_burn := false
|
@export var abort_burn := false
|
||||||
## Tick this in the inspector (or Remote tab while running) to self-test every jet.
|
|
||||||
@export var debug_fire := false
|
|
||||||
|
|
||||||
const _RIBBON := "shader_type spatial;
|
const _RIBBON := "shader_type spatial;
|
||||||
render_mode blend_add, unshaded, cull_disabled, depth_draw_never, fog_disabled;
|
render_mode blend_add, unshaded, cull_disabled, depth_draw_never, fog_disabled;
|
||||||
@@ -42,17 +49,14 @@ void fragment() {
|
|||||||
}"
|
}"
|
||||||
|
|
||||||
var _player: AnimationPlayer
|
var _player: AnimationPlayer
|
||||||
|
var _clip_players: Dictionary = {}
|
||||||
var _shader: Shader
|
var _shader: Shader
|
||||||
var _rcs: Array[Node3D] = []
|
var _rcs: Array[Node3D] = []
|
||||||
var _aborts: Array[Dictionary] = []
|
var _aborts: Array[Dictionary] = []
|
||||||
var _abort_hold := 0.0
|
var _abort_hold := 0.0
|
||||||
var _time := 0.0
|
var _time := 0.0
|
||||||
var _prev := {}
|
var _prev := {}
|
||||||
var _clip_cache := {}
|
|
||||||
var _warm_frames := 12
|
|
||||||
var _cabin_ready := false
|
var _cabin_ready := false
|
||||||
var _applied_dim := false
|
|
||||||
var _applied_lights := true
|
|
||||||
var _cabin_lights_n: Array[Light3D] = []
|
var _cabin_lights_n: Array[Light3D] = []
|
||||||
var _cabin_rest: Array[Dictionary] = []
|
var _cabin_rest: Array[Dictionary] = []
|
||||||
var _cabin_mats: Array[Dictionary] = []
|
var _cabin_mats: Array[Dictionary] = []
|
||||||
@@ -69,32 +73,37 @@ func _ready() -> void:
|
|||||||
_player = get_node_or_null("AnimationPlayer") as AnimationPlayer
|
_player = get_node_or_null("AnimationPlayer") as AnimationPlayer
|
||||||
if _player == null:
|
if _player == null:
|
||||||
_player = find_child("AnimationPlayer", true, false) as AnimationPlayer
|
_player = find_child("AnimationPlayer", true, false) as AnimationPlayer
|
||||||
|
if _player == null and get_parent():
|
||||||
|
_player = get_parent().find_child("AnimationPlayer", true, false) as AnimationPlayer
|
||||||
|
_split_clips()
|
||||||
_arm()
|
_arm()
|
||||||
_collect_cabin()
|
|
||||||
_apply_clips()
|
|
||||||
print("Kestrel driver ready: rcs=", _rcs.size(), " abort=", _aborts.size(),
|
|
||||||
" cabin_lights=", _cabin_lights_n.size(), " strips=", _cabin_mats.size(),
|
|
||||||
" anim_player=", _player != null)
|
|
||||||
if _rcs.is_empty():
|
|
||||||
push_warning("Kestrel driver: no Vfx_RCS_* nodes found under " + str(get_path()))
|
|
||||||
if _aborts.is_empty():
|
if _aborts.is_empty():
|
||||||
push_warning("Kestrel driver: no Vfx_Abort_* nodes found under " + str(get_path()))
|
_fallback_abort()
|
||||||
if _player == null:
|
_collect_cabin()
|
||||||
push_warning("Kestrel driver: no AnimationPlayer found (gear/hatches will not move)")
|
_gear_shown = gear_deploy
|
||||||
|
_crew_shown = hatch_crew_open
|
||||||
|
_dock_shown = hatch_dock_open
|
||||||
func _physics_process(delta: float) -> void:
|
_ladder_shown = hatch_ladder_deploy
|
||||||
_time += delta
|
_apply_clips()
|
||||||
if listen_keys:
|
var clips := PackedStringArray()
|
||||||
_read_keys()
|
if _player:
|
||||||
if debug_fire:
|
clips = _player.get_animation_list()
|
||||||
abort_burn = true
|
print("Kestrel driver ready rcs=", _rcs.size(), " abort=", _aborts.size(), " clips=", clips, " lights=", _cabin_lights_n.size())
|
||||||
rcs_direction = 1 + int(_time) % 6
|
|
||||||
|
|
||||||
|
func drive(thrusting: bool, pitch: float, yaw: float, roll: float) -> void:
|
||||||
|
abort_burn = thrusting
|
||||||
|
att_pitch = pitch
|
||||||
|
att_yaw = yaw
|
||||||
|
att_roll = roll
|
||||||
|
|
||||||
|
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
_time += delta
|
||||||
|
if listen_keys and not Engine.is_editor_hint():
|
||||||
|
_read_keys()
|
||||||
|
_ease_poses(delta)
|
||||||
_apply_clips()
|
_apply_clips()
|
||||||
if _warm_frames > 0:
|
|
||||||
_warm_frames -= 1
|
|
||||||
# FIX: the capsule sets cabin_dim as a plain variable, so nothing re-applied it.
|
|
||||||
if cabin_dim != _applied_dim or cabin_lights != _applied_lights:
|
|
||||||
_apply_cabin()
|
_apply_cabin()
|
||||||
_burn(_wish(), delta)
|
_burn(_wish(), delta)
|
||||||
|
|
||||||
@@ -112,6 +121,7 @@ func _read_keys() -> void:
|
|||||||
instruments_demo = 0.15 if instruments_demo > 0.5 else 1.0
|
instruments_demo = 0.15 if instruments_demo > 0.5 else 1.0
|
||||||
if _pressed(KEY_K):
|
if _pressed(KEY_K):
|
||||||
cabin_lights = not cabin_lights
|
cabin_lights = not cabin_lights
|
||||||
|
_apply_cabin()
|
||||||
abort_burn = Input.is_physical_key_pressed(KEY_SPACE)
|
abort_burn = Input.is_physical_key_pressed(KEY_SPACE)
|
||||||
|
|
||||||
|
|
||||||
@@ -145,41 +155,135 @@ func _wish() -> Vector3:
|
|||||||
return (global_transform.basis * local).normalized()
|
return (global_transform.basis * local).normalized()
|
||||||
|
|
||||||
|
|
||||||
func _apply_clips() -> void:
|
var _anim_root: Node = null
|
||||||
_seek("gear_deploy", gear_deploy)
|
var _hinge_report: bool = false
|
||||||
_seek("hatch_crew_open", hatch_crew_open)
|
var _gear_shown: float = 1.0
|
||||||
_seek("hatch_ladder_deploy", hatch_ladder_deploy)
|
var _crew_shown: float = 0.0
|
||||||
_seek("hatch_dock_open", hatch_dock_open)
|
var _dock_shown: float = 0.0
|
||||||
_seek("instruments_demo", instruments_demo)
|
var _ladder_shown: float = 0.0
|
||||||
|
const GEAR_SECONDS: float = 4.0
|
||||||
|
const HATCH_SECONDS: float = 2.5
|
||||||
|
|
||||||
|
|
||||||
## FIX: only re-seek when the value actually changed. The old version called
|
func _split_clips() -> void:
|
||||||
## play()+seek()+pause() on five clips every physics frame.
|
_anim_root = self
|
||||||
func _clip_name(clip: StringName) -> StringName:
|
|
||||||
if _player.has_animation(clip):
|
|
||||||
return clip
|
|
||||||
for a in _player.get_animation_list():
|
|
||||||
if String(a).ends_with("/" + String(clip)):
|
|
||||||
return a
|
|
||||||
return &""
|
|
||||||
|
|
||||||
|
|
||||||
## Re-seeks only when the value changed, but keeps re-applying for the first few
|
|
||||||
## frames so the pose sticks after the AnimationPlayer finishes initializing.
|
|
||||||
func _seek(clip: StringName, t: float) -> void:
|
|
||||||
if _player == null:
|
if _player == null:
|
||||||
|
print("Kestrel clips: no AnimationPlayer")
|
||||||
return
|
return
|
||||||
var clip_id := _clip_name(clip)
|
var root := _player.get_node_or_null(_player.root_node)
|
||||||
if clip_id == &"":
|
if root:
|
||||||
|
_anim_root = root
|
||||||
|
print("Kestrel clips root=", _anim_root.name, " list=", _player.get_animation_list())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func _apply_clips() -> void:
|
||||||
|
_hard_pose()
|
||||||
|
|
||||||
|
|
||||||
|
func _hinge(node_name: String) -> Node3D:
|
||||||
|
var n := find_child(node_name, true, false) as Node3D
|
||||||
|
if n == null and get_parent() != null:
|
||||||
|
n = get_parent().find_child(node_name, true, false) as Node3D
|
||||||
|
return n
|
||||||
|
|
||||||
|
|
||||||
|
func _q(x: float, y: float, z: float, w: float) -> Quaternion:
|
||||||
|
return Quaternion(x, y, z, w)
|
||||||
|
|
||||||
|
|
||||||
|
func _ease_poses(delta: float) -> void:
|
||||||
|
_gear_shown = move_toward(_gear_shown, gear_deploy, delta / GEAR_SECONDS)
|
||||||
|
_crew_shown = move_toward(_crew_shown, hatch_crew_open, delta / HATCH_SECONDS)
|
||||||
|
_dock_shown = move_toward(_dock_shown, hatch_dock_open, delta / HATCH_SECONDS)
|
||||||
|
_ladder_shown = move_toward(_ladder_shown, hatch_ladder_deploy, delta / HATCH_SECONDS)
|
||||||
|
|
||||||
|
|
||||||
|
func _hard_pose() -> void:
|
||||||
|
var g := clampf(_gear_shown, 0.0, 1.0)
|
||||||
|
var hip0 := _q(0.572867, 0.0, 0.0, 0.819648)
|
||||||
|
var hip1 := _q(0.470626, 0.0, 0.0, 0.882333)
|
||||||
|
var knee0 := _q(0.998152, 0.0, 0.0, 0.060759)
|
||||||
|
var knee1 := _q(0.208460, 0.0, 0.0, 0.978031)
|
||||||
|
var hit := 0
|
||||||
|
for side in ["FR", "FL", "RR", "RL"]:
|
||||||
|
hit += _swing("Gear_%s_Hip" % side, hip0, hip1, g)
|
||||||
|
hit += _slide_z("Gear_%s_UpperStrut" % side, 0.0138, 0.46, g)
|
||||||
|
hit += _stretch_y("Gear_%s_UpperStrut" % side, 0.16, 1.0, g)
|
||||||
|
hit += _slide_z("Gear_%s_Knee" % side, 0.0276, 0.92, g)
|
||||||
|
hit += _swing("Gear_%s_Knee" % side, knee0, knee1, g)
|
||||||
|
hit += _slide_z("Gear_%s_Shock" % side, 0.0147, 0.49, g)
|
||||||
|
hit += _stretch_y("Gear_%s_Shock" % side, 0.16, 1.0, g)
|
||||||
|
hit += _slide_z("Gear_%s_Foot" % side, 0.0294, 0.98, g)
|
||||||
|
hit += _swing("CrewHatch_Hinge", Quaternion.IDENTITY, _q(0.0, -0.854714, 0.0, 0.519099), _crew_shown)
|
||||||
|
hit += _swing("DockHatch_Hinge", Quaternion.IDENTITY, _q(0.0, 0.0, -0.854714, 0.519099), _dock_shown)
|
||||||
|
hit += _swing("CrewStep_Hinge", _q(0.0, 0.0, 0.02, 0.9998), _q(0.0, 0.0, 0.305059, 0.952334), _ladder_shown)
|
||||||
|
hit += _stretch_y("CrewStep_Ladder", 0.12, 1.0, _ladder_shown)
|
||||||
|
if not _hinge_report:
|
||||||
|
_hinge_report = true
|
||||||
|
print("Kestrel hinges hit=", hit, " crew=", _hinge("CrewHatch_Hinge"), " gear=", _hinge("Gear_FR_Hip"))
|
||||||
|
|
||||||
|
|
||||||
|
func _swing(node_name: String, a: Quaternion, b: Quaternion, t: float) -> int:
|
||||||
|
var n := _hinge(node_name)
|
||||||
|
if n == null:
|
||||||
|
return 0
|
||||||
|
n.quaternion = a.slerp(b, clampf(t, 0.0, 1.0))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
func _slide_z(node_name: String, a: float, b: float, t: float) -> int:
|
||||||
|
var n := _hinge(node_name)
|
||||||
|
if n == null:
|
||||||
|
return 0
|
||||||
|
n.position.z = lerpf(a, b, clampf(t, 0.0, 1.0))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
func _stretch_y(node_name: String, a: float, b: float, t: float) -> int:
|
||||||
|
var n := _hinge(node_name)
|
||||||
|
if n == null:
|
||||||
|
return 0
|
||||||
|
n.scale.y = lerpf(a, b, clampf(t, 0.0, 1.0))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
|
||||||
|
func _pose(clip: StringName, t: float) -> void:
|
||||||
|
if _player == null or not _player.has_animation(clip):
|
||||||
return
|
return
|
||||||
t = clampf(t, 0.0, 1.0)
|
var anim := _player.get_animation(clip)
|
||||||
if _warm_frames <= 0 and _clip_cache.has(clip) and is_equal_approx(float(_clip_cache[clip]), t):
|
var at := clampf(t, 0.0, 1.0) * anim.length
|
||||||
return
|
var root: Node = _anim_root if _anim_root else self
|
||||||
_clip_cache[clip] = t
|
for i in anim.get_track_count():
|
||||||
var clip_len := _player.get_animation(clip_id).length
|
var full := String(anim.track_get_path(i))
|
||||||
_player.play(clip_id)
|
var node_path := full.get_slice(":", 0)
|
||||||
_player.seek(t * clip_len, true)
|
var prop := full.get_slice(":", 1)
|
||||||
_player.pause()
|
var node := root.get_node_or_null(NodePath(node_path))
|
||||||
|
if node == null:
|
||||||
|
node = find_child(node_path.get_file(), true, false)
|
||||||
|
if node == null:
|
||||||
|
continue
|
||||||
|
var typ := anim.track_get_type(i)
|
||||||
|
if typ == Animation.TYPE_ROTATION_3D:
|
||||||
|
var q := anim.rotation_track_interpolate(i, at)
|
||||||
|
if prop == "" or prop == "quaternion" or prop == "rotation":
|
||||||
|
(node as Node3D).quaternion = q
|
||||||
|
else:
|
||||||
|
node.set(prop, q)
|
||||||
|
elif typ == Animation.TYPE_POSITION_3D:
|
||||||
|
var pos := anim.position_track_interpolate(i, at)
|
||||||
|
if prop == "" or prop == "position":
|
||||||
|
(node as Node3D).position = pos
|
||||||
|
else:
|
||||||
|
node.set(prop, pos)
|
||||||
|
elif typ == Animation.TYPE_SCALE_3D:
|
||||||
|
var sc := anim.scale_track_interpolate(i, at)
|
||||||
|
if prop == "" or prop == "scale":
|
||||||
|
(node as Node3D).scale = sc
|
||||||
|
else:
|
||||||
|
node.set(prop, sc)
|
||||||
|
elif typ == Animation.TYPE_VALUE and prop != "":
|
||||||
|
node.set(prop, anim.value_track_interpolate(i, at))
|
||||||
|
|
||||||
|
|
||||||
func _collect_cabin() -> void:
|
func _collect_cabin() -> void:
|
||||||
@@ -219,24 +323,36 @@ func _collect_cabin() -> void:
|
|||||||
func _apply_cabin() -> void:
|
func _apply_cabin() -> void:
|
||||||
if not _cabin_ready:
|
if not _cabin_ready:
|
||||||
return
|
return
|
||||||
_applied_dim = cabin_dim
|
|
||||||
_applied_lights = cabin_lights
|
|
||||||
var dim := cabin_dim or not cabin_lights
|
var dim := cabin_dim or not cabin_lights
|
||||||
for i in _cabin_lights_n.size():
|
for i in _cabin_lights_n.size():
|
||||||
var lamp := _cabin_lights_n[i]
|
var lamp := _cabin_lights_n[i]
|
||||||
var rest: Dictionary = _cabin_rest[i]
|
var rest: Dictionary = _cabin_rest[i]
|
||||||
lamp.light_color = rest.color
|
lamp.light_color = rest.color
|
||||||
lamp.light_energy = float(rest.energy) * (0.08 if dim else 1.0)
|
lamp.light_energy = float(rest.energy) * (0.16 if dim else 1.0)
|
||||||
for row in _cabin_mats:
|
for row in _cabin_mats:
|
||||||
var mat := row.mat as StandardMaterial3D
|
var mat := row.mat as StandardMaterial3D
|
||||||
mat.emission_enabled = true if dim else bool(row.on)
|
mat.emission_enabled = true if dim else bool(row.on)
|
||||||
mat.emission = row.color
|
mat.emission = row.color
|
||||||
mat.emission_energy_multiplier = float(row.energy) * (0.05 if dim else 1.0)
|
mat.emission_energy_multiplier = float(row.energy) * (0.18 if dim else 1.0)
|
||||||
|
|
||||||
|
|
||||||
|
func _scope() -> Array[Node]:
|
||||||
|
var found: Array[Node] = []
|
||||||
|
var roots: Array[Node] = [self]
|
||||||
|
if get_parent():
|
||||||
|
roots.append(get_parent())
|
||||||
|
for root in roots:
|
||||||
|
found.append(root)
|
||||||
|
for n in root.find_children("*", "Node", true, false):
|
||||||
|
found.append(n)
|
||||||
|
return found
|
||||||
|
|
||||||
|
|
||||||
func _arm() -> void:
|
func _arm() -> void:
|
||||||
var i := 0
|
var i := 0
|
||||||
for n in find_children("*", "Node3D", true, false):
|
for n in _scope():
|
||||||
|
if not (n is Node3D):
|
||||||
|
continue
|
||||||
var nm := String(n.name)
|
var nm := String(n.name)
|
||||||
if nm.begins_with("Vfx_RCS_"):
|
if nm.begins_with("Vfx_RCS_"):
|
||||||
_rcs.append(_spear(n, 1.2, 0.09, Color(0.863, 0.937, 1.0, 0.95), Color(0.41, 0.67, 1.0, 0.35), Color(0.25, 0.45, 0.8, 0.0), 0.82, 2, float(i)))
|
_rcs.append(_spear(n, 1.2, 0.09, Color(0.863, 0.937, 1.0, 0.95), Color(0.41, 0.67, 1.0, 0.35), Color(0.25, 0.45, 0.8, 0.0), 0.82, 2, float(i)))
|
||||||
@@ -245,27 +361,34 @@ func _arm() -> void:
|
|||||||
_aborts.append(_make_abort(n))
|
_aborts.append(_make_abort(n))
|
||||||
|
|
||||||
|
|
||||||
|
func _fallback_abort() -> void:
|
||||||
|
var spots: Array[Vector3] = [Vector3(0.55, -0.35, 0.55), Vector3(-0.55, -0.35, 0.55), Vector3(0.55, -0.35, -0.55), Vector3(-0.55, -0.35, -0.55)]
|
||||||
|
for i in spots.size():
|
||||||
|
var s := Marker3D.new()
|
||||||
|
s.name = "Vfx_Abort_Fallback_%d" % i
|
||||||
|
s.position = spots[i]
|
||||||
|
add_child(s)
|
||||||
|
_aborts.append(_make_abort(s))
|
||||||
|
print("Kestrel driver built fallback abort plumes")
|
||||||
|
|
||||||
|
|
||||||
func _burn(wish: Vector3, delta: float) -> void:
|
func _burn(wish: Vector3, delta: float) -> void:
|
||||||
var ship := global_transform.basis
|
var ship := global_transform.basis
|
||||||
var ship_inv := ship.inverse()
|
var cmd := Vector3(att_pitch, att_roll, -att_yaw)
|
||||||
# FIX: capsule yaws about +Z by +att_yaw (rotate_object_local(FORWARD, -yaw) == +Z, +yaw),
|
|
||||||
# so the commanded angular velocity is (pitch, roll, +yaw). The old -att_yaw fired the
|
|
||||||
# opposite-side jets for yaw.
|
|
||||||
var cmd := Vector3(att_pitch, att_roll, att_yaw)
|
|
||||||
var turning := cmd.length() > 0.15
|
var turning := cmd.length() > 0.15
|
||||||
var origin := global_position
|
var origin := global_position
|
||||||
for ribbon in _rcs:
|
for ribbon in _rcs:
|
||||||
var want := 0.0
|
var want := 0.0
|
||||||
var exhaust: Vector3 = (ship_inv * ribbon.global_transform.basis.y).normalized()
|
var exhaust: Vector3 = (ship.inverse() * ribbon.global_transform.basis.y).normalized()
|
||||||
if turning:
|
if turning:
|
||||||
var local_pos: Vector3 = ship_inv * (ribbon.global_position - origin)
|
var local_pos: Vector3 = ship.inverse() * (ribbon.global_position - origin)
|
||||||
if local_pos.length() < 0.05:
|
if local_pos.length() < 0.05:
|
||||||
local_pos = -exhaust
|
local_pos = -exhaust
|
||||||
var torque: Vector3 = local_pos.cross(-exhaust)
|
var torque: Vector3 = local_pos.cross(-exhaust)
|
||||||
if torque.dot(cmd) > 0.12:
|
if torque.dot(cmd) > 0.12:
|
||||||
want = 1.0
|
want = 1.0
|
||||||
if want < 0.5 and wish != Vector3.ZERO:
|
if want < 0.5 and wish != Vector3.ZERO:
|
||||||
if exhaust.dot(-(ship_inv * wish)) > 0.7:
|
if exhaust.dot(-(ship.inverse() * wish)) > 0.7:
|
||||||
want = 1.0
|
want = 1.0
|
||||||
var burn := float(ribbon.get_meta("burn"))
|
var burn := float(ribbon.get_meta("burn"))
|
||||||
burn = _smooth(burn, want, delta, 0.08 if want > burn else 0.14)
|
burn = _smooth(burn, want, delta, 0.08 if want > burn else 0.14)
|
||||||
@@ -306,8 +429,6 @@ func _burn(wish: Vector3, delta: float) -> void:
|
|||||||
light.light_energy = _abort_hold * 8.0 if on else 0.0
|
light.light_energy = _abort_hold * 8.0 if on else 0.0
|
||||||
|
|
||||||
|
|
||||||
## Exhaust direction in the socket's parent space. The model puts each Vfx_ socket's
|
|
||||||
## translation along its exhaust direction (RCS = +Y, Abort = -Y), so position is the aim.
|
|
||||||
func _exhaust(socket: Node3D) -> Vector3:
|
func _exhaust(socket: Node3D) -> Vector3:
|
||||||
var dir := socket.position
|
var dir := socket.position
|
||||||
if dir.length() < 0.001:
|
if dir.length() < 0.001:
|
||||||
@@ -365,13 +486,13 @@ func _taper(length: float, w0: float, w1: float) -> ArrayMesh:
|
|||||||
return st.commit()
|
return st.commit()
|
||||||
|
|
||||||
|
|
||||||
func _crossed(socket: Node3D, mesh: ArrayMesh, mat: ShaderMaterial, planes: int, node_name: String, length: float, opacity: float, flick_seed: float) -> Node3D:
|
func _crossed(socket: Node3D, mesh: ArrayMesh, mat: ShaderMaterial, planes: int, node_name: String, length: float, opacity: float, seed: float) -> Node3D:
|
||||||
var g := Node3D.new()
|
var g := Node3D.new()
|
||||||
g.name = node_name
|
g.name = node_name
|
||||||
g.set_meta("mat", mat)
|
g.set_meta("mat", mat)
|
||||||
g.set_meta("len", length)
|
g.set_meta("len", length)
|
||||||
g.set_meta("opacity", opacity)
|
g.set_meta("opacity", opacity)
|
||||||
g.set_meta("seed", flick_seed)
|
g.set_meta("seed", seed)
|
||||||
g.set_meta("burn", 0.0)
|
g.set_meta("burn", 0.0)
|
||||||
for i in planes:
|
for i in planes:
|
||||||
var m := MeshInstance3D.new()
|
var m := MeshInstance3D.new()
|
||||||
@@ -387,8 +508,8 @@ func _crossed(socket: Node3D, mesh: ArrayMesh, mat: ShaderMaterial, planes: int,
|
|||||||
return g
|
return g
|
||||||
|
|
||||||
|
|
||||||
func _spear(socket: Node3D, length: float, width: float, root: Color, mid: Color, tip: Color, opacity: float, planes: int, flick_seed: float) -> Node3D:
|
func _spear(socket: Node3D, length: float, width: float, root: Color, mid: Color, tip: Color, opacity: float, planes: int, seed: float) -> Node3D:
|
||||||
return _crossed(socket, _sheet(length, width), _ribbon_mat(root, mid, tip), planes, "Spear", length, opacity, flick_seed)
|
return _crossed(socket, _sheet(length, width), _ribbon_mat(root, mid, tip), planes, "Spear", length, opacity, seed)
|
||||||
|
|
||||||
|
|
||||||
func _taper_ribbon(socket: Node3D, length: float, w0: float, w1: float, root: Color, mid: Color, tip: Color, opacity: float, planes: int, node_name: String) -> Node3D:
|
func _taper_ribbon(socket: Node3D, length: float, w0: float, w1: float, root: Color, mid: Color, tip: Color, opacity: float, planes: int, node_name: String) -> Node3D:
|
||||||
@@ -407,8 +528,8 @@ func _set_spear(ribbon: Node3D, amount: float, time: float) -> void:
|
|||||||
if a < 0.02:
|
if a < 0.02:
|
||||||
_set_opacity(ribbon, 0.0)
|
_set_opacity(ribbon, 0.0)
|
||||||
return
|
return
|
||||||
var flick_seed := float(ribbon.get_meta("seed"))
|
var seed := float(ribbon.get_meta("seed"))
|
||||||
var flick := 0.82 + 0.18 * sin(time * 37.0 + flick_seed * 2.1)
|
var flick := 0.82 + 0.18 * sin(time * 37.0 + seed * 2.1)
|
||||||
ribbon.scale = Vector3.ONE
|
ribbon.scale = Vector3.ONE
|
||||||
_set_opacity(ribbon, float(ribbon.get_meta("opacity")) * minf(a, 1.0) * flick)
|
_set_opacity(ribbon, float(ribbon.get_meta("opacity")) * minf(a, 1.0) * flick)
|
||||||
|
|
||||||
@@ -534,11 +655,11 @@ func _spot(socket: Node3D) -> SpotLight3D:
|
|||||||
func _make_abort(socket: Node3D) -> Dictionary:
|
func _make_abort(socket: Node3D) -> Dictionary:
|
||||||
var core := _taper_ribbon(socket, 2.1, 0.06, 0.20, Color(1.0, 0.97, 0.92, 1.0), Color(1.0, 0.45, 0.12, 0.72), Color(0.40, 0.08, 0.02, 0.0), 0.95, 3, "AbortCore")
|
var core := _taper_ribbon(socket, 2.1, 0.06, 0.20, Color(1.0, 0.97, 0.92, 1.0), Color(1.0, 0.45, 0.12, 0.72), Color(0.40, 0.08, 0.02, 0.0), 0.95, 3, "AbortCore")
|
||||||
var sheath := _taper_ribbon(socket, 5.2, 0.10, 0.78, Color(1.0, 0.55, 0.18, 1.0), Color(1.0, 0.28, 0.06, 0.55), Color(0.35, 0.06, 0.01, 0.0), 0.82, 3, "AbortSheath")
|
var sheath := _taper_ribbon(socket, 5.2, 0.10, 0.78, Color(1.0, 0.55, 0.18, 1.0), Color(1.0, 0.28, 0.06, 0.55), Color(0.35, 0.06, 0.01, 0.0), 0.82, 3, "AbortSheath")
|
||||||
return {
|
var row: Dictionary = {}
|
||||||
"core": core,
|
row["core"] = core
|
||||||
"sheath": sheath,
|
row["sheath"] = sheath
|
||||||
"sparks": _sparks(socket, "AbortCoreSparks", 10, 0.15, 18.0, 28.0, 1.6, 0.05, 6.0),
|
row["sparks"] = _sparks(socket, "AbortCoreSparks", 10, 0.15, 18.0, 28.0, 1.6, 0.05, 6.0)
|
||||||
"sheath_sparks": _sparks(socket, "AbortSheathSparks", 18, 0.26, 14.0, 22.0, 4.5, 0.09, 8.0),
|
row["sheath_sparks"] = _sparks(socket, "AbortSheathSparks", 18, 0.26, 14.0, 22.0, 4.5, 0.09, 8.0)
|
||||||
"flash": _abort_flash(socket),
|
row["flash"] = _abort_flash(socket)
|
||||||
"light": _spot(socket),
|
row["light"] = _spot(socket)
|
||||||
}
|
return row
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,45 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://bsf6cehnp2xy7"
|
||||||
|
path="res://.godot/imported/ArgonautSite.glb-70ba0fb5c0cd1a3e0d9ec4b62d093975.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/ArgonautSite.glb"
|
||||||
|
dest_files=["res://.godot/imported/ArgonautSite.glb-70ba0fb5c0cd1a3e0d9ec4b62d093975.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
mesh_library/use_node_names_as_mesh_names=false
|
||||||
|
array_mesh/deduplicate_surfaces=true
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=2
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
|
gltf/texture_map_mode=1
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://qm03fqdikunu"
|
||||||
|
path.s3tc="res://.godot/imported/ArgonautSite_T_Argonaut_BaseColor.png-f9116cbc16640290d36eea9e578baf60.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "9955b192993b0ed878a790621f61b451"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/ArgonautSite_T_Argonaut_BaseColor.png"
|
||||||
|
dest_files=["res://.godot/imported/ArgonautSite_T_Argonaut_BaseColor.png-f9116cbc16640290d36eea9e578baf60.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ckug0ehydgt26"
|
||||||
|
path.s3tc="res://.godot/imported/ArgonautSite_T_Argonaut_Metallic-T_Argonaut_Roughness.png-aec96d683db590467207937d3b13cbc7.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "b344bbdc7dca8b71bbcb9acc04c79c2b"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/ArgonautSite_T_Argonaut_Metallic-T_Argonaut_Roughness.png"
|
||||||
|
dest_files=["res://.godot/imported/ArgonautSite_T_Argonaut_Metallic-T_Argonaut_Roughness.png-aec96d683db590467207937d3b13cbc7.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://bapdvqvr8fqpi"
|
||||||
|
path.s3tc="res://.godot/imported/ArgonautSite_T_Regolith_BaseColor.png-e82f3c739731fd7b363f6af5f4f6bce8.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "65f447decf9bf29e384cfe0675874154"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/ArgonautSite_T_Regolith_BaseColor.png"
|
||||||
|
dest_files=["res://.godot/imported/ArgonautSite_T_Regolith_BaseColor.png-e82f3c739731fd7b363f6af5f4f6bce8.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dnw6yyqc27ijy"
|
||||||
|
path.s3tc="res://.godot/imported/ArgonautSite_T_Regolith_Normal.png-0e10b000b00deb0b8335dedea0d5e244.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "d4a3f8a9c4a38a6305d7ad8eb7305c20"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/ArgonautSite_T_Regolith_Normal.png"
|
||||||
|
dest_files=["res://.godot/imported/ArgonautSite_T_Regolith_Normal.png-0e10b000b00deb0b8335dedea0d5e244.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=1
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=1
|
||||||
|
roughness/src_normal="res://planets_whatnot/ArgonautSite_T_Regolith_Normal.png"
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,45 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://tr8nf8lfnu17"
|
||||||
|
path="res://.godot/imported/SM_Argonaut.glb-73a73880652f88539c9b873743d513ba.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/SM_Argonaut.glb"
|
||||||
|
dest_files=["res://.godot/imported/SM_Argonaut.glb-73a73880652f88539c9b873743d513ba.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
mesh_library/use_node_names_as_mesh_names=false
|
||||||
|
array_mesh/deduplicate_surfaces=true
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=2
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
|
gltf/texture_map_mode=1
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://de1cxt8h7fg2"
|
||||||
|
path.s3tc="res://.godot/imported/SM_Argonaut_T_Argonaut_BaseColor.png-ab3707f28deecd6a93517aa680ff7854.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "9955b192993b0ed878a790621f61b451"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/SM_Argonaut_T_Argonaut_BaseColor.png"
|
||||||
|
dest_files=["res://.godot/imported/SM_Argonaut_T_Argonaut_BaseColor.png-ab3707f28deecd6a93517aa680ff7854.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,44 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://di3kk6hcc0ywm"
|
||||||
|
path.s3tc="res://.godot/imported/SM_Argonaut_T_Argonaut_Metallic-T_Argonaut_Roughness.png-3d4c4542ebeb676786691949c1454238.s3tc.ctex"
|
||||||
|
metadata={
|
||||||
|
"imported_formats": ["s3tc_bptc"],
|
||||||
|
"vram_texture": true
|
||||||
|
}
|
||||||
|
generator_parameters={
|
||||||
|
"md5": "b344bbdc7dca8b71bbcb9acc04c79c2b"
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/SM_Argonaut_T_Argonaut_Metallic-T_Argonaut_Roughness.png"
|
||||||
|
dest_files=["res://.godot/imported/SM_Argonaut_T_Argonaut_Metallic-T_Argonaut_Roughness.png-3d4c4542ebeb676786691949c1454238.s3tc.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=2
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/uastc_level=0
|
||||||
|
compress/rdo_quality_loss=0.0
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=true
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/channel_remap/red=0
|
||||||
|
process/channel_remap/green=1
|
||||||
|
process/channel_remap/blue=2
|
||||||
|
process/channel_remap/alpha=3
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=0
|
||||||
Binary file not shown.
@@ -0,0 +1,45 @@
|
|||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="scene"
|
||||||
|
importer_version=1
|
||||||
|
type="PackedScene"
|
||||||
|
uid="uid://dfw2nwijt2v1f"
|
||||||
|
path="res://.godot/imported/SM_Jupiter.glb-1328e41b794dd98cd297fbebab0f402e.scn"
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://planets_whatnot/SM_Jupiter.glb"
|
||||||
|
dest_files=["res://.godot/imported/SM_Jupiter.glb-1328e41b794dd98cd297fbebab0f402e.scn"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
nodes/root_type=""
|
||||||
|
nodes/root_name=""
|
||||||
|
nodes/root_script=null
|
||||||
|
mesh_library/use_node_names_as_mesh_names=false
|
||||||
|
array_mesh/deduplicate_surfaces=true
|
||||||
|
nodes/apply_root_scale=true
|
||||||
|
nodes/root_scale=1.0
|
||||||
|
nodes/import_as_skeleton_bones=false
|
||||||
|
nodes/use_name_suffixes=true
|
||||||
|
nodes/use_node_type_suffixes=true
|
||||||
|
meshes/ensure_tangents=true
|
||||||
|
meshes/generate_lods=true
|
||||||
|
meshes/create_shadow_meshes=true
|
||||||
|
meshes/light_baking=1
|
||||||
|
meshes/lightmap_texel_size=0.2
|
||||||
|
meshes/force_disable_compression=false
|
||||||
|
skins/use_named_skins=true
|
||||||
|
animation/import=true
|
||||||
|
animation/fps=30
|
||||||
|
animation/trimming=false
|
||||||
|
animation/remove_immutable_tracks=true
|
||||||
|
animation/import_rest_as_RESET=false
|
||||||
|
import_script/path=""
|
||||||
|
materials/extract=0
|
||||||
|
materials/extract_format=0
|
||||||
|
materials/extract_path=""
|
||||||
|
_subresources={}
|
||||||
|
gltf/naming_version=2
|
||||||
|
gltf/embedded_image_handling=1
|
||||||
|
gltf/texture_map_mode=1
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user