From 7833a1c756dce93d8937c681070025a676ec46f7 Mon Sep 17 00:00:00 2001 From: ChaoticByte Date: Thu, 3 Oct 2024 14:02:05 +0200 Subject: [PATCH] Manage nodes in TextViewport dynamically --- core/globals/levels.gd | 15 +++------------ core/globals/node_registry.gd | 1 - core/shadowing_camera_2d.gd | 5 ----- core/text_viewport.gd | 36 +++++++++++++++++++++++++++++++++++ main.gd | 1 - main.tscn | 6 +++--- 6 files changed, 42 insertions(+), 22 deletions(-) delete mode 100644 core/shadowing_camera_2d.gd create mode 100644 core/text_viewport.gd diff --git a/core/globals/levels.gd b/core/globals/levels.gd index 711c125..6fd92ed 100644 --- a/core/globals/levels.gd +++ b/core/globals/levels.gd @@ -41,9 +41,6 @@ func _pre_load_checks() -> bool: if NodeRegistry.level_root_container == null: push_error("Can't load level, level_root_container is not registered yet.") return false - if NodeRegistry.level_text_root_container == null: - push_error("Can't load level, level_text_root_container is not registered yet.") - return false if NodeRegistry.player == null: push_error("Can't load entrypoint, player is not registered yet.") return false @@ -61,18 +58,12 @@ func load_scene(scn_name: String, force_reload: bool = false) -> bool: unload_scene() var scn: Node2D = load(SCENES[scn_name]).instantiate() NodeRegistry.level_root_container.add_child(scn) - for t in get_tree().get_nodes_in_group("text_viewport"): - t.reparent(NodeRegistry.level_text_root_container) return true func unload_scene(): - for container in [ - NodeRegistry.level_root_container, - NodeRegistry.level_text_root_container - ]: - if container != null: - for c in container.get_children(): - c.queue_free() + if NodeRegistry.level_root_container != null: + for c in NodeRegistry.level_root_container.get_children(): + c.queue_free() func load_entrypoint(ep_name: String) -> bool: # returns true on success if not ep_name in ENTRYPOINTS: diff --git a/core/globals/node_registry.gd b/core/globals/node_registry.gd index c3b5e16..b461e10 100644 --- a/core/globals/node_registry.gd +++ b/core/globals/node_registry.gd @@ -2,4 +2,3 @@ extends Node var player: CharacterBody2D var level_root_container: Node2D -var level_text_root_container: Node2D diff --git a/core/shadowing_camera_2d.gd b/core/shadowing_camera_2d.gd deleted file mode 100644 index 98d41c8..0000000 --- a/core/shadowing_camera_2d.gd +++ /dev/null @@ -1,5 +0,0 @@ -extends Camera2D - -func _physics_process(_delta: float) -> void: - var orig_camera: Camera2D = NodeRegistry.player.camera - self.global_position = -orig_camera.get_viewport_transform().origin diff --git a/core/text_viewport.gd b/core/text_viewport.gd new file mode 100644 index 0000000..23b50c1 --- /dev/null +++ b/core/text_viewport.gd @@ -0,0 +1,36 @@ +extends SubViewport + +# All nodes from the MainViewport that are in the text_viewport group +# are shadowed in this SubViewport + +@onready var camera: Camera2D = $Camera2D +@onready var container: Node2D = %LevelTextRootContainer + +# map nodes to its shadowed nodes +var mapping: Dictionary = {} + +func update_mapping(): + var nodes = get_tree().get_nodes_in_group("text_viewport") + for k in mapping.keys(): + if not is_instance_valid(k): # check if node is gone + container.remove_child(mapping[k]) + mapping.erase(k) + for n in nodes: + if not n in mapping.keys(): + var dup = n.duplicate() + dup.remove_from_group("text_viewport") + mapping[n] = dup + container.add_child(dup) + +func _process(_delta: float) -> void: + update_mapping() + # update shadowed nodes + for k in mapping: + var v = mapping[k] + if k is Label and k.text != v.text: + v.text = k.text + if (k is Label or k is Node2D): + mapping[k].global_position = k.global_position + # camera position + var orig_camera: Camera2D = NodeRegistry.player.camera + camera.global_position = -orig_camera.get_viewport_transform().origin diff --git a/main.gd b/main.gd index 659f3b8..87f18ae 100644 --- a/main.gd +++ b/main.gd @@ -3,5 +3,4 @@ extends Node func _ready() -> void: NodeRegistry.player = %Player NodeRegistry.level_root_container = %LevelRootContainer - NodeRegistry.level_text_root_container = %LevelTextRootContainer Levels.load_menu() diff --git a/main.tscn b/main.tscn index 9e3e0f3..b625ef3 100644 --- a/main.tscn +++ b/main.tscn @@ -3,8 +3,8 @@ [ext_resource type="Script" path="res://main.gd" id="1_m407c"] [ext_resource type="PackedScene" uid="uid://dxp3dru2lrv6h" path="res://core/shaders/outline/outline_canvas_layer.tscn" id="2_ta1pa"] [ext_resource type="PackedScene" uid="uid://jmy11lqcs4c" path="res://core/shaders/distortion/distortion_canvas_layer.tscn" id="3_emkei"] +[ext_resource type="Script" path="res://core/text_viewport.gd" id="4_hxymt"] [ext_resource type="PackedScene" uid="uid://ebb4pfxklatj" path="res://player/player.tscn" id="5_0agpg"] -[ext_resource type="Script" path="res://core/shadowing_camera_2d.gd" id="5_rlmue"] [node name="Main" type="Control"] layout_mode = 3 @@ -54,13 +54,13 @@ handle_input_locally = false canvas_item_default_texture_filter = 0 size = Vector2i(800, 450) render_target_update_mode = 4 +script = ExtResource("4_hxymt") [node name="LevelTextRootContainer" type="Node2D" parent="TextViewportContainer/TextViewport"] unique_name_in_owner = true -[node name="ShadowingCamera2D" type="Camera2D" parent="TextViewportContainer/TextViewport"] +[node name="Camera2D" type="Camera2D" parent="TextViewportContainer/TextViewport"] editor_description = "Shadows the camera in MainViewportContainer" anchor_mode = 0 -script = ExtResource("5_rlmue") [node name="DistortionShader" parent="." instance=ExtResource("3_emkei")]