diff --git a/_props/_prefabs/camera/camera_tool.gd b/_props/_prefabs/camera/camera_tool.gd deleted file mode 100644 index d14cf69..0000000 --- a/_props/_prefabs/camera/camera_tool.gd +++ /dev/null @@ -1,25 +0,0 @@ -extends Node - -@export var binded_camera: PhantomCamera2D - -var _binded_cam: PhantomCamera2D - -func _ready() -> void: - _binded_cam = binded_camera - if not _binded_cam: - _binded_cam = get_parent() as PhantomCamera2D - - if not _binded_cam: - printerr("[CameraTool]: No Vaild Camera Founded") - -## 将自己的priority设置为最高 -func hold_self_priority() -> void: - var pcs = PhantomCameraManager.get_phantom_camera_2ds() - for pc in pcs: - pc.priority = -1 - - _binded_cam.priority = 100 - -## 将自己的priority设置为不可用 -func release_self_priority() -> void: - _binded_cam.priority = -1 diff --git a/_props/_prefabs/camera/camera_tool.gd.uid b/_props/_prefabs/camera/camera_tool.gd.uid deleted file mode 100644 index 1e4dd4c..0000000 --- a/_props/_prefabs/camera/camera_tool.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ce7d2tpunfaxe diff --git a/_props/_prefabs/camera/change_room_tween.tres b/_props/_prefabs/camera/change_room_tween.tres deleted file mode 100644 index 4eaee96..0000000 --- a/_props/_prefabs/camera/change_room_tween.tres +++ /dev/null @@ -1,9 +0,0 @@ -[gd_resource type="Resource" script_class="PhantomCameraTween" load_steps=2 format=3 uid="uid://bm0iyvgqfrqoj"] - -[ext_resource type="Script" uid="uid://8umksf8e80fw" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="1_j0gyv"] - -[resource] -script = ExtResource("1_j0gyv") -duration = 0.6 -transition = 7 -metadata/_custom_type_script = "uid://8umksf8e80fw" diff --git a/_props/_prefabs/camera/scene_static_camera.tscn b/_props/_prefabs/camera/scene_static_camera.tscn deleted file mode 100644 index 90062c3..0000000 --- a/_props/_prefabs/camera/scene_static_camera.tscn +++ /dev/null @@ -1,18 +0,0 @@ -[gd_scene load_steps=5 format=3 uid="uid://b0xmcb5i4jey"] - -[ext_resource type="Script" uid="uid://bhexx6mj1xv3q" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="1_p2s6f"] -[ext_resource type="Script" uid="uid://8umksf8e80fw" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="2_77rrp"] -[ext_resource type="Script" uid="uid://ce7d2tpunfaxe" path="res://_props/_prefabs/camera/camera_tool.gd" id="3_77rrp"] - -[sub_resource type="Resource" id="Resource_gofl0"] -script = ExtResource("2_77rrp") - -[node name="SceneStaticCamera" type="Node2D"] -script = ExtResource("1_p2s6f") -tween_resource = SubResource("Resource_gofl0") -draw_limits = true -metadata/_custom_type_script = "uid://bhexx6mj1xv3q" - -[node name="Tool" type="Node" parent="." node_paths=PackedStringArray("binded_camera")] -script = ExtResource("3_77rrp") -binded_camera = NodePath("..") diff --git a/_shared/camera/CameraSystem.gd b/_shared/camera/CameraSystem.gd index 6652f9e..def8f48 100644 --- a/_shared/camera/CameraSystem.gd +++ b/_shared/camera/CameraSystem.gd @@ -19,7 +19,6 @@ var _switch_scheduled := false var _dirty := false ## 玩家关卡内静态相机 -const PLAYER_CAMERA_SCENE:= preload("res://_shared/camera/PlayerStaticCamera.tscn") const CAMERA_FOLLOWER:= preload("res://_shared/camera/camera_follower.tscn") func _ready() -> void: diff --git a/_shared/camera/PlayerStaticCamera.tscn b/_shared/camera/PlayerStaticCamera.tscn deleted file mode 100644 index 6973820..0000000 --- a/_shared/camera/PlayerStaticCamera.tscn +++ /dev/null @@ -1,119 +0,0 @@ -[gd_scene load_steps=11 format=3 uid="uid://d1w8ftfhxycfy"] - -[ext_resource type="Script" uid="uid://bhexx6mj1xv3q" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd" id="1_llsih"] -[ext_resource type="Script" uid="uid://bhd4nuiu23e7l" path="res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd" id="3_0bl5s"] -[ext_resource type="Script" uid="uid://8umksf8e80fw" path="res://addons/phantom_camera/scripts/resources/tween_resource.gd" id="3_fixiw"] -[ext_resource type="Script" uid="uid://dimvdouy8g0sv" path="res://addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd" id="6_ctkin"] - -[sub_resource type="GDScript" id="GDScript_fixiw"] -script/source = "class_name GlobalCamera extends Node2D - -@onready var phantom_camera_2d: PhantomCamera2D = %PhantomCamera2D - -@onready var _0_hook_touch_noise: PhantomCameraNoiseEmitter2D = %\"0_Hook_Touch_Noise\" -@onready var _45_hook_touch_noise: PhantomCameraNoiseEmitter2D = %\"45_Hook_Touch_Noise\" -@onready var _90_hook_touch_noise: PhantomCameraNoiseEmitter2D = %\"90_Hook_Touch_Noise\" -@onready var _135_hook_touch_noise: PhantomCameraNoiseEmitter2D = %\"135_Hook_Touch_Noise\" - - -func emit_camera_shock(noise: PhantomCameraNoise2D) -> void: - if not noise: - return - -func emit_hook_touch_shock(dir : int) -> void: - match dir: - 0: - _0_hook_touch_noise.emit() - 1: - _45_hook_touch_noise.emit() - 2: - _90_hook_touch_noise.emit() - 3: - _135_hook_touch_noise.emit() -" - -[sub_resource type="Resource" id="Resource_pvk7k"] -script = ExtResource("3_fixiw") - -[sub_resource type="Resource" id="Resource_jjeqj"] -script = ExtResource("6_ctkin") -amplitude = 5.0 -frequency = 18.0 -randomize_noise_seed = 1 -noise_seed = 1000 -positional_multiplier_x = 0.0 -positional_multiplier_y = 2.0 -metadata/_custom_type_script = "uid://dimvdouy8g0sv" - -[sub_resource type="Resource" id="Resource_ctkin"] -script = ExtResource("6_ctkin") -amplitude = 5.0 -frequency = 18.0 -randomize_noise_seed = 1 -metadata/_custom_type_script = "uid://dimvdouy8g0sv" - -[sub_resource type="Resource" id="Resource_wjs5j"] -script = ExtResource("6_ctkin") -amplitude = 5.0 -frequency = 18.0 -randomize_noise_seed = 1 -positional_multiplier_x = 2.0 -positional_multiplier_y = 0.0 -metadata/_custom_type_script = "uid://dimvdouy8g0sv" - -[sub_resource type="Resource" id="Resource_ompnq"] -script = ExtResource("6_ctkin") -amplitude = 5.0 -frequency = 18.0 -randomize_noise_seed = 1 -metadata/_custom_type_script = "uid://dimvdouy8g0sv" - -[node name="PlayerStaticCamera" type="Node2D"] -script = SubResource("GDScript_fixiw") - -[node name="PhantomCamera2D" type="Node2D" parent="."] -unique_name_in_owner = true -script = ExtResource("1_llsih") -priority = 1000 -zoom = Vector2(0.8, 0.8) -tween_resource = SubResource("Resource_pvk7k") -tween_on_load = false -draw_limits = true -noise_emitter_layer = 1 -metadata/_custom_type_script = "uid://bhexx6mj1xv3q" - -[node name="0_Hook_Touch_Noise" type="Node2D" parent="PhantomCamera2D"] -unique_name_in_owner = true -script = ExtResource("3_0bl5s") -noise = SubResource("Resource_jjeqj") -growth_time = 0.04095982 -duration = 0.16 -decay_time = 0.10085586 -metadata/_custom_type_script = "uid://bhd4nuiu23e7l" - -[node name="45_Hook_Touch_Noise" type="Node2D" parent="PhantomCamera2D"] -unique_name_in_owner = true -script = ExtResource("3_0bl5s") -noise = SubResource("Resource_ctkin") -growth_time = 0.04096021 -duration = 0.16 -decay_time = 0.10085552 -metadata/_custom_type_script = "uid://bhd4nuiu23e7l" - -[node name="90_Hook_Touch_Noise" type="Node2D" parent="PhantomCamera2D"] -unique_name_in_owner = true -script = ExtResource("3_0bl5s") -noise = SubResource("Resource_wjs5j") -growth_time = 0.0409602 -duration = 0.16 -decay_time = 0.10085564 -metadata/_custom_type_script = "uid://bhd4nuiu23e7l" - -[node name="135_Hook_Touch_Noise" type="Node2D" parent="PhantomCamera2D"] -unique_name_in_owner = true -script = ExtResource("3_0bl5s") -noise = SubResource("Resource_ompnq") -growth_time = 0.040960066 -duration = 0.16 -decay_time = 0.100856625 -metadata/_custom_type_script = "uid://bhd4nuiu23e7l" diff --git a/_shared/l_test.tscn b/_shared/l_test.tscn deleted file mode 100644 index 680bd44..0000000 --- a/_shared/l_test.tscn +++ /dev/null @@ -1,8 +0,0 @@ -[gd_scene load_steps=2 format=4 uid="uid://bomv75fi4uuyi"] - -[ext_resource type="TileSet" uid="uid://doepkfp83k0lb" path="res://_tileset/test.tres" id="1_vei0o"] - -[node name="TileMapLayer" type="TileMapLayer"] -texture_filter = 1 -tile_map_data = PackedByteArray("AAAAAA0AAAAAAAAAAAABAA0AAAAAAAAAAAACAA0AAAAAAAAAAAADAA0AAAAAAAAAAAAEAA0AAAAAAAAAAAAFAA0AAAAAAAAAAAAGAA0AAAAAAAAAAAAHAA0AAAAAAAAAAAAIAA0AAAAAAAAAAAAJAA0AAAAAAAAAAAAKAA0AAAAAAAAAAAALAA0AAAAAAAAAAAAMAA0AAAAAAAAAAAANAA0AAAAAAAAAAAAOAA0AAAAAAAAAAAAPAA0AAAAAAAAAAAAQAA0AAAAAAAAAAAARAA0AAAAAAAAAAAASAA0AAAAAAAAAAAATAA0AAAAAAAAAAAAUAA0AAAAAAAAAAAAVAA0AAAAAAAAAAAAWAA0AAAAAAAAAAAAXAA0AAAAAAAAAAAAYAA0AAAAAAAAAAAAZAA0AAAAAAAAAAAAaAA0AAAAAAAAAAAAbAA0AAAAAAAAAAAAcAA0AAAAAAAAAAAAdAA0AAAAAAAAAAAAAAAMAAAAAAAAAAAAAAAQAAAAAAAAAAAABAAQAAAAAAAAAAAABAAUAAAAAAAAAAAABAAYAAAAAAAAAAAACAAYAAAAAAAAAAAACAAcAAAAAAAAAAAACAAgAAAAAAAAAAAACAAkAAAAAAAAAAAACAAoAAAAAAAAAAAADAAoAAAAAAAAAAAADAAsAAAAAAAAAAAACAAsAAAAAAAAAAAACAAwAAAAAAAAAAAADAAwAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAYAAAAAAAAAAAAAAAcAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAkAAAAAAAAAAAAAAAoAAAAAAAAAAAAAAAsAAAAAAAAAAAAAAAwAAAAAAAAAAAABAAcAAAAAAAAAAAABAAgAAAAAAAAAAAABAAkAAAAAAAAAAAABAAoAAAAAAAAAAAABAAsAAAAAAAAAAAABAAwAAAAAAAAAAAAPAAoAAAAAAAAAAAAPAAsAAAAAAAAAAAAQAAoAAAAAAAAAAAAQAAsAAAAAAAAAAAATAAgAAAAAAAAAAAATAAkAAAAAAAAAAAAUAAgAAAAAAAAAAAAUAAkAAAAAAAAAAAAVAAgAAAAAAAAAAAAVAAkAAAAAAAAAAAAYAAUAAAAAAAAAAAAYAAYAAAAAAAAAAAAYAAcAAAAAAAAAAAAYAAsAAAAAAAAAAAAYAAwAAAAAAAAAAAAZAAUAAAAAAAAAAAAZAAYAAAAAAAAAAAAZAAcAAAAAAAAAAAAaAAsAAAAAAAAAAAAaAAwAAAAAAAAAAAAZAAwAAAAAAAAAAAAZAAsAAAAAAAAAAAAaAAUAAAAAAAAAAAAaAAYAAAAAAAAAAAAaAAcAAAAAAAAAAAADAAYAAAAAAAAAAAADAAcAAAAAAAAAAAADAAgAAAAAAAAAAAADAAkAAAAAAAAAAAABAAMAAAAAAAAAAAACAAMAAAAAAAAAAAACAAQAAAAAAAAAAAACAAUAAAAAAAAAAAADAAMAAAAAAAAAAAADAAQAAAAAAAAAAAADAAUAAAAAAAAAAAAAAA4AAAAAAAAAAAABAA4AAAAAAAAAAAACAA4AAAAAAAAAAAADAA4AAAAAAAAAAAAEAA4AAAAAAAAAAAAFAA4AAAAAAAAAAAAGAA4AAAAAAAAAAAAHAA4AAAAAAAAAAAAIAA4AAAAAAAAAAAAJAA4AAAAAAAAAAAAKAA4AAAAAAAAAAAALAA4AAAAAAAAAAAAMAA4AAAAAAAAAAAANAA4AAAAAAAAAAAAOAA4AAAAAAAAAAAAPAA4AAAAAAAAAAAAbAA4AAAAAAAAAAAAcAA4AAAAAAAAAAAAdAA4AAAAAAAAAAAAaAA4AAAAAAAAAAAAZAA4AAAAAAAAAAAAYAA4AAAAAAAAAAAAXAA4AAAAAAAAAAAAWAA4AAAAAAAAAAAAVAA4AAAAAAAAAAAAUAA4AAAAAAAAAAAATAA4AAAAAAAAAAAASAA4AAAAAAAAAAAARAA4AAAAAAAAAAAAQAA4AAAAAAAAAAAAPAA8AAAAAAAAAAAAOAA8AAAAAAAAAAAANAA8AAAAAAAAAAAAMAA8AAAAAAAAAAAALAA8AAAAAAAAAAAAKAA8AAAAAAAAAAAAJAA8AAAAAAAAAAAAIAA8AAAAAAAAAAAAHAA8AAAAAAAAAAAAGAA8AAAAAAAAAAAAFAA8AAAAAAAAAAAAEAA8AAAAAAAAAAAAEABAAAAAAAAAAAAADABAAAAAAAAAAAAACABAAAAAAAAAAAAABABAAAAAAAAAAAAABAA8AAAAAAAAAAAAAAA8AAAAAAAAAAAAAABAAAAAAAAAAAAAFABAAAAAAAAAAAAAGABAAAAAAAAAAAAAHABAAAAAAAAAAAAAIABAAAAAAAAAAAAAJABAAAAAAAAAAAAAKABAAAAAAAAAAAAALABAAAAAAAAAAAAAMABAAAAAAAAAAAAANABAAAAAAAAAAAAAOABAAAAAAAAAAAAAPABAAAAAAAAAAAAAQABAAAAAAAAAAAAARABAAAAAAAAAAAAASABAAAAAAAAAAAAATABAAAAAAAAAAAAAUABAAAAAAAAAAAAAVABAAAAAAAAAAAAAWABAAAAAAAAAAAAAXABAAAAAAAAAAAAAYABAAAAAAAAAAAAAZABAAAAAAAAAAAAAaABAAAAAAAAAAAAAbABAAAAAAAAAAAAAcABAAAAAAAAAAAAAdABAAAAAAAAAAAAAeABAAAAAAAAAAAAAeAA8AAAAAAAAAAAAdAA8AAAAAAAAAAAAcAA8AAAAAAAAAAAAbAA8AAAAAAAAAAAAaAA8AAAAAAAAAAAAZAA8AAAAAAAAAAAAYAA8AAAAAAAAAAAAXAA8AAAAAAAAAAAAWAA8AAAAAAAAAAAAVAA8AAAAAAAAAAAAUAA8AAAAAAAAAAAATAA8AAAAAAAAAAAASAA8AAAAAAAAAAAARAA8AAAAAAAAAAAADAA8AAAAAAAAAAAACAA8AAAAAAAAAAAAQAA8AAAAAAAAAAAD//wMAAAAAAAAAAAD//wQAAAAAAAAAAAD//wUAAAAAAAAAAAD//wYAAAAAAAAAAAD//wcAAAAAAAAAAAD//wgAAAAAAAAAAAD//wkAAAAAAAAAAAD//woAAAAAAAAAAAD//wsAAAAAAAAAAAD//wwAAAAAAAAAAAD//w0AAAAAAAAAAAD//w4AAAAAAAAAAAD//w8AAAAAAAAAAAD//xAAAAAAAAAAAAD+/wQAAAAAAAAAAAD+/wUAAAAAAAAAAAD+/wYAAAAAAAAAAAD+/wcAAAAAAAAAAAD+/wgAAAAAAAAAAAD+/wkAAAAAAAAAAAD+/woAAAAAAAAAAAD+/wsAAAAAAAAAAAD+/wwAAAAAAAAAAAD+/w0AAAAAAAAAAAD+/w4AAAAAAAAAAAD+/w8AAAAAAAAAAAD+/xAAAAAAAAAAAAD+/wMAAAAAAAAAAAD+/wIAAAAAAAAAAAD//wIAAAAAAAAAAAAAAAIAAAAAAAAAAAABAAIAAAAAAAAAAAACAAIAAAAAAAAAAAADAAIAAAAAAAAAAAD+/wEAAAAAAAAAAAD//wEAAAAAAAAAAAAAAAEAAAAAAAAAAAABAAEAAAAAAAAAAAACAAEAAAAAAAAAAAADAAEAAAAAAAAAAAD+/wAAAAAAAAAAAAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAD+////AAAAAAAAAAD/////AAAAAAAAAAAAAP//AAAAAAAAAAABAP//AAAAAAAAAAACAP//AAAAAAAAAAADAP//AAAAAAAAAAD+//7/AAAAAAAAAAD///7/AAAAAAAAAAAAAP7/AAAAAAAAAAABAP7/AAAAAAAAAAACAP7/AAAAAAAAAAADAP7/AAAAAAAAAAAeAA0AAAAAAAAAAAAeAA4AAAAAAAAAAAAfAA0AAAAAAAAAAAAfAA4AAAAAAAAAAAAfAA8AAAAAAAAAAAAfABAAAAAAAAAAAAAgAA0AAAAAAAAAAAAgAA4AAAAAAAAAAAAgAA8AAAAAAAAAAAAgABAAAAAAAAAAAAAhAA0AAAAAAAAAAAAhAA4AAAAAAAAAAAAhAA8AAAAAAAAAAAAhABAAAAAAAAAAAAAiAA0AAAAAAAAAAAAiAA4AAAAAAAAAAAAiAA8AAAAAAAAAAAAiABAAAAAAAAAAAAAjAA0AAAAAAAAAAAAjAA4AAAAAAAAAAAAjAA8AAAAAAAAAAAAjABAAAAAAAAAAAAAkAA0AAAAAAAAAAAAkAA4AAAAAAAAAAAAkAA8AAAAAAAAAAAAkABAAAAAAAAAAAAAlAA0AAAAAAAAAAAAlAA4AAAAAAAAAAAAlAA8AAAAAAAAAAAAlABAAAAAAAAAAAAAmAA0AAAAAAAAAAAAmAA4AAAAAAAAAAAAmAA8AAAAAAAAAAAAmABAAAAAAAAAAAAAnAA0AAAAAAAAAAAAnAA4AAAAAAAAAAAAnAA8AAAAAAAAAAAAnABAAAAAAAAAAAAAoAA0AAAAAAAAAAAAoAA4AAAAAAAAAAAAoAA8AAAAAAAAAAAAoABAAAAAAAAAAAAApAA0AAAAAAAAAAAApAA4AAAAAAAAAAAApAA8AAAAAAAAAAAApABAAAAAAAAAAAAAqAA0AAAAAAAAAAAAqAA4AAAAAAAAAAAAqAA8AAAAAAAAAAAAqABAAAAAAAAAAAAArAA0AAAAAAAAAAAArAA4AAAAAAAAAAAArAA8AAAAAAAAAAAArABAAAAAAAAAAAAAsAA0AAAAAAAAAAAAsAA4AAAAAAAAAAAAsAA8AAAAAAAAAAAAsABAAAAAAAAAAAAAtAA0AAAAAAAAAAAAtAA4AAAAAAAAAAAAtAA8AAAAAAAAAAAAtABAAAAAAAAAAAAAuAA0AAAAAAAAAAAAuAA4AAAAAAAAAAAAuAA8AAAAAAAAAAAAuABAAAAAAAAAAAAAvAA0AAAAAAAAAAAAvAA4AAAAAAAAAAAAvAA8AAAAAAAAAAAAvABAAAAAAAAAAAAAwAA0AAAAAAAAAAAAwAA4AAAAAAAAAAAAwAA8AAAAAAAAAAAAwABAAAAAAAAAAAAAxAA0AAAAAAAAAAAAxAA4AAAAAAAAAAAAxAA8AAAAAAAAAAAAxABAAAAAAAAAAAAAyAA0AAAAAAAAAAAAyAA4AAAAAAAAAAAAyAA8AAAAAAAAAAAAyABAAAAAAAAAAAAAzAA0AAAAAAAAAAAAzAA4AAAAAAAAAAAAzAA8AAAAAAAAAAAAzABAAAAAAAAAAAAA0AA0AAAAAAAAAAAA0AA4AAAAAAAAAAAA0AA8AAAAAAAAAAAA0ABAAAAAAAAAAAAA1AA0AAAAAAAAAAAA1AA4AAAAAAAAAAAA1AA8AAAAAAAAAAAA1ABAAAAAAAAAAAAA2AA0AAAAAAAAAAAA2AA4AAAAAAAAAAAA2AA8AAAAAAAAAAAA2ABAAAAAAAAAAAAA3AA0AAAAAAAAAAAA3AA4AAAAAAAAAAAA3AA8AAAAAAAAAAAA3ABAAAAAAAAAAAAA4AA0AAAAAAAAAAAA4AA4AAAAAAAAAAAA4AA8AAAAAAAAAAAA4ABAAAAAAAAAAAAA5AA0AAAAAAAAAAAA5AA4AAAAAAAAAAAA5AA8AAAAAAAAAAAA5ABAAAAAAAAAAAAA6AA0AAAAAAAAAAAA6AA4AAAAAAAAAAAA6AA8AAAAAAAAAAAA6ABAAAAAAAAAAAAA7AA0AAAAAAAAAAAA7AA4AAAAAAAAAAAA7AA8AAAAAAAAAAAA7ABAAAAAAAAAAAAA8AA0AAAAAAAAAAAA8AA4AAAAAAAAAAAA8AA8AAAAAAAAAAAA8ABAAAAAAAAAAAAA9AA0AAAAAAAAAAAA9AA4AAAAAAAAAAAA9AA8AAAAAAAAAAAA9ABAAAAAAAAAAAAA+AA0AAAAAAAAAAAA+AA4AAAAAAAAAAAA+AA8AAAAAAAAAAAA+ABAAAAAAAAAAAAA/AA0AAAAAAAAAAAA/AA4AAAAAAAAAAAA/AA8AAAAAAAAAAAA/ABAAAAAAAAAAAABAAA0AAAAAAAAAAABAAA4AAAAAAAAAAABAAA8AAAAAAAAAAABAABAAAAAAAAAAAABBAA0AAAAAAAAAAABBAA4AAAAAAAAAAABBAA8AAAAAAAAAAABBABAAAAAAAAAAAABCAA0AAAAAAAAAAABCAA4AAAAAAAAAAABCAA8AAAAAAAAAAABCABAAAAAAAAAAAABDAA0AAAAAAAAAAABDAA4AAAAAAAAAAABDAA8AAAAAAAAAAABDABAAAAAAAAAAAABEAA0AAAAAAAAAAABEAA4AAAAAAAAAAABEAA8AAAAAAAAAAABEABAAAAAAAAAAAABFAA0AAAAAAAAAAABFAA4AAAAAAAAAAABFAA8AAAAAAAAAAABFABAAAAAAAAAAAABGAA0AAAAAAAAAAABGAA4AAAAAAAAAAABGAA8AAAAAAAAAAABGABAAAAAAAAAAAABHAA0AAAAAAAAAAABHAA4AAAAAAAAAAABHAA8AAAAAAAAAAABHABAAAAAAAAAAAABIAA0AAAAAAAAAAABIAA4AAAAAAAAAAABIAA8AAAAAAAAAAABIABAAAAAAAAAAAABJAA0AAAAAAAAAAABJAA4AAAAAAAAAAABJAA8AAAAAAAAAAABJABAAAAAAAAAAAABKAA0AAAAAAAAAAABKAA4AAAAAAAAAAABKAA8AAAAAAAAAAABKABAAAAAAAAAAAABLAA0AAAAAAAAAAABLAA4AAAAAAAAAAABLAA8AAAAAAAAAAABLABAAAAAAAAAAAABMAA0AAAAAAAAAAABMAA4AAAAAAAAAAABMAA8AAAAAAAAAAABMABAAAAAAAAAAAABNAA0AAAAAAAAAAABNAA4AAAAAAAAAAABNAA8AAAAAAAAAAABNABAAAAAAAAAAAABOAA0AAAAAAAAAAABOAA4AAAAAAAAAAABOAA8AAAAAAAAAAABOABAAAAAAAAAAAABPAA0AAAAAAAAAAABPAA4AAAAAAAAAAABPAA8AAAAAAAAAAABPABAAAAAAAAAAAABQAA0AAAAAAAAAAABQAA4AAAAAAAAAAABQAA8AAAAAAAAAAABQABAAAAAAAAAAAABRAA0AAAAAAAAAAABRAA4AAAAAAAAAAABRAA8AAAAAAAAAAABRABAAAAAAAAAAAABSAA0AAAAAAAAAAABSAA4AAAAAAAAAAABSAA8AAAAAAAAAAABSABAAAAAAAAAAAABTAA0AAAAAAAAAAABTAA4AAAAAAAAAAABTAA8AAAAAAAAAAABTABAAAAAAAAAAAAAhAAUAAAAAAAAAAAAhAAYAAAAAAAAAAAAiAAUAAAAAAAAAAAAiAAYAAAAAAAAAAAAjAAUAAAAAAAAAAAAjAAYAAAAAAAAAAAAkAAUAAAAAAAAAAAAkAAYAAAAAAAAAAAAlAAUAAAAAAAAAAAAlAAYAAAAAAAAAAAAmAAUAAAAAAAAAAAAmAAYAAAAAAAAAAAAnAAUAAAAAAAAAAAAnAAYAAAAAAAAAAAAoAAUAAAAAAAAAAAAoAAYAAAAAAAAAAAApAAUAAAAAAAAAAAApAAYAAAAAAAAAAAAqAAUAAAAAAAAAAAAqAAYAAAAAAAAAAAArAAUAAAAAAAAAAAArAAYAAAAAAAAAAAAlAAsAAAAAAAAAAAAlAAwAAAAAAAAAAAAmAAsAAAAAAAAAAAAmAAwAAAAAAAAAAAAnAAsAAAAAAAAAAAAnAAwAAAAAAAAAAAA0AAsAAAAAAAAAAAA0AAwAAAAAAAAAAAA1AAsAAAAAAAAAAAA1AAwAAAAAAAAAAAA2AAsAAAAAAAAAAAA2AAwAAAAAAAAAAAA3AAsAAAAAAAAAAAA3AAwAAAAAAAAAAAA0AAAAAAAAAAAAAAA0AAEAAAAAAAAAAAA0AAIAAAAAAAAAAAA0AAMAAAAAAAAAAAA0AAQAAAAAAAAAAAA0AAUAAAAAAAAAAAA1AAAAAAAAAAAAAAA1AAEAAAAAAAAAAAA1AAIAAAAAAAAAAAA1AAMAAAAAAAAAAAA1AAQAAAAAAAAAAAA1AAUAAAAAAAAAAAA2AAAAAAAAAAAAAAA2AAEAAAAAAAAAAAA2AAIAAAAAAAAAAAA2AAMAAAAAAAAAAAA2AAQAAAAAAAAAAAA2AAUAAAAAAAAAAAA3AAAAAAAAAAAAAAA3AAEAAAAAAAAAAAA3AAIAAAAAAAAAAAA3AAMAAAAAAAAAAAA3AAQAAAAAAAAAAAA3AAUAAAAAAAAAAAAsAP7/AAAAAAAAAAAsAP//AAAAAAAAAAAtAP7/AAAAAAAAAAAtAP//AAAAAAAAAAAuAP7/AAAAAAAAAAAuAP//AAAAAAAAAAAvAP7/AAAAAAAAAAAvAP//AAAAAAAAAAAwAP7/AAAAAAAAAAAwAP//AAAAAAAAAAAxAP7/AAAAAAAAAAAxAP//AAAAAAAAAAAiAPv/AAAAAAAAAAAiAPz/AAAAAAAAAAAjAPv/AAAAAAAAAAAjAPz/AAAAAAAAAAAkAPv/AAAAAAAAAAAkAPz/AAAAAAAAAAAlAPv/AAAAAAAAAAAlAPz/AAAAAAAAAAAmAPv/AAAAAAAAAAAmAPz/AAAAAAAAAAAnAPv/AAAAAAAAAAAnAPz/AAAAAAAAAAAoAPv/AAAAAAAAAAAoAPz/AAAAAAAAAAApAPv/AAAAAAAAAAApAPz/AAAAAAAAAAAZAPv/AAAAAAAAAAAZAPz/AAAAAAAAAAAZAP3/AAAAAAAAAAAZAP7/AAAAAAAAAAAaAPv/AAAAAAAAAAAaAPz/AAAAAAAAAAAaAP3/AAAAAAAAAAAaAP7/AAAAAAAAAAAbAPv/AAAAAAAAAAAbAPz/AAAAAAAAAAAbAP3/AAAAAAAAAAAbAP7/AAAAAAAAAAAcAPv/AAAAAAAAAAAcAPz/AAAAAAAAAAAcAP3/AAAAAAAAAAAcAP7/AAAAAAAAAAAdAPv/AAAAAAAAAAAdAPz/AAAAAAAAAAAdAP3/AAAAAAAAAAAdAP7/AAAAAAAAAAAeAPv/AAAAAAAAAAAeAPz/AAAAAAAAAAAeAP3/AAAAAAAAAAAeAP7/AAAAAAAAAAAOAPz/AAAAAAAAAAAOAP3/AAAAAAAAAAAOAP7/AAAAAAAAAAAOAP//AAAAAAAAAAAPAPz/AAAAAAAAAAAPAP3/AAAAAAAAAAAPAP7/AAAAAAAAAAAPAP//AAAAAAAAAAAQAPz/AAAAAAAAAAAQAP3/AAAAAAAAAAAQAP7/AAAAAAAAAAAQAP//AAAAAAAAAAARAPz/AAAAAAAAAAARAP3/AAAAAAAAAAARAP7/AAAAAAAAAAARAP//AAAAAAAAAAASAPz/AAAAAAAAAAASAP3/AAAAAAAAAAASAP7/AAAAAAAAAAASAP//AAAAAAAAAAATAPz/AAAAAAAAAAATAP3/AAAAAAAAAAATAP7/AAAAAAAAAAATAP//AAAAAAAAAAAUAPz/AAAAAAAAAAAUAP3/AAAAAAAAAAAUAP7/AAAAAAAAAAAUAP//AAAAAAAAAAAVAPz/AAAAAAAAAAAVAP3/AAAAAAAAAAAVAP7/AAAAAAAAAAAVAP//AAAAAAAAAAD+//j/AAAAAAAAAAD+//n/AAAAAAAAAAD+//r/AAAAAAAAAAD+//v/AAAAAAAAAAD+//z/AAAAAAAAAAD+//3/AAAAAAAAAAD///j/AAAAAAAAAAD///n/AAAAAAAAAAD///r/AAAAAAAAAAD///v/AAAAAAAAAAD///z/AAAAAAAAAAD///3/AAAAAAAAAAAAAPj/AAAAAAAAAAAAAPn/AAAAAAAAAAAAAPr/AAAAAAAAAAAAAPv/AAAAAAAAAAAAAPz/AAAAAAAAAAAAAP3/AAAAAAAAAAABAPj/AAAAAAAAAAABAPn/AAAAAAAAAAABAPr/AAAAAAAAAAABAPv/AAAAAAAAAAABAPz/AAAAAAAAAAABAP3/AAAAAAAAAAACAPj/AAAAAAAAAAACAPn/AAAAAAAAAAACAPr/AAAAAAAAAAACAPv/AAAAAAAAAAACAPz/AAAAAAAAAAACAP3/AAAAAAAAAAADAPj/AAAAAAAAAAADAPn/AAAAAAAAAAADAPr/AAAAAAAAAAADAPv/AAAAAAAAAAADAPz/AAAAAAAAAAADAP3/AAAAAAAAAAAPAAwAAAABAAAAAAAQAAwAAAABAAAAAAAOAAwAAAABAAAAAAARAAwAAAABAAAAAAA=") -tile_set = ExtResource("1_vei0o") diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png deleted file mode 100644 index 3082789..0000000 Binary files a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png and /dev/null differ diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import deleted file mode 100644 index 6582ece..0000000 --- a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://censw3w53gldn" -path="res://.godot/imported/PhantomCameraBtnPrimaryDefault.png-fcf3696b583a82b1078609a5bfd648f5.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png" -dest_files=["res://.godot/imported/PhantomCameraBtnPrimaryDefault.png-fcf3696b583a82b1078609a5bfd648f5.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=false -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 diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png deleted file mode 100644 index 1e0c31a..0000000 Binary files a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png and /dev/null differ diff --git a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import b/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import deleted file mode 100644 index a9b1fa8..0000000 --- a/addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://pvr8mbvl1onm" -path="res://.godot/imported/PhantomCameraBtnPrimaryHover.png-3d2e4d225f6a86ce8a9c981ee7926a16.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png" -dest_files=["res://.godot/imported/PhantomCameraBtnPrimaryHover.png-3d2e4d225f6a86ce8a9c981ee7926a16.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=false -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 diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf b/addons/phantom_camera/fonts/Nunito-Black.ttf deleted file mode 100644 index 1081731..0000000 Binary files a/addons/phantom_camera/fonts/Nunito-Black.ttf and /dev/null differ diff --git a/addons/phantom_camera/fonts/Nunito-Black.ttf.import b/addons/phantom_camera/fonts/Nunito-Black.ttf.import deleted file mode 100644 index ac0fdb7..0000000 --- a/addons/phantom_camera/fonts/Nunito-Black.ttf.import +++ /dev/null @@ -1,36 +0,0 @@ -[remap] - -importer="font_data_dynamic" -type="FontFile" -uid="uid://c4mm3of2mc8o5" -path="res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata" - -[deps] - -source_file="res://addons/phantom_camera/fonts/Nunito-Black.ttf" -dest_files=["res://.godot/imported/Nunito-Black.ttf-2a374efbc207a97a99b8c70bdc4b7cbb.fontdata"] - -[params] - -Rendering=null -antialiasing=1 -generate_mipmaps=false -disable_embedded_bitmaps=true -multichannel_signed_distance_field=false -msdf_pixel_range=8 -msdf_size=48 -allow_system_fallback=true -force_autohinter=false -modulate_color_glyphs=false -hinting=1 -subpixel_positioning=1 -keep_rounding_remainders=true -oversampling=0.0 -Fallbacks=null -fallbacks=[] -Compress=null -compress=true -preload=[] -language_support={} -script_support={} -opentype_features={} diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf b/addons/phantom_camera/fonts/Nunito-Regular.ttf deleted file mode 100644 index dfd0fcb..0000000 Binary files a/addons/phantom_camera/fonts/Nunito-Regular.ttf and /dev/null differ diff --git a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import b/addons/phantom_camera/fonts/Nunito-Regular.ttf.import deleted file mode 100644 index a2ee2e8..0000000 --- a/addons/phantom_camera/fonts/Nunito-Regular.ttf.import +++ /dev/null @@ -1,36 +0,0 @@ -[remap] - -importer="font_data_dynamic" -type="FontFile" -uid="uid://dve7mgsjik4dg" -path="res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.fontdata" - -[deps] - -source_file="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" -dest_files=["res://.godot/imported/Nunito-Regular.ttf-b6054d499efa1a10921004862b1e217a.fontdata"] - -[params] - -Rendering=null -antialiasing=1 -generate_mipmaps=false -disable_embedded_bitmaps=true -multichannel_signed_distance_field=false -msdf_pixel_range=8 -msdf_size=48 -allow_system_fallback=true -force_autohinter=false -modulate_color_glyphs=false -hinting=1 -subpixel_positioning=1 -keep_rounding_remainders=true -oversampling=0.0 -Fallbacks=null -fallbacks=[] -Compress=null -compress=true -preload=[] -language_support={} -script_support={} -opentype_features={} diff --git a/addons/phantom_camera/icons/misc/PriorityOverride.svg b/addons/phantom_camera/icons/misc/PriorityOverride.svg deleted file mode 100644 index de7fd01..0000000 --- a/addons/phantom_camera/icons/misc/PriorityOverride.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/addons/phantom_camera/icons/misc/PriorityOverride.svg.import b/addons/phantom_camera/icons/misc/PriorityOverride.svg.import deleted file mode 100644 index 79ad2a1..0000000 --- a/addons/phantom_camera/icons/misc/PriorityOverride.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dy8eifa6aw2en" -path="res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/misc/PriorityOverride.svg" -dest_files=["res://.godot/imported/PriorityOverride.svg-e76e07f4bbd98169f119e17fe5f2f03f.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg b/addons/phantom_camera/icons/phantom_camera_2d.svg deleted file mode 100644 index 0c67805..0000000 --- a/addons/phantom_camera/icons/phantom_camera_2d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/phantom_camera/icons/phantom_camera_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_2d.svg.import deleted file mode 100644 index 9fe97c8..0000000 --- a/addons/phantom_camera/icons/phantom_camera_2d.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dchkkx4v3ikpw" -path="res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_2d.svg" -dest_files=["res://.godot/imported/phantom_camera_2d.svg-e5483cbc858fc5f95f7210b1649dff0d.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg b/addons/phantom_camera/icons/phantom_camera_3d.svg deleted file mode 100644 index db18730..0000000 --- a/addons/phantom_camera/icons/phantom_camera_3d.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/phantom_camera/icons/phantom_camera_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_3d.svg.import deleted file mode 100644 index 8d1154b..0000000 --- a/addons/phantom_camera/icons/phantom_camera_3d.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c71drpb8o4prn" -path="res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_3d.svg" -dest_files=["res://.godot/imported/phantom_camera_3d.svg-41ed612e834470377fb56eebffa083fe.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg deleted file mode 100644 index 282adf2..0000000 --- a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import deleted file mode 100644 index a2a2fa6..0000000 --- a/addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dnaykbu6ue5lo" -path="res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg" -dest_files=["res://.godot/imported/phantom_camera_camera_3d_resource.svg-f8bf8d1a5b7442fd6933bfbed999d57d.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_gizmo.svg b/addons/phantom_camera/icons/phantom_camera_gizmo.svg deleted file mode 100644 index d791ce0..0000000 --- a/addons/phantom_camera/icons/phantom_camera_gizmo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import b/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import deleted file mode 100644 index e46b332..0000000 --- a/addons/phantom_camera/icons/phantom_camera_gizmo.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://e36npe2rbxyg" -path.s3tc="res://.godot/imported/phantom_camera_gizmo.svg-ba1aacb9b1c5f4ef401d3bd3697a542b.s3tc.ctex" -metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_gizmo.svg" -dest_files=["res://.godot/imported/phantom_camera_gizmo.svg-ba1aacb9b1c5f4ef401d3bd3697a542b.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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_glow_logo.png b/addons/phantom_camera/icons/phantom_camera_glow_logo.png deleted file mode 100644 index 41ad8de..0000000 Binary files a/addons/phantom_camera/icons/phantom_camera_glow_logo.png and /dev/null differ diff --git a/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import b/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import deleted file mode 100644 index 8cc3625..0000000 --- a/addons/phantom_camera/icons/phantom_camera_glow_logo.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cjli3p2b8mfyh" -path="res://.godot/imported/phantom_camera_glow_logo.png-078f944973b55b32029ba02980211fe0.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_glow_logo.png" -dest_files=["res://.godot/imported/phantom_camera_glow_logo.png-078f944973b55b32029ba02980211fe0.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=false -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 diff --git a/addons/phantom_camera/icons/phantom_camera_host.svg b/addons/phantom_camera/icons/phantom_camera_host.svg deleted file mode 100644 index 4ff3ada..0000000 --- a/addons/phantom_camera/icons/phantom_camera_host.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/phantom_camera/icons/phantom_camera_host.svg.import b/addons/phantom_camera/icons/phantom_camera_host.svg.import deleted file mode 100644 index bd05ffc..0000000 --- a/addons/phantom_camera/icons/phantom_camera_host.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://5fatldiu7dd5" -path="res://.godot/imported/phantom_camera_host.svg-3150f8f2d82ca9ecab9a3a415da21c5b.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_host.svg" -dest_files=["res://.godot/imported/phantom_camera_host.svg-3150f8f2d82ca9ecab9a3a415da21c5b.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true diff --git a/addons/phantom_camera/icons/phantom_camera_logo.png b/addons/phantom_camera/icons/phantom_camera_logo.png deleted file mode 100644 index bc43e56..0000000 Binary files a/addons/phantom_camera/icons/phantom_camera_logo.png and /dev/null differ diff --git a/addons/phantom_camera/icons/phantom_camera_logo.png.import b/addons/phantom_camera/icons/phantom_camera_logo.png.import deleted file mode 100644 index 12e3ccd..0000000 --- a/addons/phantom_camera/icons/phantom_camera_logo.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cc0wmici0eic8" -path="res://.godot/imported/phantom_camera_logo.png-8b8d347b5e4800c86cd8095d030a3e5a.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_logo.png" -dest_files=["res://.godot/imported/phantom_camera_logo.png-8b8d347b5e4800c86cd8095d030a3e5a.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=false -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 diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg deleted file mode 100644 index f6fbad3..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import deleted file mode 100644 index f25e7c0..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b2r7mhd780y8d" -path="res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg" -dest_files=["res://.godot/imported/phantom_camera_noise_emitter_2d.svg-1b3d37fe36964dc86a6ea6681d0772bb.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg deleted file mode 100644 index c567f6a..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import deleted file mode 100644 index fd4775c..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cby76y7m6xn4f" -path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.s3tc.ctex" -metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg" -dest_files=["res://.godot/imported/phantom_camera_noise_emitter_3d.svg-9b90fe54aa618f65d52ac94515d41ea4.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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg deleted file mode 100644 index 9b9bcb2..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import deleted file mode 100644 index f94b1f9..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dw4iy855s0atm" -path.s3tc="res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.s3tc.ctex" -metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg" -dest_files=["res://.godot/imported/phantom_camera_noise_emitter_gizmo.svg-9a593802655a8d5038c7f55deab3882d.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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg deleted file mode 100644 index d3c6deb..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import b/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import deleted file mode 100644 index 92c7e3d..0000000 --- a/addons/phantom_camera/icons/phantom_camera_noise_resource.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://fudwitkewe70" -path="res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg" -dest_files=["res://.godot/imported/phantom_camera_noise_resource.svg-a81ed223714edd2c0d9cfa00be0c3f58.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/phantom_camera_tween.svg b/addons/phantom_camera/icons/phantom_camera_tween.svg deleted file mode 100644 index 6956fb5..0000000 --- a/addons/phantom_camera/icons/phantom_camera_tween.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/addons/phantom_camera/icons/phantom_camera_tween.svg.import b/addons/phantom_camera/icons/phantom_camera_tween.svg.import deleted file mode 100644 index b9e024b..0000000 --- a/addons/phantom_camera/icons/phantom_camera_tween.svg.import +++ /dev/null @@ -1,44 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dphl04mdf3220" -path="res://.godot/imported/phantom_camera_tween.svg-16faced08ef4a5f3458264d894230dbd.ctex" -metadata={ -"has_editor_variant": true, -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_tween.svg" -dest_files=["res://.godot/imported/phantom_camera_tween.svg-16faced08ef4a5f3458264d894230dbd.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=true diff --git a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg b/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg deleted file mode 100644 index 6d3bcd4..0000000 --- a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import b/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import deleted file mode 100644 index d1ace76..0000000 --- a/addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://d4j4hrb7yusyq" -path="res://.godot/imported/phantom_camera_updater_panel_icon.svg-19823e6cbee8115f8b2554d0ee6e79db.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg" -dest_files=["res://.godot/imported/phantom_camera_updater_panel_icon.svg-19823e6cbee8115f8b2554d0ee6e79db.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg deleted file mode 100644 index 59efad4..0000000 --- a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import deleted file mode 100644 index 714d685..0000000 --- a/addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ccnsrg8hq74p2" -path="res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg" -dest_files=["res://.godot/imported/Camera2DIcon.svg-300e6f57281180711c5ecf391104d4ba.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg deleted file mode 100644 index 2366c3f..0000000 --- a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import b/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import deleted file mode 100644 index be171ac..0000000 --- a/addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dkiefpjsrj37n" -path="res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg" -dest_files=["res://.godot/imported/Camera3DIcon.svg-4805c46004db1c89cc9443dd740693f5.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg deleted file mode 100644 index 87e3f79..0000000 --- a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import b/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import deleted file mode 100644 index e97d921..0000000 --- a/addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dk7omm0x44suj" -path="res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg" -dest_files=["res://.godot/imported/SceneTypesIcon.svg-66e2255bd3398007bec03a5cbfa4d0aa.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=false -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 -svg/scale=1.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/viewfinder/Select.svg b/addons/phantom_camera/icons/viewfinder/Select.svg deleted file mode 100644 index 34b109b..0000000 --- a/addons/phantom_camera/icons/viewfinder/Select.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/addons/phantom_camera/icons/viewfinder/Select.svg.import b/addons/phantom_camera/icons/viewfinder/Select.svg.import deleted file mode 100644 index b1cb20c..0000000 --- a/addons/phantom_camera/icons/viewfinder/Select.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://rghrkoqrm2ig" -path="res://.godot/imported/Select.svg-cdf90b8b400d3b91a023b70c6a823894.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/viewfinder/Select.svg" -dest_files=["res://.godot/imported/Select.svg-cdf90b8b400d3b91a023b70c6a823894.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=false -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 -svg/scale=2.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/icons/warning.svg b/addons/phantom_camera/icons/warning.svg deleted file mode 100644 index 63dbedf..0000000 --- a/addons/phantom_camera/icons/warning.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/addons/phantom_camera/icons/warning.svg.import b/addons/phantom_camera/icons/warning.svg.import deleted file mode 100644 index 07b7909..0000000 --- a/addons/phantom_camera/icons/warning.svg.import +++ /dev/null @@ -1,43 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cjlv0bg7byjx0" -path="res://.godot/imported/warning.svg-c1b21c265e0842bbdc9ed10735995366.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://addons/phantom_camera/icons/warning.svg" -dest_files=["res://.godot/imported/warning.svg-c1b21c265e0842bbdc9ed10735995366.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=false -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 -svg/scale=2.0 -editor/scale_with_editor_scale=false -editor/convert_colors_with_editor_theme=false diff --git a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd deleted file mode 100644 index d5a0d22..0000000 --- a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd +++ /dev/null @@ -1,46 +0,0 @@ -@tool -extends EditorInspectorPlugin - -#var _phantom_camera_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera.gd") - - -# TODO - Enable again once work is resumed for inspector based tasks - -#func _can_handle(object) -> bool: -# return object is _phantom_camera_script - - -func _parse_category(object: Object, category: String) -> void: - - var _margin_container: MarginContainer = MarginContainer.new() - var _margin_v: float = 20 - _margin_container.add_theme_constant_override("margin_left", 10) - _margin_container.add_theme_constant_override("margin_top", _margin_v) - _margin_container.add_theme_constant_override("margin_right", 10) - _margin_container.add_theme_constant_override("margin_bottom", _margin_v) - add_custom_control(_margin_container) - - var _vbox_container: VBoxContainer = VBoxContainer.new() - _margin_container.add_child(_vbox_container) - - var align_with_view_button = Button.new() - align_with_view_button.connect("pressed", _align_camera_with_view.bind(object)) - align_with_view_button.set_custom_minimum_size(Vector2(0, 60)) - align_with_view_button.set_text("Align with view") - _vbox_container.add_child(align_with_view_button) - - var preview_camera_button = Button.new() - preview_camera_button.connect("pressed", _preview_camera.bind(object)) - preview_camera_button.set_custom_minimum_size(Vector2(0, 60)) - preview_camera_button.set_text("Preview Camera") - _vbox_container.add_child(preview_camera_button) - - - -func _align_camera_with_view(object: Object) -> void: - print("Aligning camera with view") - print(object) - -func _preview_camera(object: Object) -> void: - print("Previewing camera") - print(object) diff --git a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid b/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid deleted file mode 100644 index 325b3c0..0000000 --- a/addons/phantom_camera/inspector/phantom_camera_inspector_plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dhwxgngr7sn6d diff --git a/addons/phantom_camera/panel/editor.gd.uid b/addons/phantom_camera/panel/editor.gd.uid deleted file mode 100644 index 52a27c4..0000000 --- a/addons/phantom_camera/panel/editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ppret7j0jle7 diff --git a/addons/phantom_camera/panel/editor.tscn b/addons/phantom_camera/panel/editor.tscn deleted file mode 100644 index 0c75c6a..0000000 --- a/addons/phantom_camera/panel/editor.tscn +++ /dev/null @@ -1,23 +0,0 @@ -[gd_scene load_steps=4 format=3 uid="uid://cfdoaceoosi1w"] - -[ext_resource type="Script" uid="uid://cgfwg3paxkj2x" path="res://addons/phantom_camera/scripts/panel/editor.gd" id="1_86hp7"] -[ext_resource type="PackedScene" uid="uid://cuqkqsp3ikv5u" path="res://addons/phantom_camera/panel/updater/update_button.tscn" id="1_oowcd"] -[ext_resource type="PackedScene" uid="uid://dbkr3d716wtx0" path="res://addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn" id="2_xecnk"] - -[node name="EditorPanel" type="VBoxContainer"] -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_86hp7") - -[node name="UpdateButton" parent="." instance=ExtResource("1_oowcd")] -unique_name_in_owner = true -layout_mode = 2 -size_flags_horizontal = 8 -size_flags_vertical = 1 - -[node name="ViewfinderPanel" parent="." instance=ExtResource("2_xecnk")] -unique_name_in_owner = true -layout_mode = 2 diff --git a/addons/phantom_camera/panel/updater/download_update_panel.tscn b/addons/phantom_camera/panel/updater/download_update_panel.tscn deleted file mode 100644 index 5fa49e3..0000000 --- a/addons/phantom_camera/panel/updater/download_update_panel.tscn +++ /dev/null @@ -1,253 +0,0 @@ -[gd_scene load_steps=15 format=3 uid="uid://b25fl4usw0nlp"] - -[ext_resource type="Script" uid="uid://cjblcocen12r3" path="res://addons/phantom_camera/scripts/panel/updater/download_update_panel.gd" id="1_sx5xq"] -[ext_resource type="Texture2D" uid="uid://cc0wmici0eic8" path="res://addons/phantom_camera/icons/phantom_camera_logo.png" id="2_f3yo7"] -[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_h8uk3"] -[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="4_gwh4i"] -[ext_resource type="Texture2D" uid="uid://censw3w53gldn" path="res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png" id="5_bonti"] - -[sub_resource type="ImageTexture" id="ImageTexture_sjwi2"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_insma"] -bg_color = Color(0.0190018, 0.21903, 0.16997, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.0980392, 0.572549, 0.458824, 1) -border_blend = true -corner_radius_bottom_right = 12 -corner_radius_bottom_left = 12 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_8m63d"] -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.105882, 0.619608, 0.498039, 1) -corner_radius_bottom_right = 12 -corner_radius_bottom_left = 12 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yn22d"] -bg_color = Color(0.0117647, 0.164706, 0.12549, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.0980392, 0.572549, 0.458824, 1) -border_blend = true -corner_radius_bottom_right = 12 -corner_radius_bottom_left = 12 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_djsbc"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_xtrn6"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_o12j0"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_buptb"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g3tf0"] - -[node name="DownloadUpdatePanel" type="Control"] -custom_minimum_size = Vector2(300, 350) -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_bottom = -61.0 -grow_horizontal = 2 -grow_vertical = 2 -script = ExtResource("1_sx5xq") - -[node name="DownloadHTTPRequest" type="HTTPRequest" parent="."] -unique_name_in_owner = true - -[node name="Timer" type="Timer" parent="DownloadHTTPRequest"] -one_shot = true - -[node name="VBox" type="VBoxContainer" parent="."] -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_constants/separation = 2 - -[node name="VBoxContainer2" type="VBoxContainer" parent="VBox"] -layout_mode = 2 -theme_override_constants/separation = -20 - -[node name="MarginContainer" type="MarginContainer" parent="VBox/VBoxContainer2"] -layout_mode = 2 -theme_override_constants/margin_top = 12 - -[node name="Logo" type="TextureRect" parent="VBox/VBoxContainer2/MarginContainer"] -unique_name_in_owner = true -clip_contents = true -custom_minimum_size = Vector2(300, 160) -layout_mode = 2 -texture = ExtResource("2_f3yo7") -expand_mode = 3 -stretch_mode = 5 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBox/VBoxContainer2"] -layout_mode = 2 -theme_override_constants/separation = -5 - -[node name="NameLabel" type="Label" parent="VBox/VBoxContainer2/VBoxContainer"] -layout_mode = 2 -theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1) -theme_override_fonts/font = ExtResource("3_h8uk3") -theme_override_font_sizes/font_size = 32 -text = "Phantom Camera" -horizontal_alignment = 1 - -[node name="DownloadVersionLabel" type="Label" parent="VBox/VBoxContainer2/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1) -theme_override_fonts/font = ExtResource("4_gwh4i") -theme_override_font_sizes/font_size = 18 -text = "v1.2.3 is available for download." -horizontal_alignment = 1 - -[node name="CurrentVersionLabel" type="Label" parent="VBox"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -theme_override_fonts/font = ExtResource("4_gwh4i") -text = "Current version: 0.0.0" -horizontal_alignment = 1 - -[node name="Center2" type="CenterContainer" parent="VBox"] -layout_mode = 2 - -[node name="NotesButton" type="LinkButton" parent="VBox/Center2"] -layout_mode = 2 -theme_override_colors/font_color = Color(0.917647, 0.631373, 0.368627, 1) -theme_override_colors/font_hover_color = Color(0.721569, 0.454902, 0.192157, 1) -theme_override_fonts/font = ExtResource("3_h8uk3") -theme_override_font_sizes/font_size = 18 -text = "Release Notes" - -[node name="Center" type="CenterContainer" parent="VBox"] -layout_mode = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBox/Center"] -layout_mode = 2 - -[node name="BreakingLabel" type="Label" parent="VBox/Center/VBoxContainer"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -theme_override_colors/font_color = Color(0.72549, 0.227451, 0.34902, 1) -theme_override_fonts/font = ExtResource("3_h8uk3") -theme_override_font_sizes/font_size = 18 -text = "Potential Breaking Changes -in new release" -horizontal_alignment = 1 -uppercase = true - -[node name="BreakingMarginContainer" type="MarginContainer" parent="VBox/Center/VBoxContainer"] -unique_name_in_owner = true -visible = false -layout_mode = 2 - -[node name="VBoxContainer" type="VBoxContainer" parent="VBox/Center/VBoxContainer/BreakingMarginContainer"] -layout_mode = 2 - -[node name="RichTextLabel2" type="RichTextLabel" parent="VBox/Center/VBoxContainer/BreakingMarginContainer/VBoxContainer"] -layout_mode = 2 -theme_override_fonts/normal_font = ExtResource("4_gwh4i") -theme_override_fonts/bold_font = ExtResource("3_h8uk3") -theme_override_fonts/mono_font = ExtResource("3_h8uk3") -theme_override_font_sizes/normal_font_size = 18 -theme_override_font_sizes/bold_font_size = 14 -theme_override_font_sizes/mono_font_size = 12 -bbcode_enabled = true -text = "[center][b]I am prepared for any breaking -changes that may occur from this update[/b][/center]" -fit_content = true - -[node name="BreakingOptionButton" type="OptionButton" parent="VBox/Center/VBoxContainer/BreakingMarginContainer/VBoxContainer"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -mouse_default_cursor_shape = 2 -theme_override_fonts/font = ExtResource("3_h8uk3") -theme_override_font_sizes/font_size = 18 -theme_override_icons/arrow = SubResource("ImageTexture_sjwi2") -theme_override_styles/normal = SubResource("StyleBoxFlat_insma") -theme_override_styles/hover = SubResource("StyleBoxFlat_8m63d") -theme_override_styles/pressed = SubResource("StyleBoxFlat_yn22d") -alignment = 1 -item_count = 2 -selected = 0 -popup/item_0/text = "Confirm choice" -popup/item_0/id = 0 -popup/item_1/text = "Yes, I am prepared" -popup/item_1/id = 1 - -[node name="DownloadButton" type="Button" parent="VBox/Center/VBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(240, 90) -layout_mode = 2 -mouse_default_cursor_shape = 2 -theme_override_styles/normal = SubResource("StyleBoxEmpty_djsbc") -theme_override_styles/hover = SubResource("StyleBoxEmpty_xtrn6") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_o12j0") -theme_override_styles/disabled = SubResource("StyleBoxEmpty_buptb") -theme_override_styles/focus = SubResource("StyleBoxEmpty_g3tf0") - -[node name="DownloadButtonBG" type="NinePatchRect" parent="VBox/Center/VBoxContainer/DownloadButton"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -texture = ExtResource("5_bonti") -patch_margin_left = 38 -patch_margin_top = 37 -patch_margin_right = 38 -patch_margin_bottom = 39 - -[node name="UpdateLabel" type="Label" parent="VBox/Center/VBoxContainer/DownloadButton"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 14 -anchor_top = 0.5 -anchor_right = 1.0 -anchor_bottom = 0.5 -offset_top = -14.5 -offset_bottom = 14.5 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1) -theme_override_colors/font_shadow_color = Color(0, 0, 0, 1) -theme_override_fonts/font = ExtResource("3_h8uk3") -theme_override_font_sizes/font_size = 20 -text = "Update" -horizontal_alignment = 1 -uppercase = true - -[node name="MarginContainer" type="MarginContainer" parent="VBox"] -layout_mode = 2 -theme_override_constants/margin_top = 10 - -[node name="RichTextLabel" type="RichTextLabel" parent="VBox/MarginContainer"] -layout_mode = 2 -theme_override_fonts/normal_font = ExtResource("4_gwh4i") -theme_override_fonts/mono_font = ExtResource("3_h8uk3") -theme_override_font_sizes/normal_font_size = 12 -theme_override_font_sizes/mono_font_size = 12 -bbcode_enabled = true -text = "[center]The updater can be disabled within: -[code]Project Settings / Phantom Camera / Updater / Enable Updater[/code][/center]" -fit_content = true - -[connection signal="pressed" from="VBox/Center2/NotesButton" to="." method="_on_notes_button_pressed"] diff --git a/addons/phantom_camera/panel/updater/update_button.tscn b/addons/phantom_camera/panel/updater/update_button.tscn deleted file mode 100644 index a6efba1..0000000 --- a/addons/phantom_camera/panel/updater/update_button.tscn +++ /dev/null @@ -1,101 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://cuqkqsp3ikv5u"] - -[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="1_5e5k4"] -[ext_resource type="Script" uid="uid://bwc42i46603qn" path="res://addons/phantom_camera/scripts/panel/updater/update_button.gd" id="1_xtaw5"] -[ext_resource type="Texture2D" uid="uid://d4j4hrb7yusyq" path="res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg" id="2_c4d83"] -[ext_resource type="PackedScene" uid="uid://b25fl4usw0nlp" path="res://addons/phantom_camera/panel/updater/download_update_panel.tscn" id="2_vtgcx"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_c7fd1"] -content_margin_left = 10.0 -content_margin_top = 4.0 -content_margin_right = 10.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0980392, 0.415686, 0.341176, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 20 -corner_radius_top_right = 20 -corner_radius_bottom_right = 20 -corner_radius_bottom_left = 20 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_y83dj"] -content_margin_left = 10.0 -content_margin_top = 4.0 -content_margin_right = 10.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.960784, 0.960784, 0.960784, 1) -corner_radius_top_left = 20 -corner_radius_top_right = 20 -corner_radius_bottom_right = 20 -corner_radius_bottom_left = 20 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_slf6e"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_lekqh"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dr4n4"] -content_margin_bottom = 20.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) - -[node name="UpdateButton" type="Button"] -visible = false -offset_left = 1.0 -offset_right = 149.0 -offset_bottom = 28.0 -size_flags_vertical = 3 -theme_override_colors/font_color = Color(0.960784, 0.960784, 0.960784, 1) -theme_override_colors/font_hover_color = Color(0.939288, 0.917743, 0.892615, 1) -theme_override_colors/icon_normal_color = Color(0.960784, 0.960784, 0.960784, 1) -theme_override_fonts/font = ExtResource("1_5e5k4") -theme_override_font_sizes/font_size = 14 -theme_override_styles/normal = SubResource("StyleBoxFlat_c7fd1") -theme_override_styles/hover = SubResource("StyleBoxFlat_y83dj") -theme_override_styles/pressed = SubResource("StyleBoxEmpty_slf6e") -theme_override_styles/focus = SubResource("StyleBoxEmpty_lekqh") -text = "Update available" -icon = ExtResource("2_c4d83") -script = ExtResource("1_xtaw5") - -[node name="HTTPRequest" type="HTTPRequest" parent="."] -unique_name_in_owner = true - -[node name="DownloadDialog" type="AcceptDialog" parent="."] -unique_name_in_owner = true -transparent_bg = true -title = "New Update" -initial_position = 2 -size = Vector2i(450, 480) -transient = false -unresizable = true -borderless = true -keep_title_visible = false -content_scale_mode = 1 -theme_override_constants/buttons_separation = 30 -theme_override_styles/panel = SubResource("StyleBoxFlat_dr4n4") -ok_button_text = "Close" - -[node name="DownloadUpdatePanel" parent="DownloadDialog" instance=ExtResource("2_vtgcx")] -unique_name_in_owner = true -offset_left = 2.0 -offset_top = 2.0 -offset_right = -2.0 -offset_bottom = -80.0 - -[node name="NeedsReloadDialog" type="ConfirmationDialog" parent="."] -unique_name_in_owner = true - -[node name="UpdateFailedDialog" type="AcceptDialog" parent="."] -unique_name_in_owner = true diff --git a/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres b/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres deleted file mode 100644 index 7353299..0000000 --- a/addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres +++ /dev/null @@ -1,14 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://dpa7yvxlq043a"] - -[resource] -bg_color = Color(0.227451, 0.72549, 0.603922, 0.2) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_detail = 1 -expand_margin_left = 1.0 -expand_margin_top = 1.0 -expand_margin_right = 1.0 -expand_margin_bottom = 1.0 diff --git a/addons/phantom_camera/panel/viewfinder/host_list/host_list.tscn b/addons/phantom_camera/panel/viewfinder/host_list/host_list.tscn deleted file mode 100644 index 332415d..0000000 --- a/addons/phantom_camera/panel/viewfinder/host_list/host_list.tscn +++ /dev/null @@ -1,87 +0,0 @@ -[gd_scene load_steps=8 format=3 uid="uid://mbjdav5oqves"] - -[ext_resource type="Script" uid="uid://c84cxry3t35ny" path="res://addons/phantom_camera/scripts/panel/viewfinder/host_list.gd" id="1_h6ayt"] -[ext_resource type="Texture2D" uid="uid://5fatldiu7dd5" path="res://addons/phantom_camera/icons/phantom_camera_host.svg" id="1_xlgqb"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_w002y"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kq7gm"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_color = Color(0.960784, 0.960784, 0.960784, 1) -corner_radius_top_right = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ynag5"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.960784, 0.960784, 0.960784, 1) -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_right = 6 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q2svd"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_right = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_e0jvt"] -content_margin_left = 0.0 -content_margin_top = 8.0 -content_margin_right = 0.0 -content_margin_bottom = 8.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_right = 10 - -[node name="PCamHostList" type="VBoxContainer"] -anchors_preset = 9 -anchor_bottom = 1.0 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_constants/separation = -2 -alignment = 2 -script = ExtResource("1_h6ayt") - -[node name="HostListButton" type="Button" parent="."] -unique_name_in_owner = true -custom_minimum_size = Vector2(40, 40) -layout_mode = 2 -size_flags_horizontal = 0 -theme_override_colors/icon_hover_color = Color(0.0784314, 0.109804, 0.129412, 1) -theme_override_colors/icon_hover_pressed_color = Color(0.0784314, 0.109804, 0.129412, 1) -theme_override_styles/focus = SubResource("StyleBoxEmpty_w002y") -theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_kq7gm") -theme_override_styles/hover = SubResource("StyleBoxFlat_ynag5") -theme_override_styles/pressed = SubResource("StyleBoxFlat_kq7gm") -theme_override_styles/normal = SubResource("StyleBoxFlat_q2svd") -icon = ExtResource("1_xlgqb") -expand_icon = true - -[node name="ScrollContainer" type="ScrollContainer" parent="."] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme_override_styles/panel = SubResource("StyleBoxFlat_e0jvt") -horizontal_scroll_mode = 0 - -[node name="HostListContainer" type="VBoxContainer" parent="ScrollContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_constants/separation = 8 diff --git a/addons/phantom_camera/panel/viewfinder/host_list/host_list_item.tscn b/addons/phantom_camera/panel/viewfinder/host_list/host_list_item.tscn deleted file mode 100644 index 9ce67e5..0000000 --- a/addons/phantom_camera/panel/viewfinder/host_list/host_list_item.tscn +++ /dev/null @@ -1,68 +0,0 @@ -[gd_scene load_steps=10 format=3 uid="uid://btn6jgv0vix7"] - -[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="1_anjxo"] -[ext_resource type="Theme" uid="uid://bhppejri5dbsf" path="res://addons/phantom_camera/themes/theme.tres" id="1_wql5t"] -[ext_resource type="Texture2D" uid="uid://rghrkoqrm2ig" path="res://addons/phantom_camera/icons/viewfinder/Select.svg" id="2_71b6g"] -[ext_resource type="ButtonGroup" uid="uid://dfu0b8jbtyr1n" path="res://addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres" id="3_06a0y"] -[ext_resource type="Script" uid="uid://bv24ubx8mutw7" path="res://addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd" id="3_a5o8b"] -[ext_resource type="Texture2D" uid="uid://cjlv0bg7byjx0" path="res://addons/phantom_camera/icons/warning.svg" id="3_qgpy7"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0rxfi"] -content_margin_right = 6.0 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_llqnh"] - -[sub_resource type="Theme" id="Theme_7h15c"] -Button/colors/icon_hover_color = Color(0.960784, 0.960784, 0.960784, 1) -Button/colors/icon_hover_pressed_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/colors/icon_normal_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/colors/icon_pressed_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/constants/icon_max_width = 20 -Button/styles/focus = SubResource("StyleBoxEmpty_llqnh") - -[node name="HostListItem" type="PanelContainer"] -offset_right = 229.0 -offset_bottom = 34.0 -theme_override_styles/panel = SubResource("StyleBoxEmpty_0rxfi") -script = ExtResource("3_a5o8b") - -[node name="HBoxContainer" type="HBoxContainer" parent="."] -layout_mode = 2 -theme_override_constants/separation = 2 - -[node name="SelectPCamHost" type="Button" parent="HBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 4 -tooltip_text = "Select the Phantom Camera Host node from the scene hierarchy" -focus_mode = 0 -theme = SubResource("Theme_7h15c") -icon = ExtResource("2_71b6g") -flat = true - -[node name="HBoxContainer" type="HBoxContainer" parent="HBoxContainer"] -layout_mode = 2 -theme_override_constants/separation = 8 - -[node name="ErrorPCamHost" type="TextureRect" parent="HBoxContainer/HBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(18, 18) -layout_mode = 2 -size_flags_horizontal = 3 -size_flags_vertical = 4 -tooltip_text = "This Phantom Camera Host node will not affect a Camera node. -See the warning in the Scene Tree for more information." -texture = ExtResource("3_qgpy7") -expand_mode = 1 - -[node name="SwitchPCamHost" type="Button" parent="HBoxContainer/HBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(40, 0) -layout_mode = 2 -tooltip_text = "Change the viewfinder's camera to the camera of this Phantom Camera Host" -theme = ExtResource("1_wql5t") -theme_override_fonts/font = ExtResource("1_anjxo") -theme_override_font_sizes/font_size = 18 -toggle_mode = true -button_group = ExtResource("3_06a0y") -text = "{ PCamHostName }" diff --git a/addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres b/addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres deleted file mode 100644 index 64c4600..0000000 --- a/addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres +++ /dev/null @@ -1,3 +0,0 @@ -[gd_resource type="ButtonGroup" format=3 uid="uid://dfu0b8jbtyr1n"] - -[resource] diff --git a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn b/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn deleted file mode 100644 index b6caa0d..0000000 --- a/addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn +++ /dev/null @@ -1,563 +0,0 @@ -[gd_scene load_steps=28 format=3 uid="uid://dbkr3d716wtx0"] - -[ext_resource type="Script" uid="uid://drmv3363t8amc" path="res://addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd" id="1_utvi8"] -[ext_resource type="StyleBox" uid="uid://dpa7yvxlq043a" path="res://addons/phantom_camera/panel/viewfinder/deadzone_style_box.tres" id="2_uabt4"] -[ext_resource type="FontFile" uid="uid://c4mm3of2mc8o5" path="res://addons/phantom_camera/fonts/Nunito-Black.ttf" id="3_li3i3"] -[ext_resource type="Texture2D" uid="uid://5fatldiu7dd5" path="res://addons/phantom_camera/icons/phantom_camera_host.svg" id="4_lcg1p"] -[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="5_4jhax"] -[ext_resource type="Texture2D" uid="uid://dy8eifa6aw2en" path="res://addons/phantom_camera/icons/misc/PriorityOverride.svg" id="6_ptuth"] -[ext_resource type="Script" uid="uid://c84cxry3t35ny" path="res://addons/phantom_camera/scripts/panel/viewfinder/host_list.gd" id="7_kpij0"] -[ext_resource type="Theme" uid="uid://bhppejri5dbsf" path="res://addons/phantom_camera/themes/theme.tres" id="8_b4akn"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fle8t"] -bg_color = Color(0.227451, 0.72549, 0.603922, 0.2) -draw_center = false -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_detail = 1 -expand_margin_left = 1.0 -expand_margin_top = 1.0 -expand_margin_right = 1.0 -expand_margin_bottom = 1.0 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_xmo1t"] -draw_center = false -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0.745098, 0.858824, 0.380392, 1) - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q7vs4"] -bg_color = Color(0.929412, 0.87451, 0.619608, 1) -border_width_left = 1 -border_width_top = 1 -border_width_right = 1 -border_width_bottom = 1 -border_color = Color(0, 0, 0, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_iho1a"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_obaj6"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_4b76l"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_yh38y"] -content_margin_left = 10.0 -content_margin_top = 10.0 -content_margin_right = 10.0 -content_margin_bottom = 10.0 -bg_color = Color(0.129412, 0.407843, 0.337255, 1) -border_width_left = 4 -border_width_top = 4 -border_width_right = 4 -border_width_bottom = 4 -border_color = Color(0.988235, 0.498039, 0.498039, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_gci88"] -content_margin_left = 10.0 -content_margin_top = 10.0 -content_margin_right = 10.0 -content_margin_bottom = 10.0 -bg_color = Color(0.180392, 0.576471, 0.482353, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_fsxik"] -content_margin_left = 10.0 -content_margin_top = 10.0 -content_margin_right = 10.0 -content_margin_bottom = 10.0 -bg_color = Color(0.129412, 0.407843, 0.337255, 1) -border_width_left = 4 -border_width_top = 4 -border_width_right = 4 -border_width_bottom = 4 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_g5wua"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_x4bx8"] - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_840sd"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ja3vm"] -bg_color = Color(0.53, 0.1643, 0.255725, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_blend = true -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_mk273"] -bg_color = Color(0.43, 0.1333, 0.207475, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_blend = true -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_agqdu"] -bg_color = Color(0.72549, 0.227451, 0.34902, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_blend = true -corner_radius_top_left = 10 -corner_radius_top_right = 10 -corner_radius_bottom_right = 10 -corner_radius_bottom_left = 10 - -[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_w002y"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_kq7gm"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_color = Color(0.960784, 0.960784, 0.960784, 1) -corner_radius_top_right = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ynag5"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.960784, 0.960784, 0.960784, 1) -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_right = 6 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_q2svd"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_right = 8 - -[node name="ViewfinderPanel" type="Control"] -clip_contents = true -custom_minimum_size = Vector2(0, 300) -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -size_flags_horizontal = 3 -size_flags_vertical = 3 -mouse_filter = 2 -script = ExtResource("1_utvi8") - -[node name="Viewfinder" type="Control" parent="."] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -metadata/_edit_lock_ = true - -[node name="SubViewportContainer" type="SubViewportContainer" parent="Viewfinder"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -stretch = true - -[node name="SubViewport" type="SubViewport" parent="Viewfinder/SubViewportContainer"] -unique_name_in_owner = true -handle_input_locally = false -canvas_item_default_texture_filter = 0 -gui_disable_input = true -size = Vector2i(1152, 648) -size_2d_override_stretch = true -render_target_update_mode = 4 - -[node name="Camera2D" type="Camera2D" parent="Viewfinder/SubViewportContainer/SubViewport"] -unique_name_in_owner = true -editor_draw_screen = false - -[node name="DeadZoneHBoxContainer" type="HBoxContainer" parent="Viewfinder"] -unique_name_in_owner = true -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -theme_override_constants/separation = 0 - -[node name="DeadZoneLeftHBoxContainer" type="VBoxContainer" parent="Viewfinder/DeadZoneHBoxContainer"] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -mouse_filter = 2 -theme_override_constants/separation = 0 - -[node name="DeadZoneLeftTopPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneLeftCenterPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneLeftBottomPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneLeftHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneCenterHBoxContainer" type="VBoxContainer" parent="Viewfinder/DeadZoneHBoxContainer"] -unique_name_in_owner = true -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 4 -mouse_filter = 2 -theme_override_constants/separation = 0 - -[node name="DeadZoneCenterTopPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneCenterCenterPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 4 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_fle8t") - -[node name="DeadZoneCenterBottomPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneCenterHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneRightHBoxContainer" type="VBoxContainer" parent="Viewfinder/DeadZoneHBoxContainer"] -clip_contents = true -layout_mode = 2 -size_flags_horizontal = 3 -mouse_filter = 2 -theme_override_constants/separation = 0 - -[node name="DeadZoneRightTopPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneRightCenterPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="DeadZoneRightBottomPanel" type="Panel" parent="Viewfinder/DeadZoneHBoxContainer/DeadZoneRightHBoxContainer"] -layout_mode = 2 -size_flags_vertical = 3 -mouse_filter = 2 -theme_override_styles/panel = ExtResource("2_uabt4") - -[node name="AspectRatioContainer" type="AspectRatioContainer" parent="Viewfinder"] -unique_name_in_owner = true -clip_contents = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -ratio = 1.77778 - -[node name="CameraViewportPanel" type="Panel" parent="Viewfinder/AspectRatioContainer"] -layout_mode = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_xmo1t") - -[node name="TargetPoint" type="Panel" parent="Viewfinder/AspectRatioContainer/CameraViewportPanel"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -3.0 -offset_top = -3.0 -offset_right = 3.0 -offset_bottom = 3.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -theme_override_styles/panel = SubResource("StyleBoxFlat_q7vs4") - -[node name="NoSupportMsg" type="Label" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = -8.0 -offset_bottom = -8.0 -grow_horizontal = 2 -grow_vertical = 2 -theme_override_fonts/font = ExtResource("3_li3i3") -theme_override_font_sizes/font_size = 24 -theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a") -text = "Control scenes are not supported" -horizontal_alignment = 1 -vertical_alignment = 1 -metadata/_edit_lock_ = true - -[node name="EmptyStateControl" type="Control" parent="."] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -metadata/_edit_use_anchors_ = true -metadata/_edit_lock_ = true - -[node name="BGColorRect" type="ColorRect" parent="EmptyStateControl"] -visible = false -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -color = Color(0, 0, 0, 1) -metadata/_edit_lock_ = true - -[node name="VBoxContainer" type="VBoxContainer" parent="EmptyStateControl"] -layout_mode = 1 -anchors_preset = 8 -anchor_left = 0.5 -anchor_top = 0.5 -anchor_right = 0.5 -anchor_bottom = 0.5 -offset_left = -200.0 -offset_top = -112.0 -offset_right = 200.0 -offset_bottom = 112.0 -grow_horizontal = 2 -grow_vertical = 2 -alignment = 1 - -[node name="EmptyStateIcon" type="TextureRect" parent="EmptyStateControl/VBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 64) -layout_mode = 2 -texture = ExtResource("4_lcg1p") -expand_mode = 1 -stretch_mode = 5 - -[node name="EmptyStateText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme_override_colors/default_color = Color(1, 1, 1, 1) -theme_override_fonts/normal_font = ExtResource("5_4jhax") -theme_override_fonts/bold_font = ExtResource("3_li3i3") -theme_override_font_sizes/normal_font_size = 24 -theme_override_font_sizes/bold_font_size = 24 -theme_override_styles/focus = SubResource("StyleBoxEmpty_obaj6") -theme_override_styles/normal = SubResource("StyleBoxEmpty_iho1a") -bbcode_enabled = true -text = "[center][b]NodeType[/b] Description [/center]" -fit_content = true - -[node name="AddNodeButton" type="Button" parent="EmptyStateControl/VBoxContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(400, 54) -layout_mode = 2 -size_flags_horizontal = 4 -focus_mode = 0 -theme_override_colors/font_color = Color(1, 1, 1, 1) -theme_override_fonts/font = ExtResource("3_li3i3") -theme_override_font_sizes/font_size = 24 -theme_override_styles/focus = SubResource("StyleBoxEmpty_4b76l") -theme_override_styles/hover = SubResource("StyleBoxFlat_yh38y") -theme_override_styles/pressed = SubResource("StyleBoxFlat_gci88") -theme_override_styles/normal = SubResource("StyleBoxFlat_fsxik") - -[node name="AddNodeTypeText" type="RichTextLabel" parent="EmptyStateControl/VBoxContainer/AddNodeButton"] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -offset_top = 9.0 -offset_bottom = -11.0 -grow_horizontal = 2 -grow_vertical = 2 -mouse_filter = 2 -theme_override_colors/default_color = Color(1, 1, 1, 1) -theme_override_fonts/normal_font = ExtResource("5_4jhax") -theme_override_fonts/bold_font = ExtResource("3_li3i3") -theme_override_font_sizes/normal_font_size = 24 -theme_override_font_sizes/bold_font_size = 24 -theme_override_styles/focus = SubResource("StyleBoxEmpty_g5wua") -theme_override_styles/normal = SubResource("StyleBoxEmpty_x4bx8") -bbcode_enabled = true -text = "[center]Add [img=32]res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg[/img] [b]{NodeType}[/b][/center]" -scroll_active = false - -[node name="PriorityOverrideButton" type="Button" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 1 -offset_left = 5.0 -offset_top = 5.0 -offset_right = 165.0 -offset_bottom = 57.0 -mouse_default_cursor_shape = 2 -theme_override_styles/focus = SubResource("StyleBoxEmpty_840sd") -theme_override_styles/hover = SubResource("StyleBoxFlat_ja3vm") -theme_override_styles/pressed = SubResource("StyleBoxFlat_mk273") -theme_override_styles/normal = SubResource("StyleBoxFlat_agqdu") -metadata/_edit_lock_ = true - -[node name="PriorityOverrideIcon" type="TextureRect" parent="PriorityOverrideButton"] -layout_mode = 1 -offset_left = 8.0 -offset_top = 4.0 -offset_right = 32.0 -offset_bottom = 28.0 -texture = ExtResource("6_ptuth") -expand_mode = 1 - -[node name="PriorityOverrideByLabel" type="Label" parent="PriorityOverrideButton"] -layout_mode = 0 -offset_left = 30.0 -offset_top = 1.0 -offset_right = 140.0 -offset_bottom = 24.0 -theme_override_fonts/font = ExtResource("3_li3i3") -theme_override_font_sizes/font_size = 14 -text = "OVERRIDDEN BY" -vertical_alignment = 1 - -[node name="PriorityOverrideNameLabel" type="Label" parent="PriorityOverrideButton"] -unique_name_in_owner = true -layout_mode = 0 -offset_left = 6.0 -offset_top = 21.0 -offset_right = 153.0 -offset_bottom = 44.0 -theme_override_fonts/font = ExtResource("5_4jhax") -theme_override_font_sizes/font_size = 14 -text = "PCam_Name -" -vertical_alignment = 1 -text_overrun_behavior = 3 - -[node name="SizeLabel" type="Label" parent="."] -unique_name_in_owner = true -layout_mode = 1 -anchors_preset = 4 -anchor_top = 0.5 -anchor_bottom = 0.5 -offset_top = -11.5 -offset_right = 40.0 -offset_bottom = 11.5 -grow_vertical = 2 - -[node name="PCamHostList" type="VBoxContainer" parent="."] -unique_name_in_owner = true -visible = false -layout_mode = 1 -anchors_preset = -1 -anchor_bottom = 1.0 -offset_top = 588.0 -grow_vertical = 2 -size_flags_horizontal = 0 -size_flags_vertical = 0 -theme_override_constants/separation = -2 -alignment = 2 -script = ExtResource("7_kpij0") - -[node name="HostListButton" type="Button" parent="PCamHostList"] -unique_name_in_owner = true -custom_minimum_size = Vector2(40, 40) -layout_mode = 2 -size_flags_horizontal = 0 -theme_override_colors/icon_hover_pressed_color = Color(0.0784314, 0.109804, 0.129412, 1) -theme_override_colors/icon_hover_color = Color(0.0784314, 0.109804, 0.129412, 1) -theme_override_styles/focus = SubResource("StyleBoxEmpty_w002y") -theme_override_styles/hover_pressed = SubResource("StyleBoxFlat_kq7gm") -theme_override_styles/hover = SubResource("StyleBoxFlat_ynag5") -theme_override_styles/pressed = SubResource("StyleBoxFlat_kq7gm") -theme_override_styles/normal = SubResource("StyleBoxFlat_q2svd") -icon = ExtResource("4_lcg1p") -expand_icon = true - -[node name="PanelContainer" type="PanelContainer" parent="PCamHostList"] -layout_mode = 2 -size_flags_vertical = 3 -theme = ExtResource("8_b4akn") - -[node name="ScrollContainer" type="ScrollContainer" parent="PCamHostList/PanelContainer"] -unique_name_in_owner = true -layout_mode = 2 -size_flags_vertical = 3 -theme = ExtResource("8_b4akn") -horizontal_scroll_mode = 0 - -[node name="HostListContainer" type="VBoxContainer" parent="PCamHostList/PanelContainer/ScrollContainer"] -unique_name_in_owner = true -layout_mode = 2 -theme = ExtResource("8_b4akn") diff --git a/addons/phantom_camera/plugin.cfg b/addons/phantom_camera/plugin.cfg deleted file mode 100644 index 4fcbcfe..0000000 --- a/addons/phantom_camera/plugin.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[plugin] - -name="Phantom Camera" -description="Control the movement and dynamically tween 2D & 3D cameras positions. Built for Godot 4. Inspired by Cinemachine." -author="Marcus Skov" -version="0.9.4.1" -script="plugin.gd" diff --git a/addons/phantom_camera/plugin.gd b/addons/phantom_camera/plugin.gd deleted file mode 100644 index 0421330..0000000 --- a/addons/phantom_camera/plugin.gd +++ /dev/null @@ -1,181 +0,0 @@ -@tool -extends EditorPlugin - -#region Constants - -const PCAM_HOST: String = "PhantomCameraHost" -const PCAM_2D: String = "PhantomCamera2D" -const PCAM_3D: String = "PhantomCamera3D" -const PCAM_NOISE_EMITTER_2D: String = "PhantomCameraNoiseEmitter2D" -const PCAM_NOISE_EMITTER_3D: String = "PhantomCameraNoiseEmitter3D" - -const PCam3DPlugin: Script = preload("res://addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd") -const PCam3DNoiseEmitterPlugin: Script = preload("res://addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd") -const EditorPanel: PackedScene = preload("res://addons/phantom_camera/panel/editor.tscn") -const updater_constants: Script = preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") -const PHANTOM_CAMERA_MANAGER: StringName = "PhantomCameraManager" - -#endregion - -#region Private Variables - -var _settings_show_jitter_tips: String = "phantom_camera/tips/show_jitter_tips" -var _settings_enable_editor_shortcut: String = "phantom_camera/general/enable_editor_shortcut" -var _settings_editor_shortcut: String = "phantom_camera/general/editor_shortcut" - -# TODO - Pending merge of https://github.com/godotengine/godot/pull/102889 - Should only support Godot version after the release that is featured in -#var _editor_shortcut: Shortcut = Shortcut.new() -#var _editor_shortcut_input: InputEventKey -#endregion - -#region Public Variables - -var pcam_3d_gizmo_plugin = PCam3DPlugin.new() -var pcam_3d_noise_emitter_gizmo_plugin = PCam3DNoiseEmitterPlugin.new() - -var editor_panel_instance: Control -var panel_button: Button -#var viewfinder_panel_instance - - -#endregion - -#region Private Functions - -func _enable_plugin() -> void: - print_rich("Phantom Camera documentation can be found at: [url=https://phantom-camera.dev]https://phantom-camera.dev[/url]") - if not Engine.has_singleton(PHANTOM_CAMERA_MANAGER): - add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") - - -func _disable_plugin() -> void: - remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) - - -func _enter_tree() -> void: - add_autoload_singleton(PHANTOM_CAMERA_MANAGER, "res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd") - - # Phantom Camera Nodes - add_custom_type(PCAM_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) - add_custom_type(PCAM_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) - add_custom_type(PCAM_HOST, "Node", preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg")) - add_custom_type(PCAM_NOISE_EMITTER_2D, "Node2D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg")) - add_custom_type(PCAM_NOISE_EMITTER_3D, "Node3D", preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd"), preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg")) - - # Phantom Camera 3D Gizmo - add_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) - add_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) - - var setting_updater_mode: String - var setting_updater_mode_default: int - if FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn"): # For forks - setting_updater_mode = "Off, Console Output" - setting_updater_mode_default = 1 - else: # For end-users - setting_updater_mode = "Off, Console Output, Updater Window" - setting_updater_mode_default = 2 - - if not ProjectSettings.has_setting(updater_constants.setting_updater_mode): - ProjectSettings.set_setting(updater_constants.setting_updater_mode, setting_updater_mode_default) - ProjectSettings.add_property_info({ - "name": updater_constants.setting_updater_mode, - "type": TYPE_INT, - "hint": PROPERTY_HINT_ENUM, - "hint_string": setting_updater_mode, - }) - ProjectSettings.set_initial_value(updater_constants.setting_updater_mode, setting_updater_mode_default) - ProjectSettings.set_as_basic(updater_constants.setting_updater_mode, true) - - - ## Setting for enabling / disabling Jitter tips in the Output - if not ProjectSettings.has_setting(_settings_show_jitter_tips): - ProjectSettings.set_setting(_settings_show_jitter_tips, true) - ProjectSettings.add_property_info({ - "name": _settings_show_jitter_tips, - "type": TYPE_BOOL, - }) - ProjectSettings.set_initial_value(_settings_show_jitter_tips, true) - ProjectSettings.set_as_basic(_settings_show_jitter_tips, true) - - -# TODO - Pending merge of https://github.com/godotengine/godot/pull/102889 - Should only support Godot version after this release -# if not ProjectSettings.has_setting(_settings_enable_editor_shortcut): -# ProjectSettings.set_setting(_settings_enable_editor_shortcut, false) -# ProjectSettings.set_initial_value(_settings_enable_editor_shortcut, false) - -# TODO - Pending merge of https://github.com/godotengine/godot/pull/102889 - Should only support Godot version after this release -# _viewfinder_shortcut_default.events = [editor_shortcut] -# if ProjectSettings.get_setting(_settings_enable_editor_shortcut): -# if not ProjectSettings.has_setting(_settings_editor_shortcut): -# ProjectSettings.set_setting(_settings_editor_shortcut, _editor_shortcut) -# ProjectSettings.set_initial_value(_settings_editor_shortcut, _editor_shortcut) - - - # TODO - Should be disabled unless in editor - # Viewfinder - editor_panel_instance = EditorPanel.instantiate() - editor_panel_instance.editor_plugin = self - panel_button = add_control_to_bottom_panel(editor_panel_instance, "Phantom Camera") - panel_button.toggled.connect(_btn_toggled) - if panel_button.toggle_mode: _btn_toggled(true) - - scene_changed.connect(editor_panel_instance.viewfinder.scene_changed) - scene_changed.connect(_scene_changed) - - -func _exit_tree() -> void: - panel_button.toggled.disconnect(_btn_toggled) - scene_changed.disconnect(editor_panel_instance.viewfinder.scene_changed) - scene_changed.disconnect(_scene_changed) - - remove_control_from_bottom_panel(editor_panel_instance) - editor_panel_instance.queue_free() - - remove_node_3d_gizmo_plugin(pcam_3d_gizmo_plugin) - remove_node_3d_gizmo_plugin(pcam_3d_noise_emitter_gizmo_plugin) - - remove_custom_type(PCAM_2D) - remove_custom_type(PCAM_3D) - remove_custom_type(PCAM_HOST) - remove_custom_type(PCAM_NOISE_EMITTER_2D) - remove_custom_type(PCAM_NOISE_EMITTER_3D) - - remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) -# if get_tree().root.get_node_or_null(String(PHANTOM_CAMERA_MANAGER)): -# remove_autoload_singleton(PHANTOM_CAMERA_MANAGER) - - -func _btn_toggled(toggled_on: bool): - editor_panel_instance.viewfinder.set_visibility(toggled_on) -# if toggled_on: -# editor_panel_instance.viewfinder.viewfinder_visible = true -# editor_panel_instance.viewfinder.visibility_check() -# else: -# editor_panel_instance.viewfinder.viewfinder_visible = false - -func _make_visible(visible): - if editor_panel_instance: - editor_panel_instance.set_visible(visible) - -## TODO - Signal can be added directly to the editor_panel with the changes in Godot 4.5 (https://github.com/godotengine/godot/pull/102986) -func _scene_changed(scene_root: Node) -> void: - editor_panel_instance.viewfinder.scene_changed(scene_root) - -# TODO - Pending merge of https://github.com/godotengine/godot/pull/102889 - Should only support Godot version after this release -#func _set_editor_shortcut() -> InputEventKey: -# var shortcut: InputEventKey = InputEventKey.new() -# shortcut.keycode = 67 # Key = C -# shortcut.alt_pressed = true -# return shortcut - -#endregion - - -#region Public Functions - -func get_version() -> String: - var config: ConfigFile = ConfigFile.new() - config.load(get_script().resource_path.get_base_dir() + "/plugin.cfg") - return config.get_value("plugin", "version") - -#endregion diff --git a/addons/phantom_camera/plugin.gd.uid b/addons/phantom_camera/plugin.gd.uid deleted file mode 100644 index 1c23477..0000000 --- a/addons/phantom_camera/plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c7g41in1osxi6 diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd b/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd deleted file mode 100644 index 42e71a5..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd +++ /dev/null @@ -1,85 +0,0 @@ -@tool -extends EditorNode3DGizmo - -var pcam_3d: PhantomCamera3D - -func _redraw() -> void: - clear() - - var icon: Material = get_plugin().get_material(get_plugin().get_name(), self) - add_unscaled_billboard(icon, 0.035) - - pcam_3d = get_node_3d() - - if pcam_3d.is_following() and pcam_3d.draw_follow_gizmo_line(): - _draw_target(pcam_3d.get_follow_target_position(), "follow_target") - if pcam_3d.is_looking() and pcam_3d.draw_look_at_gizmo_line(): - _draw_target(pcam_3d.get_look_at_target_position(),"look_at_target") - - if pcam_3d.is_active(): return - - var frustum_lines: PackedVector3Array = PackedVector3Array() - var height: float = 0.25 - var width: float = height * 1.25 - var forward: float = height * -1.5 - - # Trapezoid - frustum_lines.push_back(Vector3.ZERO) - frustum_lines.push_back(Vector3(-width, height, forward)) - - frustum_lines.push_back(Vector3.ZERO) - frustum_lines.push_back(Vector3(width, height, forward)) - - frustum_lines.push_back(Vector3.ZERO) - frustum_lines.push_back(Vector3(-width, -height, forward)) - - frustum_lines.push_back(Vector3.ZERO) - frustum_lines.push_back(Vector3(width, -height, forward)) - - ####### - # Frame - ####### - ## Left - frustum_lines.push_back(Vector3(-width, height, forward)) - frustum_lines.push_back(Vector3(-width, -height, forward)) - - ## Bottom - frustum_lines.push_back(Vector3(-width, -height, forward)) - frustum_lines.push_back(Vector3(width, -height, forward)) - - ## Right - frustum_lines.push_back(Vector3(width, -height, forward)) - frustum_lines.push_back(Vector3(width, height, forward)) - - ## Top - frustum_lines.push_back(Vector3(width, height, forward)) - frustum_lines.push_back(Vector3(-width, height, forward)) - - ############## - # Up Direction - ############## - var up_height: float = height + 0.15 - var up_width: float = width / 3 - - ## Left - frustum_lines.push_back(Vector3(0, up_height, forward)) - frustum_lines.push_back(Vector3(-up_width, height, forward)) - - ## Right - frustum_lines.push_back(Vector3(0, up_height, forward)) - frustum_lines.push_back(Vector3(up_width, height, forward)) - - var frustum_material: StandardMaterial3D = get_plugin().get_material("frustum", self) - add_lines(frustum_lines, frustum_material, false) - - -func _draw_target(target: Vector3, type: StringName) -> void: - var target_lines: PackedVector3Array = PackedVector3Array() - var direction: Vector3 = pcam_3d.global_position - target - var end_position: Vector3 = -direction * pcam_3d.quaternion - - target_lines.push_back(Vector3.ZERO) - target_lines.push_back(end_position) - - var target_material: StandardMaterial3D = get_plugin().get_material(type, self) - add_lines(target_lines, target_material, false) diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd.uid b/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd.uid deleted file mode 100644 index 564e0cf..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cyr6fgximfw6q diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd b/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd deleted file mode 100644 index 622e7bf..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd +++ /dev/null @@ -1,37 +0,0 @@ -@tool -extends EditorNode3DGizmoPlugin - -const PhantomCamera3DNode: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd") -const PhantomCamera3DGizmo: Script = preload("res://addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo.gd") -const _icon_texture: Texture2D = preload("res://addons/phantom_camera/icons/phantom_camera_gizmo.svg") -var _gizmo_name: String = "PhantomCamera3D" - -var gizmo_name: String: set = set_gizmo_name -var _gizmo_icon: Texture2D -var _gizmo_spatial_script: Script = PhantomCamera3DNode - - -func set_gizmo_name(name: String) -> void: - _gizmo_name = name - - -func _get_gizmo_name() -> String: - return _gizmo_name - - -func _has_gizmo(spatial: Node3D) -> bool: - return spatial is PhantomCamera3D - - -func _init() -> void: - create_icon_material(gizmo_name, _icon_texture, false, Color.WHITE) - create_material("frustum", Color8(252, 127, 127, 255)) - create_material("follow_target", Color8(248, 67, 47)) - create_material("look_at_target", Color8(61, 207, 225)) - - -func _create_gizmo(for_node_3d: Node3D) -> EditorNode3DGizmo: - if for_node_3d is PhantomCamera3DNode: - return PhantomCamera3DGizmo.new() - else: - return null diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd.uid b/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd.uid deleted file mode 100644 index ce528d7..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_3d_gizmo_plugin.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bkevga3bx4rfj diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd b/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd deleted file mode 100644 index 3dd4d3e..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd +++ /dev/null @@ -1,29 +0,0 @@ -extends EditorNode3DGizmoPlugin - -var _spatial_script: Script = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd") -var _gizmo_icon: Texture2D = preload("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_gizmo.svg") - -var _gizmo_name: StringName = "PhantomCameraNoiseEmitter" - -func _init() -> void: - create_material("main", Color8(252, 127, 127, 255)) - create_handle_material("handles") - create_icon_material(_gizmo_name, _gizmo_icon, false, Color.WHITE) - - -func _has_gizmo(node: Node3D): - return node.get_script() == _spatial_script - - -func _get_gizmo_name() -> String: - return _gizmo_name - - -func _redraw(gizmo: EditorNode3DGizmo): - gizmo.clear() - - var icon: Material = get_material(_gizmo_name, gizmo) - gizmo.add_unscaled_billboard(icon, 0.035) - - #var material = get_material("main", gizmo) - #gizmo.add_lines(_draw_frustum(), material) diff --git a/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid b/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid deleted file mode 100644 index 2b93b6c..0000000 --- a/addons/phantom_camera/scripts/gizmos/phantom_camera_noise_emitter_gizmo_plugin_3d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dddokcd2ug05i diff --git a/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs b/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs deleted file mode 100644 index f0f6b96..0000000 --- a/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Linq; -using Godot; - -#nullable enable - -namespace PhantomCamera.Manager; - -public static class PhantomCameraManager -{ - private static GodotObject? _instance; - - public static GodotObject Instance => _instance ??= Engine.GetSingleton("PhantomCameraManager"); - - public static PhantomCamera2D[] PhantomCamera2Ds => - Instance.Call(MethodName.GetPhantomCamera2Ds).AsGodotArray() - .Select(node => new PhantomCamera2D(node)).ToArray(); - - public static PhantomCamera3D[] PhantomCamera3Ds => - Instance.Call(MethodName.GetPhantomCamera3Ds).AsGodotArray() - .Select(node => new PhantomCamera3D(node)).ToArray(); - - public static PhantomCameraHost[] PhantomCameraHosts => - Instance.Call(MethodName.GetPhantomCameraHosts).AsGodotArray() - .Select(node => new PhantomCameraHost(node)).ToArray(); - - public static PhantomCamera2D[] GetPhantomCamera2Ds() => PhantomCamera2Ds; - public static PhantomCamera3D[] GetPhantomCamera3Ds() => PhantomCamera3Ds; - public static PhantomCameraHost[] GetPhantomCameraHosts() => PhantomCameraHosts; - - public static class MethodName - { - public static readonly StringName GetPhantomCamera2Ds = new("get_phantom_camera_2ds"); - public static readonly StringName GetPhantomCamera3Ds = new("get_phantom_camera_3ds"); - public static readonly StringName GetPhantomCameraHosts = new("get_phantom_camera_hosts"); - } -} diff --git a/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs.uid b/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs.uid deleted file mode 100644 index cdf7f4e..0000000 --- a/addons/phantom_camera/scripts/managers/PhantomCameraManager.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://vtj8iqx4bp43 diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd deleted file mode 100644 index 6e13d9a..0000000 --- a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd +++ /dev/null @@ -1,149 +0,0 @@ -@tool -extends Node - -const _CONSTANTS = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#region Signals - -# Noise -signal noise_2d_emitted(noise_output: Transform2D, emitter_layer: int) -signal noise_3d_emitted(noise_output: Transform3D, emitter_layer: int) - -# PCam Host -signal pcam_host_added_to_scene(pcam_host: PhantomCameraHost) -signal pcam_host_removed_from_scene(pcam_host: PhantomCameraHost) - -# PCam -signal pcam_added_to_scene(pcam: Node) -signal pcam_removed_from_scene(pcam: Node) - -# Priority -signal pcam_priority_changed(pcam: Node) -signal pcam_visibility_changed(pcam: Node) - -signal pcam_teleport(pcam: Node) - -# Limit (2D) -signal limit_2d_changed(side: int, limit: int) -signal draw_limit_2d(enabled: bool) - -# Camera3DResource (3D) -signal camera_3d_resource_changed(property: String, value: Variant) - -# Viewfinder Signals -signal viewfinder_pcam_host_switch(pcam_host: PhantomCameraHost) -signal pcam_priority_override(pcam: Node, shouldOverride: bool) -signal pcam_dead_zone_changed(pcam: Node) -signal pcam_host_layer_changed(pcam: Node) - -#endregion - -#region Private Variables - -var _phantom_camera_host_list: Array[PhantomCameraHost] -var _phantom_camera_2d_list: Array[PhantomCamera2D] -var _phantom_camera_3d_list: Array[Node] ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - -#endregion - -#region Public Variables - -var phantom_camera_hosts: Array[PhantomCameraHost]: - get: - return _phantom_camera_host_list - -var phantom_camera_2ds: Array[PhantomCamera2D]: - get: - return _phantom_camera_2d_list - -var phantom_camera_3ds: Array[Node]: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - get: - return _phantom_camera_3d_list - -var screen_size: Vector2i - -#endregion - -#region Private Functions - -func _enter_tree() -> void: - if not Engine.has_singleton(_CONSTANTS.PCAM_MANAGER_NODE_NAME): - Engine.register_singleton(_CONSTANTS.PCAM_MANAGER_NODE_NAME, self) - Engine.physics_jitter_fix = 0 - - -func _ready() -> void: - # Setting default screensize - screen_size = Vector2i( - ProjectSettings.get_setting("display/window/size/viewport_width"), - ProjectSettings.get_setting("display/window/size/viewport_height") - ) - - # For editor - if Engine.is_editor_hint(): - ProjectSettings.settings_changed.connect(func(): - screen_size = Vector2i( - ProjectSettings.get_setting("display/window/size/viewport_width"), - ProjectSettings.get_setting("display/window/size/viewport_height") - ) - ) - # For runtime - else: - get_tree().get_root().size_changed.connect(func(): - screen_size = get_viewport().get_visible_rect().size - ) - -#endregion - -#region Public Functions - -func pcam_host_added(caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _phantom_camera_host_list.append(caller) - pcam_host_added_to_scene.emit(caller) - else: - printerr("This method can only be called from a PhantomCameraHost node") - -func pcam_host_removed(caller: Node) -> void: - if is_instance_of(caller, PhantomCameraHost): - _phantom_camera_host_list.erase(caller) - pcam_host_removed_from_scene.emit(caller) - else: - printerr("This method can only be called from a PhantomCameraHost node") - - -func pcam_added(caller) -> void: - if is_instance_of(caller, PhantomCamera2D): - _phantom_camera_2d_list.append(caller) - pcam_added_to_scene.emit(caller) - elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - _phantom_camera_3d_list.append(caller) - pcam_added_to_scene.emit(caller) - -func pcam_removed(caller) -> void: - if is_instance_of(caller, PhantomCamera2D): - _phantom_camera_2d_list.erase(caller) - pcam_removed_from_scene.emit(caller) - elif caller.is_class("PhantomCamera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - _phantom_camera_3d_list.erase(caller) - pcam_removed_from_scene.emit(caller) - else: - printerr("This method can only be called from a PhantomCamera node") - - -func get_phantom_camera_hosts() -> Array[PhantomCameraHost]: - return _phantom_camera_host_list - -func get_phantom_camera_2ds() -> Array[PhantomCamera2D]: - return _phantom_camera_2d_list - -func get_phantom_camera_3ds() -> Array: ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - return _phantom_camera_3d_list - - -func scene_changed() -> void: - _phantom_camera_2d_list.clear() - _phantom_camera_3d_list.clear() - _phantom_camera_host_list.clear() - -#endregion diff --git a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid b/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid deleted file mode 100644 index ea18023..0000000 --- a/addons/phantom_camera/scripts/managers/phantom_camera_manager.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://duq6jhf6unyis diff --git a/addons/phantom_camera/scripts/panel/editor.gd b/addons/phantom_camera/scripts/panel/editor.gd deleted file mode 100644 index a10018c..0000000 --- a/addons/phantom_camera/scripts/panel/editor.gd +++ /dev/null @@ -1,23 +0,0 @@ -@tool -extends VBoxContainer - -#region Onready - -@onready var updater: Control = %UpdateButton -@onready var viewfinder: Control = %ViewfinderPanel - -#endregion - -#region Public Variables - -var editor_plugin: EditorPlugin - -#endregion - - -#region Private Functions - -func _ready(): - updater.editor_plugin = editor_plugin - -#endregion diff --git a/addons/phantom_camera/scripts/panel/editor.gd.uid b/addons/phantom_camera/scripts/panel/editor.gd.uid deleted file mode 100644 index 6be368c..0000000 --- a/addons/phantom_camera/scripts/panel/editor.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cgfwg3paxkj2x diff --git a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd deleted file mode 100644 index b19beb9..0000000 --- a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd +++ /dev/null @@ -1,162 +0,0 @@ -####################################################################### -# Credit goes to the Dialogue Manager plugin for this script -# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager -####################################################################### - -@tool -extends Control - -#region Constants - -const TEMP_FILE_NAME = "user://temp.zip" - -#endregion - - -#region Signals - -signal failed() -signal updated(updated_to_version: String) - -#endregion - - -#region @onready - -#@onready var logo: TextureRect = %Logo -@onready var _download_verion: Label = %DownloadVersionLabel -@onready var _download_http_request: HTTPRequest = %DownloadHTTPRequest -@onready var _download_button: Button = %DownloadButton -@onready var _download_button_bg: NinePatchRect = %DownloadButtonBG -@onready var _download_label: Label = %UpdateLabel - -@onready var _breaking_label: Label = %BreakingLabel -@onready var _breaking_margin_container: MarginContainer = %BreakingMarginContainer -@onready var _breaking_options_button: OptionButton = %BreakingOptionButton -#@onready var current_version_label: Label = %CurrentVersionLabel - -#endregion - - -#region Variables - -# Todo - For 4.2 upgrade - Shows current version -var _download_dialogue: AcceptDialog -var _button_texture_default: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryDefault.png") -var _button_texture_hover: Texture2D = load("res://addons/phantom_camera/assets/PhantomCameraBtnPrimaryHover.png") - -var next_version_release: Dictionary: - set(value): - next_version_release = value - _download_verion.text = "%s update is available for download" % value.tag_name.substr(1) - # Todo - For 4.2 upgrade - #current_version_label.text = "Current version is " + editor_plugin.get_version() - get: - return next_version_release - -var _breaking_window_height: float = 520 -var _breaking_window_height_update: float = 600 - -#endregion - - -#region Private Functions - -func _ready() -> void: - _download_http_request.request_completed.connect(_on_http_request_request_completed) - _download_button.pressed.connect(_on_download_button_pressed) - _download_button.mouse_entered.connect(_on_mouse_entered) - _download_button.mouse_exited.connect(_on_mouse_exited) - - _breaking_label.hide() - _breaking_margin_container.hide() - _breaking_options_button.hide() - - _breaking_options_button.item_selected.connect(_on_item_selected) - - -func _on_item_selected(index: int) -> void: - if index == 1: - _download_button.show() - _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height_update) - else: - _download_button.hide() - _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height) - - -func _on_download_button_pressed() -> void: - _download_http_request.request(next_version_release.zipball_url) - _download_button.disabled = true - _download_label.text = "Downloading..." - _download_button_bg.hide() - - -func _on_mouse_entered() -> void: - _download_button_bg.set_texture(_button_texture_hover) - - -func _on_mouse_exited() -> void: - _download_button_bg.set_texture(_button_texture_default) - - -func _on_http_request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: - if result != HTTPRequest.RESULT_SUCCESS: - failed.emit() - return - - # Save the downloaded zip - var zip_file: FileAccess = FileAccess.open(TEMP_FILE_NAME, FileAccess.WRITE) - zip_file.store_buffer(body) - zip_file.close() - - OS.move_to_trash(ProjectSettings.globalize_path("res://addons/phantom_camera")) - - var zip_reader: ZIPReader = ZIPReader.new() - zip_reader.open(TEMP_FILE_NAME) - var files: PackedStringArray = zip_reader.get_files() - - var base_path = files[1] - # Remove archive folder - files.remove_at(0) - # Remove assets folder - files.remove_at(0) - - for path in files: - var new_file_path: String = path.replace(base_path, "") - if path.ends_with("/"): - DirAccess.make_dir_recursive_absolute("res://addons/%s" % new_file_path) - else: - var file: FileAccess = FileAccess.open("res://addons/%s" % new_file_path, FileAccess.WRITE) - file.store_buffer(zip_reader.read_file(path)) - - zip_reader.close() - DirAccess.remove_absolute(TEMP_FILE_NAME) - - updated.emit(next_version_release.tag_name.substr(1)) - - -func _on_notes_button_pressed() -> void: - OS.shell_open(next_version_release.html_url) - -#endregion - -#region Public Functions - -func show_updater_warning(next_version_number: Array, current_version_number: Array) -> void: - var current_version_number_0: int = current_version_number[0] as int - var current_version_number_1: int = current_version_number[1] as int - - var next_version_number_0: int = next_version_number[0] as int # Major release number in the new release - var next_version_number_1: int = next_version_number[1] as int # Minor release number in the new release - - if next_version_number_0 > current_version_number_0 or \ - next_version_number_1 > current_version_number_1: - _breaking_label.show() - _breaking_margin_container.show() - _breaking_options_button.show() - _download_button.hide() - - _download_dialogue = get_parent() - _download_dialogue.size = Vector2(_download_dialogue.size.x, _breaking_window_height) - -#endregion diff --git a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid b/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid deleted file mode 100644 index ff50946..0000000 --- a/addons/phantom_camera/scripts/panel/updater/download_update_panel.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cjblcocen12r3 diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd b/addons/phantom_camera/scripts/panel/updater/update_button.gd deleted file mode 100644 index 686535c..0000000 --- a/addons/phantom_camera/scripts/panel/updater/update_button.gd +++ /dev/null @@ -1,177 +0,0 @@ -####################################################################### -# Credit goes to the Dialogue Manager plugin for this script -# Check it out at: https://github.com/nathanhoad/godot_dialogue_manager -####################################################################### - -@tool -extends Button - -#region Constants - -const REMOTE_RELEASE_URL: StringName = "https://api.github.com/repos/ramokz/phantom-camera/releases" -const UPDATER_CONSTANTS := preload("res://addons/phantom_camera/scripts/panel/updater/updater_constants.gd") - -#endregion - - -#region @onready - -@onready var http_request: HTTPRequest = %HTTPRequest -@onready var download_dialog: AcceptDialog = %DownloadDialog -@onready var download_update_panel: Control = %DownloadUpdatePanel -@onready var needs_reload_dialog: AcceptDialog = %NeedsReloadDialog -@onready var update_failed_dialog: AcceptDialog = %UpdateFailedDialog - -#endregion - - -#region Variables - -# The main editor plugin -var editor_plugin: EditorPlugin - -var needs_reload: bool = false - -# A lambda that gets called just before refreshing the plugin. Return false to stop the reload. -var on_before_refresh: Callable = func(): return true - -#endregion - - -#region Private Functions - -func _ready() -> void: - hide() - - # Check for updates on GitHub Releases - check_for_update() - - pressed.connect(_on_update_button_pressed) - http_request.request_completed.connect(_request_request_completed) - download_update_panel.updated.connect(_on_download_update_panel_updated) - needs_reload_dialog.confirmed.connect(_on_needs_reload_dialog_confirmed) - - -func _request_request_completed(result: int, response_code: int, headers: PackedStringArray, body: PackedByteArray) -> void: - if result != HTTPRequest.RESULT_SUCCESS: return - - if not editor_plugin: return - var current_version: String = editor_plugin.get_version() - - # Work out the next version from the releases information on GitHub - var response: Array = JSON.parse_string(body.get_string_from_utf8()) - if typeof(response) != TYPE_ARRAY: return - - # GitHub releases are in order of creation, not order of version - var versions: Array = response.filter(func(release): - var version: String = release.tag_name.substr(1) - return version_to_number(version) > version_to_number(current_version) - ) - - if versions.size() > 0: - if ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_mode) == 1: ## For console output mode - - print_rich(" -[color=#3AB99A] ********[/color] -[color=#3AB99A] ************[/color] -[color=#3AB99A]**************[/color] -[color=#3AB99A]****** *** *[/color] -[color=#3AB99A]****** ***[/color] -[color=#3AB99A]********** *****[/color] -[color=#3AB99A]******** ***********[/color] -[color=#3AB99A]******** *********** **[/color] -[color=#3AB99A]********* **************[/color] -[color=#3AB99A]********** *************[/color] -[color=#3AB99A]** ** ** ******* **[/color] -[font_size=18][b]New Phantom Camera version is available[/b][/font_size]") - - if FileAccess.file_exists("res://dev_scenes/3d/dev_scene_3d.tscn"): - print_rich("[font_size=14][color=#EAA15E][b]As you're using a fork of the project, you will need to update it manually[/b][/color][/font_size]") - - print_rich("[font_size=12]If you don't want to see this message, then it can be disabled inside:\n[code]Project Settings/Phantom Camera/Updater/Show New Release Info on Editor Launch in Output[/code]") - - return - - download_update_panel.next_version_release = versions[0] - download_update_panel.show_updater_warning( - versions[0].tag_name.substr(1).split("."), - current_version.split(".") - ) - _set_scale() - editor_plugin.panel_button.add_theme_color_override("font_color", Color("#3AB99A")) - editor_plugin.panel_button.icon = load("res://addons/phantom_camera/icons/phantom_camera_updater_panel_icon.svg") - editor_plugin.panel_button.add_theme_color_override("icon_normal_color", Color("#3AB99A")) - show() - - -func _on_update_button_pressed() -> void: - if needs_reload: - var will_refresh = on_before_refresh.call() - if will_refresh: - EditorInterface.restart_editor(true) - else: - _set_scale() - download_dialog.popup_centered() - - -func _set_scale() -> void: - var scale: float = EditorInterface.get_editor_scale() - download_dialog.min_size = Vector2(300, 250) * scale - - -func _on_download_dialog_close_requested() -> void: - download_dialog.hide() - - -func _on_download_update_panel_updated(updated_to_version: String) -> void: - download_dialog.hide() - - needs_reload_dialog.dialog_text = "Reload to finish update" - needs_reload_dialog.ok_button_text = "Reload" - needs_reload_dialog.cancel_button_text = "Cancel" - needs_reload_dialog.popup_centered() - - needs_reload = true - text = "Reload Project" - - -func _on_download_update_panel_failed() -> void: - download_dialog.hide() - update_failed_dialog.dialog_text = "Updated Failed" - update_failed_dialog.popup_centered() - - -func _on_needs_reload_dialog_confirmed() -> void: - EditorInterface.restart_editor(true) - - -func _on_timer_timeout() -> void: - if not needs_reload: - check_for_update() - -#endregion - - -#region Public Functions - -# Convert a version number to an actually comparable number -func version_to_number(version: String) -> int: - var regex = RegEx.new() - regex.compile("[a-zA-Z]+") - if regex.search(str(version)): return 0 - - var bits = version.split(".") - var version_bit: int - var multiplier: int = 10000 - for i in bits.size(): - version_bit += bits[i].to_int() * multiplier / (10 ** (i)) - - return version_bit - - -func check_for_update() -> void: - if ProjectSettings.get_setting(UPDATER_CONSTANTS.setting_updater_mode) == 0: return - - http_request.request(REMOTE_RELEASE_URL) - -#endregion diff --git a/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid b/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid deleted file mode 100644 index cb88ddc..0000000 --- a/addons/phantom_camera/scripts/panel/updater/update_button.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bwc42i46603qn diff --git a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd deleted file mode 100644 index 94ac2ad..0000000 --- a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd +++ /dev/null @@ -1,8 +0,0 @@ -extends RefCounted - -# Plugin Project Settings Sections -const setting_phantom_camera: StringName = "phantom_camera/" -const setting_updater_name: StringName = setting_phantom_camera + "updater/" - -# Updater Settings -const setting_updater_mode: StringName = setting_updater_name + "updater_mode" diff --git a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid b/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid deleted file mode 100644 index 1f86170..0000000 --- a/addons/phantom_camera/scripts/panel/updater/updater_constants.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c8qkbc38waor2 diff --git a/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd b/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd deleted file mode 100644 index 662e598..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd +++ /dev/null @@ -1,112 +0,0 @@ -@tool -extends VBoxContainer - -#region Constants - -const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") -const _host_list_item: PackedScene = preload("res://addons/phantom_camera/panel/viewfinder/host_list/host_list_item.tscn") - -#endregion - -signal pcam_host_removed(pcam_host: PhantomCameraHost) - -@onready var _host_list_button: Button = %HostListButton -@onready var _host_list_scroll_container: ScrollContainer = %ScrollContainer -@onready var _host_list_item_container: VBoxContainer = %HostListContainer - -var _host_list_open: bool = false - -var _bottom_offset_value: float - -var _pcam_host_list: Array[PhantomCameraHost] -var _pcam_manager: Node - -var _viewfinder_panel: Control - -#region Private Functions - -func _ready() -> void: - _host_list_button.pressed.connect(_host_list_button_pressed) - if Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): - _pcam_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - _pcam_manager.pcam_host_removed_from_scene.connect(_remove_pcam_host) - - if not get_parent() is Control: return # To prevent errors when opening the scene on its own - _viewfinder_panel = get_parent() - _viewfinder_panel.resized.connect(_set_offset_top) - - _host_list_item_container.resized.connect(_set_offset_top) - - -func _set_offset_top() -> void: - offset_top = _set_host_list_size() - - -func _host_list_button_pressed() -> void: - _host_list_open = !_host_list_open - - var tween: Tween = create_tween() - var max_duration: float = 0.6 - - # 300 being the minimum size of the viewfinder's height - var duration: float = clampf( - max_duration / (300 / _host_list_item_container.size.y), - 0.3, - max_duration) - - tween.tween_property(self, "offset_top", _set_host_list_size(), duration)\ - .set_ease(Tween.EASE_OUT)\ - .set_trans(Tween.TRANS_QUINT) - - -func _set_host_list_size() -> float: - if not _host_list_open: - return clampf( - _viewfinder_panel.size.y - \ - _host_list_item_container.size.y - \ - _host_list_button.size.y - 20, - 0, - INF - ) - else: - return (_viewfinder_panel.size.y - _host_list_button.size.y / 2) - - -func _remove_pcam_host(pcam_host: PhantomCameraHost) -> void: - if _pcam_host_list.has(pcam_host): - _pcam_host_list.erase(pcam_host) - - var freed_pcam_host: Control - for host_list_item_instance in _host_list_item_container.get_children(): - if not host_list_item_instance.pcam_host == pcam_host: continue - freed_pcam_host = host_list_item_instance - host_list_item_instance.queue_free() - -#endregion - -#region Public Functions - -func add_pcam_host(pcam_host: PhantomCameraHost, is_default: bool) -> void: - if _pcam_host_list.has(pcam_host): return - - _pcam_host_list.append(pcam_host) - - var host_list_item_instance: PanelContainer = _host_list_item.instantiate() - var switch_pcam_host_button: Button = host_list_item_instance.get_node("%SwitchPCamHost") - if is_default: switch_pcam_host_button.button_pressed = true - - if not pcam_host.tree_exiting.is_connected(_remove_pcam_host): - pcam_host.tree_exiting.connect(_remove_pcam_host.bind(pcam_host)) - - host_list_item_instance.pcam_host = pcam_host - - _host_list_item_container.add_child(host_list_item_instance) - - -func clear_pcam_host_list() -> void: - _pcam_host_list.clear() - - for host_list_item_instance in _host_list_item_container.get_children(): - host_list_item_instance.queue_free() - -#endregion diff --git a/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd.uid b/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd.uid deleted file mode 100644 index 6923d3e..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/host_list.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c84cxry3t35ny diff --git a/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd b/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd deleted file mode 100644 index 5707974..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd +++ /dev/null @@ -1,58 +0,0 @@ -@tool -extends Control - -const button_group_resource: ButtonGroup = preload("res://addons/phantom_camera/panel/viewfinder/host_list/host_list_item_group.tres") -const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -@onready var select_pcam_host: Button = %SelectPCamHost -@onready var switch_pcam_host: Button = %SwitchPCamHost - -var pcam_host: PhantomCameraHost: - set(value): - pcam_host = value - if not is_instance_valid(value): return - if not pcam_host.renamed.is_connected(_rename_pcam_host): - pcam_host.renamed.connect(_rename_pcam_host) - pcam_host.has_error.connect(_pcam_host_has_error) - get: - return pcam_host - -var _pcam_manager: Node - -#region Private fucntions - -func _ready() -> void: - switch_pcam_host.button_group = button_group_resource - select_pcam_host.pressed.connect(_select_pcam) - switch_pcam_host.pressed.connect(_switch_pcam_host) - - if not is_instance_valid(pcam_host): return - switch_pcam_host.text = pcam_host.name - - _pcam_host_has_error() - - -func _pcam_host_has_error() -> void: - if pcam_host.show_warning: - %ErrorPCamHost.visible = true - else: - %ErrorPCamHost.visible = false - - -func _rename_pcam_host() -> void: - switch_pcam_host.text = pcam_host.name - - -func _select_pcam() -> void: - EditorInterface.get_selection().clear() - EditorInterface.get_selection().add_node(pcam_host) - - -func _switch_pcam_host() -> void: - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - if not is_instance_valid(_pcam_manager): - _pcam_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - - _pcam_manager.viewfinder_pcam_host_switch.emit(pcam_host) - -#endregion diff --git a/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd.uid b/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd.uid deleted file mode 100644 index 9df2919..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/host_list_item.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bv24ubx8mutw7 diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd deleted file mode 100644 index fe163a7..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd +++ /dev/null @@ -1,605 +0,0 @@ -@tool -extends Control - -#region Constants - -const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -# TODO - Should be in a central location -const _camera_2d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera2DIcon.svg") -const _camera_3d_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/Camera3DIcon.svg") -const _pcam_host_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_host.svg") -const _pcam_2D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_2d.svg") -const _pcam_3D_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/phantom_camera_3d.svg") - -const _overlay_color_alpha: float = 0.3 - -#endregion - -#region @onready - -@onready var dead_zone_center_hbox: VBoxContainer = %DeadZoneCenterHBoxContainer -@onready var dead_zone_center_center_panel: Panel = %DeadZoneCenterCenterPanel -@onready var dead_zone_left_center_panel: Panel = %DeadZoneLeftCenterPanel -@onready var dead_zone_right_center_panel: Panel = %DeadZoneRightCenterPanel -@onready var target_point: Panel = %TargetPoint - -@onready var aspect_ratio_container: AspectRatioContainer = %AspectRatioContainer -@onready var camera_viewport_panel: Panel = aspect_ratio_container.get_child(0) -@onready var _viewfinder: Control = %Viewfinder -@onready var _dead_zone_h_box_container: Control = %DeadZoneHBoxContainer -@onready var sub_viewport: SubViewport = %SubViewport - -@onready var _empty_state_control: Control = %EmptyStateControl -@onready var _empty_state_icon: TextureRect = %EmptyStateIcon -@onready var _empty_state_text: RichTextLabel = %EmptyStateText -@onready var _add_node_button: Button = %AddNodeButton -@onready var _add_node_button_text: RichTextLabel = %AddNodeTypeText - -@onready var _priority_override_button: Button = %PriorityOverrideButton -@onready var _priority_override_name_label: Label = %PriorityOverrideNameLabel - -@onready var _camera_2d: Camera2D = %Camera2D - -@onready var _pcam_host_list: VBoxContainer = %PCamHostList - -#endregion - -#region Private Variables - -var _no_open_scene_icon: CompressedTexture2D = preload("res://addons/phantom_camera/icons/viewfinder/SceneTypesIcon.svg") -var _no_open_scene_string: String = "[b]2D[/b] or [b]3D[/b] scene open" - -var _selected_camera: Node -var _active_pcam: Node - -var _is_2d: bool - -var _pcam_manager: Node - -var _root_node: Node - -#endregion - -#region Public Variables - -var pcam_host_group: Array[PhantomCameraHost] - -var is_scene: bool - -var viewfinder_visible: bool - -var min_horizontal: float -var max_horizontal: float -var min_vertical: float -var max_vertical: float - -var pcam_host: PhantomCameraHost - -#endregion - - -#region Private Functions - -func _ready() -> void: - if not Engine.is_editor_hint(): - set_process(true) - camera_viewport_panel.self_modulate.a = 0 - - _root_node = get_tree().current_scene - - if _root_node is Node2D || _root_node is Node3D: - %SubViewportContainer.visible = false - if _root_node is Node2D: - _is_2d = true - else: - _is_2d = false - - _set_viewfinder(_root_node, false) - - if not Engine.is_editor_hint(): - _empty_state_control.visible = false - - _priority_override_button.visible = false - - # Triggered when viewport size is changed in Project Settings - ProjectSettings.settings_changed.connect(_settings_changed) - - # PCam Host List - _pcam_host_list.visible = false - _assign_manager() - _visibility_check() - - -func _pcam_host_switch(new_pcam_host: PhantomCameraHost) -> void: - _set_viewfinder_camera(new_pcam_host, true) - - -func _exit_tree() -> void: - if aspect_ratio_container.resized.is_connected(_resized): - aspect_ratio_container.resized.disconnect(_resized) - - if _add_node_button.pressed.is_connected(_visibility_check): - _add_node_button.pressed.disconnect(_visibility_check) - - if is_instance_valid(_active_pcam): - if _active_pcam.dead_zone_changed.is_connected(_on_dead_zone_changed): - _active_pcam.dead_zone_changed.disconnect(_on_dead_zone_changed) - - if _priority_override_button.pressed.is_connected(_select_override_pcam): - _priority_override_button.pressed.disconnect(_select_override_pcam) - - -func _process(_delta: float) -> void: - if Engine.is_editor_hint() and not viewfinder_visible: return - if not is_instance_valid(_active_pcam): return - - var unprojected_position_clamped: Vector2 = Vector2( - clamp(_active_pcam.viewport_position.x, min_horizontal, max_horizontal), - clamp(_active_pcam.viewport_position.y, min_vertical, max_vertical) - ) - - if not Engine.is_editor_hint(): - target_point.position = camera_viewport_panel.size * unprojected_position_clamped - target_point.size / 2 - - if not _is_2d: return - if not is_instance_valid(pcam_host): return - if not is_instance_valid(pcam_host.camera_2d): return - - var window_size_height: float = ProjectSettings.get_setting("display/window/size/viewport_height") - sub_viewport.size_2d_override = sub_viewport.size * (window_size_height / sub_viewport.size.y) - - _camera_2d.global_transform = pcam_host.camera_2d.global_transform - _camera_2d.offset = pcam_host.camera_2d.offset - _camera_2d.zoom = pcam_host.camera_2d.zoom - _camera_2d.ignore_rotation = pcam_host.camera_2d.ignore_rotation - _camera_2d.anchor_mode = pcam_host.camera_2d.anchor_mode - _camera_2d.limit_left = pcam_host.camera_2d.limit_left - _camera_2d.limit_top = pcam_host.camera_2d.limit_top - _camera_2d.limit_right = pcam_host.camera_2d.limit_right - _camera_2d.limit_bottom = pcam_host.camera_2d.limit_bottom - - -func _settings_changed() -> void: - var viewport_width: float = ProjectSettings.get_setting("display/window/size/viewport_width") - var viewport_height: float = ProjectSettings.get_setting("display/window/size/viewport_height") - var ratio: float = viewport_width / viewport_height - aspect_ratio_container.set_ratio(ratio) - camera_viewport_panel.size.x = viewport_width / (viewport_height / sub_viewport.size.y) - - # Applies Project Settings to Viewport - sub_viewport.canvas_item_default_texture_filter = ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter") - - # TODO - Add resizer for Framed Viewfinder - - -func _visibility_check() -> void: - if not viewfinder_visible: return - - var pcam_host: PhantomCameraHost - var has_camera: bool = false - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - - if not Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts().is_empty(): - has_camera = true - pcam_host = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts()[0] - - var root: Node = EditorInterface.get_edited_scene_root() - if root is Node2D: - var camera_2d: Camera2D - - if has_camera: - camera_2d = pcam_host.camera_2d - else: - camera_2d = _get_camera_2d() - - _is_2d = true - is_scene = true - _add_node_button.visible = true - _check_camera(root, camera_2d) - elif root is Node3D: - var camera_3d: Camera3D - if has_camera: - camera_3d = pcam_host.camera_3d - elif root.get_viewport() != null: - if root.get_viewport().get_camera_3d() != null: - camera_3d = root.get_viewport().get_camera_3d() - - _is_2d = false - is_scene = true - _add_node_button.visible = true - _check_camera(root, camera_3d) - else: - # Is not a 2D or 3D scene - is_scene = false - _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon) - _add_node_button.visible = false - - # Checks if a new scene is created and changes viewfinder accordingly - if not get_tree().node_added.is_connected(_node_added_to_scene): - get_tree().node_added.connect(_node_added_to_scene) - - if not _priority_override_button.pressed.is_connected(_select_override_pcam): - _priority_override_button.pressed.connect(_select_override_pcam) - - -func _node_added_to_scene(node: Node) -> void: - if node is Node2D or node is Node3D: - get_tree().node_added.disconnect(_node_added_to_scene) - _visibility_check() - - -func _get_camera_2d() -> Camera2D: - var edited_scene_root: Node = EditorInterface.get_edited_scene_root() - - if edited_scene_root == null: return null - - var viewport: Viewport = edited_scene_root.get_viewport() - if viewport == null: return null - - var viewport_rid: RID = viewport.get_viewport_rid() - if viewport_rid == null: return null - - var camerasGroupName: String = "__cameras_%d" % viewport_rid.get_id() - var cameras: Array[Node] = get_tree().get_nodes_in_group(camerasGroupName) - - for camera in cameras: - if camera is Camera2D and camera.is_current: - return camera - - return null - - -func _check_camera(root: Node, camera: Node) -> void: - var camera_string: String - var pcam_string: String - var color: Color - var camera_icon: CompressedTexture2D - var pcam_icon: CompressedTexture2D - - if _is_2d: - camera_string = _constants.CAMERA_2D_NODE_NAME - pcam_string = _constants.PCAM_2D_NODE_NAME - color = _constants.COLOR_2D - camera_icon = _camera_2d_icon - pcam_icon = _pcam_2D_icon - else: - camera_string = _constants.CAMERA_3D_NODE_NAME - pcam_string = _constants.PCAM_3D_NODE_NAME - color = _constants.COLOR_3D - camera_icon = _camera_3d_icon - pcam_icon = _pcam_3D_icon - - if camera: -# Has Camera - if camera.get_children().size() > 0: - for cam_child in camera.get_children(): - if cam_child is PhantomCameraHost: - pcam_host = cam_child - - if pcam_host: - if get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_2ds() or \ - get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_3ds(): - # Pcam exists in tree - _set_viewfinder(root, true) - _set_viewfinder_state() - %NoSupportMsg.visible = false - else: -# No PCam in scene - _update_button(pcam_string, pcam_icon, color) - _set_empty_viewfinder_state(pcam_string, pcam_icon) - else: -# No PCamHost in scene - _update_button(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, _constants.PCAM_HOST_COLOR) - _set_empty_viewfinder_state(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon) - else: -# No PCamHost in scene - _update_button(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon, _constants.PCAM_HOST_COLOR) - _set_empty_viewfinder_state(_constants.PCAM_HOST_NODE_NAME, _pcam_host_icon) - else: -# No Camera - _update_button(camera_string, camera_icon, color) - _set_empty_viewfinder_state(camera_string, camera_icon) - - -func _update_button(text: String, icon: CompressedTexture2D, color: Color) -> void: - _add_node_button_text.set_text("[center]Add [img=32]" + icon.resource_path + "[/img] [b]"+ text + "[/b][/center]"); - var button_theme_hover: StyleBoxFlat = _add_node_button.get_theme_stylebox("hover") - button_theme_hover.border_color = color - _add_node_button.add_theme_stylebox_override("hover", button_theme_hover) - - -func _set_viewfinder_state() -> void: - _empty_state_control.visible = false - _viewfinder.visible = true - - if is_instance_valid(_active_pcam): - if _active_pcam.get_follow_mode() == _active_pcam.FollowMode.FRAMED: - _dead_zone_h_box_container.visible = true - target_point.visible = true - else: - _dead_zone_h_box_container.visible = false - target_point.visible = false - - -func _set_empty_viewfinder_state(text: String, icon: CompressedTexture2D) -> void: - _viewfinder.visible = false - _framed_view_visible(false) - - _empty_state_control.visible = true - _empty_state_icon.texture = icon - if icon == _no_open_scene_icon: - _empty_state_text.set_text("[center]No " + text + "[/center]") - else: - _empty_state_text.set_text("[center]No [b]" + text + "[/b] in scene[/center]") - - if _add_node_button.pressed.is_connected(_add_node): - _add_node_button.pressed.disconnect(_add_node) - - _add_node_button.pressed.connect(_add_node.bind(text)) - - -func _add_node(node_type: String) -> void: - var scene_root: Node = EditorInterface.get_edited_scene_root() - - match node_type: - _no_open_scene_string: - pass - _constants.CAMERA_2D_NODE_NAME: - var camera: Camera2D = Camera2D.new() - _instantiate_node(scene_root, camera, _constants.CAMERA_2D_NODE_NAME) - _constants.CAMERA_3D_NODE_NAME: - var camera: Camera3D = Camera3D.new() - _instantiate_node(scene_root, camera, _constants.CAMERA_3D_NODE_NAME) - _constants.PCAM_HOST_NODE_NAME: - var pcam_host: PhantomCameraHost = PhantomCameraHost.new() - var camera_owner: Node - if _is_2d: - camera_owner = _get_camera_2d() - else: - camera_owner = get_tree().get_edited_scene_root().get_viewport().get_camera_3d() - _instantiate_node( - scene_root, - pcam_host, - _constants.PCAM_HOST_NODE_NAME, - camera_owner - ) - _constants.PCAM_2D_NODE_NAME: - var pcam_2D: PhantomCamera2D = PhantomCamera2D.new() - _instantiate_node(scene_root, pcam_2D, _constants.PCAM_2D_NODE_NAME) - _constants.PCAM_3D_NODE_NAME: - var pcam_3D: PhantomCamera3D = PhantomCamera3D.new() - _instantiate_node(scene_root, pcam_3D, _constants.PCAM_3D_NODE_NAME) - - _visibility_check() - - -func _instantiate_node(scene_root: Node, node: Node, name: String, parent: Node = scene_root) -> void: - node.set_name(name) - parent.add_child(node) - node.owner = scene_root - - -func _set_viewfinder(root: Node, editor: bool) -> void: - pcam_host_group = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME).get_phantom_camera_hosts() - if pcam_host_group.size() != 0: - if pcam_host_group.size() == 1: - _pcam_host_list.visible = false - _set_viewfinder_camera(pcam_host_group[0], editor) - else: - _pcam_host_list.visible = true - _set_viewfinder_camera(pcam_host_group[0], editor) - for i in pcam_host_group.size(): - var is_default: bool = false - if i == 0: - is_default = true - _pcam_host_list.add_pcam_host(pcam_host_group[i], is_default) - - -func _set_viewfinder_camera(new_pcam_host: PhantomCameraHost, editor: bool) -> void: - pcam_host = new_pcam_host - - if _is_2d: - _selected_camera = pcam_host.camera_2d - - if editor: - sub_viewport.disable_3d = true - pcam_host = pcam_host - _camera_2d.zoom = pcam_host.camera_2d.zoom - _camera_2d.offset = pcam_host.camera_2d.offset - _camera_2d.ignore_rotation = pcam_host.camera_2d.ignore_rotation - - sub_viewport.world_2d = pcam_host.camera_2d.get_world_2d() - sub_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS - sub_viewport.render_target_clear_mode = SubViewport.CLEAR_MODE_ALWAYS - sub_viewport.size_2d_override_stretch = true - else: - _selected_camera = pcam_host.camera_3d - if editor: - var camera_3d_rid: RID = _selected_camera.get_camera_rid() - sub_viewport.disable_3d = false - sub_viewport.world_3d = pcam_host.camera_3d.get_world_3d() - RenderingServer.viewport_attach_camera(sub_viewport.get_viewport_rid(), camera_3d_rid) - - if _selected_camera.keep_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: - aspect_ratio_container.set_stretch_mode(AspectRatioContainer.STRETCH_HEIGHT_CONTROLS_WIDTH) - else: - aspect_ratio_container.set_stretch_mode(AspectRatioContainer.STRETCH_WIDTH_CONTROLS_HEIGHT) - - set_process(true) - - if not pcam_host.viewfinder_update.is_connected(_on_update_editor_viewfinder): - pcam_host.viewfinder_update.connect(_on_update_editor_viewfinder) - - if not pcam_host.viewfinder_disable_dead_zone.is_connected(_disconnect_dead_zone): - pcam_host.viewfinder_disable_dead_zone.connect(_disconnect_dead_zone) - - if not aspect_ratio_container.resized.is_connected(_resized): - aspect_ratio_container.resized.connect(_resized) - - if is_instance_valid(pcam_host.get_active_pcam()): - _active_pcam = pcam_host.get_active_pcam() - else: - _framed_view_visible(false) - _active_pcam = null - return - - if not _active_pcam.follow_mode == PhantomCamera2D.FollowMode.FRAMED: return - - _framed_view_visible(true) - _on_dead_zone_changed() - _connect_dead_zone() - - -func _connect_dead_zone() -> void: - if not _active_pcam and is_instance_valid(pcam_host.get_active_pcam()): - _active_pcam = pcam_host.get_active_pcam() - - if not _active_pcam.dead_zone_changed.is_connected(_on_dead_zone_changed): - _active_pcam.dead_zone_changed.connect(_on_dead_zone_changed) - - _framed_view_visible(true) - _viewfinder.visible = true - _on_dead_zone_changed() - -func _disconnect_dead_zone() -> void: - if not is_instance_valid(_active_pcam): return - _framed_view_visible(_is_framed_pcam()) - - if _active_pcam.follow_mode_changed.is_connected(_check_follow_mode): - _active_pcam.follow_mode_changed.disconnect(_check_follow_mode) - - if _active_pcam.dead_zone_changed.is_connected(_on_dead_zone_changed): - _active_pcam.dead_zone_changed.disconnect(_on_dead_zone_changed) - - -func _resized() -> void: - _on_dead_zone_changed() - - -func _is_framed_pcam() -> bool: - if not is_instance_valid(pcam_host): return false - _active_pcam = pcam_host.get_active_pcam() - if not is_instance_valid(_active_pcam): return false - if not _active_pcam.follow_mode == PhantomCamera2D.FollowMode.FRAMED: return false - - return true - - -func _framed_view_visible(should_show: bool) -> void: - if should_show: - target_point.visible = true - _dead_zone_h_box_container.visible = true - else: - target_point.visible = false - _dead_zone_h_box_container.visible = false - - -func _on_dead_zone_changed() -> void: - if not is_instance_valid(_active_pcam): return - if not _active_pcam.follow_mode == _active_pcam.FollowMode.FRAMED: return - - # Waits until the camera_viewport_panel has been resized when launching the game - if camera_viewport_panel.size.x == 0: - await camera_viewport_panel.resized - - if not _active_pcam == pcam_host.get_active_pcam(): - _active_pcam == pcam_host.get_active_pcam() - - var dead_zone_width: float = _active_pcam.dead_zone_width * camera_viewport_panel.size.x - var dead_zone_height: float = _active_pcam.dead_zone_height * camera_viewport_panel.size.y - dead_zone_center_hbox.set_custom_minimum_size(Vector2(dead_zone_width, 0)) - dead_zone_center_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) - dead_zone_left_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) - dead_zone_right_center_panel.set_custom_minimum_size(Vector2(0, dead_zone_height)) - - min_horizontal = 0.5 - _active_pcam.dead_zone_width / 2 - max_horizontal = 0.5 + _active_pcam.dead_zone_width / 2 - min_vertical = 0.5 - _active_pcam.dead_zone_height / 2 - max_vertical = 0.5 + _active_pcam.dead_zone_height / 2 - - -func _check_follow_mode() -> void: - _framed_view_visible(_is_framed_pcam()) - - -func _on_update_editor_viewfinder(check_framed_view: bool = false) -> void: - _active_pcam = pcam_host.get_active_pcam() - - if not is_instance_valid(_active_pcam): return - - if not _active_pcam.follow_mode_changed.is_connected(_check_follow_mode): - _active_pcam.follow_mode_changed.connect(_check_follow_mode) - - if _active_pcam.priority_override: - _priority_override_button.visible = true - _priority_override_name_label.set_text(_active_pcam.name) - _priority_override_button.set_tooltip_text(_active_pcam.name) - else: - _priority_override_button.visible = false - - _framed_view_visible(false) - if not check_framed_view: return - if _is_framed_pcam(): _connect_dead_zone() - - -func _select_override_pcam() -> void: - EditorInterface.get_selection().clear() - EditorInterface.get_selection().add_node(_active_pcam) - - -func _assign_manager() -> void: - if not is_instance_valid(_pcam_manager): - if Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): - _pcam_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - _pcam_manager.pcam_host_added_to_scene.connect(_pcam_changed) - _pcam_manager.pcam_host_removed_from_scene.connect(_pcam_host_removed_from_scene) - - _pcam_manager.pcam_added_to_scene.connect(_pcam_changed) - _pcam_manager.pcam_removed_from_scene.connect(_pcam_changed) - - _pcam_manager.viewfinder_pcam_host_switch.connect(_pcam_host_switch) - - -func _pcam_host_removed_from_scene(pcam_host: PhantomCameraHost) -> void: - if _pcam_manager.phantom_camera_hosts.size() < 2: - _pcam_host_list.visible = false - - _visibility_check() - - -func _pcam_changed(pcam: Node) -> void: - _visibility_check() - -#endregion - - -#region Public Functions - -func set_visibility(visible: bool) -> void: - if visible: - viewfinder_visible = true - _visibility_check() - else: - viewfinder_visible = false - - -func update_dead_zone() -> void: - _set_viewfinder(_root_node, true) - - -## TODO - Signal can be added directly to this file with the changes in Godot 4.5 (https://github.com/godotengine/godot/pull/102986) -func scene_changed(scene_root: Node) -> void: - _assign_manager() - _priority_override_button.visible = false - _pcam_host_list.clear_pcam_host_list() - - if not scene_root is Node2D and not scene_root is Node3D: - is_scene = false - _pcam_host_list.visible = false - _set_empty_viewfinder_state(_no_open_scene_string, _no_open_scene_icon) - _add_node_button.visible = false - else: - _visibility_check() - -#endregion diff --git a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid b/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid deleted file mode 100644 index f115630..0000000 --- a/addons/phantom_camera/scripts/panel/viewfinder/viewfinder.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://drmv3363t8amc diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs deleted file mode 100644 index 7ee47a7..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs +++ /dev/null @@ -1,234 +0,0 @@ -using Godot; -using PhantomCamera.Noise; - -#nullable enable - -namespace PhantomCamera; - -public enum InactiveUpdateMode -{ - Always, - Never -} - -public abstract class PhantomCamera -{ - protected readonly GodotObject Node; - - public delegate void BecameActiveEventHandler(); - public delegate void BecameInactiveEventHandler(); - public delegate void FollowTargetChangedEventHandler(); - public delegate void DeadZoneChangedEventHandler(); - public delegate void TweenStartedEventHandler(); - public delegate void IsTweeningEventHandler(); - public delegate void TweenCompletedEventHandler(); - - public event BecameActiveEventHandler? BecameActive; - public event BecameInactiveEventHandler? BecameInactive; - public event FollowTargetChangedEventHandler? FollowTargetChanged; - public event DeadZoneChangedEventHandler? DeadZoneChanged; - public event TweenStartedEventHandler? TweenStarted; - public event IsTweeningEventHandler? IsTweening; - public event TweenCompletedEventHandler? TweenCompleted; - - public int Priority - { - get => (int)Node.Call(MethodName.GetPriority); - set => Node.Call(MethodName.SetPriority, value); - } - - public bool IsActive => (bool)Node.Call(MethodName.IsActive); - - public bool FollowDamping - { - get => (bool)Node.Call(MethodName.GetFollowDamping); - set => Node.Call(MethodName.SetFollowDamping, value); - } - - public bool IsFollowing => (bool)Node.Call(PhantomCamera.MethodName.IsFollowing); - - public float DeadZoneWidth - { - get => (float)Node.Get(PropertyName.DeadZoneWidth); - set => Node.Set(PropertyName.DeadZoneWidth, value); - } - - public float DeadZoneHeight - { - get => (float)Node.Get(PropertyName.DeadZoneHeight); - set => Node.Set(PropertyName.DeadZoneHeight, value); - } - - public PhantomCameraTween TweenResource - { - get => new((Resource)Node.Call(MethodName.GetTweenResource)); - set => Node.Call(MethodName.SetTweenResource, (GodotObject)value.Resource); - } - - public bool TweenSkip - { - get => (bool)Node.Call(MethodName.GetTweenSkip); - set => Node.Call(MethodName.SetTweenSkip, value); - } - - public float TweenDuration - { - get => (float)Node.Call(MethodName.GetTweenDuration); - set => Node.Call(MethodName.SetTweenDuration, value); - } - - public TransitionType TweenTransition - { - get => (TransitionType)(int)Node.Call(MethodName.GetTweenTransition); - set => Node.Call(MethodName.SetTweenTransition, (int)value); - } - - public EaseType TweenEase - { - get => (EaseType)(int)Node.Call(MethodName.GetTweenEase); - set => Node.Call(MethodName.SetTweenEase, (int)value); - } - - public bool TweenOnLoad - { - get => (bool)Node.Call(MethodName.GetTweenOnLoad); - set => Node.Call(MethodName.SetTweenOnLoad, value); - } - - public InactiveUpdateMode InactiveUpdateMode - { - get => (InactiveUpdateMode)(int)Node.Call(MethodName.GetInactiveUpdateMode); - set => Node.Call(MethodName.SetInactiveUpdateMode, (int)value); - } - - public int HostLayers - { - get => (int)Node.Call(MethodName.GetHostLayers); - set => Node.Call(MethodName.SetHostLayers, value); - } - - public int NoiseEmitterLayer - { - get => (int)Node.Call(MethodName.GetNoiseEmitterLayer); - set => Node.Call(MethodName.SetNoiseEmitterLayer, value); - } - - public void TeleportPosition() - { - Node.Call(MethodName.TeleportPosition); - } - - public void SetHostLayersValue(int layer, bool enabled) - { - Node.Call(MethodName.SetHostLayersValue, layer, enabled); - } - - protected PhantomCamera(GodotObject phantomCameraNode) - { - Node = phantomCameraNode; - - var callableBecameActive = Callable.From(() => BecameActive?.Invoke()); - var callableBecameInactive = Callable.From(() => BecameInactive?.Invoke()); - var callableFollowTargetChanged = Callable.From(() => FollowTargetChanged?.Invoke()); - var callableDeadZoneChanged = Callable.From(() => DeadZoneChanged?.Invoke()); - var callableTweenStarted = Callable.From(() => TweenStarted?.Invoke()); - var callableIsTweening = Callable.From(() => IsTweening?.Invoke()); - var callableTweenCompleted = Callable.From(() => TweenCompleted?.Invoke()); - - Node.Connect(SignalName.BecameActive, callableBecameActive); - Node.Connect(SignalName.BecameInactive, callableBecameInactive); - Node.Connect(SignalName.FollowTargetChanged, callableFollowTargetChanged); - Node.Connect(SignalName.DeadZoneChanged, callableDeadZoneChanged); - Node.Connect(SignalName.TweenStarted, callableTweenStarted); - Node.Connect(SignalName.IsTweening, callableIsTweening); - Node.Connect(SignalName.TweenCompleted, callableTweenCompleted); - } - - public static class MethodName - { - public static readonly StringName GetFollowMode = new("get_follow_mode"); - public static readonly StringName IsActive = new("is_active"); - - public static readonly StringName GetPriority = new("get_priority"); - public static readonly StringName SetPriority = new("set_priority"); - - public static readonly StringName IsFollowing = new("is_following"); - - public static readonly StringName GetFollowTarget = new("get_follow_target"); - public static readonly StringName SetFollowTarget = new("set_follow_target"); - - public static readonly StringName GetFollowTargets = new("get_follow_targets"); - public static readonly StringName SetFollowTargets = new("set_follow_targets"); - - public static readonly StringName TeleportPosition = new("teleport_position"); - - public static readonly StringName AppendFollowTargets = new("append_follow_targets"); - public static readonly StringName AppendFollowTargetsArray = new("append_follow_targets_array"); - public static readonly StringName EraseFollowTargets = new("erase_follow_targets"); - - public static readonly StringName GetFollowPath = new("get_follow_path"); - public static readonly StringName SetFollowPath = new("set_follow_path"); - - public static readonly StringName GetFollowOffset = new("get_follow_offset"); - public static readonly StringName SetFollowOffset = new("set_follow_offset"); - - public static readonly StringName GetFollowDamping = new("get_follow_damping"); - public static readonly StringName SetFollowDamping = new("set_follow_damping"); - - public static readonly StringName GetFollowDampingValue = new("get_follow_damping_value"); - public static readonly StringName SetFollowDampingValue = new("set_follow_damping_value"); - - public static readonly StringName GetFollowAxisLock = new("get_follow_axis_lock"); - public static readonly StringName SetFollowAxisLock = new("set_follow_axis_lock"); - - public static readonly StringName GetTweenResource = new("get_tween_resource"); - public static readonly StringName SetTweenResource = new("set_tween_resource"); - - public static readonly StringName GetTweenSkip = new("get_tween_skip"); - public static readonly StringName SetTweenSkip = new("set_tween_skip"); - - public static readonly StringName GetTweenDuration = new("get_tween_duration"); - public static readonly StringName SetTweenDuration = new("set_tween_duration"); - - public static readonly StringName GetTweenTransition = new("get_tween_transition"); - public static readonly StringName SetTweenTransition = new("set_tween_transition"); - - public static readonly StringName GetTweenEase = new("get_tween_ease"); - public static readonly StringName SetTweenEase = new("set_tween_ease"); - - public static readonly StringName GetTweenOnLoad = new("get_tween_on_load"); - public static readonly StringName SetTweenOnLoad = new("set_tween_on_load"); - - public static readonly StringName GetInactiveUpdateMode = new("get_inactive_update_mode"); - public static readonly StringName SetInactiveUpdateMode = new("set_inactive_update_mode"); - - public static readonly StringName GetHostLayers = new("get_host_layers"); - public static readonly StringName SetHostLayers = new("set_host_layers"); - public static readonly StringName SetHostLayersValue = new("set_host_layers_value"); - - public static readonly StringName GetNoiseEmitterLayer = new("get_noise_emitter_layer"); - public static readonly StringName SetNoiseEmitterLayer = new("set_noise_emitter_layer"); - - public static readonly StringName EmitNoise = new("emit_noise"); - } - - public static class PropertyName - { - public static readonly StringName DeadZoneWidth = new("dead_zone_width"); - public static readonly StringName DeadZoneHeight = new("dead_zone_height"); - } - - public static class SignalName - { - public static readonly StringName BecameActive = new("became_active"); - public static readonly StringName BecameInactive = new("became_inactive"); - public static readonly StringName FollowTargetChanged = new("follow_target_changed"); - public static readonly StringName DeadZoneChanged = new("dead_zone_changed"); - public static readonly StringName DeadZoneReached = new("dead_zone_reached"); - public static readonly StringName TweenStarted = new("tween_started"); - public static readonly StringName IsTweening = new("is_tweening"); - public static readonly StringName TweenCompleted = new("tween_completed"); - public static readonly StringName TweenInterrupted = new("tween_interrupted"); - public static readonly StringName NoiseEmitted = new("noise_emitted"); - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs.uid b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs.uid deleted file mode 100644 index 856fbdb..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d3wh0457i0i3 diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs deleted file mode 100644 index a0faf1d..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs +++ /dev/null @@ -1,326 +0,0 @@ -using System.Linq; -using Godot; -using Godot.Collections; -using PhantomCamera.Noise; - -#nullable enable - -namespace PhantomCamera; - -public enum FollowMode2D -{ - None, - Glued, - Simple, - Group, - Path, - Framed -} - -public enum FollowLockAxis2D -{ - None, - X, - Y, - XY -} - -public static class PhantomCamera2DExtensions -{ - public static PhantomCamera2D AsPhantomCamera2D(this Node2D node2D) - { - return new PhantomCamera2D(node2D); - } - - public static PhantomCameraNoiseEmitter2D AsPhantomCameraNoiseEmitter2D(this Node2D node2D) - { - return new PhantomCameraNoiseEmitter2D(node2D); - } - - public static PhantomCameraNoise2D AsPhantomCameraNoise2D(this Resource resource) - { - return new PhantomCameraNoise2D(resource); - } -} - -public class PhantomCamera2D : PhantomCamera -{ - public Node2D Node2D => (Node2D)Node; - - public delegate void TweenInterruptedEventHandler(Node2D pCam); - public delegate void DeadZoneReachedEventHandler(Vector2 side); - public delegate void NoiseEmittedEventHandler(Transform2D output); - - public event TweenInterruptedEventHandler? TweenInterrupted; - public event DeadZoneReachedEventHandler? DeadZoneReached; - public event NoiseEmittedEventHandler? NoiseEmitted; - - public Node2D FollowTarget - { - get => (Node2D)Node2D.Call(PhantomCamera.MethodName.GetFollowTarget); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowTarget, value); - } - - public Node2D[] FollowTargets - { - get => Node2D.Call(PhantomCamera.MethodName.GetFollowTargets).AsGodotArray().ToArray(); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowTargets, new Array(value)); - } - - public void AppendFollowTargets(Node2D target) => Node2D.Call(PhantomCamera.MethodName.AppendFollowTargets, target); - public void AppendFollowTargetsArray(Node2D[] targets) => Node2D.Call(PhantomCamera.MethodName.AppendFollowTargetsArray, targets); - public void EraseFollowTargets(Node2D target) => Node2D.Call(PhantomCamera.MethodName.EraseFollowTargets, target); - - public FollowMode2D FollowMode => (FollowMode2D)(int)Node.Call(PhantomCamera.MethodName.GetFollowMode); - - public Path2D FollowPath - { - get => (Path2D)Node2D.Call(PhantomCamera.MethodName.GetFollowPath); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowPath, value); - } - - public Vector2 FollowOffset - { - get => (Vector2)Node2D.Call(PhantomCamera.MethodName.GetFollowOffset); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowOffset, value); - } - - public Vector2 FollowDampingValue - { - get => (Vector2)Node2D.Call(PhantomCamera.MethodName.GetFollowDampingValue); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowDampingValue, value); - } - - public FollowLockAxis2D FollowAxisLock - { - get => (FollowLockAxis2D)(int)Node2D.Call(PhantomCamera.MethodName.GetFollowAxisLock); - set => Node2D.Call(PhantomCamera.MethodName.SetFollowAxisLock, (int)value); - } - - public Vector2 Zoom - { - get => (Vector2)Node2D.Call(MethodName.GetZoom); - set => Node2D.Call(MethodName.SetZoom, value); - } - - public bool SnapToPixel - { - get => (bool)Node2D.Call(MethodName.GetSnapToPixel); - set => Node2D.Call(MethodName.SetSnapToPixel, value); - } - - public bool RotateWithTarget - { - get => (bool)Node2D.Call(MethodName.GetRotateWithTarget); - set => Node2D.Call(MethodName.SetRotateWithTarget, value); - } - - public float RotationOffset - { - get => (float)Node2D.Call(MethodName.GetRotationOffset); - set => Node2D.Call(MethodName.SetRotationOffset, value); - } - - public bool RotationDamping - { - get => (bool)Node2D.Call(MethodName.GetRotationDamping); - set => Node2D.Call(MethodName.SetRotationDamping, value); - } - - public float RotationDampingValue - { - get => (float)Node2D.Call(MethodName.GetRotationDampingValue); - set => Node2D.Call(MethodName.SetRotationDampingValue, value); - } - - public int LimitLeft - { - get => (int)Node2D.Call(MethodName.GetLimitLeft); - set => Node2D.Call(MethodName.SetLimitLeft, value); - } - - public int LimitTop - { - get => (int)Node2D.Call(MethodName.GetLimitTop); - set => Node2D.Call(MethodName.SetLimitTop, value); - } - - public int LimitRight - { - get => (int)Node2D.Call(MethodName.GetLimitRight); - set => Node2D.Call(MethodName.SetLimitRight, value); - } - - public int LimitBottom - { - get => (int)Node2D.Call(MethodName.GetLimitBottom); - set => Node2D.Call(MethodName.SetLimitBottom, value); - } - - public Vector4I LimitMargin - { - get => (Vector4I)Node2D.Call(MethodName.GetLimitMargin); - set => Node2D.Call(MethodName.SetLimitMargin, value); - } - - public bool AutoZoom - { - get => (bool)Node2D.Call(MethodName.GetAutoZoom); - set => Node2D.Call(MethodName.SetAutoZoom, value); - } - - public float AutoZoomMin - { - get => (float)Node2D.Call(MethodName.GetAutoZoomMin); - set => Node2D.Call(MethodName.SetAutoZoomMin, value); - } - - public float AutoZoomMax - { - get => (float)Node2D.Call(MethodName.GetAutoZoomMax); - set => Node2D.Call(MethodName.SetAutoZoomMax, value); - } - - public Vector4 AutoZoomMargin - { - get => (Vector4)Node2D.Call(MethodName.GetAutoZoomMargin); - set => Node2D.Call(MethodName.SetAutoZoomMargin, value); - } - - public bool DrawLimits - { - get => (bool)Node2D.Get(PropertyName.DrawLimits); - set => Node2D.Set(PropertyName.DrawLimits, value); - } - - public PhantomCameraNoise2D Noise - { - get => new((Resource)Node2D.Call(MethodName.GetNoise)); - set => Node2D.Call(MethodName.SetNoise, (GodotObject)value.Resource); - } - - public void EmitNoise(Transform2D transform) => Node2D.Call(PhantomCamera.MethodName.EmitNoise, transform); - - public NodePath LimitTarget - { - get => (NodePath)Node2D.Call(MethodName.GetLimitTarget); - set => Node2D.Call(MethodName.SetLimitTarget, value); - } - - public PhantomCamera2D(GodotObject phantomCameraNode) : base(phantomCameraNode) - { - var callableTweenInterrupted = Callable.From(pCam => TweenInterrupted?.Invoke(pCam)); - var callableDeadZoneReached = Callable.From((Vector2 side) => DeadZoneReached?.Invoke(side)); - var callableNoiseEmitted = Callable.From((Transform2D output) => NoiseEmitted?.Invoke(output)); - - Node2D.Connect(SignalName.TweenInterrupted, callableTweenInterrupted); - Node2D.Connect(SignalName.DeadZoneReached, callableDeadZoneReached); - Node2D.Connect(SignalName.NoiseEmitted, callableNoiseEmitted); - } - - public void SetLimitTarget(TileMapLayer tileMapLayer) - { - Node2D.Call(MethodName.SetLimitTarget, tileMapLayer.GetPath()); - } - - public void SetLimitTarget(CollisionShape2D shape2D) - { - Node2D.Call(MethodName.SetLimitTarget, shape2D.GetPath()); - } - - public LimitTargetQueryResult? GetLimitTarget() - { - var result = (NodePath)Node2D.Call(MethodName.GetLimitTarget); - return result.IsEmpty ? null : new LimitTargetQueryResult(Node2D.GetNode(result)); - } - - public void SetLimit(Side side, int value) - { - Node2D.Call(MethodName.SetLimit, (int)side, value); - } - - public int GetLimit(Side side) - { - return (int)Node2D.Call(MethodName.GetLimit, (int)side); - } - - public new static class MethodName - { - public static readonly StringName GetZoom = new("get_zoom"); - public static readonly StringName SetZoom = new("set_zoom"); - - public static readonly StringName GetSnapToPixel = new("get_snap_to_pixel"); - public static readonly StringName SetSnapToPixel = new("set_snap_to_pixel"); - - public static readonly StringName GetRotateWithTarget = new("get_rotate_with_target"); - public static readonly StringName SetRotateWithTarget = new("set_rotate_with_target"); - - public static readonly StringName GetRotationOffset = new("get_rotation_offset"); - public static readonly StringName SetRotationOffset = new("set_rotation_offset"); - - public static readonly StringName GetRotationDamping = new("get_rotation_damping"); - public static readonly StringName SetRotationDamping = new("set_rotation_damping"); - - public static readonly StringName GetRotationDampingValue = new("get_rotation_damping_value"); - public static readonly StringName SetRotationDampingValue = new("set_rotation_damping_value"); - - public static readonly StringName GetLimit = new("get_limit"); - public static readonly StringName SetLimit = new("set_limit"); - - public static readonly StringName GetLimitLeft = new("get_limit_left"); - public static readonly StringName SetLimitLeft = new("set_limit_left"); - - public static readonly StringName GetLimitTop = new("get_limit_top"); - public static readonly StringName SetLimitTop = new("set_limit_top"); - - public static readonly StringName GetLimitRight = new("get_limit_right"); - public static readonly StringName SetLimitRight = new("set_limit_right"); - - public static readonly StringName GetLimitBottom = new("get_limit_bottom"); - public static readonly StringName SetLimitBottom = new("set_limit_bottom"); - - public static readonly StringName GetLimitTarget = new("get_limit_target"); - public static readonly StringName SetLimitTarget = new("set_limit_target"); - - public static readonly StringName GetLimitMargin = new("get_limit_margin"); - public static readonly StringName SetLimitMargin = new("set_limit_margin"); - - public static readonly StringName GetAutoZoom = new("get_auto_zoom"); - public static readonly StringName SetAutoZoom = new("set_auto_zoom"); - - public static readonly StringName GetAutoZoomMin = new("get_auto_zoom_min"); - public static readonly StringName SetAutoZoomMin = new("set_auto_zoom_min"); - - public static readonly StringName GetAutoZoomMax = new("get_auto_zoom_max"); - public static readonly StringName SetAutoZoomMax = new("set_auto_zoom_max"); - - public static readonly StringName GetAutoZoomMargin = new("get_auto_zoom_margin"); - public static readonly StringName SetAutoZoomMargin = new("set_auto_zoom_margin"); - - public static readonly StringName GetNoise = new("get_noise"); - public static readonly StringName SetNoise = new("set_noise"); - } - - public new static class PropertyName - { - public static readonly StringName DrawLimits = new("draw_limits"); - } -} - -public class LimitTargetQueryResult(GodotObject godotObject) -{ - public bool IsTileMapLayer => godotObject.IsClass("TileMapLayer"); - - public bool IsCollisionShape2D => godotObject.IsClass("CollisionShape2D"); - - - public TileMapLayer? AsTileMapLayer() - { - return IsTileMapLayer ? (TileMapLayer)godotObject : null; - } - - public CollisionShape2D? AsCollisionShape2D() - { - return IsCollisionShape2D ? (CollisionShape2D)godotObject : null; - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs.uid b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs.uid deleted file mode 100644 index 8cc93f0..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera2D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c38e5qhsf3fk3 diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs deleted file mode 100644 index 1e4cd07..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs +++ /dev/null @@ -1,482 +0,0 @@ -using System.Linq; -using Godot; -using Godot.Collections; -using PhantomCamera.Noise; - -#nullable enable - -namespace PhantomCamera; - -public enum LookAtMode -{ - None, - Mimic, - Simple, - Group -} - -public enum FollowMode3D -{ - None, - Glued, - Simple, - Group, - Path, - Framed, - ThirdPerson -} - -public enum FollowLockAxis3D -{ - None, - X, - Y, - Z, - XY, - XZ, - YZ, - XYZ -} - -public static class PhantomCamera3DExtensions -{ - public static PhantomCamera3D AsPhantomCamera3D(this Node3D node3D) - { - return new PhantomCamera3D(node3D); - } - - public static PhantomCameraNoiseEmitter3D AsPhantomCameraNoiseEmitter3D(this Node3D node3D) - { - return new PhantomCameraNoiseEmitter3D(node3D); - } - - public static PhantomCameraNoise3D AsPhantomCameraNoise3D(this Resource resource) - { - return new PhantomCameraNoise3D(resource); - } - - public static Camera3DResource AsCamera3DResource(this Resource resource) - { - return new Camera3DResource(resource); - } - - public static Vector3 GetThirdPersonRotation(this PhantomCamera3D pCam3D) => - (Vector3)pCam3D.Node3D.Call(PhantomCamera3D.MethodName.GetThirdPersonRotation); - - public static void SetThirdPersonRotation(this PhantomCamera3D pCam3D, Vector3 rotation) => - pCam3D.Node3D.Call(PhantomCamera3D.MethodName.SetThirdPersonRotation, rotation); - - public static Vector3 GetThirdPersonRotationDegrees(this PhantomCamera3D pCam3D) => - (Vector3)pCam3D.Node3D.Call(PhantomCamera3D.MethodName.GetThirdPersonRotationDegrees); - - public static void SetThirdPersonRotationDegrees(this PhantomCamera3D pCam3D, Vector3 rotation) => - pCam3D.Node3D.Call(PhantomCamera3D.MethodName.SetThirdPersonRotationDegrees, rotation); - - public static Quaternion GetThirdPersonQuaternion(this PhantomCamera3D pCam3D) => - (Quaternion)pCam3D.Node3D.Call(PhantomCamera3D.MethodName.GetThirdPersonQuaternion); - - public static void SetThirdPersonQuaternion(this PhantomCamera3D pCam3D, Quaternion quaternion) => - pCam3D.Node3D.Call(PhantomCamera3D.MethodName.SetThirdPersonQuaternion, quaternion); - -} - -public class PhantomCamera3D : PhantomCamera -{ - public Node3D Node3D => (Node3D)Node; - - public delegate void LookAtTargetChangedEventHandler(); - public delegate void DeadZoneReachedEventHandler(); - public delegate void Camera3DResourceChangedEventHandler(); - public delegate void Camera3DResourcePropertyChangedEventHandler(StringName property, Variant value); - public delegate void TweenInterruptedEventHandler(Node3D pCam); - public delegate void NoiseEmittedEventHandler(Transform3D output); - - public event LookAtTargetChangedEventHandler? LookAtTargetChanged; - public event DeadZoneReachedEventHandler? DeadZoneReached; - public event Camera3DResourceChangedEventHandler? Camera3DResourceChanged; - public event Camera3DResourcePropertyChangedEventHandler? Camera3DResourcePropertyChanged; - public event TweenInterruptedEventHandler? TweenInterrupted; - public event NoiseEmittedEventHandler? NoiseEmitted; - - public Node3D FollowTarget - { - get => (Node3D)Node3D.Call(PhantomCamera.MethodName.GetFollowTarget); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowTarget, value); - } - - public Node3D[] FollowTargets - { - get => Node3D.Call(PhantomCamera.MethodName.GetFollowTargets).AsGodotArray().ToArray(); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowTargets, new Array(value)); - } - - public void AppendFollowTarget(Node3D target) => Node3D.Call(PhantomCamera.MethodName.AppendFollowTargets, target); - public void AppendFollowTargetArray(Node3D[] targets) => Node3D.Call(PhantomCamera.MethodName.AppendFollowTargetsArray, targets); - public void EraseFollowTarget(Node3D target) => Node3D.Call(PhantomCamera.MethodName.EraseFollowTargets, target); - - public FollowMode3D FollowMode => (FollowMode3D)(int)Node.Call(PhantomCamera.MethodName.GetFollowMode); - - public Path3D FollowPath - { - get => (Path3D)Node3D.Call(PhantomCamera.MethodName.GetFollowPath); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowPath, value); - } - - public Vector3 FollowOffset - { - get => (Vector3)Node3D.Call(PhantomCamera.MethodName.GetFollowOffset); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowOffset, value); - } - - public Vector3 FollowDampingValue - { - get => (Vector3)Node3D.Call(PhantomCamera.MethodName.GetFollowDampingValue); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowDampingValue, value); - } - - public FollowLockAxis3D FollowAxisLock - { - get => (FollowLockAxis3D)(int)Node3D.Call(PhantomCamera.MethodName.GetFollowAxisLock); - set => Node3D.Call(PhantomCamera.MethodName.SetFollowAxisLock, (int)value); - } - - public LookAtMode LookAtMode => (LookAtMode)(int)Node3D.Call(MethodName.GetLookAtMode); - - public Camera3DResource Camera3DResource - { - get => new((Resource)Node3D.Call(MethodName.GetCamera3DResource)); - set => Node3D.Call(MethodName.SetCamera3DResource, value.Resource); - } - - public float SpringLength - { - get => (float)Node3D.Call(MethodName.GetSpringLength); - set => Node3D.Call(MethodName.SetSpringLength, value); - } - - public float VerticalRotationOffset - { - get => (float)Node3D.Call(MethodName.GetVerticalRotationOffset); - set => Node3D.Call(MethodName.SetVerticalRotationOffset, value); - } - - public float HorizontalRotationOffset - { - get => (float)Node3D.Call(MethodName.GetHorizontalRotationOffset); - set => Node3D.Call(MethodName.SetHorizontalRotationOffset, value); - } - - public float FollowDistance - { - get => (float)Node3D.Call(MethodName.GetFollowDistance); - set => Node3D.Call(MethodName.SetFollowDistance, value); - } - - public bool AutoFollowDistance - { - get => (bool)Node3D.Call(MethodName.GetAutoFollowDistance); - set => Node3D.Call(MethodName.SetAutoFollowDistance, value); - } - - public float AutoFollowDistanceMin - { - get => (float)Node3D.Call(MethodName.GetAutoFollowDistanceMin); - set => Node3D.Call(MethodName.SetAutoFollowDistanceMin, value); - } - - public float AutoFollowDistanceMax - { - get => (float)Node3D.Call(MethodName.GetAutoFollowDistanceMax); - set => Node3D.Call(MethodName.SetAutoFollowDistanceMax, value); - } - - public float AutoFollowDistanceDivisor - { - get => (float)Node3D.Call(MethodName.GetAutoFollowDistanceDivisor); - set => Node3D.Call(MethodName.SetAutoFollowDistanceDivisor, value); - } - - public Node3D LookAtTarget - { - get => (Node3D)Node3D.Call(MethodName.GetLookAtTarget); - set => Node3D.Call(MethodName.SetLookAtTarget, value); - } - - public Node3D[] LookAtTargets - { - get => Node3D.Call(MethodName.GetLookAtTargets).AsGodotArray().ToArray(); - set => Node3D.Call(MethodName.SetLookAtTargets, new Array(value)); - } - - public bool IsLooking => (bool)Node3D.Call(MethodName.IsLooking); - - public int CollisionMask - { - get => (int)Node3D.Call(MethodName.GetCollisionMask); - set => Node3D.Call(MethodName.SetCollisionMask, value); - } - - public void SetCollisionMaskValue(int maskLayer, bool enable) => - Node3D.Call(MethodName.SetCollisionMaskValue, maskLayer, enable); - - public Shape3D Shape - { - get => (Shape3D)Node3D.Call(MethodName.GetShape); - set => Node3D.Call(MethodName.SetShape, value); - } - - public float Margin - { - get => (float)Node3D.Call(MethodName.GetMargin); - set => Node3D.Call(MethodName.SetMargin, value); - } - - public Vector3 LookAtOffset - { - get => (Vector3)Node3D.Call(MethodName.GetLookAtOffset); - set => Node3D.Call(MethodName.SetLookAtOffset, value); - } - - public bool LookAtDamping - { - get => (bool)Node3D.Call(MethodName.GetLookAtDamping); - set => Node3D.Call(MethodName.SetLookAtDamping, value); - } - - public float LookAtDampingValue - { - get => (float)Node3D.Call(MethodName.GetLookAtDampingValue); - set => Node3D.Call(MethodName.SetLookAtDampingValue, value); - } - - public Vector3 Up - { - get => (Vector3)Node3D.Call(MethodName.GetUp); - set => Node3D.Call(MethodName.SetUp, value); - } - - public Node3D UpTarget - { - get => (Node3D)Node3D.Call(MethodName.GetUpTarget); - set => Node3D.Call(MethodName.SetUpTarget, value); - } - - public int KeepAspect - { - get => (int)Node3D.Call(MethodName.GetKeepAspect); - set => Node3D.Call(MethodName.SetKeepAspect, value); - } - - public int CullMask - { - get => (int)Node3D.Call(MethodName.GetCullMask); - set => Node3D.Call(MethodName.SetCullMask, value); - } - - public float HOffset - { - get => (float)Node3D.Call(MethodName.GetHOffset); - set => Node3D.Call(MethodName.SetHOffset, value); - } - - public float VOffset - { - get => (float)Node3D.Call(MethodName.GetVOffset); - set => Node3D.Call(MethodName.SetVOffset, value); - } - - public ProjectionType Projection - { - get => (ProjectionType)(int)Node3D.Call(MethodName.GetProjection); - set => Node3D.Call(MethodName.SetProjection, (int)value); - } - - public float Fov - { - get => (float)Node3D.Call(MethodName.GetFov); - set => Node3D.Call(MethodName.SetFov, value); - } - - public float Size - { - get => (float)Node3D.Call(MethodName.GetSize); - set => Node3D.Call(MethodName.SetSize, value); - } - - public Vector2 FrustumOffset - { - get => (Vector2)Node3D.Call(MethodName.GetFrustumOffset); - set => Node3D.Call(MethodName.SetFrustumOffset, value); - } - - public float Far - { - get => (float)Node3D.Call(MethodName.GetFar); - set => Node3D.Call(MethodName.SetFar, value); - } - - public float Near - { - get => (float)Node3D.Call(MethodName.GetNear); - set => Node3D.Call(MethodName.SetNear, value); - } - - public Environment Environment - { - get => (Environment)Node3D.Call(MethodName.GetEnvironment); - set => Node3D.Call(MethodName.SetEnvironment, value); - } - - public CameraAttributes Attributes - { - get => (CameraAttributes)Node3D.Call(MethodName.GetAttributes); - set => Node3D.Call(MethodName.SetAttributes, value); - } - - public PhantomCameraNoise3D Noise - { - get => new((Resource)Node3D.Call(MethodName.GetNoise)); - set => Node3D.Call(MethodName.SetNoise, (GodotObject)value.Resource); - } - - public void EmitNoise(Transform3D transform) => Node3D.Call(PhantomCamera.MethodName.EmitNoise, transform); - - public PhantomCamera3D(GodotObject phantomCamera3DNode) : base(phantomCamera3DNode) - { - var callableLookAtTargetChanged = Callable.From(() => LookAtTargetChanged?.Invoke()); - var callableDeadZoneReached = Callable.From(() => DeadZoneReached?.Invoke()); - var callableCamera3DResourceChanged = Callable.From(() => Camera3DResourceChanged?.Invoke()); - var callableCamera3DResourcePropertyChanged = Callable.From((StringName property, Variant value) => - Camera3DResourcePropertyChanged?.Invoke(property, value)); - var callableTweenInterrupted = Callable.From(pCam => TweenInterrupted?.Invoke(pCam)); - var callableNoiseEmitted = Callable.From((Transform3D output) => NoiseEmitted?.Invoke(output)); - - Node3D.Connect(SignalName.LookAtTargetChanged, callableLookAtTargetChanged); - Node3D.Connect(PhantomCamera.SignalName.DeadZoneReached, callableDeadZoneReached); - Node3D.Connect(SignalName.Camera3DResourceChanged, callableCamera3DResourceChanged); - Node3D.Connect(SignalName.Camera3DResourcePropertyChanged, callableCamera3DResourcePropertyChanged); - Node3D.Connect(PhantomCamera.SignalName.TweenInterrupted, callableTweenInterrupted); - Node3D.Connect(PhantomCamera.SignalName.NoiseEmitted, callableNoiseEmitted); - } - - public new static class MethodName - { - public static readonly StringName GetLookAtMode = new("get_look_at_mode"); - - public static readonly StringName GetCamera3DResource = new("get_camera_3d_resource"); - public static readonly StringName SetCamera3DResource = new("set_camera_3d_resource"); - - public static readonly StringName GetThirdPersonRotation = new("get_third_person_rotation"); - public static readonly StringName SetThirdPersonRotation = new("set_third_person_rotation"); - - public static readonly StringName GetThirdPersonRotationDegrees = new("get_third_person_rotation_degrees"); - public static readonly StringName SetThirdPersonRotationDegrees = new("set_third_person_rotation_degrees"); - - public static readonly StringName GetThirdPersonQuaternion = new("get_third_person_quaternion"); - public static readonly StringName SetThirdPersonQuaternion = new("set_third_person_quaternion"); - - public static readonly StringName GetVerticalRotationOffset = new("get_vertical_rotation_offset"); - public static readonly StringName SetVerticalRotationOffset = new("set_vertical_rotation_offset"); - - public static readonly StringName GetHorizontalRotationOffset = new("get_horizontal_rotation_offset"); - public static readonly StringName SetHorizontalRotationOffset = new("set_horizontal_rotation_offset"); - - public static readonly StringName GetSpringLength = new("get_spring_length"); - public static readonly StringName SetSpringLength = new("set_spring_length"); - - public static readonly StringName GetFollowDistance = new("get_follow_distance"); - public static readonly StringName SetFollowDistance = new("set_follow_distance"); - - public static readonly StringName GetAutoFollowDistance = new("get_auto_follow_distance"); - public static readonly StringName SetAutoFollowDistance = new("set_auto_follow_distance"); - - public static readonly StringName GetAutoFollowDistanceMin = new("get_auto_follow_distance_min"); - public static readonly StringName SetAutoFollowDistanceMin = new("set_auto_follow_distance_min"); - - public static readonly StringName GetAutoFollowDistanceMax = new("get_auto_follow_distance_max"); - public static readonly StringName SetAutoFollowDistanceMax = new("set_auto_follow_distance_max"); - - public static readonly StringName GetAutoFollowDistanceDivisor = new("get_auto_follow_distance_divisor"); - public static readonly StringName SetAutoFollowDistanceDivisor = new("set_auto_follow_distance_divisor"); - - public static readonly StringName GetLookAtTarget = new("get_look_at_target"); - public static readonly StringName SetLookAtTarget = new("set_look_at_target"); - - public static readonly StringName GetLookAtTargets = new("get_look_at_targets"); - public static readonly StringName SetLookAtTargets = new("set_look_at_targets"); - - public static readonly StringName IsLooking = new("is_looking"); - - public static readonly StringName GetUp = new("get_up"); - public static readonly StringName SetUp = new("set_up"); - - public static readonly StringName GetUpTarget = new("get_up_target"); - public static readonly StringName SetUpTarget = new("set_up_target"); - - public static readonly StringName GetCollisionMask = new("get_collision_mask"); - public static readonly StringName SetCollisionMask = new("set_collision_mask"); - - public static readonly StringName SetCollisionMaskValue = new("set_collision_mask_value"); - - public static readonly StringName GetShape = new("get_shape"); - public static readonly StringName SetShape = new("set_shape"); - - public static readonly StringName GetMargin = new("get_margin"); - public static readonly StringName SetMargin = new("set_margin"); - - public static readonly StringName GetLookAtOffset = new("get_look_at_offset"); - public static readonly StringName SetLookAtOffset = new("set_look_at_offset"); - - public static readonly StringName GetLookAtDamping = new("get_look_at_damping"); - public static readonly StringName SetLookAtDamping = new("set_look_at_damping"); - - public static readonly StringName GetLookAtDampingValue = new("get_look_at_damping_value"); - public static readonly StringName SetLookAtDampingValue = new("set_look_at_damping_value"); - - public static readonly StringName GetKeepAspect = new("get_keep_aspect"); - public static readonly StringName SetKeepAspect = new("set_keep_aspect"); - - public static readonly StringName GetCullMask = new("get_cull_mask"); - public static readonly StringName SetCullMask = new("set_cull_mask"); - - public static readonly StringName GetHOffset = new("get_h_offset"); - public static readonly StringName SetHOffset = new("set_h_offset"); - - public static readonly StringName GetVOffset = new("get_v_offset"); - public static readonly StringName SetVOffset = new("set_v_offset"); - - public static readonly StringName GetProjection = new("get_projection"); - public static readonly StringName SetProjection = new("set_projection"); - - public static readonly StringName GetFov = new("get_fov"); - public static readonly StringName SetFov = new("set_fov"); - - public static readonly StringName GetSize = new("get_size"); - public static readonly StringName SetSize = new("set_size"); - - public static readonly StringName GetFrustumOffset = new("get_frustum_offset"); - public static readonly StringName SetFrustumOffset = new("set_frustum_offset"); - - public static readonly StringName GetFar = new("get_far"); - public static readonly StringName SetFar = new("set_far"); - - public static readonly StringName GetNear = new("get_near"); - public static readonly StringName SetNear = new("set_near"); - - public static readonly StringName GetEnvironment = new("get_environment"); - public static readonly StringName SetEnvironment = new("set_environment"); - - public static readonly StringName GetAttributes = new("get_attributes"); - public static readonly StringName SetAttributes = new("set_attributes"); - - public static readonly StringName GetNoise = new("get_noise"); - public static readonly StringName SetNoise = new("set_noise"); - } - - public new static class SignalName - { - public static readonly StringName LookAtTargetChanged = new("look_at_target_changed"); - public static readonly StringName Camera3DResourceChanged = new("camera_3d_resource_changed"); - public static readonly StringName Camera3DResourcePropertyChanged = new("camera_3d_resource_property_changed"); - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs.uid b/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs.uid deleted file mode 100644 index c1f0801..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCamera3D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bx3g7jxtwhi04 diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs b/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs deleted file mode 100644 index 4444dad..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Godot; - -namespace PhantomCamera.Noise; - -public class PhantomCameraNoiseEmitter2D(GodotObject node) -{ - public Node2D Node2D = (Node2D)node; - - public PhantomCameraNoise2D Noise - { - get => new((Resource)Node2D.Call(MethodName.GetNoise)); - set => Node2D.Call(MethodName.SetNoise, (GodotObject)value.Resource); - } - - public bool Continuous - { - get => (bool)Node2D.Call(MethodName.GetContinuous); - set => Node2D.Call(MethodName.SetContinuous, value); - } - - public float GrowthTime - { - get => (float)Node2D.Call(MethodName.GetGrowthTime); - set => Node2D.Call(MethodName.SetGrowthTime, value); - } - - public float Duration - { - get => (float)Node2D.Call(MethodName.GetDuration); - set => Node2D.Call(MethodName.SetDuration, value); - } - - public float DecayTime - { - get => (float)Node2D.Call(MethodName.GetDecayTime); - set => Node2D.Call(MethodName.SetDecayTime, value); - } - - public int NoiseEmitterLayer - { - get => (int)Node2D.Call(MethodName.GetNoiseEmitterLayer); - set => Node2D.Call(MethodName.SetNoiseEmitterLayer, value); - } - - public void SetNoiseEmitterLayerValue(int layer, bool value) => - Node2D.Call(MethodName.SetNoiseEmitterLayerValue, layer, value); - - public void Emit() => Node2D.Call(MethodName.Emit); - - public bool IsEmitting() => (bool)Node2D.Call(MethodName.IsEmitting); - - public void Stop() => Node2D.Call(MethodName.Stop); - - public void Toggle() => Node2D.Call(MethodName.Toggle); - - public static class MethodName - { - public static readonly StringName GetNoise = new("get_noise"); - public static readonly StringName SetNoise = new("set_noise"); - - public static readonly StringName GetContinuous = new("get_continuous"); - public static readonly StringName SetContinuous = new("set_continuous"); - - public static readonly StringName GetGrowthTime = new("get_growth_time"); - public static readonly StringName SetGrowthTime = new("set_growth_time"); - - public static readonly StringName GetDuration = new("get_duration"); - public static readonly StringName SetDuration = new("set_duration"); - - public static readonly StringName GetDecayTime = new("get_decay_time"); - public static readonly StringName SetDecayTime = new("set_decay_time"); - - public static readonly StringName GetNoiseEmitterLayer = new("get_noise_emitter_layer"); - public static readonly StringName SetNoiseEmitterLayer = new("set_noise_emitter_layer"); - - public static readonly StringName SetNoiseEmitterLayerValue = new("set_noise_emitter_layer_value"); - - public static readonly StringName Emit = new("emit"); - public static readonly StringName IsEmitting = new("is_emitting"); - public static readonly StringName Stop = new("stop"); - public static readonly StringName Toggle = new("toggle"); - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs.uid b/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs.uid deleted file mode 100644 index 4f35145..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter2D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://btom8l3wlkn2j diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs b/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs deleted file mode 100644 index 2821f1f..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs +++ /dev/null @@ -1,83 +0,0 @@ -using Godot; - -namespace PhantomCamera.Noise; - -public class PhantomCameraNoiseEmitter3D(GodotObject node) -{ - public Node3D Node3D = (Node3D)node; - - public PhantomCameraNoise3D Noise - { - get => new((Resource)Node3D.Call(MethodName.GetNoise)); - set => Node3D.Call(MethodName.SetNoise, (GodotObject)value.Resource); - } - - public bool Continuous - { - get => (bool)Node3D.Call(MethodName.GetContinuous); - set => Node3D.Call(MethodName.SetContinuous, value); - } - - public float GrowthTime - { - get => (float)Node3D.Call(MethodName.GetGrowthTime); - set => Node3D.Call(MethodName.SetGrowthTime, value); - } - - public float Duration - { - get => (float)Node3D.Call(MethodName.GetDuration); - set => Node3D.Call(MethodName.SetDuration, value); - } - - public float DecayTime - { - get => (float)Node3D.Call(MethodName.GetDecayTime); - set => Node3D.Call(MethodName.SetDecayTime, value); - } - - public int NoiseEmitterLayer - { - get => (int)Node3D.Call(MethodName.GetNoiseEmitterLayer); - set => Node3D.Call(MethodName.SetNoiseEmitterLayer, value); - } - - public void SetNoiseEmitterLayerValue(int layer, bool value) => - Node3D.Call(MethodName.SetNoiseEmitterLayerValue, layer, value); - - public void Emit() => Node3D.Call(MethodName.Emit); - - public bool IsEmitting() => (bool)Node3D.Call(MethodName.IsEmitting); - - public void Stop() => Node3D.Call(MethodName.Stop); - - public void Toggle() => Node3D.Call(MethodName.Toggle); - - public static class MethodName - { - public static readonly StringName GetNoise = new("get_noise"); - public static readonly StringName SetNoise = new("set_noise"); - - public static readonly StringName GetContinuous = new("get_continuous"); - public static readonly StringName SetContinuous = new("set_continuous"); - - public static readonly StringName GetGrowthTime = new("get_growth_time"); - public static readonly StringName SetGrowthTime = new("set_growth_time"); - - public static readonly StringName GetDuration = new("get_duration"); - public static readonly StringName SetDuration = new("set_duration"); - - public static readonly StringName GetDecayTime = new("get_decay_time"); - public static readonly StringName SetDecayTime = new("set_decay_time"); - - public static readonly StringName GetNoiseEmitterLayer = new("get_noise_emitter_layer"); - public static readonly StringName SetNoiseEmitterLayer = new("set_noise_emitter_layer"); - - public static readonly StringName SetNoiseEmitterLayerValue = new("set_noise_emitter_layer_value"); - - public static readonly StringName Emit = new("emit"); - public static readonly StringName IsEmitting = new("is_emitting"); - public static readonly StringName Stop = new("stop"); - public static readonly StringName Toggle = new("toggle"); - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs.uid b/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs.uid deleted file mode 100644 index bf32a5b..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/PhantomCameraNoiseEmitter3D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://buvda14filkjx diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd deleted file mode 100644 index 00c346d..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd +++ /dev/null @@ -1,1718 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_2d.svg") -class_name PhantomCamera2D -extends Node2D - -## Controls a scene's [Camera2D] and applies logic to it. -## -## The scene's [param Camera2D] will follow the position of the -## [param PhantomCamera2D] with the highest priority. -## Each instance can have different positional and rotational logic applied -## to them. - -#region Constants - -const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#endregion - -#region Signals - -## Emitted when the [param PhantomCamera2D] becomes active. -signal became_active - -## Emitted when the [param PhantomCamera2D] becomes inactive. -signal became_inactive - -## Emitted when the follow_mode changes. -## Note: This is for internal use only -signal follow_mode_changed - -## Emitted when [member follow_target] changes. -signal follow_target_changed - -## Emitted when dead zones changes.[br] -## [b]Note:[/b] Only applicable in [param Framed] [enum FollowMode]. -signal dead_zone_changed - -## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. -signal dead_zone_reached(side: Vector2) - -## Emitted when the [param Camera2D] starts to tween to another [param PhantomCamera2D]. -signal tween_started - -## Emitted when the [param Camera2D] is to tweening towards another [param PhantomCamera2D]. -signal is_tweening - -## Emitted when the tween is interrupted due to another [param PhantomCamera2D] -## becoming active. The argument is the [param PhantomCamera2D] that interrupted -## the tween. -signal tween_interrupted(pcam_2d: PhantomCamera2D) - -## Emitted when the [param Camera2D] completes its tween to the -## [param PhantomCamera2D]. -signal tween_completed - -## Emitted when Noise should be applied to the Camera2D. -signal noise_emitted(noise_output: Transform2D) - -signal physics_target_changed - -#endregion - -#region Enums - -## Determines the positional logic for a given [param PhantomCamera2D] -## [br][br] -## The different modes have different functionalities and purposes, so choosing -## the correct one depends on what each [param PhantomCamera2D] is meant to do. -enum FollowMode { - NONE = 0, ## Default - No follow logic is applied. - GLUED = 1, ## Sticks to its target. - SIMPLE = 2, ## Follows its target with an optional offset. - GROUP = 3, ## Follows multiple targets with option to dynamically reframe itself. - PATH = 4, ## Follows a target while being positionally confined to a [Path2D] node. - FRAMED = 5, ## Applies a dead zone on the frame and only follows its target when it tries to leave it. -} - -## Determines how often an inactive [param PhantomCamera2D] should update -## its positional and rotational values. This is meant to reduce the amount -## of calculations inactive [param PhantomCamera2D] are doing when idling to -## improve performance. -enum InactiveUpdateMode { - ALWAYS, ## Always updates the [param PhantomCamera2D], even when it's inactive. - NEVER, ## Never updates the [param PhantomCamera2D] when it's inactive. Reduces the amount of computational resources when inactive. -# EXPONENTIALLY, -} - -enum FollowLockAxis { - NONE = 0, - X = 1, - Y = 2, - XY = 3, -} - -#endregion - -#region Exported Properties - -## To quickly preview a [param PhantomCamera2D] without adjusting its -## [member priority], this property allows the selected PCam to ignore the -## Priority system altogether and forcefully become the active one. It's -## partly designed to work within the Viewfinder, and will be disabled when -## running a build export of the game. -@export var priority_override: bool = false: - set(value): - priority_override = value - if Engine.is_editor_hint(): - if value: - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_override.emit(self, true) - else: - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_override.emit(self, false) - get: - return priority_override - - -## It defines which [param PhantomCamera2D] a scene's [param Camera2D] should -## be corresponding with and be attached to. This is decided by the PCam with -## the highest [param Priority]. -## [br][br] -## Changing [param Priority] will send an event to the scene's -## [PhantomCameraHost], which will then determine whether if the -## [param Priority] value is greater than or equal to the currently -## highest [param PhantomCamera2D]'s in the scene. The [param PhantomCamera2D] -## with the highest value will then reattach the [param Camera2D] accordingly. -@export var priority: int = 0: - set = set_priority, - get = get_priority - - -## Determines the positional logic for a given [param PhantomCamera2D]. -## The different modes have different functionalities and purposes, so -## choosing the correct one depends on what each [param PhantomCamera2D] -## is meant to do. -@export var follow_mode: FollowMode = FollowMode.NONE: - set(value): - follow_mode = value - - if follow_mode == FollowMode.NONE: - _should_follow = false - top_level = false - _is_parents_physics() - notify_property_list_changed() - return - - match follow_mode: - FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - FollowMode.GROUP: - _follow_targets_size_check() - _: - _should_follow_checker() - - if follow_mode == FollowMode.FRAMED: - if _follow_framed_initial_set and follow_target: - _follow_framed_initial_set = false - dead_zone_changed.connect(_on_dead_zone_changed) - else: - if dead_zone_changed.is_connected(_on_dead_zone_changed): - dead_zone_changed.disconnect(_on_dead_zone_changed) - - top_level = true - follow_mode_changed.emit() - notify_property_list_changed() - get: - return follow_mode - -## Determines which target should be followed. -## The [param Camera2D] will follow the position of the Follow Target -## based on the [member follow_mode] type and its parameters. -@export var follow_target: Node2D = null: - set = set_follow_target, - get = get_follow_target - -### Defines the targets that the [param PhantomCamera2D] should be following. -@export var follow_targets: Array[Node2D] = []: - set = set_follow_targets, - get = get_follow_targets - -## Determines the [Path2D] the [param PhantomCamera2D] -## should be bound to. -## The [param PhantomCamera2D] will follow the position of the -## [member follow_target] while sticking to the closest point on this path. -@export var follow_path: Path2D = null: - set = set_follow_path, - get = get_follow_path - - -## Applies a zoom level to the [param PhantomCamera2D], which effectively -## overrides the [param zoom] property of the [param Camera2D] node. -@export_custom(PROPERTY_HINT_LINK, "") var zoom: Vector2 = Vector2.ONE: - set = set_zoom, - get = get_zoom - - -## If enabled, will snap the [param Camera2D] to whole pixels as it moves. -## [br][br] -## This should be particularly useful in pixel art projects, -## where assets should always be aligned to the monitor's pixels to avoid -## unintended stretching. -@export var snap_to_pixel: bool = false: - set = set_snap_to_pixel, - get = get_snap_to_pixel - - -## Enables a preview of what the [PhantomCamera2D] will see in the -## scene. It works identically to how a [param Camera2D] shows which area -## will be visible during runtime. Likewise, this too will be affected by the -## [member zoom] property and the [param viewport_width] and -## [param Viewport Height] defined in the [param Project Settings]. -@export var frame_preview: bool = true: - set(value): - frame_preview = value - queue_redraw() - get: - return frame_preview - - -## Defines how the [param PhantomCamera2D] transition between one another. -## Changing the tween values for a given [param PhantomCamera2D] -## determines how transitioning to that instance will look like. -## This is a resource type that can be either used for one -## [param PhantomCamera] or reused across multiple - both 2D and 3D. -## By default, all [param PhantomCameras] will use a [param linear] -## transition, [param easeInOut] ease with a [param 1s] duration. -@export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): - set = set_tween_resource, - get = get_tween_resource - -## If enabled, the moment a [param PhantomCamera2D] is instantiated into -## a scene, and has the highest priority, it will perform its tween transition. -## This is most obvious if a [param PhantomCamera2D] has a long duration and -## is attached to a playable character that can be moved the moment a scene -## is loaded. Disabling the [param tween_on_load] property will -## disable this behaviour and skip the tweening entirely when instantiated. -@export var tween_on_load: bool = true: - set = set_tween_on_load, - get = get_tween_on_load - - -## Determines how often an inactive [param PhantomCamera2D] should update -## its positional and rotational values. This is meant to reduce the amount -## of calculations inactive [param PhantomCamera2Ds] are doing when idling -## to improve performance. -@export var inactive_update_mode: InactiveUpdateMode = InactiveUpdateMode.ALWAYS - - -## Determines which layers this [param PhantomCamera2D] should be able to communicate with [PhantomCameraHost] nodes.[br] -## A corresponding layer needs to be set on the [PhantomCameraHost] node. -@export_flags_2d_render var host_layers: int = 1: - set = set_host_layers, - get = get_host_layers - - -@export_group("Follow Parameters") -## Offsets the [member follow_target] position. -@export var follow_offset: Vector2 = Vector2.ZERO: - set = set_follow_offset, - get = get_follow_offset - -## Applies a damping effect on the [param Camera2D]'s movement. -## Leading to heavier / slower camera movement as the targeted node moves around. -## This is useful to avoid sharp and rapid camera movement. -@export var follow_damping: bool = false: - set = set_follow_damping, - get = get_follow_damping - -## Defines the damping amount. The ideal range should be somewhere between 0-1.[br][br] -## The damping amount can be specified in the individual axis.[br][br] -## [b]Lower value[/b] = faster / sharper camera movement.[br] -## [b]Higher value[/b] = slower / heavier camera movement. -@export_custom(PROPERTY_HINT_LINK, "") -var follow_damping_value: Vector2 = Vector2(0.1, 0.1): - set = set_follow_damping_value, - get = get_follow_damping_value - -## Prevents the [param PhantomCamera2D] from moving in a designated axis. -## This can be enabled or disabled at runtime or from the editor directly. -@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: - set = set_lock_axis, - get = get_lock_axis -var _follow_axis_is_locked: bool = false -var _follow_axis_lock_value: Vector2 = Vector2.ZERO - -## Makes the [param PhantomCamera2D] copy the rotation of its [member follow_target][br] -## This behavior is only available when [member follow_mode] is set and only has one [member follow_target].[br][br] -## [b]Important:[/b] Be sure to disable [member Camera2D.ignore_rotation] on the [Camera2D] node to enable this feature. -@export var rotate_with_target: bool = false: - set = set_rotate_with_target, - get = get_rotate_with_target -var _should_rotate_with_target: bool = false - -## Offsets the rotation when [member rotate_with_target] is enabled. -@export_range(-360, 360, 0.001, "radians_as_degrees") var rotation_offset: float = 0: - set = set_rotation_offset, - get = get_rotation_offset - -## Enables rotational damping when [member rotate_with_target] is enabled. -@export var rotation_damping: bool = false: - set = set_rotation_damping, - get = get_rotation_damping - -## Defines the damping amount for the [member rotate_with_target]. -@export_range(0, 1) var rotation_damping_value: float = 0.1: - set = set_rotation_damping_value, - get = get_rotation_damping_value - - -@export_subgroup("Follow Group") -## Enables the [param PhantomCamera2D] to dynamically zoom in and out based on -## the targets' distances between each other. -## Once enabled, the [param Camera2D] will stay as zoomed in as possible, -## limited by the [member auto_zoom_max] and start zooming out as the targets -## move further apart, limited by the [member auto_zoom_min]. -## Note: Enabling this property hides and disables the [member zoom] property -## as this effectively overrides that value. -@export var auto_zoom: bool = false: - set = set_auto_zoom, - get = get_auto_zoom - -## Sets the param minimum zoom amount, in other words how far away the -## [param Camera2D] can be from scene.[br][br] -## This only works when [member auto_zoom] is enabled. -@export var auto_zoom_min: float = 1: - set = set_auto_zoom_min, - get = get_auto_zoom_min - -## Sets the maximum zoom amount, in other words how close the [param Camera2D] -## can move towards the scene.[br][br] -## This only works when [member auto_zoom] is enabled. -@export var auto_zoom_max: float = 5: - set = set_auto_zoom_max, - get = get_auto_zoom_max - -## Determines how close to the edges the targets are allowed to be. -## This is useful to avoid targets being cut off at the edges of the screen. -## [br][br] -## The Vector4 parameter order goes: [param Left] - [param Top] - [param Right] -## - [param Bottom]. -@export var auto_zoom_margin: Vector4 = Vector4.ZERO: - set = set_auto_zoom_margin, - get = get_auto_zoom_margin - - -@export_subgroup("Dead Zones") -## Defines the horizontal dead zone area. While the target is within it, the -## [param PhantomCamera2D] will not move in the horizontal axis. -## If the targeted node leaves the horizontal bounds, the -## [param PhantomCamera2D] will follow the target horizontally to keep -## it within bounds. -@export_range(0, 1) var dead_zone_width: float = 0: - set(value): - dead_zone_width = value - dead_zone_changed.emit() - get: - return dead_zone_width - -## Defines the vertical dead zone area. While the target is within it, the -## [param PhantomCamera2D] will not move in the vertical axis. -## If the targeted node leaves the vertical bounds, the -## [param PhantomCamera2D] will follow the target horizontally to keep -## it within bounds. -@export_range(0, 1) var dead_zone_height: float = 0: - set(value): - dead_zone_height = value - dead_zone_changed.emit() - get: - return dead_zone_height - -## Enables the [param dead zones] to be visible when running the game from the editor. -## [br] -## [param dead zones] will never be visible in build exports. -@export var show_viewfinder_in_play: bool = false - - -@export_group("Limit") - -## Shows the [param Camera2D]'s built-in limit border.[br] -## The [param PhantomCamera2D] and [param Camera2D] can move around anywhere within it. -@export var draw_limits: bool = false: - set(value): - _draw_limits = value - if Engine.is_editor_hint(): - _draw_camera_2d_limit() - get: - return _draw_limits - -## Defines the left side of the [param Camera2D] limit. -## The camera will not be able to move past this point. -@export var limit_left: int = -10000000: - set = set_limit_left, - get = get_limit_left -## Defines the top side of the [param Camera2D] limit. -## The camera will not be able to move past this point. -@export var limit_top: int = -10000000: - set = set_limit_top, - get = get_limit_top -## Defines the right side of the [param Camera2D] limit. -## The camera will not be able to move past this point. -@export var limit_right: int = 10000000: - set = set_limit_right, - get = get_limit_right -## Defines the bottom side of the [param Camera2D] limit. -## The camera will not be able to move past this point. -@export var limit_bottom: int = 10000000: - set = set_limit_bottom, - get = get_limit_bottom - -## Allows for setting either a [TileMapLayer] or [CollisionShape2D] node to -## automatically apply a limit size instead of manually adjusting the Left, -## Top, Right and Left properties.[br][br] -## [b]TileMapLayer[/b][br] -## The Limit will update after the [TileSet] of the [TileMapLayer] has changed.[br] -## [b]Note:[/b] The limit size will only update after closing the TileMap editor -## bottom panel. -## [br][br] -## [b]CollisionShape2D[/b][br] -## The limit will update in realtime as the Shape2D changes its size. -## Note: For performance reasons, resizing the [Shape2D] during runtime will not change the Limits sides. -@export_node_path("TileMapLayer", "CollisionShape2D") var limit_target: NodePath = NodePath(""): - set = set_limit_target, - get = get_limit_target - -## Applies an offset to the [TileMapLayer] Limit or [Shape2D] Limit. -## The values goes from [param Left], [param Top], [param Right] -## and [param Bottom]. -@export var limit_margin: Vector4i = Vector4.ZERO: - set = set_limit_margin, - get = get_limit_margin -#@export var limit_smoothed: bool = false: # TODO - Needs proper support - #set = set_limit_smoothing, - #get = get_limit_smoothing - -@export_group("Noise") -## Applies a noise, or shake, to a [Camera2D].[br] -## Once set, the noise will run continuously after the tween to the [PhantomCamera2D] is complete. -@export var noise: PhantomCameraNoise2D = null: - set = set_noise, - get = get_noise - -## If true, will trigger the noise while in the editor.[br] -## Useful in cases where you want to temporarily disable the noise in the editor without removing -## the resource.[br][br] -## [b]Note:[/b] This property has no effect on runtime behaviour. -@export var _preview_noise: bool = true: - set(value): - _preview_noise = value - if not value: - _transform_noise = Transform2D() - -## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter2D.noise_emitter_layer] -## to make this [PhantomCamera2D] be affect by it. -@export_flags_2d_render var noise_emitter_layer: int = 0: - set = set_noise_emitter_layer, - get = get_noise_emitter_layer - -#region Private Variables - -var _is_active: bool = false - -var _should_follow: bool = false -var _follow_framed_offset: Vector2 = Vector2.ZERO -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled: bool = false # NOTE - Enable for Godot 4.3 and when PhysicsInterpolationMode bug is resolved - -var _has_multiple_follow_targets: bool = false -var _follow_targets_single_target_index: int = 0 -var _follow_targets: Array[Node2D] = [] - -var _follow_velocity_ref: Vector2 = Vector2.ZERO # Stores and applies the velocity of the follow movement -var _rotation_velocity_ref: float = 0 # Stores and applies the velocity of the rotation movement - -var _has_follow_path: bool = false - -var _tween_skip: bool = false - -## Defines the position of the [member follow_target] within the viewport.[br] -## This is only used for when [member follow_mode] is set to [param Framed]. -var _follow_framed_initial_set: bool = false - -static var _draw_limits: bool = false - -var _limit_sides: Vector4i = _limit_sides_default -var _limit_sides_default: Vector4i = Vector4i(-10000000, -10000000, 10000000, 10000000) - -var _limit_node: Node2D = null -var _tile_size_perspective_scaler: Vector2 = Vector2.ONE - -var _limit_inactive_pcam: bool = false - -var _follow_target_position: Vector2 = Vector2.ZERO - -var _transform_output: Transform2D = Transform2D() -var _transform_noise: Transform2D = Transform2D() - -var _has_noise_resource: bool = false - -# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. -var _phantom_camera_manager: Node = null - -#endregion - -#region Public Variables - -var tween_duration: float: - set = set_tween_duration, - get = get_tween_duration -var tween_transition: PhantomCameraTween.TransitionType: - set = set_tween_transition, - get = get_tween_transition -var tween_ease: PhantomCameraTween.EaseType: - set = set_tween_ease, - get = get_tween_ease - -var viewport_position: Vector2 - -#endregion - -#region Private Functions - -func _validate_property(property: Dictionary) -> void: - ################ - ## Follow Target - ################ - if property.name == "follow_target": - if follow_mode == FollowMode.NONE or \ - follow_mode == FollowMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - elif property.name == "follow_path" and \ - follow_mode != FollowMode.PATH: - property.usage = PROPERTY_USAGE_NO_EDITOR - - - #################### - ## Follow Parameters - #################### - if follow_mode == FollowMode.NONE: - match property.name: - "follow_offset", \ - "follow_damping", \ - "follow_damping_value", \ - "follow_axis_lock", \ - "rotate_with_target": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "follow_offset": - if follow_mode == FollowMode.GLUED: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "follow_damping_value" and not follow_damping: - property.usage = PROPERTY_USAGE_NO_EDITOR - - ############### - ## Follow Group - ############### - if follow_mode != FollowMode.GROUP: - match property.name: - "follow_targets", \ - "auto_zoom": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not auto_zoom or follow_mode != FollowMode.GROUP: - match property.name: - "auto_zoom_min", \ - "auto_zoom_max", \ - "auto_zoom_margin": - property.usage = PROPERTY_USAGE_NO_EDITOR - - ################ - ## Follow Framed - ################ - if not follow_mode == FollowMode.FRAMED: - match property.name: - "dead_zone_width", \ - "dead_zone_height", \ - "show_viewfinder_in_play": - property.usage = PROPERTY_USAGE_NO_EDITOR - - - ##################### - ## Rotate With Target - ##################### - if property.name == "rotate_with_target" and follow_mode == FollowMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - - if not rotate_with_target or follow_mode == FollowMode.GROUP: - match property.name: - "rotation_damping", \ - "rotation_offset", \ - "rotation_damping_value": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "rotation_damping_value": - if not rotation_damping: - property.usage = PROPERTY_USAGE_NO_EDITOR - - - ####### - ## Zoom - ####### - if property.name == "zoom" and follow_mode == FollowMode.GROUP and auto_zoom: - property.usage = PROPERTY_USAGE_NO_EDITOR - - ######## - ## Limit - ######## - if is_instance_valid(_limit_node): - match property.name: - "limit_left", \ - "limit_top", \ - "limit_right", \ - "limit_bottom": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "limit_margin" and not _limit_node: - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _enter_tree() -> void: - _phantom_camera_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - _tween_skip = !tween_on_load - - _phantom_camera_manager.pcam_added(self) - - priority_override = false - - match follow_mode: - FollowMode.NONE: - _is_parents_physics() - FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - FollowMode.GROUP: - _follow_targets_size_check() - _: - _should_follow_checker() - - if not visibility_changed.is_connected(_check_visibility): - visibility_changed.connect(_check_visibility) - - update_limit_all_sides() - - -func _exit_tree() -> void: - if not follow_mode == FollowMode.GROUP: - follow_targets = [] - - if not is_instance_valid(_phantom_camera_manager): return - _phantom_camera_manager.pcam_removed(self) - - -func _ready() -> void: - _transform_output = global_transform - - _phantom_camera_manager.noise_2d_emitted.connect(_noise_emitted) - - if not Engine.is_editor_hint(): - _preview_noise = true - - -func _process(delta: float) -> void: - if _follow_target_physics_based or _is_active: return - process_logic(delta) - - -func _physics_process(delta: float) -> void: - if not _follow_target_physics_based or _is_active: return - process_logic(delta) - - -func process_logic(delta: float) -> void: - if _is_active: - if _has_noise_resource and _preview_noise: - _transform_noise = noise.get_noise_transform(delta) - else: - match inactive_update_mode: - InactiveUpdateMode.NEVER: return - InactiveUpdateMode.ALWAYS: - # Only triggers if limit isn't default - if _limit_inactive_pcam: - global_position = _set_limit_clamp_position(global_position) - # InactiveUpdateMode.EXPONENTIALLY: - # TODO - Trigger positional updates less frequently as more PCams gets added - - _limit_checker() - - if _should_follow: - _follow(delta) - else: - _transform_output = global_transform - - if _follow_axis_is_locked: - match follow_axis_lock: - FollowLockAxis.X: - _transform_output.origin.x = _follow_axis_lock_value.x - FollowLockAxis.Y: - _transform_output.origin.y = _follow_axis_lock_value.y - FollowLockAxis.XY: - _transform_output.origin.x = _follow_axis_lock_value.x - _transform_output.origin.y = _follow_axis_lock_value.y - - -func _limit_checker() -> void: - ## TODO - Needs to see if this can be triggerd only from CollisionShape2D Transform changes - if not Engine.is_editor_hint(): return - if draw_limits: - update_limit_all_sides() - - -func _follow(delta: float) -> void: - _set_follow_position() - _interpolate_position(_follow_target_position, delta) - - -func _set_follow_position() -> void: - match follow_mode: - FollowMode.GLUED: - _follow_target_position = follow_target.global_position - - FollowMode.SIMPLE: - _follow_target_position = _get_target_position_offset() - - FollowMode.GROUP: - if _has_multiple_follow_targets: - var rect: Rect2 = Rect2(_follow_targets[0].global_position, Vector2.ZERO) - for target in _follow_targets: - rect = rect.expand(target.global_position) - if auto_zoom: - rect = rect.grow_individual( - auto_zoom_margin.x, - auto_zoom_margin.y, - auto_zoom_margin.z, - auto_zoom_margin.w - ) - - if rect.size.x > rect.size.y * _phantom_camera_manager.screen_size.aspect(): - zoom = clamp(_phantom_camera_manager.screen_size.x / rect.size.x, auto_zoom_min, auto_zoom_max) * Vector2.ONE - else: - zoom = clamp(_phantom_camera_manager.screen_size.y / rect.size.y, auto_zoom_min, auto_zoom_max) * Vector2.ONE - _follow_target_position = rect.get_center() + follow_offset - else: - _follow_target_position = follow_targets[_follow_targets_single_target_index].global_position + follow_offset - - FollowMode.PATH: - var path_position: Vector2 = follow_path.global_position - - _follow_target_position = \ - follow_path.curve.get_closest_point( - _get_target_position_offset() - path_position - ) + path_position - - FollowMode.FRAMED: - if not Engine.is_editor_hint(): - if not _is_active: - _follow_target_position = _get_target_position_offset() - else: - viewport_position = (get_follow_target().get_global_transform_with_canvas().get_origin() + follow_offset) / get_viewport_rect().size - var framed_side_offset: Vector2 = _get_framed_side_offset() - - if framed_side_offset != Vector2.ZERO: - var glo_pos: Vector2 - var target_position: Vector2 = _get_target_position_offset() + _follow_framed_offset - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - _follow_target_position = _get_target_position_offset() - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _get_target_position_offset() - glo_pos.x += target_position.x - global_position.x - _follow_target_position = glo_pos - else: - _follow_target_position = _get_target_position_offset() - - # If a horizontal dead zone is reached - if framed_side_offset.x != 0 and framed_side_offset.y == 0: - _follow_target_position.y = _transform_output.origin.y - _follow_target_position.x = target_position.x - _follow_framed_offset.y = global_position.y - _get_target_position_offset().y - dead_zone_reached.emit(Vector2(framed_side_offset.x, 0)) - # If a vertical dead zone is reached - elif framed_side_offset.x == 0 and framed_side_offset.y != 0: - _follow_target_position.x = _transform_output.origin.x - _follow_target_position.y = target_position.y - _follow_framed_offset.x = global_position.x - _get_target_position_offset().x - dead_zone_reached.emit(Vector2(0, framed_side_offset.y)) - # If a deadzone corner is reached - else: - _follow_target_position = target_position - dead_zone_reached.emit(Vector2(framed_side_offset.x, framed_side_offset.y)) - else: - _follow_framed_offset = _transform_output.origin - _get_target_position_offset() - _follow_target_position = global_position - return - else: - _follow_target_position = _get_target_position_offset() - - -func _set_follow_velocity(index: int, value: float): - _follow_velocity_ref[index] = value - -func _set_rotation_velocity(index: int, value: float): - _rotation_velocity_ref = value - -func _interpolate_position(target_position: Vector2, delta: float) -> void: - var output_rotation: float = global_transform.get_rotation() - if rotate_with_target: - if rotation_damping and not Engine.is_editor_hint(): - output_rotation = _smooth_damp( - follow_target.get_rotation() + rotation_offset, - _transform_output.get_rotation(), - 0, - _rotation_velocity_ref, - _set_rotation_velocity, - rotation_damping_value, - delta - ) - else: - output_rotation = follow_target.get_rotation() + rotation_offset - - if _limit_inactive_pcam and not _tween_skip: - target_position = _set_limit_clamp_position(target_position) - - global_position = target_position - - if follow_damping and not Engine.is_editor_hint(): - var output_position: Vector2 - for i in 2: - output_position[i] = _smooth_damp( - global_position[i], - _transform_output.origin[i], - i, - _follow_velocity_ref[i], - _set_follow_velocity, - follow_damping_value[i], - delta - ) - _transform_output = Transform2D(output_rotation, output_position) - else: - _transform_output = Transform2D(output_rotation, target_position) - - -func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: - damping_time = maxf(0.0001, damping_time) - var omega: float = 2 / damping_time - var x: float = omega * delta - var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x) - var diff: float = self_axis - target_axis - var _target_axis: float = target_axis - - var max_change: float = INF * damping_time - diff = clampf(diff, -max_change, max_change) - target_axis = self_axis - diff - - var temp: float = (current_velocity + omega * diff) * delta - set_velocity.call(index, (current_velocity - omega * temp) * exponential) - var output: float = target_axis + (diff + temp) * exponential - - ## To prevent overshooting - if (_target_axis - self_axis > 0.0) == (output > _target_axis): - output = _target_axis - set_velocity.call(index, (output - _target_axis) / delta) - - return output - - -func _set_limit_clamp_position(value: Vector2) -> Vector2: - var camera_frame_rect_size: Vector2 = _camera_frame_rect().size - value.x = clampf(value.x, _limit_sides.x + camera_frame_rect_size.x / 2, _limit_sides.z - camera_frame_rect_size.x / 2) - value.y = clampf(value.y, _limit_sides.y + camera_frame_rect_size.y / 2, _limit_sides.w - camera_frame_rect_size.y / 2) - return value - - -func _draw() -> void: - if not Engine.is_editor_hint(): return - - if frame_preview and not _is_active: - draw_rect(_camera_frame_rect(), Color("3ab99a"), false, 2) - - -func _camera_frame_rect() -> Rect2: - var screen_size_zoom: Vector2 = Vector2(_phantom_camera_manager.screen_size.x / get_zoom().x, _phantom_camera_manager.screen_size.y / get_zoom().y) - - return Rect2(-screen_size_zoom / 2, screen_size_zoom) - - -func _on_tile_map_changed() -> void: - update_limit_all_sides() - - -func _get_target_position_offset() -> Vector2: - return follow_target.global_position + follow_offset - - -func _on_dead_zone_changed() -> void: - global_position = _get_target_position_offset() - - -func _get_framed_side_offset() -> Vector2: - var frame_out_bounds: Vector2 - - if viewport_position.x < 0.5 - dead_zone_width / 2: - # Is outside left edge - frame_out_bounds.x = -1 - - if viewport_position.y < 0.5 - dead_zone_height / 2: - # Is outside top edge - frame_out_bounds.y = 1 - - if viewport_position.x > 0.5 + dead_zone_width / 2: - # Is outside right edge - frame_out_bounds.x = 1 - - if viewport_position.y > 0.5001 + dead_zone_height / 2: # 0.501 to resolve an issue where the bottom vertical Dead Zone never becoming 0 when the Dead Zone Vertical parameter is set to 0 - # Is outside bottom edge - frame_out_bounds.y = -1 - - return frame_out_bounds - - -func _draw_camera_2d_limit() -> void: - if not is_instance_valid(_phantom_camera_manager): return - _phantom_camera_manager.draw_limit_2d.emit(draw_limits) - - -func _check_limit_is_not_default() -> void: - if _limit_sides == _limit_sides_default: - _limit_inactive_pcam = false - else: - _limit_inactive_pcam = true - - -func _check_visibility() -> void: - _phantom_camera_manager.pcam_visibility_changed.emit(self) - - -func _follow_target_tree_exiting(target: Node) -> void: - if target == follow_target: - _should_follow = false - if _follow_targets.has(target): - _follow_targets.erase(target) - - -func _should_follow_checker() -> void: - if follow_mode == FollowMode.NONE: - _should_follow = false - return - - if not follow_mode == FollowMode.GROUP: - if is_instance_valid(follow_target): - _should_follow = true - else: - _should_follow = false - - -func _follow_targets_size_check() -> void: - var targets_size: int = 0 - _follow_target_physics_based = false - _follow_targets = [] - for i in follow_targets.size(): - if follow_targets[i] == null: continue - if is_instance_valid(follow_targets[i]): - _follow_targets.append(follow_targets[i]) - targets_size += 1 - _follow_targets_single_target_index = i - _check_physics_body(follow_targets[i]) - if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): - follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) - - match targets_size: - 0: - _should_follow = false - _has_multiple_follow_targets = false - 1: - _should_follow = true - _has_multiple_follow_targets = false - _: - _should_follow = true - _has_multiple_follow_targets = true - - -func _noise_emitted(emitter_noise_output: Transform2D, emitter_layer: int) -> void: - if noise_emitter_layer & emitter_layer != 0: - noise_emitted.emit(emitter_noise_output) - - -func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: - var mask: int = current_layers - - # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 - if layer_number < 1 or layer_number > 20: - printerr("Render layer must be between 1 and 20.") - else: - if value: - mask |= 1 << (layer_number - 1) - else: - mask &= ~(1 << (layer_number - 1)) - - return mask - - -func _check_physics_body(target: Node2D) -> void: - if target is PhysicsBody2D: - var show_jitter_tips := ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips") - var physics_interpolation_enabled := ProjectSettings.get_setting("physics/common/physics_interpolation") - - ## NOTE - Feature Toggle - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor < 3: - if show_jitter_tips == null: # Default value is null when referencing custom Project Setting - print_rich("Following a [b]PhysicsBody2D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("If possible, will recommend upgrading to Godot 4.3, as it has built-in support for 2D Physics Interpolation, which will mitigate this issue.") - print_rich("Otherwise, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## NOTE - Only supported in Godot 4.3 or above - elif not physics_interpolation_enabled and show_jitter_tips == null: # Default value is null when referencing custom Project Setting - printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - _follow_target_physics_based = true - else: - _is_parents_physics(target) - physics_target_changed.emit() - - -func _is_parents_physics(target: Node = self) -> void: - var current_node: Node = target - while current_node: - current_node = current_node.get_parent() - if not current_node is PhysicsBody2D: continue - _follow_target_physics_based = true - -#endregion - - -#region Public Functions - -## Updates the limit sides based what has been set to define it -## This should be automatic, but can be called manully if need be. -func update_limit_all_sides() -> void: - var limit_rect: Rect2 - - if not is_instance_valid(_limit_node): - _limit_sides.x = limit_left - _limit_sides.y = limit_top - _limit_sides.z = limit_right - _limit_sides.w = limit_bottom - elif _limit_node is TileMapLayer: - var tile_map: TileMapLayer = _limit_node - - if not tile_map.tile_set: return # TODO: This should be removed once https://github.com/godotengine/godot/issues/96898 is resolved - - var tile_map_size: Vector2 = Vector2(tile_map.get_used_rect().size) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() - var tile_map_position: Vector2 = tile_map.global_position + Vector2(tile_map.get_used_rect().position) * Vector2(tile_map.tile_set.tile_size) * tile_map.get_scale() - - ## Calculates the Rect2 based on the Tile Map position and size + margin - limit_rect = Rect2( - tile_map_position + Vector2(limit_margin.x, limit_margin.y), - tile_map_size - Vector2(limit_margin.x, limit_margin.y) - Vector2(limit_margin.z, limit_margin.w) - ) - - # Left - _limit_sides.x = roundi(limit_rect.position.x) - # Top - _limit_sides.y = roundi(limit_rect.position.y) - # Right - _limit_sides.z = roundi(limit_rect.position.x + limit_rect.size.x) - # Bottom - _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y) - elif _limit_node is CollisionShape2D: - var collision_shape_2d: CollisionShape2D = _limit_node as CollisionShape2D - - if not collision_shape_2d.get_shape(): return - - var shape_2d: Shape2D = collision_shape_2d.get_shape() - var shape_2d_size: Vector2 = shape_2d.get_rect().size - var shape_2d_position: Vector2 = collision_shape_2d.global_position + Vector2(shape_2d.get_rect().position) - - ## Calculates the Rect2 based on the Tile Map position and size - limit_rect = Rect2(shape_2d_position, shape_2d_size) - - ## Calculates the Rect2 based on the Tile Map position and size + margin - limit_rect = Rect2( - limit_rect.position + Vector2(limit_margin.x, limit_margin.y), - limit_rect.size - Vector2(limit_margin.x, limit_margin.y) - Vector2(limit_margin.z, limit_margin.w) - ) - - # Left - _limit_sides.x = roundi(limit_rect.position.x) - # Top - _limit_sides.y = roundi(limit_rect.position.y) - # Right - _limit_sides.z = roundi(limit_rect.position.x + limit_rect.size.x) - # Bottom - _limit_sides.w = roundi(limit_rect.position.y + limit_rect.size.y) - - _check_limit_is_not_default() - if not _is_active: return - if not is_instance_valid(_phantom_camera_manager): return - _phantom_camera_manager.limit_2d_changed.emit(SIDE_LEFT, _limit_sides.x) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_TOP, _limit_sides.y) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_RIGHT, _limit_sides.z) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_BOTTOM, _limit_sides.w) - _phantom_camera_manager.draw_limit_2d.emit(draw_limits) - - -func reset_limit() -> void: - if not is_instance_valid(_phantom_camera_manager): return - _phantom_camera_manager.limit_2d_changed.emit(SIDE_LEFT, _limit_sides_default.x) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_TOP, _limit_sides_default.y) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_RIGHT, _limit_sides_default.z) - _phantom_camera_manager.limit_2d_changed.emit(SIDE_BOTTOM, _limit_sides_default.w) - _phantom_camera_manager.draw_limit_2d.emit(draw_limits) - - -## Assigns the value of the [param has_tweened] property. -## [b][color=yellow]Important:[/color][/b] This value can only be changed -## from the [PhantomCameraHost] script. -func set_tween_skip(caller: Node, value: bool) -> void: - if is_instance_of(caller, PhantomCameraHost): - _tween_skip = value - else: - printerr("Can only be called PhantomCameraHost class") -## Returns the current [param has_tweened] value. -func get_tween_skip() -> bool: - return _tween_skip - -## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. -func get_transform_output() -> Transform2D: - return _transform_output - - -## Returns the noise [Transform3D] value. -func get_noise_transform() -> Transform2D: - return _transform_noise - - -## Emits a noise based on a custom [Transform2D] value.[br] -## Use this function if you wish to make use of external noise patterns from, for example, other addons. -func emit_noise(value: Transform2D) -> void: - noise_emitted.emit(value) - - -## Teleports the [param PhantomCamera2D] and [Camera2D] to their designated position, -## bypassing the damping process. -func teleport_position() -> void: - _follow_velocity_ref = Vector2.ZERO - _set_follow_position() - _transform_output.origin = _follow_target_position - _phantom_camera_manager.pcam_teleport.emit(self) - - -# TODO: Enum link does link to anywhere is being tracked in: https://github.com/godotengine/godot/issues/106828 -## Returns true if this [param PhantomCamera2D]'s [member follow_mode] is not set to [enum FollowMode] -## and has a valid [member follow_target]. -func is_following() -> bool: - return _should_follow - -#endregion - - -#region Setter & Getter Functions - -## Assigns new [member zoom] value. -func set_zoom(value: Vector2) -> void: - zoom = value - queue_redraw() - -## Gets current [member zoom] value. -func get_zoom() -> Vector2: - return zoom - - -## Assigns new [member priority] value. -func set_priority(value: int) -> void: - priority = maxi(0, value) - if not is_node_ready(): return - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_changed.emit(self) - -## Gets current [member priority] value. -func get_priority() -> int: - return priority - - -## Assigns a new PhantomCameraTween resource to the PhantomCamera2D -func set_tween_resource(value: PhantomCameraTween) -> void: - tween_resource = value - -## Gets the PhantomCameraTween resource assigned to the PhantomCamera2D -## Returns null if there's nothing assigned to it. -func get_tween_resource() -> PhantomCameraTween: - return tween_resource - - -## Assigns a new [param Tween Duration] to the [member tween_resource] value.[br] -## The duration value is in seconds. -func set_tween_duration(value: float) -> void: - tween_resource.duration = value - -## Gets the current [param Tween Duration] value inside the -## [member tween_resource].[br] -## The duration value is in seconds. -func get_tween_duration() -> float: - return tween_resource.duration - - -## Assigns a new [param Tween Transition] value inside the -## [member tween_resource]. -func set_tween_transition(value: int) -> void: - tween_resource.transition = value - -## Gets the current [param Tween Transition] value inside the -## [member tween_resource]. -func get_tween_transition() -> int: - return tween_resource.transition - - -## Assigns a new [param Tween Ease] value inside the [member tween_resource]. -func set_tween_ease(value: int) -> void: - tween_resource.ease = value - -## Gets the current [param Tween Ease] value inside the [member tween_resource]. -func get_tween_ease() -> int: - return tween_resource.ease - - -## Sets the [param PhantomCamera2D] active state.[br] -## [b][color=yellow]Important:[/color][/b] This value can only be changed -## from the [PhantomCameraHost] script. -func set_is_active(node, value) -> void: - if node is PhantomCameraHost: - _is_active = value - queue_redraw() - else: - printerr("PCams can only be set from the PhantomCameraHost") - -## Gets current active state of the [param PhantomCamera2D]. -## If it returns true, it means the [param PhantomCamera2D] is what the -## [param Camera2D] is currently following. -func is_active() -> bool: - return _is_active - - -## Enables or disables the [member tween_on_load]. -func set_tween_on_load(value: bool) -> void: - tween_on_load = value - -## Gets the current [member tween_on_load] value. -func get_tween_on_load() -> bool: - return tween_on_load - -## Sets the [member host_layers] value. -func set_host_layers(value: int) -> void: - host_layers = value - if is_instance_valid(_phantom_camera_manager): - _phantom_camera_manager.pcam_host_layer_changed.emit(self) - -## Enables or disables a given layer of [member host_layers]. -func set_host_layers_value(layer: int, value: bool) -> void: - host_layers = _set_layer(host_layers, layer, value) - -## Gets the current [member host_layers]. -func get_host_layers() -> int: - return host_layers - - -## Gets the current follow mode as an enum int based on [enum FollowMode].[br] -## [b]Note:[/b] Setting [enum FollowMode] purposely not added. -## A separate PCam should be used instead. -func get_follow_mode() -> int: - return follow_mode - - -## Assigns a new [Node2D] as the [member follow_target]. -func set_follow_target(value: Node2D) -> void: - if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return - if follow_target == value: return - follow_target = value - _follow_target_physics_based = false - if is_instance_valid(value): - if follow_mode == FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow = true - else: - _should_follow = false - else: - _should_follow = true - _check_physics_body(value) - if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): - follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) - else: - _should_follow = false - follow_target_changed.emit() - notify_property_list_changed() - -## Erases the current [member follow_target]. -func erase_follow_target() -> void: - if follow_target == null: return - _should_follow = false - follow_target = null - _follow_target_physics_based = false - follow_target_changed.emit() - -## Gets the current [member follow_target]. -func get_follow_target() -> Node2D: - return follow_target - - -## Assigns a new [Path2D] to the [member follow_path]. -func set_follow_path(value: Path2D) -> void: - follow_path = value - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - -## Erases the current [Path2D] from the [member follow_path] property. -func erase_follow_path() -> void: - follow_path = null - -## Gets the current [Path2D] from the [member follow_path]. -func get_follow_path() -> Path2D: - return follow_path - - -## Assigns a new [param follow_targets] array value. -func set_follow_targets(value: Array[Node2D]) -> void: - if follow_mode != FollowMode.GROUP: return - if follow_targets == value: return - follow_targets = value - _follow_targets_size_check() - -## Appends a single [Node2D] to [member follow_targets]. -func append_follow_targets(value: Node2D) -> void: - if not is_instance_valid(value): - printerr(value, " is not a valid Node2D instance") - return - - if not follow_targets.has(value): - follow_targets.append(value) - _follow_targets_size_check() - else: - printerr(value, " is already part of Follow Group") - -## Adds an Array of type [Node2D] to [member follow_targets]. -func append_follow_targets_array(value: Array[Node2D]) -> void: - for target in value: - if not is_instance_valid(target): continue - if not follow_targets.has(target): - follow_targets.append(target) - _follow_targets_size_check() - else: - printerr(value, " is already part of Follow Group") - -## Removes a [Node2D] from [member follow_targets] array. -func erase_follow_targets(value: Node2D) -> void: - follow_targets.erase(value) - _follow_targets_size_check() - -## Gets all [Node2D] from [member follow_targets] array. -func get_follow_targets() -> Array[Node2D]: - return follow_targets - - -## Assigns a new Vector2 for the Follow Target Offset property. -func set_follow_offset(value: Vector2) -> void: - var temp_offset: Vector2 = follow_offset - - follow_offset = value - - if follow_axis_lock != FollowLockAxis.NONE: - temp_offset = temp_offset - value - match value: - FollowLockAxis.X: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - FollowLockAxis.Y: - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - FollowLockAxis.XY: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - - -## Gets the current Vector2 for the Follow Target Offset property. -func get_follow_offset() -> Vector2: - return follow_offset - - -## Enables or disables Follow Damping. -func set_follow_damping(value: bool) -> void: - follow_damping = value - notify_property_list_changed() - -## Gets the current Follow Damping property. -func get_follow_damping() -> bool: - return follow_damping - - -## Assigns new Damping value. -func set_follow_damping_value(value: Vector2) -> void: - ## TODO - Should be using @export_range once minimum version support is Godot 4.3 - if value.x < 0: value.x = 0 - elif value.y < 0: value.y = 0 - follow_damping_value = value - -## Gets the current Follow Damping value. -func get_follow_damping_value() -> Vector2: - return follow_damping_value - - -## Assigns a new [member follow_axis] member. Value is based on [enum FollowLockAxis] enum. -func set_lock_axis(value: FollowLockAxis) -> void: - follow_axis_lock = value - - # Wait for the node to be ready before setting lock - if not is_node_ready(): await ready - - # Prevent axis lock from working in the editor - if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): - _follow_axis_is_locked = true - match value: - FollowLockAxis.X: - _follow_axis_lock_value.x = _transform_output.origin.x - FollowLockAxis.Y: - _follow_axis_lock_value.y = _transform_output.origin.y - FollowLockAxis.XY: - _follow_axis_lock_value.x = _transform_output.origin.x - _follow_axis_lock_value.y = _transform_output.origin.y - else: - _follow_axis_is_locked = false - -## Gets the current [member follow_axis_lock] value. Value is based on [enum FollowLockAxis] enum. -func get_lock_axis() -> FollowLockAxis: - return follow_axis_lock - - -## Enables or disables [member rotate_with_target]. -func set_rotate_with_target(value: bool) -> void: - rotate_with_target = value - notify_property_list_changed() - -## Gets the current [member rotate_with_target] value. -func get_rotate_with_target() -> bool: - return rotate_with_target - - -## Sets the [member rotation_offset]. -func set_rotation_offset(value: float) -> void: - rotation_offset = value - -## Gets the current [member rotation_offset] value. -func get_rotation_offset() -> float: - return rotation_offset - - -## Enables or disables [member rotation_damping]. -func set_rotation_damping(value: bool) -> void: - rotation_damping = value - notify_property_list_changed() - -## Gets the [member rotation_damping] value. -func get_rotation_damping() -> bool: - return rotation_damping - - -## Set the [member rotation_damping_value]. -func set_rotation_damping_value(value: float) -> void: - rotation_damping_value = value - -## Gets the [member rotation_damping_value] value. -func get_rotation_damping_value() -> float: - return rotation_damping_value - - -## Enables or disables [member snap_to_pixel]. -func set_snap_to_pixel(value: bool) -> void: - snap_to_pixel = value - -## Gets the current [member snap_to_pixel] value. -func get_snap_to_pixel() -> bool: - return snap_to_pixel - - -## Enables or disables Auto zoom when using Group Follow. -func set_auto_zoom(value: bool) -> void: - auto_zoom = value - notify_property_list_changed() - -## Gets Auto Zoom state. -func get_auto_zoom() -> bool: - return auto_zoom - - -## Assigns new Min Auto Zoom value. -func set_auto_zoom_min(value: float) -> void: - auto_zoom_min = value - -## Gets Min Auto Zoom value. -func get_auto_zoom_min() -> float: - return auto_zoom_min - - -## Assigns new Max Auto Zoom value. -func set_auto_zoom_max(value: float) -> void: - auto_zoom_max = value - -## Gets Max Auto Zoom value. -func get_auto_zoom_max() -> float: - return auto_zoom_max - - -## Assigns new Zoom Auto Margin value. -func set_auto_zoom_margin(value: Vector4) -> void: - auto_zoom_margin = value - -## Gets Zoom Auto Margin value. -func get_auto_zoom_margin() -> Vector4: - return auto_zoom_margin - - -## Sets a limit side based on the side parameter.[br] -## It's recommended to pass the [enum Side] enum as the sid parameter. -func set_limit(side: int, value: int) -> void: - match side: - SIDE_LEFT: limit_left = value - SIDE_TOP: limit_top = value - SIDE_RIGHT: limit_right = value - SIDE_BOTTOM: limit_bottom = value - _: printerr("Not a valid Side.") - -## Gets the limit side -func get_limit(value: int) -> int: - match value: - SIDE_LEFT: return limit_left - SIDE_TOP: return limit_top - SIDE_RIGHT: return limit_right - SIDE_BOTTOM: return limit_bottom - _: - printerr("Not a valid Side.") - return -1 - - -## Assign a the Camera2D Left Limit Side value. -func set_limit_left(value: int) -> void: - _limit_target_exist_error() - limit_left = value - update_limit_all_sides() - -## Gets the Camera2D Left Limit value. -func get_limit_left() -> int: - return limit_left - - -## Assign a the Camera2D Top Limit Side value. -func set_limit_top(value: int) -> void: - _limit_target_exist_error() - limit_top = value - update_limit_all_sides() - -## Gets the Camera2D Top Limit value. -func get_limit_top() -> int: - return limit_top - - -## Assign a the Camera2D Right Limit Side value. -func set_limit_right(value: int) -> void: - _limit_target_exist_error() - limit_right = value - update_limit_all_sides() - -## Gets the Camera2D Right Limit value. -func get_limit_right() -> int: - return limit_right - - -## Assign a the Camera2D Bottom Limit Side value. -func set_limit_bottom(value: int) -> void: - _limit_target_exist_error() - limit_bottom = value - update_limit_all_sides() - -## Gets the Camera2D Bottom Limit value. -func get_limit_bottom() -> int: - return limit_bottom - - -func _limit_target_exist_error() -> void: - if not limit_target.is_empty(): - printerr("Unable to set Limit Side due to Limit Target ", _limit_node.name, " being assigned") - - -# Sets a [memeber limit_target] node. -func set_limit_target(value: NodePath) -> void: - limit_target = value - - # Waits for PCam2d's _ready() before trying to validate limit_node_path - if not is_node_ready(): await ready - - # Removes signal from existing TileMapLayer node - if is_instance_valid(get_node_or_null(value)): - var prev_limit_node: Node2D = _limit_node - var new_limit_node: Node2D = get_node(value) - - if prev_limit_node: - if prev_limit_node is TileMapLayer: - if prev_limit_node.changed.is_connected(_on_tile_map_changed): - prev_limit_node.changed.disconnect(_on_tile_map_changed) - - if new_limit_node is TileMapLayer: - if not new_limit_node.changed.is_connected(_on_tile_map_changed): - new_limit_node.changed.connect(_on_tile_map_changed) - elif new_limit_node is CollisionShape2D: - var col_shape: CollisionShape2D = get_node(value) - - if col_shape.shape == null: - printerr("No Shape2D in: ", col_shape.name) - reset_limit() - limit_target = "" - return - else: - printerr("Limit Target is not a TileMapLayer or CollisionShape2D node") - return - elif value == NodePath(""): - reset_limit() - limit_target = "" - else: - printerr("Limit Target cannot be found") - return - - _limit_node = get_node_or_null(value) - - notify_property_list_changed() - update_limit_all_sides() - -## Get [member limit_target] node. -func get_limit_target() -> NodePath: - if not limit_target: # TODO - Fixes an spam error if if limit_taret is empty - return NodePath("") - else: - return limit_target - - -## Set Tile Map Limit Margin. -func set_limit_margin(value: Vector4i) -> void: - limit_margin = value - update_limit_all_sides() -## Get Tile Map Limit Margin. -func get_limit_margin() -> Vector4i: - return limit_margin - - -### Enables or disables the Limit Smoothing beaviour. -#func set_limit_smoothing(value: bool) -> void: - #limit_smoothed = value -### Returns the Limit Smoothing beaviour. -#func get_limit_smoothing() -> bool: - #return limit_smoothed - - -## Sets a [PhantomCameraNoise2D] resource. -func set_noise(value: PhantomCameraNoise2D) -> void: - noise = value - if value != null: - _has_noise_resource = true - noise.set_trauma(1) - else: - _has_noise_resource = false - _transform_noise = Transform2D() - -## Returns the [PhantomCameraNoise2D] resource. -func get_noise() -> PhantomCameraNoise2D: - return noise - -func has_noise_resource() -> bool: - return _has_noise_resource - - -## Sets the [member noise_emitter_layer] value. -func set_noise_emitter_layer(value: int) -> void: - noise_emitter_layer = value - -## Enables or disables a given layer of [member noise_emitter_layer]. -func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: - noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) - -## Returns the [member noise_emitter_layer] -func get_noise_emitter_layer() -> int: - return noise_emitter_layer - - -## Sets [member inactive_update_mode] property. -func set_inactive_update_mode(value: int) -> void: - inactive_update_mode = value - -## Gets [enum InactiveUpdateMode] value. -func get_inactive_update_mode() -> int: - return inactive_update_mode - - -func get_follow_target_physics_based() -> bool: - return _follow_target_physics_based - - -func get_class() -> String: - return "PhantomCamera2D" - - -func is_class(value) -> bool: - return value == "PhantomCamera2D" - -#endregion diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid deleted file mode 100644 index 66fa7de..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_2d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bhexx6mj1xv3q diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd deleted file mode 100644 index 95608c0..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd +++ /dev/null @@ -1,2471 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_3d.svg") -class_name PhantomCamera3D -extends Node3D - -## Controls a scene's [Camera3D] and applies logic to it. -## -## The scene's [Camera3D] will follow the position of the -## [param PhantomCamera3D] with the highest priority. -## Each instance can have different positional and rotational logic applied -## to them. - -#region Constants - -const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#endregion - -#region Signals - -## Emitted when the [param PhantomCamera3D] becomes active. -signal became_active - -## Emitted when the [param PhantomCamera3D] becomes inactive. -signal became_inactive - -## Emitted when the follow_mode changes. -## Note: This is for internal use only -signal follow_mode_changed - -## Emitted when [member follow_target] changes. -signal follow_target_changed - -## Emitted when [member look_at_target] changes. -signal look_at_target_changed - -## Emitted when dead zones changes.[br] -## [b]Note:[/b] Only applicable in [param Framed] [member FollowMode]. -signal dead_zone_changed - -## Emitted when a target touches the edge of the dead zone in [param Framed] [enum FollowMode]. -signal dead_zone_reached - -## Emitted when the [param Camera3D] starts to tween to another -## [param PhantomCamera3D]. -signal tween_started - -## Emitted when the [param Camera3D] is to tweening towards another -## [param PhantomCamera3D]. -signal is_tweening - -## Emitted when the tween is interrupted due to another [param PhantomCamera3D] -## becoming active. The argument is the [param PhantomCamera3D] that -## interrupted the tween. -signal tween_interrupted(pcam_3d: PhantomCamera3D) - -## Emitted when the [param Camera3D] completes its tween to the -## [param PhantomCamera3D]. -signal tween_completed - -## Emitted when Noise should be applied to the [param Camera3D]. -signal noise_emitted(noise_output: Transform3D) - -signal physics_target_changed - -signal camera_3d_resource_property_changed(property: StringName, value: Variant) -signal camera_3d_resource_changed - -#endregion - - -#region Enums - -## Determines the positional logic for a given [param PhantomCamera3D] -## [br][br] -## The different modes have different functionalities and purposes, so choosing -## the correct one depends on what each [param PhantomCamera3D] is meant to do. -enum FollowMode { - NONE = 0, ## Default - No follow logic is applied. - GLUED = 1, ## Sticks to its target. - SIMPLE = 2, ## Follows its target with an optional offset. - GROUP = 3, ## Follows multiple targets with option to dynamically reframe itself. - PATH = 4, ## Follows a target while being positionally confined to a [Path3D] node. - FRAMED = 5, ## Applies a dead zone on the frame and only follows its target when it tries to leave it. - THIRD_PERSON = 6, ## Applies a [SpringArm3D] node to the target's position and allows for rotating around it. -} - -## Determines the rotational logic for a given [param PhantomCamera3D].[br][br] -## The different modes has different functionalities and purposes, so -## choosing the correct mode depends on what each [param PhantomCamera3D] -## is meant to do. -enum LookAtMode { - NONE = 0, ## Default - No Look At logic is applied. - MIMIC = 1, ## Copies its target's rotational value. - SIMPLE = 2, ## Looks at its target in a straight line. - GROUP = 3, ## Looks at the centre of its targets. -} - -## Determines how often an inactive [param PhantomCamera3D] should update -## its positional and rotational values. This is meant to reduce the amount -## of calculations inactive [param PhantomCamera3D] are doing when idling -## to improve performance. -enum InactiveUpdateMode { - ALWAYS, ## Always updates the [param PhantomCamera3D], even when it's inactive. - NEVER, ## Never updates the [param PhantomCamera3D] when it's inactive. Reduces the amount of computational resources when inactive. -# EXPONENTIALLY, -} - -enum FollowLockAxis { - NONE = 0, - X = 1, - Y = 2, - Z = 3, - XY = 4, - XZ = 5, - YZ = 6, - XYZ = 7, -} - -#endregion - - -#region Exported Properties - -## To quickly preview a [param PhantomCamera3D] without adjusting its -## [member Priority], this property allows the selected [param PhantomCamera3D] -## to ignore the Priority system altogether and forcefully become the active -## one. It's partly designed to work within the [param viewfinder], and will be -## disabled when running a build export of the game. -@export var priority_override: bool = false: - set(value): - priority_override = value - if Engine.is_editor_hint(): - if value: - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_override.emit(self, priority_override) - else: - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_override.emit(self, priority_override) - get: - return priority_override - - -## It defines which [param PhantomCamera3D] a scene's [param Camera3D] should -## be corresponding with and be attached to. This is decided by the -## [param PhantomCamera3D] with the highest [param priority]. -## [br][br] -## Changing [param priority] will send an event to the scene's -## [PhantomCameraHost], which will then determine whether if the -## [param priority] value is greater than or equal to the currently -## highest [param PhantomCamera3D]'s in the scene. The -## [param PhantomCamera3D] with the highest value will then reattach the -## Camera accordingly. -@export var priority: int = 0: - set = set_priority, - get = get_priority - - -## Determines the positional logic for a given [param PhantomCamera3D]. -## The different modes have different functionalities and purposes, so -## choosing the correct one depends on what each [param PhantomCamera3D] -## is meant to do. -@export var follow_mode: FollowMode = FollowMode.NONE: - set(value): - follow_mode = value - - if follow_mode == FollowMode.NONE: - _should_follow = false - top_level = false - _draw_follow_gizmo_line = false - _check_draw_gizmo() - _is_parents_physics() - notify_property_list_changed() - return - - match follow_mode: - FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - FollowMode.GROUP: - _follow_targets_size_check() - _: - _should_follow_checker() - - ## Disables Follow Gizmo Line for Follow Glued - if follow_mode == FollowMode.GLUED: - _draw_follow_gizmo_line = false - _check_draw_gizmo() - else: - if draw_follow_line: _draw_follow_gizmo_line = true - _check_draw_gizmo() - - if follow_mode == FollowMode.FRAMED: - if _follow_framed_initial_set and follow_target: - _follow_framed_initial_set = false - dead_zone_changed.connect(_on_dead_zone_changed) - else: - if dead_zone_changed.is_connected(_on_dead_zone_changed): - dead_zone_changed.disconnect(_on_dead_zone_changed) - - if follow_mode == FollowMode.THIRD_PERSON: - top_level = false - _is_third_person_follow = true - else: - top_level = true - _is_third_person_follow = false - - follow_mode_changed.emit() - notify_property_list_changed() - - ## NOTE - Warning that Look At + Follow Mode hasn't been fully tested together yet - if look_at_mode != LookAtMode.NONE: - print_rich("[color=#EAA15E]Warning: Using both Look At and Follow Mode on the same PCam3D has not been fully tested yet, proceed with caution![/color]") - get: - return follow_mode - -## Determines which target should be followed. -## The [param Camera3D] will follow the position of the Follow Target based on -## the [member follow_mode] type and its parameters. -@export var follow_target: Node3D = null: - set = set_follow_target, - get = get_follow_target - -## Defines the targets that the [param PhantomCamera3D] should be following. -@export var follow_targets: Array[Node3D] = []: - set = set_follow_targets, - get = get_follow_targets - -## Determines the [Path3D] node the [param PhantomCamera3D] -## should be bound to. -## The [param PhantomCamera3D] will follow the position of the -## [member follow_target] while sticking to the closest point on this path. -@export var follow_path: Path3D = null: - set = set_follow_path, - get = get_follow_path - - -## Determines the rotational logic for a given [param PhantomCamera3D]. -## The different modes has different functionalities and purposes, -## so choosing the correct mode depends on what each -## [param PhantomCamera3D] is meant to do. -@export var look_at_mode: LookAtMode = LookAtMode.NONE: - set(value): - look_at_mode = value - - if look_at_mode == LookAtMode.NONE: - _should_look_at = false - _draw_look_at_gizmo_line = false - _check_draw_gizmo() - notify_property_list_changed() - return - - if look_at_mode == LookAtMode.MIMIC: - _draw_look_at_gizmo_line = false - _check_draw_gizmo() - else: - if draw_look_at_line: _draw_look_at_gizmo_line = true - _check_draw_gizmo() - - if not look_at_mode == LookAtMode.GROUP: - if look_at_target is Node3D: - _should_look_at = true - else: # If Look At Group - _look_at_targets_size_check() - - notify_property_list_changed() - - ## NOTE - Warning that Look At + Follow Mode hasn't been fully tested together yet - if follow_mode != FollowMode.NONE: - print_rich("[color=#EAA15E]Warning: Using both Look At and Follow Mode on the same PCam3D has not been fully tested yet, proceed with caution![/color]") - get: - return look_at_mode - -## Determines which target should be looked at. -## The [param PhantomCamera3D] will update its rotational value as the -## target changes its position. -@export var look_at_target: Node3D = null: - set = set_look_at_target, - get = get_look_at_target - -## Defines the targets that the camera should looking at. -## It will be looking at the centre of all the assigned targets. -@export var look_at_targets: Array[Node3D] = []: - set = set_look_at_targets, - get = get_look_at_targets - - -## Defines how [param ]PhantomCamera3Ds] transition between one another. -## Changing the tween values for a given [param PhantomCamera3D] -## determines how transitioning to that instance will look like. -## This is a resource type that can be either used for one -## [param PhantomCamera] or reused across multiple - both 2D and 3D. -## By default, all [param PhantomCameras] will use a [param linear] -## transition, [param easeInOut] ease with a [param 1s] duration. -@export var tween_resource: PhantomCameraTween = PhantomCameraTween.new(): - set = set_tween_resource, - get = get_tween_resource - -## If enabled, the moment a [param PhantomCamera3D] is instantiated into -## a scene, and has the highest priority, it will perform its tween transition. -## This is most obvious if a [param PhantomCamera3D] has a long duration and -## is attached to a playable character that can be moved the moment a scene -## is loaded. Disabling the [param tween_on_load] property will -## disable this behaviour and skip the tweening entirely when instantiated. -@export var tween_on_load: bool = true: - set = set_tween_on_load, - get = get_tween_on_load - - -## Determines how often an inactive [param PhantomCamera3D] should update -## its positional and rotational values. This is meant to reduce the amount -## of calculations inactive [param PhantomCamera3Ds] are doing when idling -## to improve performance. -@export var inactive_update_mode: InactiveUpdateMode = InactiveUpdateMode.ALWAYS: - set = set_inactive_update_mode, - get = get_inactive_update_mode - - -## Determines which layers this [param PhantomCamera3D] should be able to communicate with [PhantomCameraHost] nodes.[br] -## A corresponding layer needs to be set on the [PhantomCameraHost] node. -@export_flags_3d_render var host_layers: int = 1: - set = set_host_layers, - get = get_host_layers - - -## A resource type that allows for overriding the [param Camera3D] node's -## properties. -@export var camera_3d_resource: Camera3DResource = null: - set = set_camera_3d_resource, - get = get_camera_3d_resource - - -## Overrides the [member Camera3D.attribuets] resource property. -@export var attributes: CameraAttributes = null: - set = set_attributes, - get = get_attributes - - -## Overrides the [member Camera3D.environment] resource property. -@export var environment: Environment = null: - set = set_environment, - get = get_environment - - -## Overrides the [member Camera3D.compositor] resource property. -@export var compositor: Compositor = null: - set = set_compositor, - get = get_compositor - - -@export_group("Follow Parameters") -## Offsets the [member follow_target] position. -@export var follow_offset: Vector3 = Vector3.ZERO: - set = set_follow_offset, - get = get_follow_offset - -## Applies a damping effect on the camera's movement. -## Leading to heavier / slower camera movement as the targeted node moves around. -## This is useful to avoid sharp and rapid camera movement. -@export var follow_damping: bool = false: - set = set_follow_damping, - get = get_follow_damping - -## Defines the damping amount. The ideal range should be somewhere between 0-1.[br][br] -## The damping amount can be specified in the individual axis.[br][br] -## [b]Lower value[/b] = faster / sharper camera movement.[br] -## [b]Higher value[/b] = slower / heavier camera movement. -@export_custom(PROPERTY_HINT_LINK, "") -var follow_damping_value: Vector3 = Vector3(0.1, 0.1, 0.1): - set = set_follow_damping_value, - get = get_follow_damping_value - - -## Prevents the [param PhantomCamera2D] from moving in a designated axis. -## This can be enabled or disabled at runtime or from the editor directly. -@export var follow_axis_lock: FollowLockAxis = FollowLockAxis.NONE: - set = set_follow_axis_lock, - get = get_follow_axis_lock -var _follow_axis_is_locked: bool = false -var _follow_axis_lock_value: Vector3 = Vector3.ZERO - - -## Sets a distance offset from the centre of the target's position. -## The distance is applied to the [param PhantomCamera3D]'s local z axis. -@export var follow_distance: float = 1: - set = set_follow_distance, - get = get_follow_distance - -## Enables the [param PhantomCamera3D] to automatically distance -## itself as the [param follow targets] move further apart.[br] -## It looks at the longest axis between the different targets and interpolates -## the distance length between the [member auto_follow_distance_min] and -## [member follow_group_distance] properties.[br][br] -## Note: Enabling this property hides and disables the [member follow_distance] -## property as this effectively overrides that property. -@export var auto_follow_distance: bool = false: - set = set_auto_follow_distance, - get = get_auto_follow_distance - -## Sets the minimum distance between the Camera and centre of [AABB]. -## [br][br] -## Note: This distance will only ever be reached when all the targets are in -## the exact same [param Vector3] coordinate, which will very unlikely -## happen, so adjust the value here accordingly. -## [br][br] -## If only one follow target is assigned to [member follow_targets], this value will be used as the `follow_distance`. -@export var auto_follow_distance_min: float = 1: - set = set_auto_follow_distance_min, - get = get_auto_follow_distance_min - -## Sets the maximum distance between the Camera and centre of [AABB]. -@export var auto_follow_distance_max: float = 5: - set = set_auto_follow_distance_max, - get = get_auto_follow_distance_max - -## Determines how fast the [member auto_follow_distance] moves between the -## maximum and minimum distance. The higher the value, the sooner the -## maximum distance is reached.[br][br] -## This value should be based on the sizes of the [member auto_follow_distance_min] -## and [member auto_follow_distance_max].[br] -## E.g. if the value between the [member auto_follow_distance_min] and -## [member auto_follow_distance_max] is small, consider keeping the number low -## and vice versa. -@export var auto_follow_distance_divisor: float = 10: - set = set_auto_follow_distance_divisor, - get = get_auto_follow_distance_divisor - - -@export_subgroup("Dead Zones") -## Defines the horizontal dead zone area. While the target is within it, the -## [param PhantomCamera3D] will not move in the horizontal axis. -## If the targeted node leaves the horizontal bounds, the -## [param PhantomCamera3D] will follow the target horizontally to keep -## it within bounds. -@export_range(0, 1) var dead_zone_width: float = 0: - set(value): - dead_zone_width = value - dead_zone_changed.emit() - get: - return dead_zone_width - -## Defines the vertical dead zone area. While the target is within it, the -## [param PhantomCamera3D] will not move in the vertical axis. -## If the targeted node leaves the vertical bounds, the -## [param PhantomCamera3D] will follow the target horizontally to keep -## it within bounds. -@export_range(0, 1) var dead_zone_height: float = 0: - set(value): - dead_zone_height = value - dead_zone_changed.emit() - get: - return dead_zone_height - -## Enables the dead zones to be visible when running the game from the editor. -## Dead zones will never be visible in build exports. -@export var show_viewfinder_in_play: bool = false - -## Defines the position of the [member follow_target] within the viewport.[br] -## This is only used for when [member follow_mode] is set to [param Framed]. -@export_subgroup("Spring Arm") - -## Applies a rotational offset to the Third Person [member follow_mode] in the [code]X[/code] axis. -@export_range(-360, 360, 0.1,"or_greater", "or_less", "radians_as_degrees") -var vertical_rotation_offset: float = 0: - set = set_vertical_rotation_offset, - get = get_vertical_rotation_offset - -## Applies a rotational offset to the Third Person [member follow_mode] in the [code]Y[/code] axis. -@export_range(-360, 360, 0.1, "or_greater", "or_less", "radians_as_degrees") -var horizontal_rotation_offset: float = 0: - set = set_horizontal_rotation_offset, - get = get_horizontal_rotation_offset - -## Defines the [member SpringArm3D.spring_length]. -@export var spring_length: float = 1: - set = set_spring_length, - get = get_spring_length - -## Defines the [member SpringArm3D.collision_mask] node's Collision Mask. -@export_flags_3d_physics var collision_mask: int = 1: - set = set_collision_mask, - get = get_collision_mask - -## Defines the [member SpringArm3D.shape] node's Shape3D. -@export var shape: Shape3D = null: - set = set_shape, - get = get_shape - -## Defines the [member SpringArm3D.margin] node's Margin. -@export var margin: float = 0.01: - set = set_margin, - get = get_margin - -@export_group("Look At Parameters") -## Offsets the target's [param Vector3] position that the -## [param PhantomCamera3D] is looking at. -@export var look_at_offset: Vector3 = Vector3.ZERO: - set = set_look_at_offset, - get = get_look_at_offset - -## Applies a damping effect on the camera's rotation. -## Leading to heavier / slower camera movement as the targeted node moves around. -## This is useful to avoid sharp and rapid camera rotation. -@export var look_at_damping: bool = false: - set = set_look_at_damping, - get = get_look_at_damping - -## Defines the Rotational damping amount. The ideal range is typically somewhere between 0-1.[br][br] -## The damping amount can be specified in the individual axis.[br][br] -## [b]Lower value[/b] = faster / sharper camera rotation.[br] -## [b]Higher value[/b] = slower / heavier camera rotation. -@export_range(0.0, 1.0, 0.001, "or_greater") var look_at_damping_value: float = 0.25: - set = set_look_at_damping_value, - get = get_look_at_damping_value - -@export_subgroup("Up Direction") -## Defines the upward direction of the [param PhantomCamera3D] when [member look_at_mode] is set. [br] -## This value will be overriden if [member up_target] is defined. -@export var up: Vector3 = Vector3.UP: - set = set_up, - get = get_up - -## Applies and continuously updates the [param up] direction of the [param PhantomCamera3D] based on this target when [member look_at_mode] is set.[br] -## Setting a value here will override the [member up] value. -@export var up_target: Node3D = null: - set = set_up_target, - get = get_up_target - - -@export_group("Noise") -## Applies a noise, or shake, to a [Camera3D].[br] -## Once set, the noise will run continuously after the tween to the [PhantomCamera3D] instance is complete. -@export var noise: PhantomCameraNoise3D = null: - set = set_noise, - get = get_noise - -## If true, will trigger the noise while in the editor.[br] -## Useful in cases where you want to temporarily disalbe the noise in the editor without removing -## the resource.[br][br] -## [b]Note:[/b] This property has no effect on runtime behaviour. -@export var _preview_noise: bool = true: - set(value): - _preview_noise = value - if not value: - _transform_noise = Transform3D() - -## Enable a corresponding layer for a [member PhantomCameraNoiseEmitter3D.noise_emitter_layer] -## to make this [PhantomCamera3D] be affect by it. -@export_flags_3d_render var noise_emitter_layer: int = 0: - set = set_noise_emitter_layer, - get = get_noise_emitter_layer - - -@export_group("Editor") -@export_subgroup("Align with View") -## Adds an editor button that positions and rotates the [param PhantomCamera3D] to match the 3D viewport's transform.[br][br] -## This editor button is not visible if the [param PhantomCamera3D] is following [i]or[/i] looking at a target.[br][br] -## [b]Note[/b]: This is only functional in the editor. -@export_tool_button("Align Transform with View", "CenterView") -var align_transform_with_view: Callable = func(): - var undo_redo: EditorUndoRedoManager = EditorInterface.get_editor_undo_redo() - var property: StringName = &"global_transform" - undo_redo.create_action("Aligned " + name + "'s transform with view") - undo_redo.add_do_property(self, property, EditorInterface.get_editor_viewport_3d(viewport_index).get_camera_3d().global_transform) - undo_redo.add_undo_property(self, property, global_transform) - undo_redo.commit_action() - -## Adds an editor button that positions the [param PhantomCamera3D] to match the 3D viewport's position.[br][br] -## This editor button is not visible if the [param PhantomCamera3D] is following a target.[br][br] -## [b]Note[/b]: This is only functional in the editor. -@export_tool_button("Align Position with View", "ToolMove") -var align_position_with_view: Callable = func(): - var undo_redo: EditorUndoRedoManager = EditorInterface.get_editor_undo_redo() - var property: StringName = &"global_position" - undo_redo.create_action("Aligned " + name + "'s position with view") - undo_redo.add_do_property(self, property, EditorInterface.get_editor_viewport_3d(viewport_index).get_camera_3d().global_position) - undo_redo.add_undo_property(self, property, global_position) - undo_redo.commit_action() - -## Adds an editor button that rotates the [param PhantomCamera3D] to match the 3D viewport's rotation.[br][br] -## This editor button is not visible if the [param PhantomCamera3D] is looking at a target.[br][br] -## [b]Note[/b]: This is only functional in the editor. -@export_tool_button("Align Rotation with View", "ToolRotate") -var align_rotation_with_view: Callable = func(): - var undo_redo: EditorUndoRedoManager = EditorInterface.get_editor_undo_redo() - var property: StringName = &"global_rotation" - undo_redo.create_action("Aligned " + name + "'s rotation with view") - undo_redo.add_do_property(self, property, EditorInterface.get_editor_viewport_3d(viewport_index).get_camera_3d().global_rotation) - undo_redo.add_undo_property(self, property, global_rotation) - undo_redo.commit_action() - -## Change which viewport the alignment buttons should be based on.[br] -## [b]Note:[/b] If you are only using 1 viewport, keep the default value to 0. -@export_range(0, 3) var viewport_index: int = 0: - set(value): - viewport_index = value - get: - return viewport_index - - -@export_subgroup("Gizmo Line") -## Draws a line between the [param PhantomCamera3D] and its follow target position.[br] -## This is only drawn when a valid [member follow_target] or [member follow_targets] is set. -@export var draw_follow_line: bool = false: - set = set_draw_follow_line, - get = get_draw_follow_line - -## Draws a line between the [param PhantomCamera3D] and its look at target position.[br] -## This is only drawn when a valid [member follow_target] or [member look_at_targets] is set. -@export var draw_look_at_line: bool = false: - set = set_draw_look_at_line, - get = get_draw_look_at_line - -#endregion - -#region Private Variables - -var _is_active: bool = false - -var _is_third_person_follow: bool = false -var _camera_target: Node3D = self # Calculates the position of the camera in the editor, uses instantiated SpringArm3D node when running the scene - -var _should_follow: bool = false -var _follow_target_physics_based: bool = false -var _physics_interpolation_enabled: bool = false ## TOOD - Should be enbled once toggling physics_interpolation_mode ON, when previously OFF, works in 3D - -var _has_multiple_follow_targets: bool = false -var _follow_targets_single_target_index: int = 0 -var _follow_targets: Array[Node3D] = [] - -var _should_look_at: bool = false -var _look_at_target_physics_based: bool = false - -var _has_multiple_look_at_targets: bool = false -var _look_at_targets_single_target_index: int = 0 - -var _current_rotation: Vector3 = Vector3.ZERO - -var _up: Vector3 = Vector3.UP -var _has_up_target: bool = false - -var _follow_target_output_position: Vector3 = Vector3.ZERO -var _look_at_target_output_position: Vector3 = Vector3.ZERO - -var _transform_output: Transform3D = Transform3D() -var _transform_noise: Transform3D = Transform3D() - -var _tween_skip: bool = false - -var _follow_velocity_ref: Vector3 = Vector3.ZERO # Stores and applies the velocity of the movement - -var _follow_framed_initial_set: bool = false -var _follow_framed_offset: Vector3 = Vector3.ZERO - -var _follow_spring_arm: SpringArm3D = null -var _has_follow_spring_arm: bool = false - -var _has_noise_resource: bool = false - -var _draw_gizmo: bool = false -var _draw_follow_gizmo_line: bool = false -var _follow_target_position: Vector3 = Vector3.ZERO -var _draw_look_at_gizmo_line: bool = false - -# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. -var _phantom_camera_manager: Node = null - -#endregion - -#region Public Variable - -var tween_duration: float: - set = set_tween_duration, - get = get_tween_duration -var tween_transition: PhantomCameraTween.TransitionType: - set = set_tween_transition, - get = get_tween_transition -var tween_ease: PhantomCameraTween.EaseType: - set = set_tween_ease, - get = get_tween_ease - -var keep_aspect: int: - set = set_keep_aspect, - get = get_keep_aspect -var cull_mask: int: - set = set_cull_mask, - get = get_cull_mask -var h_offset: float: - set = set_h_offset, - get = get_h_offset -var v_offset: float: - set = set_v_offset, - get = get_v_offset -var projection: Camera3DResource.ProjectionType: - set = set_projection, - get = get_projection -var fov: float: - set = set_fov, - get = get_fov -var size: float: - set = set_size, - get = get_size -var frustum_offset: Vector2: - set = set_frustum_offset, - get = get_frustum_offset -var far: float: - set = set_far, - get = get_far -var near: float: - set = set_near, - get = get_near - -var viewport_position: Vector2 - -#endregion - - -#region Private Functions - -func _validate_property(property: Dictionary) -> void: - ################ - ## Follow Target - ################ - if property.name == "follow_path" and \ - follow_mode != FollowMode.PATH: - property.usage = PROPERTY_USAGE_NO_EDITOR - - #################### - ## Follow Parameters - #################### - if follow_mode == FollowMode.NONE: - match property.name: - "follow_target", \ - "follow_offset", \ - "follow_damping", \ - "follow_damping_value", \ - "follow_axis_lock", \ - "draw_follow_line": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if follow_mode == FollowMode.GROUP: - match property.name: - "follow_target": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "follow_offset": - if follow_mode == FollowMode.GLUED: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "follow_damping_value" and not follow_damping: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "follow_distance": - if not follow_mode == FollowMode.FRAMED: - if not follow_mode == FollowMode.GROUP or \ - auto_follow_distance: \ - property.usage = PROPERTY_USAGE_NO_EDITOR - - ############### - ## Group Follow - ############### - if property.name == "follow_targets" and \ - not follow_mode == FollowMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "auto_follow_distance" and \ - not follow_mode == FollowMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not auto_follow_distance or not follow_mode == FollowMode.GROUP: - match property.name: - "auto_follow_distance_min", \ - "auto_follow_distance_max", \ - "auto_follow_distance_divisor": - property.usage = PROPERTY_USAGE_NO_EDITOR - - ############### - ## Framed Follow - ############### - if not follow_mode == FollowMode.FRAMED: - match property.name: - "dead_zone_width", \ - "dead_zone_height", \ - "show_viewfinder_in_play": - property.usage = PROPERTY_USAGE_NO_EDITOR - - ###################### - ## Third Person Follow - ###################### - if not follow_mode == FollowMode.THIRD_PERSON: - match property.name: - "vertical_rotation_offset", \ - "horizontal_rotation_offset", \ - "spring_length", \ - "collision_mask", \ - "shape", \ - "margin": - property.usage = PROPERTY_USAGE_NO_EDITOR - - ########## - ## Look At - ########## - match look_at_mode: - LookAtMode.NONE: - match property.name: - "look_at_target", \ - "look_at_offset" , \ - "look_at_damping", \ - "look_at_damping_value", \ - "up", \ - "up_target", \ - "draw_look_at_line": - property.usage = PROPERTY_USAGE_NO_EDITOR - LookAtMode.MIMIC: - match property.name: - "draw_look_at_line": - property.usage = PROPERTY_USAGE_NO_EDITOR - LookAtMode.GROUP: - match property.name: - "look_at_target", \ - "draw_look_at_line": - property.usage = PROPERTY_USAGE_NO_EDITOR - - - if property.name == "look_at_target": - if look_at_mode == LookAtMode.NONE or \ - look_at_mode == LookAtMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "look_at_targets" and \ - not look_at_mode == LookAtMode.GROUP: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "look_at_damping_value" and \ - not look_at_damping: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "up" and _has_up_target: - property.usage = PROPERTY_USAGE_NO_EDITOR - - ########################## - ## Align With Viewport - ########################## - if property.name == 'align_transform_with_view' and \ - (_should_look_at == true or _should_follow == true): - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == 'align_position_with_view' and \ - ( - _should_follow == true or \ - _should_follow == true and follow_mode == FollowMode.THIRD_PERSON - ): - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == 'align_rotation_with_view' and \ - ( - _should_look_at == true or \ - _should_follow == true and follow_mode == FollowMode.THIRD_PERSON - ): - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _enter_tree() -> void: - _phantom_camera_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - _tween_skip = !tween_on_load - - _phantom_camera_manager.pcam_added(self) - - priority_override = false - - if not visibility_changed.is_connected(_check_visibility): - visibility_changed.connect(_check_visibility) - - match follow_mode: - FollowMode.NONE: - _is_parents_physics() - FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - FollowMode.GROUP: - _follow_targets_size_check() - _should_follow_checker() - _: - _should_follow_checker() - - _should_look_at_checker() - if look_at_mode == LookAtMode.GROUP: - _look_at_targets_size_check() - - #if not get_parent() is SpringArm3D: - #if look_at_target: - #_look_at_target_node = look_at_target - #elif look_at_targets: - #_look_at_group_nodes.clear() - #for path in look_at_targets: - #if not path.is_empty() and path: - #_should_look_at = true - #_has_look_at_targets = true - #_look_at_group_nodes.append(path) - - -func _exit_tree() -> void: - if not follow_mode == FollowMode.GROUP: - follow_targets = [] - - if not is_instance_valid(_phantom_camera_manager): return - _phantom_camera_manager.pcam_removed(self) - - -func _ready(): - match follow_mode: - FollowMode.THIRD_PERSON: - _is_third_person_follow = true - if _should_follow: _transform_output.origin = _get_target_position_offset_distance() - if not Engine.is_editor_hint(): - if not is_instance_valid(_follow_spring_arm): - _follow_spring_arm = SpringArm3D.new() - _follow_spring_arm.top_level = true - _follow_spring_arm.spring_length = spring_length - _follow_spring_arm.collision_mask = collision_mask - _follow_spring_arm.shape = shape - _follow_spring_arm.margin = margin - # Stores the rotation value as the rotation gets skewed after - # the SpringArm3D is instantiated for some reason... - var initial_rotation: Vector3 = global_rotation - if _should_follow: _follow_spring_arm.add_excluded_object(follow_target) - get_parent().add_child.call_deferred(_follow_spring_arm) - - # Waits for the SpringArm3D to be ready and then apply rotation - # Resolves an issue most prominent in Godot 4.4 - await _follow_spring_arm.ready - reparent.call_deferred(_follow_spring_arm) - _camera_target = _follow_spring_arm - _follow_spring_arm.global_position = _get_target_position_offset() if is_instance_valid(follow_target) else global_position - _follow_spring_arm.global_rotation = initial_rotation - _has_follow_spring_arm = true - top_level = false - _: - _transform_output.origin = global_position - - if not Engine.is_editor_hint(): - _preview_noise = true - - ## NOTE - Only here to set position for Framed View on startup. - ## Should be removed once https://github.com/ramokz/phantom-camera/issues/161 is complete - _transform_output = global_transform - - _phantom_camera_manager.noise_3d_emitted.connect(_noise_emitted) - - -func _process(delta: float) -> void: - if Engine.is_editor_hint() and _draw_gizmo: - update_gizmos() - - if _follow_target_physics_based or _is_active: return - process_logic(delta) - - -func _physics_process(delta: float) -> void: - if not _follow_target_physics_based or _is_active: return - process_logic(delta) - - -func process_logic(delta: float) -> void: - if _is_active: - if _has_noise_resource and _preview_noise: - _transform_noise = noise.get_noise_transform(delta) - else: - match inactive_update_mode: - InactiveUpdateMode.NEVER: return - # InactiveUpdateMode.EXPONENTIALLY: - # TODO - Trigger positional updates less frequently as more PCams gets added - - if _should_follow: - _follow(delta) - else: - _transform_output.origin = global_position - - if _should_look_at: - _look_at(delta) - elif not _is_third_person_follow: - _transform_output.basis = global_basis - - if _follow_axis_is_locked: - match follow_axis_lock: - FollowLockAxis.X: - _transform_output.origin.x = _follow_axis_lock_value.x - FollowLockAxis.Y: - _transform_output.origin.y = _follow_axis_lock_value.y - FollowLockAxis.Z: - _transform_output.origin.z = _follow_axis_lock_value.z - FollowLockAxis.XY: - _transform_output.origin.x = _follow_axis_lock_value.x - _transform_output.origin.y = _follow_axis_lock_value.y - FollowLockAxis.XZ: - _transform_output.origin.x = _follow_axis_lock_value.x - _transform_output.origin.z = _follow_axis_lock_value.z - FollowLockAxis.YZ: - _transform_output.origin.y = _follow_axis_lock_value.y - _transform_output.origin.z = _follow_axis_lock_value.z - FollowLockAxis.XYZ: - _transform_output.origin.x = _follow_axis_lock_value.x - _transform_output.origin.y = _follow_axis_lock_value.y - _transform_output.origin.z = _follow_axis_lock_value.z - - -func _follow(delta: float) -> void: - _set_follow_position() - _interpolate_position(delta) - -func _look_at(delta: float) -> void: - _set_look_at_position() - _interpolate_rotation(delta) - - -func _set_follow_position() -> void: - match follow_mode: - FollowMode.GLUED: - _follow_target_output_position = follow_target.global_position - - FollowMode.SIMPLE: - _follow_target_output_position = _get_target_position_offset() - _set_follow_gizmo_line_position(follow_target.global_position) - - FollowMode.GROUP: - if _has_multiple_follow_targets: - var bounds: AABB = AABB(_follow_targets[0].global_position, Vector3.ZERO) - for target in _follow_targets: - bounds = bounds.expand(target.global_position) - var distance: float - if auto_follow_distance: - distance = lerpf(auto_follow_distance_min, auto_follow_distance_max, bounds.get_longest_axis_size() / auto_follow_distance_divisor) - distance = clampf(distance, auto_follow_distance_min, auto_follow_distance_max) - else: - distance = follow_distance - - _follow_target_output_position = \ - bounds.get_center() + \ - follow_offset + \ - global_basis.z * \ - distance - - _set_follow_gizmo_line_position(bounds.get_center()) - else: - _follow_target_output_position = \ - follow_targets[_follow_targets_single_target_index].global_position + \ - follow_offset + \ - global_basis.z * \ - auto_follow_distance_min - - FollowMode.PATH: - var path_position: Vector3 = follow_path.global_position - _follow_target_output_position = \ - follow_path.curve.get_closest_point( - _get_target_position_offset() - path_position - ) + path_position - _set_follow_gizmo_line_position(_get_target_position_offset()) - - FollowMode.FRAMED: - if not Engine.is_editor_hint(): - if not _is_active: - _follow_target_output_position = _get_target_position_offset_distance() - else: - viewport_position = get_viewport().get_camera_3d().unproject_position(_get_target_position_offset()) - var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size - viewport_position = viewport_position / visible_rect_size - _current_rotation = global_rotation - - if _current_rotation != global_rotation: - _follow_target_output_position = _get_target_position_offset_distance() - - if _get_framed_side_offset() != Vector2.ZERO: - var framed_offset: Vector2 = _get_framed_side_offset() - var target_position: Vector3 = _get_target_position_offset() + _follow_framed_offset - var glo_pos: Vector3 - - if dead_zone_width == 0 || dead_zone_height == 0: - if dead_zone_width == 0 && dead_zone_height != 0: - glo_pos = _get_target_position_offset_distance() - glo_pos.z = target_position.z - _follow_target_output_position = glo_pos - elif dead_zone_width != 0 && dead_zone_height == 0: - glo_pos = _get_target_position_offset_distance() - glo_pos.x = target_position.x - _follow_target_output_position = glo_pos - else: - _follow_target_output_position = _get_target_position_offset_distance() - else: - if _current_rotation != global_rotation: - var opposite: float = sin(-global_rotation.x) * follow_distance + _get_target_position_offset().y - glo_pos.y = _get_target_position_offset().y + opposite - glo_pos.z = sqrt(pow(follow_distance, 2) - pow(opposite, 2)) + _get_target_position_offset().z - glo_pos.x = global_position.x - - _follow_target_output_position = glo_pos - _current_rotation = global_rotation - else: - dead_zone_reached.emit() - - # FIX: Only move camera in the axis where dead zone is breached - var current_global_position: Vector3 = global_position - var current_offset: Vector3 = global_position - _get_target_position_offset() - - # Update stored offset for non-breached axes - if framed_offset.x == 0: - _follow_framed_offset.x = current_offset.x - if framed_offset.y == 0: - _follow_framed_offset.z = current_offset.z - - # Lock camera position on non-breached axes - if framed_offset.x == 0: - target_position.x = current_global_position.x - if framed_offset.y == 0: - target_position.z = current_global_position.z - - _follow_target_output_position = target_position - else: - _follow_framed_offset = global_position - _get_target_position_offset() - _follow_target_position = global_position - _current_rotation = global_rotation - return - else: - _follow_target_output_position = _get_target_position_offset_distance() - var unprojected_position: Vector2 = _get_raw_unprojected_position() - var viewport_width: float = get_viewport().size.x - var viewport_height: float = get_viewport().size.y - var camera_aspect: int = get_viewport().get_camera_3d().keep_aspect - var visible_rect_size: Vector2 = get_viewport().get_visible_rect().size - - unprojected_position = unprojected_position - visible_rect_size / 2 - if camera_aspect == Camera3D.KEEP_HEIGHT: - # Landscape View - var aspect_ratio_scale: float = viewport_width / viewport_height - unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 - unprojected_position.y = (unprojected_position.y + 1) / 2 - else: - # Portrait View - var aspect_ratio_scale: float = viewport_height / viewport_width - unprojected_position.x = (unprojected_position.x + 1) / 2 - unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 - - viewport_position = unprojected_position - _set_follow_gizmo_line_position(follow_target.global_position) - - FollowMode.THIRD_PERSON: - if not Engine.is_editor_hint(): - if not _has_follow_spring_arm: return - _follow_target_output_position = _get_target_position_offset() - else: - _follow_target_output_position = _get_target_position_offset_distance_direction() -# _follow_target_position = _get_target_position_offset_distance_direction() - _set_follow_gizmo_line_position(follow_target.global_position) - - -func _set_look_at_position() -> void: - match look_at_mode: - LookAtMode.MIMIC: - _look_at_target_output_position = global_position - look_at_target.global_basis.z - - LookAtMode.SIMPLE: - _look_at_target_output_position = look_at_target.global_position - - LookAtMode.GROUP: - if not _has_multiple_look_at_targets: - _look_at_target_output_position = look_at_targets[_look_at_targets_single_target_index].global_position - else: - var bounds: AABB = AABB(look_at_targets[0].global_position, Vector3.ZERO) - for node in look_at_targets: - bounds = bounds.expand(node.global_position) - _look_at_target_output_position = bounds.get_center() - - _look_at_target_output_position += look_at_offset - -func _get_target_position_offset() -> Vector3: - return follow_target.global_position + follow_offset - - -func _get_target_position_offset_distance() -> Vector3: - return _get_target_position_offset() + \ - transform.basis.z * follow_distance - -# Used in the editor for setting initial Third Person position and angle -func _get_target_position_offset_distance_direction() -> Vector3: - return _get_target_position_offset() + \ - follow_target.global_basis.z * \ - follow_distance * \ - Quaternion(follow_target.global_basis.x, vertical_rotation_offset) * \ - Quaternion(follow_target.global_basis.y, horizontal_rotation_offset) - - -func _set_follow_velocity(index: int, value: float) -> void: - _follow_velocity_ref[index] = value - -func _interpolate_position(delta: float) -> void: - if follow_damping and not Engine.is_editor_hint(): - if not _is_third_person_follow: - global_position = _follow_target_output_position - for i in 3: - _transform_output.origin[i] = _smooth_damp( - global_position[i], - _transform_output.origin[i], - i, - _follow_velocity_ref[i], - _set_follow_velocity, - follow_damping_value[i], - delta - ) - else: - for i in 3: - _camera_target.global_position[i] = _smooth_damp( - _follow_target_output_position[i], - _camera_target.global_position[i], - i, - _follow_velocity_ref[i], - _set_follow_velocity, - follow_damping_value[i], - delta - ) - _transform_output.origin = global_position - else: - _camera_target.global_position = _follow_target_output_position - _transform_output.origin = global_position - - if _is_third_person_follow: - var target_quat: Quaternion = _look_at_target_quat(_get_target_position_offset(), follow_target.global_basis.y) - var target_basis: Basis = Basis(target_quat) - _transform_output.basis = target_basis - global_basis = target_basis - - -func _look_at_target_quat(target_position: Vector3, up_direction: Vector3 = Vector3.UP) -> Quaternion: - var direction: Vector3 = -(target_position - global_position).normalized() - - var basis_z: Vector3 = direction.normalized() - var basis_x: Vector3 = up_direction.cross(basis_z) - var basis_y: Vector3 = basis_z.cross(basis_x.normalized()) - - var target_basis: Basis = Basis(basis_x, basis_y, basis_z) - - if target_basis.determinant() == 0: - if target_basis.z == Vector3.UP: - global_rotation_degrees.x = -90 - else: - global_rotation_degrees.x = 90 - - _transform_output.basis = global_basis - return quaternion - - return target_basis.get_rotation_quaternion().normalized() - -func _interpolate_rotation(delta: float) -> void: - if _has_up_target: - _up = up_target.global_basis.y - - var target_quat: Quaternion = _look_at_target_quat(_look_at_target_output_position, _up) - - if look_at_damping: - var current_quat: Quaternion = quaternion.normalized() - var damping_time: float = max(0.0001, look_at_damping_value) - var t: float = min(1.0, delta / damping_time) - - var dot: float = current_quat.dot(target_quat) - - if dot < 0.0: - target_quat = -target_quat - dot = -dot - - dot = clampf(dot, -1.0, 1.0) - - var theta: float = acos(dot) * t - var sin_theta: float = sin(theta) - var sin_theta_total: float = sin(acos(dot)) - - if is_zero_approx(sin_theta_total): return - - var ratio_a: float = cos(theta) - dot * sin_theta / sin_theta_total - var ratio_b: float = sin_theta / sin_theta_total - var output: Quaternion = current_quat * ratio_a + target_quat * ratio_b - - _transform_output.basis = Basis(output) - quaternion = output - else: - _transform_output.basis = Basis(target_quat) - quaternion = target_quat - - -func _smooth_damp(target_axis: float, self_axis: float, index: int, current_velocity: float, set_velocity: Callable, damping_time: float, delta: float) -> float: - damping_time = maxf(0.0001, damping_time) - var omega: float = 2 / damping_time - var x: float = omega * delta - var exponential: float = 1 / (1 + x + 0.48 * x * x + 0.235 * x * x * x) - var diff: float = self_axis - target_axis - var _target_axis: float = target_axis - - var max_change: float = INF * damping_time - diff = clampf(diff, -max_change, max_change) - target_axis = self_axis - diff - - var temp: float = (current_velocity + omega * diff) * delta - set_velocity.call(index, (current_velocity - omega * temp) * exponential) - var output: float = target_axis + (diff + temp) * exponential - - ## To prevent overshooting - if (_target_axis - self_axis > 0.0) == (output > _target_axis): - output = _target_axis - set_velocity.call(index, (output - _target_axis) / delta) - - return output - - -func _get_raw_unprojected_position() -> Vector2: - return get_viewport().get_camera_3d().unproject_position(follow_target.global_position + follow_offset) - - -func _on_dead_zone_changed() -> void: - global_position = _get_target_position_offset_distance() - - -func _get_framed_side_offset() -> Vector2: - var frame_out_bounds: Vector2 - - if viewport_position.x < 0.5 - dead_zone_width / 2: - # Is outside left edge - frame_out_bounds.x = -1 - - if viewport_position.y < 0.5 - dead_zone_height / 2: - # Is outside top edge - frame_out_bounds.y = 1 - - if viewport_position.x > 0.5 + dead_zone_width / 2: - # Is outside right edge - frame_out_bounds.x = 1 - - if viewport_position.y > 0.5001 + dead_zone_height / 2: # 0.501 to resolve an issue where the bottom vertical Dead Zone never becoming 0 when the Dead Zone Vertical parameter is set to 0 - # Is outside bottom edge - frame_out_bounds.y = -1 - - return frame_out_bounds - - -func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: - var mask: int = current_layers - - # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 - if layer_number < 1 or layer_number > 20: - printerr("Render layer must be between 1 and 20.") - else: - if value: - mask |= 1 << (layer_number - 1) - else: - mask &= ~(1 << (layer_number - 1)) - - return mask - - -func _check_visibility() -> void: - _phantom_camera_manager.pcam_visibility_changed.emit(self) - - -func _follow_target_tree_exiting(target: Node) -> void: - if target == follow_target: - _should_follow = false - if _follow_targets.has(target): - _follow_targets.erase(target) - - -func _should_follow_checker() -> void: - if follow_mode == FollowMode.NONE: - _should_follow = false - return - - if not follow_mode == FollowMode.GROUP: - if is_instance_valid(follow_target): - _should_follow = true - else: - _should_follow = false - - -func _follow_targets_size_check() -> void: - var targets_size: int = 0 - _follow_target_physics_based = false - _follow_targets = [] - for i in follow_targets.size(): - if follow_targets[i] == null: continue - if is_instance_valid(follow_targets[i]): - _follow_targets.append(follow_targets[i]) - targets_size += 1 - _follow_targets_single_target_index = i - _check_physics_body(follow_targets[i]) - if not follow_targets[i].tree_exiting.is_connected(_follow_target_tree_exiting): - follow_targets[i].tree_exiting.connect(_follow_target_tree_exiting.bind(follow_targets[i])) - - match targets_size: - 0: - _should_follow = false - _has_multiple_follow_targets = false - 1: - _should_follow = true - _has_multiple_follow_targets = false - _: - _should_follow = true - _has_multiple_follow_targets = true - - -func _look_at_target_tree_exiting(target: Node) -> void: - if target == look_at_target: - _should_look_at = false - if look_at_targets.has(target): - erase_look_at_targets(target) - -func _up_target_tree_exiting() -> void: - up_target = null - - -func _should_look_at_checker() -> void: - if look_at_mode == LookAtMode.NONE: - _should_look_at = false - return - - if not look_at_mode == LookAtMode.GROUP: - if is_instance_valid(look_at_target): - _should_look_at = true - else: - _should_look_at = false - - -func _look_at_targets_size_check() -> void: - var targets_size: int = 0 - _look_at_target_physics_based = false - - for i in look_at_targets.size(): - if is_instance_valid(look_at_targets[i]): - targets_size += 1 - _look_at_targets_single_target_index = i - _check_physics_body(look_at_targets[i]) - if not look_at_targets[i].tree_exiting.is_connected(_look_at_target_tree_exiting): - look_at_targets[i].tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_targets[i])) - - match targets_size: - 0: - _should_look_at = false - _has_multiple_look_at_targets = false - 1: - _should_look_at = true - _has_multiple_look_at_targets = false - _: - _should_look_at = true - _has_multiple_look_at_targets = true - - -func _noise_emitted(emitter_noise_output: Transform3D, emitter_layer: int) -> void: - if noise_emitter_layer & emitter_layer != 0: - noise_emitted.emit(emitter_noise_output) - - -func _check_physics_body(target: Node3D) -> void: - if target is PhysicsBody3D: - var show_jitter_tips := ProjectSettings.get_setting("phantom_camera/tips/show_jitter_tips") - var physics_interpolation_enabled := ProjectSettings.get_setting("physics/common/physics_interpolation") - - ## NOTE - Feature Toggle - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor < 4: - if show_jitter_tips == null: # Default value is null when referencing custom Project Setting - print_rich("Following or Looking at a [b]PhysicsBody3D[/b] node will likely result in jitter - on lower physics ticks in particular.") - print_rich("If possible, will recommend upgrading to Godot 4.4, as it has built-in support for 3D Physics Interpolation, which will mitigate this issue.") - print_rich("Until then, try following the guide on the [url=https://phantom-camera.dev/support/faq#i-m-seeing-jitter-what-can-i-do]documentation site[/url] for better results.") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - return - ## NOTE - Only supported in Godot 4.4 or above - elif not physics_interpolation_enabled and show_jitter_tips == null: # Default value is null when referencing custom Project Setting - printerr("Physics Interpolation is disabled in the Project Settings, recommend enabling it to smooth out physics-based camera movement") - print_rich("This tip can be disabled from within [code]Project Settings / Phantom Camera / Tips / Show Jitter Tips[/code]") - _follow_target_physics_based = true - else: - _is_parents_physics(target) - physics_target_changed.emit() - - -func _is_parents_physics(target: Node = self) -> void: - var current_node: Node = target - while current_node: - current_node = current_node.get_parent() - if not current_node is PhysicsBody3D: continue - _follow_target_physics_based = true - - -func _camera_resource_changed() -> void: - camera_3d_resource_changed.emit() - - -func _set_follow_gizmo_line_position(target_position: Vector3) -> void: - if Engine.is_editor_hint(): - _follow_target_position = target_position - -func _check_draw_gizmo() -> void: - if _draw_follow_gizmo_line or _draw_look_at_gizmo_line: - _draw_gizmo = true - else: - _draw_gizmo = false - update_gizmos() - -#endregion - -#region Public Functions - -# TBD -#func get_unprojected_position() -> Vector2: - #var unprojected_position: Vector2 = _get_raw_unprojected_position() - #var viewport_width: float = get_viewport().size.x - #var viewport_height: float = get_viewport().size.y - #var camera_aspect: Camera3D.KeepAspect = get_viewport().get_camera_3d().keep_aspect - #var visible_rect_size: Vector2 = get_viewport().size -# - #unprojected_position = unprojected_position - visible_rect_size / 2 - #if camera_aspect == Camera3D.KeepAspect.KEEP_HEIGHT: -## print("Landscape View") - #var aspect_ratio_scale: float = viewport_width / viewport_height - #unprojected_position.x = (unprojected_position.x / aspect_ratio_scale + 1) / 2 - #unprojected_position.y = (unprojected_position.y + 1) / 2 - #else: -## print("Portrait View") - #var aspect_ratio_scale: float = viewport_height / viewport_width - #unprojected_position.x = (unprojected_position.x + 1) / 2 - #unprojected_position.y = (unprojected_position.y / aspect_ratio_scale + 1) / 2 -# - #return unprojected_position - - -## Returns the [Transform3D] value based on the [member follow_mode] / [member look_at_mode] target value. -func get_transform_output() -> Transform3D: - return _transform_output - - -## Returns the noise [Transform3D] value. -func get_noise_transform() -> Transform3D: - return _transform_noise - - -## Emits a noise based on a custom [Transform3D] value.[br] -## Use this function if you wish to make use of external noise patterns from, for example, other addons. -func emit_noise(value: Transform3D) -> void: - noise_emitted.emit(value) - - -## Teleports the [param PhantomCamera3D] and [Camera3D] to their designated position, -## bypassing the damping process. -func teleport_position() -> void: - _follow_velocity_ref = Vector3.ZERO - _set_follow_position() - _transform_output.origin = _follow_target_output_position - _phantom_camera_manager.pcam_teleport.emit(self) - - -# TODO: Enum link does link to anywhere is being tracked in: https://github.com/godotengine/godot/issues/106828 -## Returns [code]true[/code] if this [param PhantomCamera3D]'s [member follow_mode] is not set to [constant FollowMode.NONE] -## and has a valid [member follow_target]. -func is_following() -> bool: - return _should_follow - -# TODO: Enum link does link to anywhere is being tracked in: https://github.com/godotengine/godot/issues/106828 -## Returns [code]true[/code] if this [param PhantomCamera3D]'s [member look_at_mode] is not set to [constant LookAtMode.NONE] -## and has a valid [member look_at_target]. -func is_looking() -> bool: - return _should_look_at - - -## Returns the world space coodinate of where the target the camera is following. -## In most cases, this is the -func get_follow_target_position() -> Vector3: - return _follow_target_position - -## Returns the world space coordinate of where the camera is looking at. -func get_look_at_target_position() -> Vector3: - return _look_at_target_output_position - -#endregion - - -#region Setter & Getter Functions - -## Assigns the value of the [param has_tweened] property.[br] -## [b][color=yellow]Important:[/color][/b] This value can only be changed -## from the [PhantomCameraHost] script. -func set_tween_skip(caller: Node, value: bool) -> void: - if is_instance_of(caller, PhantomCameraHost): - _tween_skip = value - else: - printerr("Can only be called PhantomCameraHost class") -## Returns the current [param has_tweened] value. -func get_tween_skip() -> bool: - return _tween_skip - - -## Assigns new [member priority] value. -func set_priority(value: int) -> void: - priority = maxi(0, value) - if not is_node_ready(): return - if not Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): return - Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME).pcam_priority_changed.emit(self) -## Gets current [param Priority] value. -func get_priority() -> int: - return priority - - -## Assigns a new [PhantomCameraTween] resource to the [param PhantomCamera3D]. -func set_tween_resource(value: PhantomCameraTween) -> void: - tween_resource = value -## Gets the [param PhantomCameraTween] resource assigned to the [param PhantomCamera3D]. -## Returns null if there's nothing assigned to it. -func get_tween_resource() -> PhantomCameraTween: - return tween_resource - -## Assigns a new [param Tween Duration] to the [member tween_resource] value.[br] -## The duration value is in seconds. -func set_tween_duration(value: float) -> void: - tween_resource.duration = value -## Gets the current [param Tween] Duration value. The duration value is in -## [param seconds]. -func get_tween_duration() -> float: - return tween_resource.duration - -## Assigns a new [param Tween Transition] to the [member tween_resource] value.[br] -## The duration value is in seconds. -func set_tween_transition(value: int) -> void: - tween_resource.transition = value -## Gets the current [param Tween Transition] value. -func get_tween_transition() -> int: - return tween_resource.transition - -## Assigns a new [param Tween Ease] to the [member tween_resource] value.[br] -## The duration value is in seconds. -func set_tween_ease(value: int) -> void: - tween_resource.ease = value -## Gets the current [param Tween Ease] value. -func get_tween_ease() -> int: - return tween_resource.ease - -## Sets the [param PhantomCamera3D] active state[br] -## [b][color=yellow]Important:[/color][/b] This value can only be changed -## from the [PhantomCameraHost] script. -func set_is_active(node: Node, value: bool) -> void: - if node is PhantomCameraHost: - _is_active = value - else: - printerr("PCams can only be set from the PhantomCameraHost") -## Gets current active state of the [param PhantomCamera3D]. -## If it returns true, it means the [param PhantomCamera3D] is what the -## [param Camera3D] is currently following. -func is_active() -> bool: - return _is_active - - -## Enables or disables the [member tween_on_load]. -func set_tween_on_load(value: bool) -> void: - tween_on_load = value -## Gets the current [member tween_on_load] value. -func get_tween_on_load() -> bool: - return tween_on_load - - -## Sets the [member host_layers] value. -func set_host_layers(value: int) -> void: - host_layers = value - if is_instance_valid(_phantom_camera_manager): - _phantom_camera_manager.pcam_host_layer_changed.emit(self) - -## Enables or disables a given layer of [member host_layers]. -func set_host_layers_value(layer: int, value: bool) -> void: - host_layers = _set_layer(host_layers, layer, value) - -## Gets the current [member host_layers]. -func get_host_layers() -> int: - return host_layers - - -## Gets the current follow mode as an enum int based on [member FollowMode] enum.[br] -## [b]Note:[/b] Setting [member follow_mode] has purposely not been added. -## A separate [param PhantomCamera3D] instance should be used instead. -func get_follow_mode() -> int: - return follow_mode - - -## Assigns a new [Node3D] as the [member follow_target]. -func set_follow_target(value: Node3D) -> void: - if follow_mode == FollowMode.NONE or follow_mode == FollowMode.GROUP: return - if follow_target == value: return - follow_target = value - _follow_target_physics_based = false - if is_instance_valid(value): - if follow_mode == FollowMode.PATH: - if is_instance_valid(follow_path): - _should_follow = true - else: - _should_follow = false - else: - _should_follow = true - _check_physics_body(value) - if follow_mode == FollowMode.THIRD_PERSON and is_instance_valid(_follow_spring_arm): - _follow_spring_arm.add_excluded_object(follow_target) - if not follow_target.tree_exiting.is_connected(_follow_target_tree_exiting): - follow_target.tree_exiting.connect(_follow_target_tree_exiting.bind(follow_target)) - else: - if not follow_mode == FollowMode.GROUP: - _should_follow = false - follow_target_changed.emit() - update_gizmos() - notify_property_list_changed() -## Removes the current [Node3D] [member follow_target]. -func erase_follow_target() -> void: - follow_target = null -## Gets the current Node3D target. -func get_follow_target() -> Node3D: - return follow_target - - -## Assigns a new [Path3D] to the [member follow_path] property. -func set_follow_path(value: Path3D) -> void: - follow_path = value - if is_instance_valid(follow_path): - _should_follow_checker() - else: - _should_follow = false - -## Erases the current [Path3D] from [member follow_path] property. -func erase_follow_path() -> void: - follow_path = null - -## Gets the current [Path3D] from the [member follow_path] property. -func get_follow_path() -> Path3D: - return follow_path - - -## Assigns a new [param follow_targets] array value. -func set_follow_targets(value: Array[Node3D]) -> void: - if not follow_mode == FollowMode.GROUP: return - if follow_targets == value: return - follow_targets = value - _follow_targets_size_check() - - -## Adds a single [Node3D] to [member follow_targets] array. -func append_follow_targets(value: Node3D) -> void: - if not is_instance_valid(value): - printerr(value, " is not a valid Node3D instance") - return - - if not follow_targets.has(value): - follow_targets.append(value) - _follow_targets_size_check() - else: - printerr(value, " is already part of Follow Group") - -## Adds an Array of type [Node3D] to [member follow_targets] array. -func append_follow_targets_array(value: Array[Node3D]) -> void: - for target in value: - if not is_instance_valid(target): continue - if not follow_targets.has(target): - follow_targets.append(target) - _follow_targets_size_check() - else: - printerr(value, " is already part of Follow Group") - -## Removes [Node3D] from [member follow_targets]. -func erase_follow_targets(value: Node3D) -> void: - follow_targets.erase(value) - _follow_targets_size_check() - - -## Gets all [Node3D] from [follow_targets]. -func get_follow_targets() -> Array[Node3D]: - return follow_targets - - -## Assigns a new [param Vector3] for the [param follow_offset] property. -func set_follow_offset(value: Vector3) -> void: - var temp_offset: Vector3 = follow_offset - follow_offset = value - - if follow_axis_lock != FollowLockAxis.NONE: - temp_offset = temp_offset - value - match value: - FollowLockAxis.X: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - FollowLockAxis.Y: - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - FollowLockAxis.Z: - _follow_axis_lock_value.z = _transform_output.origin.z + temp_offset.z - FollowLockAxis.XY: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - FollowLockAxis.XZ: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - _follow_axis_lock_value.z = _transform_output.origin.z + temp_offset.z - FollowLockAxis.YZ: - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - _follow_axis_lock_value.z = _transform_output.origin.z + temp_offset.z - FollowLockAxis.XYZ: - _follow_axis_lock_value.x = _transform_output.origin.x + temp_offset.x - _follow_axis_lock_value.y = _transform_output.origin.y + temp_offset.y - _follow_axis_lock_value.z = _transform_output.origin.z + temp_offset.z - -## Gets the current [param Vector3] for the [param follow_offset] property. -func get_follow_offset() -> Vector3: - return follow_offset - - -## Enables or disables [member follow_damping]. -func set_follow_damping(value: bool) -> void: - follow_damping = value - notify_property_list_changed() - -## Gets the currents [member follow_damping] property. -func get_follow_damping() -> bool: - return follow_damping - - -## Assigns new [member follow_damping_value] value. -func set_follow_damping_value(value: Vector3) -> void: - ## TODO - Should be using @export_range once minimum version support is Godot 4.3 - if value.x < 0: value.x = 0 - elif value.y < 0: value.y = 0 - elif value.z < 0: value.z = 0 - follow_damping_value = value - -## Gets the currents [member follow_damping_value] value. -func get_follow_damping_value() -> Vector3: - return follow_damping_value - - -## Assigns a new [member follow_distance] value. -func set_follow_distance(value: float) -> void: - follow_distance = value - -## Gets [member follow_distance] value. -func get_follow_distance() -> float: - return follow_distance - - -## Enables or disables [member auto_follow_distance] when using Group Follow. -func set_auto_follow_distance(value: bool) -> void: - auto_follow_distance = value - notify_property_list_changed() - -## Gets [member auto_follow_distance] state. -func get_auto_follow_distance() -> bool: - return auto_follow_distance - - -## Assigns new [member auto_follow_distance_min] value. -func set_auto_follow_distance_min(value: float) -> void: - auto_follow_distance_min = value - -## Gets [member auto_follow_distance_min] value. -func get_auto_follow_distance_min() -> float: - return auto_follow_distance_min - - -## Assigns new [member auto_follow_distance_max] value. -func set_auto_follow_distance_max(value: float) -> void: - auto_follow_distance_max = value -## Gets [member auto_follow_distance_max] value. -func get_auto_follow_distance_max() -> float: - return auto_follow_distance_max - - -## Assigns new [member auto_follow_distance_divisor] value. -func set_auto_follow_distance_divisor(value: float) -> void: - auto_follow_distance_divisor = value - -## Gets [member auto_follow_distance_divisor] value. -func get_auto_follow_distance_divisor() -> float: - return auto_follow_distance_divisor - - -## Assigns new rotation (in radians) value to [SpringArm3D] for -## [param ThirdPerson] [enum FollowMode]. -func set_third_person_rotation(value: Vector3) -> void: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return - _follow_spring_arm.rotation = value - -## Gets the rotation value (in radians) from the [SpringArm3D] for -## [param ThirdPerson] [enum FollowMode]. -func get_third_person_rotation() -> Vector3: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return Vector3.ZERO - return _follow_spring_arm.rotation - - -## Assigns new rotation (in degrees) value to [SpringArm3D] for -## [param ThirdPerson] [enum FollowMode]. -func set_third_person_rotation_degrees(value: Vector3) -> void: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return - _follow_spring_arm.rotation_degrees = value - -## Gets the rotation value (in degrees) from the [SpringArm3D] for -## [param ThirdPerson] [enum FollowMode]. -func get_third_person_rotation_degrees() -> Vector3: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return Vector3.ZERO - return _follow_spring_arm.rotation_degrees - - -## Assigns new [Quaternion] value to [SpringArm3D] for [param ThirdPerson] -## [enum FollowMode]. -func set_third_person_quaternion(value: Quaternion) -> void: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return - _follow_spring_arm.quaternion = value - -## Gets the [Quaternion] value of the [SpringArm3D] for [param ThirdPerson] -## [enum Follow mode]. -func get_third_person_quaternion() -> Quaternion: - if not _is_third_person_follow: - printerr("Follow Mode is not set to Third Person") - return Quaternion.IDENTITY - return _follow_spring_arm.quaternion - - -## Assigns a new [member set_vertical_rotation_offset] value. -func set_vertical_rotation_offset(value: float) -> void: - vertical_rotation_offset = value - -## Gets the [member vertical_rotation] value. -func get_vertical_rotation_offset() -> float: - return vertical_rotation_offset - - -func set_horizontal_rotation_offset(value: float) -> void: - horizontal_rotation_offset = value - -## Gets the [member horizontal_rotation] value. -func get_horizontal_rotation_offset() -> float: - return horizontal_rotation_offset - - -## Assigns a new ThirdPerson [member SpringArm3D.length] value. -func set_spring_length(value: float) -> void: - follow_distance = value - if not is_instance_valid(_follow_spring_arm): return - _follow_spring_arm.spring_length = value - -## Gets the [member SpringArm3D.length] -## from a [param ThirdPerson] [enum follow_mode] instance. -func get_spring_length() -> float: - return follow_distance - - -## Assigns a new [member collision_mask] to the [SpringArm3D] when [enum FollowMode] -## is set to [param ThirdPerson]. -func set_collision_mask(value: int) -> void: - collision_mask = value - if not is_instance_valid(_follow_spring_arm): return - _follow_spring_arm.collision_mask = collision_mask - -## Enables or disables a specific [member collision_mask] layer for the -## [SpringArm3D] when [enum FollowMode] is set to [param ThirdPerson]. -func set_collision_mask_value(value: int, enabled: bool) -> void: - collision_mask = _set_layer(collision_mask, value, enabled) - if not is_instance_valid(_follow_spring_arm): return - _follow_spring_arm.collision_mask = collision_mask - -## Gets [member collision_mask] from the [SpringArm3D] when [enum FollowMode] -## is set to [param ThirdPerson]. -func get_collision_mask() -> int: - return collision_mask - - -## Assigns a new [SpringArm3D.shape] when [enum FollowMode] -## is set to [param ThirdPerson]. -func set_shape(value: Shape3D) -> void: - shape = value - if not is_instance_valid(_follow_spring_arm): return - _follow_spring_arm.shape = shape - -## Gets [param ThirdPerson] [member SpringArm3D.shape] value. -func get_shape() -> Shape3D: - return shape - - -## Assigns a new [member SpringArm3D.margin] value when [enum FollowMode] -## is set to [param ThirdPerson]. -func set_margin(value: float) -> void: - margin = value - if not is_instance_valid(_follow_spring_arm): return - _follow_spring_arm.margin = margin - -## Gets the [SpringArm3D.margin] when [enum FollowMode] is set to -## [param ThirdPerson]. -func get_margin() -> float: - return margin - - -func set_draw_follow_line(value: bool) -> void: - draw_follow_line = value - _draw_follow_gizmo_line = value - _check_draw_gizmo() - -func get_draw_follow_line() -> bool: - return draw_follow_line - - -func set_draw_look_at_line(value: bool) -> void: - draw_look_at_line = value - _draw_look_at_gizmo_line = value - _check_draw_gizmo() - -func get_draw_look_at_line() -> bool: - return draw_look_at_line - - -## Gets the current [member look_at_mode]. Value is based on [enum LookAtMode] -## enum.[br] -## Note: To set a new [member look_at_mode], a separate [param PhantomCamera3D] should be used. -func get_look_at_mode() -> int: - return look_at_mode - - -## Assigns new [Node3D] as [member look_at_target]. -func set_look_at_target(value: Node3D) -> void: - if look_at_mode == LookAtMode.NONE: return - if look_at_target == value: return - look_at_target = value - if not look_at_mode == LookAtMode.GROUP: - if is_instance_valid(look_at_target): - _should_look_at = true - _check_physics_body(value) - if not look_at_target.tree_exiting.is_connected(_look_at_target_tree_exiting): - look_at_target.tree_exiting.connect(_look_at_target_tree_exiting.bind(look_at_target)) - else: - _should_look_at = false - elif look_at_targets.size() == 0: - _should_look_at = false - - look_at_target_changed.emit() - notify_property_list_changed() - -## Gets current [Node3D] from [member look_at_target] property. -func get_look_at_target() -> Node3D: - return look_at_target - - -## Sets an array of type [Node3D] to [member set_look_at_targets]. -func set_look_at_targets(value: Array[Node3D]) -> void: - if not look_at_mode == LookAtMode.GROUP: return - if look_at_targets == value: return - look_at_targets = value - - _look_at_targets_size_check() - notify_property_list_changed() - -## Appends a [Node3D] to [member look_at_targets] array. -func append_look_at_target(value: Node3D) -> void: - if not is_instance_valid(value): - printerr(value, "is an invalid Node3D instance") - return - - if not look_at_targets.has(value): - look_at_targets.append(value) - _look_at_targets_size_check() - else: - printerr(value, " is already part of Look At Group") - - -## Appends an array of type [Node3D] to [member look_at_targets] array. -func append_look_at_targets_array(value: Array[Node3D]) -> void: - for val in value: - if not is_instance_valid(val): continue - if not look_at_targets.has(val): - look_at_targets.append(val) - _look_at_targets_size_check() - else: - printerr(val, " is already part of Look At Group") - -## Removes [Node3D] from [member look_at_targets] array. -func erase_look_at_targets(value: Node3D) -> void: - if look_at_targets.has(value): - look_at_targets.erase(value) - _look_at_targets_size_check() - else: - printerr(value, " is not part of Look At Group") - - -## Removes [Node3D] from [member look_at_targets] array. [br] -## @deprecated: Use [member erase_look_at_targets] instead. -func erase_look_at_targets_member(value: Node3D) -> void: - printerr("erase_look_at_targets_member is deprecated, use erase_look_at_targets instead") - erase_look_at_targets(value) - -## Gets all the [Node3D] instances in [member look_at_targets]. -func get_look_at_targets() -> Array[Node3D]: - return look_at_targets - - -## Assigns a new [Vector3] to the [member look_at_offset] value. -func set_look_at_offset(value: Vector3) -> void: - look_at_offset = value - -## Gets the current [member look_at_offset] value. -func get_look_at_offset() -> Vector3: - return look_at_offset - - -## Enables or disables [member look_at_damping]. -func set_look_at_damping(value: bool) -> void: - look_at_damping = value - notify_property_list_changed() - -## Gets the currents [member look_at_damping] property. -func get_look_at_damping() -> bool: - return look_at_damping - - -## Assigns new [member look_at_damping_value] value. -func set_look_at_damping_value(value: float) -> void: - look_at_damping_value = value - -## Gets the currents [member look_at_damping_value] value. -func get_look_at_damping_value() -> float: - return look_at_damping_value - -## Assigns the Follow Axis. -func set_follow_axis_lock(value: FollowLockAxis) -> void: - follow_axis_lock = value - - # Wait for the node to be ready before setting lock - if not is_node_ready(): await ready - - # Prevent axis lock from working in the editor - if value != FollowLockAxis.NONE and not Engine.is_editor_hint(): - _follow_axis_is_locked = true - match value: - FollowLockAxis.X: - _follow_axis_lock_value.x = _transform_output.origin.x - FollowLockAxis.Y: - _follow_axis_lock_value.y = _transform_output.origin.y - FollowLockAxis.Z: - _follow_axis_lock_value.z = _transform_output.origin.z - FollowLockAxis.XY: - _follow_axis_lock_value.x = _transform_output.origin.x - _follow_axis_lock_value.y = _transform_output.origin.y - FollowLockAxis.XZ: - _follow_axis_lock_value.x = _transform_output.origin.x - _follow_axis_lock_value.z = _transform_output.origin.z - FollowLockAxis.YZ: - _follow_axis_lock_value.y = _transform_output.origin.y - _follow_axis_lock_value.z = _transform_output.origin.z - FollowLockAxis.XYZ: - _follow_axis_lock_value.x = _transform_output.origin.x - _follow_axis_lock_value.y = _transform_output.origin.y - _follow_axis_lock_value.z = _transform_output.origin.z - else: - _follow_axis_is_locked = false - -## Gets the current [member follow_axis_lock] property. Value is based on [enum FollowLockAxis] enum. -func get_follow_axis_lock() -> FollowLockAxis: - return follow_axis_lock - - -## Sets the [member up] value. -func set_up(value: Vector3) -> void: - if value == Vector3.ZERO: - value = Vector3.UP - push_warning("Up value cannot be (0, 0, 0), resetting to (0, 1, 0).") - - up = value - if not _has_up_target: - _up = value - -## Gets the [member up] value. -func get_up() -> Vector3: - return up - - -## Sets the [member up_target]. -func set_up_target(value: Node3D) -> void: - up_target = value - if is_instance_valid(value): - _has_up_target = true - if not value.tree_exiting.is_connected(_up_target_tree_exiting): - value.tree_exiting.connect(_up_target_tree_exiting) - else: - _has_up_target = false - _up = up - notify_property_list_changed() - -## Gets the [member up_target]. -func get_up_target() -> Node3D: - return up_target - - -## Sets a [PhantomCameraNoise3D] resource. -func set_noise(value: PhantomCameraNoise3D) -> void: - noise = value - if value != null: - _has_noise_resource = true - noise.set_trauma(1) - else: - _has_noise_resource = false - _transform_noise = Transform3D() - -func get_noise() -> PhantomCameraNoise3D: - return noise - -func has_noise_resource() -> bool: - return _has_noise_resource - - -## Sets the [member noise_emitter_layer] value. -func set_noise_emitter_layer(value: int) -> void: - noise_emitter_layer = value - -## Enables or disables a given layer of [member noise_emitter_layer]. -func set_noise_emitter_layer_value(value: int, enabled: bool) -> void: - noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) - -## Returns the [member noise_emitter_layer]. -func get_noise_emitter_layer() -> int: - return noise_emitter_layer - - -## Sets [member inactive_update_mode] property. -func set_inactive_update_mode(value: int) -> void: - inactive_update_mode = value - -## Gets [member inactive_update_mode] property. -func get_inactive_update_mode() -> int: - return inactive_update_mode - - -## Assigns a [Camera3DResource]. -func set_camera_3d_resource(value: Camera3DResource) -> void: - camera_3d_resource = value - camera_3d_resource_changed.emit() - if value: - if not camera_3d_resource.changed.is_connected(_camera_resource_changed): - camera_3d_resource.changed.connect(_camera_resource_changed) - -## Gets the [Camera3DResource]. -func get_camera_3d_resource() -> Camera3DResource: - return camera_3d_resource - - -func set_keep_aspect(value: int) -> void: - if not camera_3d_resource: - printerr("Can't assign a keep_aspect value. No Camera3DResource assigned to ", name) - return - keep_aspect = value - camera_3d_resource_property_changed.emit("keep_aspect", value) - -func get_keep_aspect() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.keep_aspect - - -## Assigns a new [member Camera3D.cull_mask] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_cull_mask(value: int) -> void: - if not camera_3d_resource: - printerr("Can't assign a cull_mask value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.cull_mask = value - camera_3d_resource_property_changed.emit("cull_mask", value) - -## Enables or disables a specific [member Camera3D.cull_mask] layer.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_cull_mask_value(layer_number: int, value: bool) -> void: - if not camera_3d_resource: - printerr("Can't assign a cull_mask value. No Camera3DResource assigned to ", name) - return - var mask: int = _set_layer(get_cull_mask(), layer_number, value) - camera_3d_resource.cull_mask = mask - camera_3d_resource_property_changed.emit("cull_mask", mask) - -## Gets the [member Camera3D.cull_mask] value assigned to the [Camera3DResource]. -func get_cull_mask() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.cull_mask - - -## Assigns a new [Environment] resource to the [Camera3DResource]. -func set_environment(value: Environment) -> void: - environment = value - camera_3d_resource_property_changed.emit("environment", value) - -## Gets the [Camera3D.environment] value assigned to the [Camera3DResource]. -func get_environment() -> Environment: - return environment - - -## Assigns a new [CameraAttributes] resource to the [Camera3DResource]. -func set_attributes(value: CameraAttributes) -> void: - attributes = value - camera_3d_resource_property_changed.emit("attributes", value) - -## Gets the [Camera3D.attributes] value assigned to the [Camera3DResource]. -func get_attributes() -> CameraAttributes: - return attributes - -## Assigns a new [Compositor] resource to the [Camera3DResource]. -func set_compositor(value: Compositor) -> void: - compositor = value - camera_3d_resource_property_changed.emit("compositor", value) - -## Gets the [Camera3D.compositor] value assigned to the [Camera3DResource]. -func get_compositor() -> Compositor: - return compositor - - -## Assigns a new [member Camera3D.h_offset] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_h_offset(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a h_offset value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.h_offset = value - camera_3d_resource_property_changed.emit("h_offset", value) - -## Gets the [member Camera3D.h_offset] value assigned to the [param Camera3DResource]. -func get_h_offset() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.h_offset - - -## Assigns a new [Camera3D.v_offset] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_v_offset(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a v_offset value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.v_offset = value - camera_3d_resource_property_changed.emit("v_offset", value) - -## Gets the [member Camera3D.v_offset] value assigned to the [param Camera3DResource]. -func get_v_offset() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.v_offset - - -## Assigns a new [Camera3D.projection] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_projection(value: int) -> void: - if not camera_3d_resource: - printerr("Can't assign a projection value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.projection = value - camera_3d_resource_property_changed.emit("projection", value) - -## Gets the [member Camera3D.projection] value assigned to the [param Camera3DResource]. -func get_projection() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.projection - - -## Assigns a new [member Camera3D.fov] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_fov(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a fov value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.fov = value - camera_3d_resource_property_changed.emit("fov", value) - -## Gets the [member Camera3D.fov] value assigned to the [param Camera3DResource]. -func get_fov() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.fov - - -## Assigns a new [member Camera3D.size] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_size(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a size value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.size = value - camera_3d_resource_property_changed.emit("size", value) - -## Gets the [member Camera3D.size] value assigned to the [param Camera3DResource]. -func get_size() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.size - - -## Assigns a new [member Camera3D.frustum_offset] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_frustum_offset(value: Vector2) -> void: - if not camera_3d_resource: - printerr("Can't assign a frustum_offset value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.frustum_offset = value - camera_3d_resource_property_changed.emit("frustum_offset", value) - -## Gets the [member Camera3D.frustum_offset] value assigned to the [param Camera3DResource]. -func get_frustum_offset() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.frustum_offset - - -## Assigns a new [member Camera3D.near] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_near(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a near value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.near = value - camera_3d_resource_property_changed.emit("near", value) - -## Gets the [member Camera3D.near] value assigned to the [param Camera3DResource]. -func get_near() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.near - - -## Assigns a new [member Camera3D.far] value.[br] -## [b]Note:[/b] This will override and make the [param Camera3DResource] unique to -## this [param PhantomCamera3D]. -func set_far(value: float) -> void: - if not camera_3d_resource: - printerr("Can't assign a far value. No Camera3DResource assigned to ", name) - return - camera_3d_resource.far = value - camera_3d_resource_property_changed.emit("far", value) - -## Gets the [member Camera3D.far] value assigned to the [param Camera3DResource]. -func get_far() -> Variant: - if not camera_3d_resource: return null - return camera_3d_resource.far - - -func get_follow_target_physics_based() -> bool: - return _follow_target_physics_based - - -## Used internally in phantom_camera_3d_gizmo.gd to check if the Follow line should be shown. -func draw_follow_gizmo_line() -> bool: - return _draw_follow_gizmo_line - -## Used internally in phantom_camera_3d_gizmo.gd to check if the Look At line should be shown. -func draw_look_at_gizmo_line() -> bool: - return _draw_look_at_gizmo_line - - -func get_class() -> String: - return "PhantomCamera3D" - - -func is_class(value) -> bool: - return value == "PhantomCamera3D" - -#endregion diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid deleted file mode 100644 index 31a2fc9..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_3d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://csjccrhj5wnx7 diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd deleted file mode 100644 index 43f6cf4..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd +++ /dev/null @@ -1,29 +0,0 @@ -@tool -extends RefCounted - -#region Constants - -#const PhantomCameraHost: Script = preload("res://addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd") - -const CAMERA_2D_NODE_NAME: StringName = "Camera2D" -const CAMERA_3D_NODE_NAME: StringName = "Camera3D" -const PCAM_HOST_NODE_NAME: StringName = "PhantomCameraHost" -const PCAM_MANAGER_NODE_NAME: String = "PhantomCameraManager" # TODO - Convert to StringName once https://github.com/godotengine/godot/pull/72702 is merged -const PCAM_2D_NODE_NAME: StringName = "PhantomCamera2D" -const PCAM_3D_NODE_NAME: StringName = "PhantomCamera3D" -const PCAM_HOST: StringName = "phantom_camera_host" - -const COLOR_2D: Color = Color("8DA5F3") -const COLOR_3D: Color = Color("FC7F7F") -const COLOR_PCAM: Color = Color("3AB99A") -const COLOR_PCAM_33: Color = Color("3ab99a33") -const PCAM_HOST_COLOR: Color = Color("E0E0E0") - -#endregion - -#region Group Names - -const PCAM_GROUP_NAME: StringName = "phantom_camera_group" -const PCAM_HOST_GROUP_NAME: StringName = "phantom_camera_host_group" - -#endregion diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid deleted file mode 100644 index b1e3789..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dn74j5b5hdxu diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd deleted file mode 100644 index 7306810..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd +++ /dev/null @@ -1,264 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_2d.svg") -class_name PhantomCameraNoiseEmitter2D -extends Node2D - -## Emits positional and rotational noise to active [PhantomCamera2D]s and its corresponding [Camera2D]. -## -## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera2D]. -## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a -## bit of slight movement to the camera to make it feel less static. -## The emitter can affect multiple [PhantomCamera2D] in a given scene based on which [member noise_emitter_layer] -## are enabled by calling its [method emit] function. At least one corresponding layer has to be -## set on the [PhantomCamera2D] and the emitter node. - -const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#region Exported Proerpties - -## The [PhantomCameraNoise2D] resource that defines the noise pattern. -@export var noise: PhantomCameraNoise2D = null: - set = set_noise, - get = get_noise - -## If true, previews the noise in the editor - can be seen in the viewfinder. -@export var preview: bool = false: - set(value): - preview = value - _play = value - get: - return preview - -## If true, repeats the noise indefinitely once started. Otherwise, it will only be triggered once. [br] -@export var continuous: bool = false: - set = set_continuous, - get = get_continuous - -## Determines how long the noise should take to reach full [member intensity] once started.[br] -## The value is set in [b]seconds[/b]. -@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: - set = set_growth_time, - get = get_growth_time - -## Sets the duration for the camera noise if [member continuous] is set to [b]false[/b].[br][br] -## The value is set in [b]seconds[/b]. -@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: - set = set_duration, - get = get_duration - -## Determines how long the noise should take to come to a full stop.[br] -## The value is set in [b]seconds[/b]. -@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: - set = set_decay_time, - get = get_decay_time - -## Enabled layers will affect [PhantomCamera2D] nodes with at least one corresponding layer enabled.[br] -## Enabling multiple corresponding layers on the same [PhantomCamera2D] causes no additional effect. -@export_flags_2d_render var noise_emitter_layer: int = 1: - set = set_noise_emitter_layer, - get = get_noise_emitter_layer - -#endregion - - -#region Private Variables - -var _play: bool = false: - set(value): - _play = value - if value: - _elasped_play_time = 0 - _decay_countdown = 0 - _play = true - _should_grow = true - _start_duration_countdown = false - _should_decay = false - else: - _should_decay = true - if noise.randomize_noise_seed: - noise.noise_seed = randi() & 1000 - else: - noise.reset_noise_time() - get: - return _play - -var _start_duration_countdown: bool = false - -var _decay_countdown: float = 0 - -var _should_grow: bool = false - -var _should_decay: bool = false - -var _elasped_play_time: float = 0 - -var _noise_output: Transform2D = Transform2D() - -# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. -var _phantom_camera_manager: Node - -#endregion - -#region Private Functions - -func _get_configuration_warnings() -> PackedStringArray: - if noise == null: - return ["Noise resource is required in order to trigger emitter."] - else: - return [] - - -func _validate_property(property) -> void: - if property.name == "duration" and continuous: - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _enter_tree() -> void: - _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) - - -func _process(delta: float) -> void: - if not _play and not _should_decay: return - if noise == null: - printerr("Noise resource missing in ", name) - _play = false - return - - _elasped_play_time += delta - - if _should_grow: - noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) - if _elasped_play_time >= growth_time: - _should_grow = false - _start_duration_countdown = true - noise.set_trauma(1) - else: - noise.set_trauma(1) - - if not continuous: - if _start_duration_countdown: - if _elasped_play_time >= duration + growth_time: - _should_decay = true - _start_duration_countdown = false - - if _should_decay: - _decay_countdown += delta - noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) - if _decay_countdown >= decay_time: - noise.set_trauma(0) - _play = false - preview = false - _should_decay = false - _elasped_play_time = 0 - _decay_countdown = 0 - - _noise_output = noise.get_noise_transform(delta) - _phantom_camera_manager.noise_2d_emitted.emit(_noise_output, noise_emitter_layer) - - -func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: - var mask: int = current_layers - - # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 - if layer_number < 1 or layer_number > 20: - printerr("Layer must be between 1 and 20.") - else: - if value: - mask |= 1 << (layer_number - 1) - else: - mask &= ~(1 << (layer_number - 1)) - - return mask - -#endregion - - -#region Public Functions - -## Emits noise to the [PhantomCamera2D]s that has at least one matching layers. -func emit() -> void: - if _play: _play = false - _play = true - -## Returns the state for the emitter. If true, the emitter is currently emitting. -func is_emitting() -> bool: - return _play - -## Stops the emitter from emitting noise. -func stop(should_decay: bool = true) -> void: - if should_decay: - _should_decay = true - else: - _play = false - -## Toggles the emitter on and off. -func toggle() -> void: - _play = !_play - -#endregion - - -#region Setter & Getter Functions - -## Sets the [member noise] resource. -func set_noise(value: PhantomCameraNoise2D) -> void: - noise = value - update_configuration_warnings() - -## Returns the [member noise] resource. -func get_noise() -> PhantomCameraNoise2D: - return noise - - -## Sets the [member continous] value. -func set_continuous(value: bool) -> void: - continuous = value - notify_property_list_changed() - -## Gets the [member continous] value. -func get_continuous() -> bool: - return continuous - - -## Sets the [member growth_time] value. -func set_growth_time(value: float) -> void: - growth_time = value - -## Returns the [member growth_time] value. -func get_growth_time() -> float: - return growth_time - - -## Sets the [member duration] value. -func set_duration(value: float) -> void: - duration = value - if duration == 0: - duration = 0.001 - -## Returns the [member duration] value. -func get_duration() -> float: - return duration - - -## Sets the [member decay_time] value. -func set_decay_time(value: float) -> void: - decay_time = value - -## Returns the [member decay_time] value. -func get_decay_time() -> float: - return decay_time - - -## Sets the [member noise_emitter_layer] value. -func set_noise_emitter_layer(value: int) -> void: - noise_emitter_layer = value - -## Enables or disables a given layer of [member noise_emitter_layer]. -func set_noise_emitter_value(value: int, enabled: bool) -> void: - noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) - -## Returns the [member noise_emitter_layer] value. -func get_noise_emitter_layer() -> int: - return noise_emitter_layer - -#endregion diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid deleted file mode 100644 index 19dbc96..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_2d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bhd4nuiu23e7l diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd deleted file mode 100644 index cd6c634..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd +++ /dev/null @@ -1,265 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_noise_emitter_3d.svg") -class_name PhantomCameraNoiseEmitter3D -extends Node3D - -## Emits positional and rotational noise to active [PhantomCamera3D]s and its corresponding [Camera3D]. -## -## Is a node meant to apply positional and rotational noise, also referred to as shake, to the [Camera3D]. -## It is designed for use cases such as when hitting or when being hit, earthquakes or to add a -## bit of slight movement to the camera to make it feel less static. -## The emitter can affect multiple [PhantomCamera3D] in a given scene based on which [member noise_emitter_layer] -## are enabled by calling its [method emit] function. At least one corresponding layer has to be -## set on the [PhantomCamera3D] and the emitter node. - -const _constants = preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#region Exported Properties - -## The [PhantomCameraNoise3D] resource that defines the noise pattern. -@export var noise: PhantomCameraNoise3D = null: - set = set_noise, - get = get_noise - -## If true, previews the noise in the Viewfinder. -@export var preview: bool = false: - set(value): - preview = value - _play = value - get: - return preview - -## If true, repeats the noise indefinitely once started.Otherwise, it will only be triggered once. [br] -## [b]Note:[/b] This will always be enabled if the resource is assigned the the [PhantomCamera3D]'s -## [member PhantomCamera3D.noise] property. -@export var continuous: bool = false: - set = set_continuous, - get = get_continuous - -## Determines how long the noise should take to reach full [member intensity] once started.[br] -## The value is set in [b]seconds[/b]. -@export_exp_easing("positive_only", "suffix: s") var growth_time: float = 0: - set = set_growth_time, - get = get_growth_time - -## Sets the duration for the camera noise if [member loop] is set to false.[br] -## If the duration is [param 0] then [member continous] becomes enabled.[br] -## The value is set in [b]seconds[/b]. -@export_range(0, 10, 0.001, "or_greater", "suffix: s") var duration: float = 1.0: - set = set_duration, - get = get_duration - -## Determines how long the noise should take to come to a full stop.[br] -## The value is set in [b]seconds[/b]. -@export_exp_easing("attenuation", "positive_only", "suffix: s") var decay_time: float = 0: - set = set_decay_time, - get = get_decay_time - -## Enabled layers will affect [PhantomCamera3D] nodes with at least one corresponding layer enabled.[br] -## Enabling multiple corresponding layers on the same [PhantomCamera3D] causes no additional effect. -@export_flags_3d_render var noise_emitter_layer: int = 1: - set = set_noise_emitter_layer, - get = get_noise_emitter_layer - -#endregion - -#region Private Variables - -var _play: bool = false: - set(value): - _play = value - if value: - _elasped_play_time = 0 - _decay_countdown = 0 - _play = true - _should_grow = true - _start_duration_countdown = false - _should_decay = false - else: - _should_decay = true - if noise.randomize_noise_seed: - noise.noise_seed = randi() & 1000 - else: - noise.reset_noise_time() - get: - return _play - -var _start_duration_countdown: bool = false - -var _decay_countdown: float = 0 - -var _should_grow: bool = false - -var _should_decay: bool = false - -var _elasped_play_time: float = 0 - -var _noise_output: Transform3D = Transform3D() - -# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. -var _phantom_camera_manager: Node - -#endregion - -#region Private Functions - -func _get_configuration_warnings() -> PackedStringArray: - if noise == null: - return ["Noise resource is required in order to trigger emitter."] - else: - return [] - - -func _validate_property(property) -> void: - if property.name == "duration" and continuous: - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _enter_tree() -> void: - _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) - - -func _process(delta: float) -> void: - if not _play and not _should_decay: return - if noise == null: - printerr("Noise resource missing in ", name) - _play = false - return - - _elasped_play_time += delta - - if _should_grow: - noise.set_trauma(minf(_elasped_play_time / growth_time, 1)) - if _elasped_play_time >= growth_time: - _should_grow = false - _start_duration_countdown = true - noise.set_trauma(1) - - if not continuous: - if _start_duration_countdown: - if _elasped_play_time >= duration + growth_time: - _should_decay = true - _start_duration_countdown = false - - if _should_decay: - _decay_countdown += delta - noise.set_trauma(maxf(1 - (_decay_countdown / decay_time), 0)) - if _decay_countdown >= decay_time: - noise.set_trauma(0) - _play = false - preview = false - _should_decay = false - _elasped_play_time = 0 - _decay_countdown = 0 - - _noise_output = noise.get_noise_transform(delta) - _phantom_camera_manager.noise_3d_emitted.emit(_noise_output, noise_emitter_layer) - - -func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: - var mask: int = current_layers - - # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 - if layer_number < 1 or layer_number > 20: - printerr("Layer must be between 1 and 20.") - else: - if value: - mask |= 1 << (layer_number - 1) - else: - mask &= ~(1 << (layer_number - 1)) - - return mask - -#endregion - -#region Public Functions - -## Emits noise to the [PhantomCamera3D]s that has at least one matching layers. -func emit() -> void: - if _play: _play = false - _play = true - - -## Returns the state for the emitter. If true, the emitter is currently emitting. -func is_emitting() -> bool: - return _play - - -## Stops the emitter from emitting noise. -func stop(should_decay: bool = true) -> void: - if should_decay: - _should_decay = true - else: - _play = false - - -## Toggles the emitter on and off.[br] -func toggle() -> void: - _play = !_play - -#endregion - -#region Setter & Getter Functions - -## Sets the [member noise] resource. -func set_noise(value: PhantomCameraNoise3D) -> void: - noise = value - update_configuration_warnings() - -## Returns the [member noise] resource. -func get_noise() -> PhantomCameraNoise3D: - return noise - - -## Sets the [member continous] value. -func set_continuous(value: bool) -> void: - continuous = value - notify_property_list_changed() - -## Gets the [member continous] value. -func get_continuous() -> bool: - return continuous - - -## Sets the [member growth_time] value. -func set_growth_time(value: float) -> void: - growth_time = value - -## Returns the [member growth_time] value. -func get_growth_time() -> float: - return growth_time - - -## Sets the [member duration] value. -func set_duration(value: float) -> void: - duration = value - if duration == 0: - duration = 0.001 - -## Returns the [member duration] value. -func get_duration() -> float: - return duration - - -## Sets the [member decay_time] value. -func set_decay_time(value: float) -> void: - decay_time = value - -## Returns the [member decay_time] value. -func get_decay_time() -> float: - return decay_time - - -## Sets the [member noise_emitter_layer] value. -func set_noise_emitter_layer(value: int) -> void: - noise_emitter_layer = value - -## Enables or disables a given layer of [member noise_emitter_layer]. -func set_noise_emitter_value(value: int, enabled: bool) -> void: - noise_emitter_layer = _set_layer(noise_emitter_layer, value, enabled) - -## Returns the [member noise_emitter_layer] value. -func get_noise_emitter_layer() -> int: - return noise_emitter_layer - - #endregion diff --git a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid b/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid deleted file mode 100644 index aa7e880..0000000 --- a/addons/phantom_camera/scripts/phantom_camera/phantom_camera_noise_emitter_3d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ccmiitq0sdh7j diff --git a/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs b/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs deleted file mode 100644 index 7bd2a01..0000000 --- a/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs +++ /dev/null @@ -1,113 +0,0 @@ -using Godot; - -#nullable enable - -namespace PhantomCamera; - -public enum InterpolationMode -{ - Auto, - Idle, - Physics -} - -public static class PhantomCameraHostExtensions -{ - public static PhantomCameraHost AsPhantomCameraHost(this Node node) - { - return new PhantomCameraHost(node); - } -} - -public class PhantomCameraHost() -{ - public Node Node { get; } = null!; - - public PhantomCameraHost(GodotObject node) : this() - { - Node = node as Node; - - var callablePCamBecameActive = Callable.From(pCam => PCamBecameActive?.Invoke(pCam)); - var callablePCamBecameInactive = Callable.From(pCam => PCamBecameInactive?.Invoke(pCam)); - - Node.Connect(SignalName.PCamBecameActive, callablePCamBecameActive); - Node.Connect(SignalName.PCamBecameInactive, callablePCamBecameInactive); - } - - public delegate void PCamBecameActiveEventHandler(Node pCam); - public delegate void PCamBecameInactiveEventHandler(Node pCam); - - public event PCamBecameActiveEventHandler? PCamBecameActive; - public event PCamBecameInactiveEventHandler? PCamBecameInactive; - - - private readonly Callable _callablePCamBecameActive; - private readonly Callable _callablePCamBecameInactive; - - // For when Godot becomes the minimum version - // public InterpolationMode InterpolationMode - // { - // get => (InterpolationMode)(int)Node.Call(MethodName.GetInterpolationMode); - // set => Node.Call(MethodName.SetInterpolationMode, (int)value); - // } - - public int HostLayers - { - get => (int)Node.Call(PhantomCamera.MethodName.GetHostLayers); - set => Node.Call(PhantomCamera.MethodName.SetHostLayers, value); - } - - public void SetHostLayersValue(int layer, bool value) => Node.Call(MethodName.SetHostLayersValue, layer, value); - - public Camera2D? Camera2D => (Camera2D?)Node.Get(PropertyName.Camera2D); - - public Camera3D? Camera3D => (Camera3D?)Node.Get(PropertyName.Camera3D); - - public InterpolationMode InterpolationMode - { - get => (InterpolationMode)(int)Node.Call(MethodName.GetInterpolationMode); - set => Node.Call(MethodName.SetInterpolationMode, (int)value); - } - - public bool TriggerPhantomCameraTween => (bool)Node.Call(MethodName.GetTriggerPhantomCameraTween); - - public PhantomCamera? GetActivePhantomCamera() - { - var result = Node.Call(MethodName.GetActivePhantomCamera); - - if (result.Obj is Node2D node2D) - { - return new PhantomCamera2D(node2D); - } - - if (result.Obj is Node3D node3D) - { - return new PhantomCamera3D(node3D); - } - - return null; - } - - public static class PropertyName - { - public static readonly StringName Camera2D = new("camera_2d"); - public static readonly StringName Camera3D = new("camera_3d"); - } - - public static class MethodName - { - public static readonly StringName GetActivePhantomCamera = new("get_active_pcam"); - public static readonly StringName GetTriggerPhantomCameraTween = new("get_trigger_pcam_tween"); - - public static readonly StringName GetInterpolationMode = new("get_interpolation_mode"); - public static readonly StringName SetInterpolationMode = new("set_interpolation_mode"); - - public static readonly StringName SetHostLayersValue = new("set_host_layers_value"); - } - - public static class SignalName - { - public static readonly StringName PCamBecameActive = new("pcam_became_active"); - public static readonly StringName PCamBecameInactive = new("pcam_became_inactive"); - } -} diff --git a/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs.uid b/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs.uid deleted file mode 100644 index ad4b4f5..0000000 --- a/addons/phantom_camera/scripts/phantom_camera_host/PhantomCameraHost.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cr8brwrls2nn3 diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd deleted file mode 100644 index e5c5dd1..0000000 --- a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd +++ /dev/null @@ -1,1418 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_host.svg") -class_name PhantomCameraHost -extends Node - -## Controls a scene's [Camera2D] (2D scenes) and [Camera3D] (3D scenes). -## -## All instantiated [param PhantomCameras] in a scene are assigned to a specific layer, where a -## PhantomCameraHost will react to those that corresponds. It is what determines which [param PhantomCamera] should -## be active. - -#region Constants - -const _constants := preload("res://addons/phantom_camera/scripts/phantom_camera/phantom_camera_constants.gd") - -#endregion - - -#region Signals - -## Updates the viewfinder [param dead zones] sizes.[br] -## [b]Note:[/b] This is only being used in the editor viewfinder UI. -#signal update_editor_viewfinder -signal viewfinder_update(check_framed_view: bool) -signal viewfinder_disable_dead_zone - -## Used internally to check if the [param PhantomCameraHost] is valid. -## The result will be visible in the viewfinder when multiple instances are present. -signal has_error() - -## Emitted when a new [param PhantomCamera] becomes active and assigned to this [param PhantomCameraHost]. -signal pcam_became_active(pcam: Node) - -## Emitted when the currently active [param PhantomCamera] goes from being active to inactive. -signal pcam_became_inactive(pcam: Node) - -#endregion - - -#region Enums - -## Dictates whether if [param PhantomCameraHost]'s logic should be called in the physics or idle (process) frames. -enum InterpolationMode { - AUTO = 0, ## Automatically sets the [param Camera]'s logic to run in either physics or idle (process) frames depending on its active [param PhantomCamera]'s [param Follow] / [param Look At] Target - IDLE = 1, ## Always run the [param Camera] logic in idle (process) frames - PHYSICS = 2, ## Always run the [param Camera] logic in physics frames -} - -#endregion - - -#region Public Variables - -## Determines which [PhantomCamera2D] / [PhantomCamera3D] nodes this [param PhantomCameraHost] should recognise. -## At least one corresponding layer needs to be set on the [param PhantomCamera] for the [param PhantomCameraHost] node to work. -@export_flags_2d_render var host_layers: int = 1: - set = set_host_layers, - get = get_host_layers - -## Determines whether the [PhantomCamera2D] / [PhantomCamera3D] nodes this [param PhantomCameraHost] controls should use physics interpolation or not. -@export var interpolation_mode: InterpolationMode = InterpolationMode.AUTO: - set = set_interpolation_mode, - get = get_interpolation_mode - -#endregion - - -#region Private Variables - -var _active_pcam_2d: PhantomCamera2D = null -var _active_pcam_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. -var _active_pcam_priority: int = -1 -var _active_pcam_missing: bool = true -var _active_pcam_has_damping: bool = false -var _follow_target_physics_based: bool = false - -var _prev_active_pcam_2d_transform: Transform2D = Transform2D() -var _prev_active_pcam_3d_transform: Transform3D = Transform3D() - -var _trigger_pcam_tween: bool = false -var _tween_elapsed_time: float = 0 -var _tween_duration: float = 0 -var _tween_is_instant: bool = false - -var _multiple_pcam_hosts: bool = false - -var _is_child_of_camera: bool = false -var _is_2d: bool = false - -var _viewfinder_node: Control = null -var _viewfinder_needed_check: bool = true - -var _camera_zoom: Vector2 = Vector2.ONE - -#region Camera3DResource - -var _prev_cam_attributes: CameraAttributes = null -var _cam_attribute_type: int = 0 # 0 = CameraAttributesPractical, 1 = CameraAttributesPhysical -var _cam_attribute_changed: bool = false -var _cam_attribute_assigned: bool = false - -#region CameraAttributes - -var _prev_cam_auto_exposure_scale: float = 0.4 -var _cam_auto_exposure_scale_changed: bool = false - -var _prev_cam_auto_exposure_speed: float = 0.5 -var _cam_auto_exposure_speed_changed: bool = false - -var _prev_cam_exposure_multiplier: float = 1.0 -var _cam_exposure_multiplier_changed: bool = false - -var _prev_cam_exposure_sensitivity: float = 100.0 -var _cam_exposure_sensitivity_changed: bool = false - -#region CameraAttributesPractical -var _prev_cam_exposure_min_sensitivity: float = 0.0 -var _cam_exposure_min_sensitivity_changed: bool = false - -var _prev_cam_exposure_max_sensitivity: float = 800.0 -var _cam_exposure_max_sensitivity_changed: bool = false - -var _prev_cam_dof_blur_amount: float = 0.1 -var _cam_dof_blur_amount_changed: bool = false - -var _cam_dof_blur_far_distance_default: float = 10 -var _prev_cam_dof_blur_far_distance: float = _cam_dof_blur_far_distance_default -var _cam_dof_blur_far_distance_changed: bool = false - -var _cam_dof_blur_far_transition_default: float = 5 -var _prev_cam_dof_blur_far_transition: float = _cam_dof_blur_far_transition_default -var _cam_dof_blur_far_transition_changed: bool = false - -var _cam_dof_blur_near_distance_default: float = 2 -var _prev_cam_dof_blur_near_distance: float = _cam_dof_blur_near_distance_default -var _cam_dof_blur_near_distance_changed: bool = false - -var _cam_dof_blur_near_transition_default: float = 1 -var _prev_cam_dof_blur_near_transition: float = _cam_dof_blur_near_transition_default -var _cam_dof_blur_near_transition_changed: bool = false - -#endregion - -#region CameraAttributesPhysical - -var _prev_cam_exposure_min_exposure_value: float = 10.0 -var _cam_exposure_min_exposure_value_changed: bool = false - -var _prev_cam_exposure_max_exposure_value: float = -8.0 -var _cam_exposure_max_exposure_value_changed: bool = false - -var _prev_cam_exposure_aperture: float = 16.0 -var _cam_exposure_aperture_changed: bool = false - -var _prev_cam_exposure_shutter_speed: float = 100.0 -var _cam_exposure_shutter_speed_changed: bool = false - -var _prev_cam_frustum_far: float = 4000.0 -var _cam_frustum_far_changed: bool = false - -var _prev_cam_frustum_focal_length: float = 35.0 -var _cam_frustum_focal_length_changed: bool = false - -var _prev_cam_frustum_near: float = 0.05 -var _cam_frustum_near_changed: bool = false - -var _prev_cam_frustum_focus_distance: float = 10.0 -var _cam_frustum_focus_distance_changed: bool = false - -#endregion - -var _prev_cam_h_offset: float = 0 -var _cam_h_offset_changed: bool = false - -var _prev_cam_v_offset: float = 0 -var _cam_v_offset_changed: bool = false - -var _prev_cam_fov: float = 75 -var _cam_fov_changed: bool = false - -var _prev_cam_size: float = 1 -var _cam_size_changed: bool = false - -var _prev_cam_frustum_offset: Vector2 = Vector2.ZERO -var _cam_frustum_offset_changed: bool = false - -var _prev_cam_near: float = 0.05 -var _cam_near_changed: bool = false - -var _prev_cam_far: float = 4000 -var _cam_far_changed: bool = false - -#endregion - -var _active_pcam_2d_glob_transform: Transform2D = Transform2D() -var _active_pcam_3d_glob_transform: Transform3D = Transform3D() - -var _has_noise_emitted: bool = false -var _reset_noise_offset_2d: bool = false -var _noise_emitted_output_2d: Transform2D = Transform2D() -var _noise_emitted_output_3d: Transform3D = Transform3D() - -#endregion - -# NOTE - Temp solution until Godot has better plugin autoload recognition out-of-the-box. -var _phantom_camera_manager: Node = null - -#region Public Variables - -var show_warning: bool = false - -## For 2D scenes, is the [Camera2D] instance the [param PhantomCameraHost] controls. -var camera_2d: Camera2D = null - -## For 3D scenes, is the [Camera3D] instance the [param PhantomCameraHost] controls. -var camera_3d: Node = null ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - -#endregion - -#region Private Functions - -## TBD - For when Godot 4.3 becomes a minimum version -#func _validate_property(property: Dictionary) -> void: - #if property.name == "interpolation_mode" and get_parent() is Node3D: - #property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _get_configuration_warnings() -> PackedStringArray: - var parent: Node = get_parent() - var first_pcam_host_child: PhantomCameraHost - - if _is_2d: - if not parent is Camera2D: - show_warning = true - has_error.emit() - return["Needs to be a child of a Camera2D in order to work."] - else: - if not parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - show_warning = true - has_error.emit() - return["Needs to be a child of a Camera3D in order to work."] - - for child in parent.get_children(): - if not child is PhantomCameraHost: continue - if not is_instance_valid(first_pcam_host_child): - first_pcam_host_child = child - continue - elif not first_pcam_host_child == self: - show_warning = true - has_error.emit() - return["Only the first PhantomCameraHost child will be used."] - child.update_configuration_warnings() - - show_warning = false - has_error.emit() - return[] - - -func _enter_tree() -> void: - var parent: Node = get_parent() - if parent is Camera2D or parent.is_class("Camera3D"): ## Note: To support disable_3d export templates for 2D projects, this is purposely not strongly typed. - _phantom_camera_manager = get_tree().root.get_node(_constants.PCAM_MANAGER_NODE_NAME) - _phantom_camera_manager.pcam_host_added(self) - - _is_child_of_camera = true - if parent is Camera2D: - _is_2d = true - camera_2d = parent - ## Force applies position smoothing to be disabled - ## This is to prevent overlap with the interpolation of the PCam2D. - camera_2d.set_position_smoothing_enabled(false) - else: - _is_2d = false - camera_3d = parent - - if not is_node_ready(): return - - if _is_2d: - if not _phantom_camera_manager.get_phantom_camera_2ds().is_empty(): - for pcam in _phantom_camera_manager.get_phantom_camera_2ds(): - _pcam_added_to_scene(pcam) - - if not _phantom_camera_manager.limit_2d_changed.is_connected(_update_limit_2d): - _phantom_camera_manager.limit_2d_changed.connect(_update_limit_2d) - if not _phantom_camera_manager.draw_limit_2d.is_connected(_draw_limit_2d): - _phantom_camera_manager.draw_limit_2d.connect(_draw_limit_2d) - - else: - if not _phantom_camera_manager.get_phantom_camera_3ds().is_empty(): - for pcam in _phantom_camera_manager.get_phantom_camera_3ds(): - _pcam_added_to_scene(pcam) - - -func _exit_tree() -> void: - if is_instance_valid(_phantom_camera_manager): - _phantom_camera_manager.pcam_host_removed(self) - - -func _ready() -> void: - # Waits for the first process tick to finish before initializing any logic - # This should help with avoiding ocassional erratic camera movement upon running a scene - await get_tree().process_frame - - process_priority = 300 - process_physics_priority = 300 - - # PCam Host Signals - if Engine.has_singleton(_constants.PCAM_MANAGER_NODE_NAME): - _phantom_camera_manager = Engine.get_singleton(_constants.PCAM_MANAGER_NODE_NAME) - _phantom_camera_manager.pcam_host_layer_changed.connect(_pcam_host_layer_changed) - - # PCam Signals - _phantom_camera_manager.pcam_added_to_scene.connect(_pcam_added_to_scene) - _phantom_camera_manager.pcam_removed_from_scene.connect(_pcam_removed_from_scene) - - _phantom_camera_manager.pcam_priority_changed.connect(pcam_priority_updated) - _phantom_camera_manager.pcam_priority_override.connect(_pcam_priority_override) - - _phantom_camera_manager.pcam_visibility_changed.connect(_pcam_visibility_changed) - - _phantom_camera_manager.pcam_teleport.connect(_pcam_teleported) - - if _is_2d: - if not _phantom_camera_manager.limit_2d_changed.is_connected(_update_limit_2d): - _phantom_camera_manager.limit_2d_changed.connect(_update_limit_2d) - if not _phantom_camera_manager.draw_limit_2d.is_connected(_draw_limit_2d): - _phantom_camera_manager.draw_limit_2d.connect(_draw_limit_2d) - else: - printerr("Could not find Phantom Camera Manager singleton") - printerr("Make sure the addon is enable or that the singleton hasn't been disabled inside Project Settings / Globals") - - _find_pcam_with_highest_priority() - - if _is_2d: - camera_2d.offset = Vector2.ZERO - if not is_instance_valid(_active_pcam_2d): return - _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() - else: - if not is_instance_valid(_active_pcam_3d): return - _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() - - -func _pcam_host_layer_changed(pcam: Node) -> void: - if _pcam_is_in_host_layer(pcam): - _check_pcam_priority(pcam) - else: - if _is_2d: - if _active_pcam_2d == pcam: - _active_pcam_missing = true - _active_pcam_2d = null - _active_pcam_priority = -1 - pcam.set_is_active(self, false) - else: - if _active_pcam_3d == pcam: - _active_pcam_missing = true - _active_pcam_3d = null - _active_pcam_priority = -1 - pcam.set_is_active(self, false) - _find_pcam_with_highest_priority() - - -func _pcam_is_in_host_layer(pcam: Node) -> bool: - if pcam.host_layers & host_layers != 0: return true - return false - - -func _find_pcam_with_highest_priority() -> void: - var pcam_list: Array - if _is_2d: - pcam_list = _phantom_camera_manager.phantom_camera_2ds - else: - pcam_list = _phantom_camera_manager.phantom_camera_3ds - - for pcam in pcam_list: - _check_pcam_priority(pcam) - - -func _check_pcam_priority(pcam: Node) -> void: - if not _pcam_is_in_host_layer(pcam): return - if not pcam.visible: return # Prevents hidden PCams from becoming active - if pcam.get_priority() >= _active_pcam_priority: - _assign_new_active_pcam(pcam) - _active_pcam_missing = false - pcam.set_tween_skip(self, false) - - -func _assign_new_active_pcam(pcam: Node) -> void: - # Only checks if the scene tree is still present. - # Prevents a few errors and checks from happening if the scene is exited. - if not is_inside_tree(): return - var no_previous_pcam: bool - if is_instance_valid(_active_pcam_2d) or is_instance_valid(_active_pcam_3d): - if OS.has_feature("debug"): - viewfinder_disable_dead_zone.emit() - - if _is_2d: - _prev_active_pcam_2d_transform = camera_2d.global_transform - _active_pcam_2d.queue_redraw() - _active_pcam_2d.set_is_active(self, false) - _active_pcam_2d.became_inactive.emit() - pcam_became_inactive.emit(_active_pcam_2d) - - if _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): - _active_pcam_2d.physics_target_changed.disconnect(_check_pcam_physics) - - if _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): - _active_pcam_2d.noise_emitted.disconnect(_noise_emitted_2d) - - if _trigger_pcam_tween: - _active_pcam_2d.tween_interrupted.emit(pcam) - else: - _prev_active_pcam_3d_transform = camera_3d.global_transform - _active_pcam_3d.set_is_active(self, false) - _active_pcam_3d.became_inactive.emit() - pcam_became_inactive.emit(_active_pcam_3d) - - if _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): - _active_pcam_3d.physics_target_changed.disconnect(_check_pcam_physics) - - if _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): - _active_pcam_3d.noise_emitted.disconnect(_noise_emitted_3d) - - if _active_pcam_3d.camera_3d_resource_changed.is_connected(_camera_3d_resource_changed): - _active_pcam_3d.camera_3d_resource_changed.disconnect(_camera_3d_resource_changed) - - if _active_pcam_3d.camera_3d_resource_property_changed.is_connected(_camera_3d_resource_property_changed): - _active_pcam_3d.camera_3d_resource_property_changed.disconnect(_camera_3d_resource_property_changed) - - if _trigger_pcam_tween: - _active_pcam_3d.tween_interrupted.emit(pcam) - - if camera_3d.attributes != null: - var _attributes: CameraAttributes = camera_3d.attributes - - _prev_cam_exposure_multiplier = _attributes.exposure_multiplier - _prev_cam_auto_exposure_scale = _attributes.auto_exposure_scale - _prev_cam_auto_exposure_speed = _attributes.auto_exposure_speed - - if camera_3d.attributes is CameraAttributesPractical: - _attributes = _attributes as CameraAttributesPractical - - _prev_cam_dof_blur_amount = _attributes.dof_blur_amount - - if _attributes.dof_blur_far_enabled: - _prev_cam_dof_blur_far_distance = _attributes.dof_blur_far_distance - _prev_cam_dof_blur_far_transition = _attributes.dof_blur_far_transition - else: - _prev_cam_dof_blur_far_distance = _cam_dof_blur_far_distance_default - _prev_cam_dof_blur_far_transition = _cam_dof_blur_far_transition_default - - if _attributes.dof_blur_near_enabled: - _prev_cam_dof_blur_near_distance = _attributes.dof_blur_near_distance - _prev_cam_dof_blur_near_transition = _attributes.dof_blur_near_transition - else: - _prev_cam_dof_blur_near_distance = _cam_dof_blur_near_distance_default - _prev_cam_dof_blur_near_transition = _cam_dof_blur_near_transition_default - - if _attributes.auto_exposure_enabled: - _prev_cam_exposure_max_sensitivity = _attributes.auto_exposure_max_sensitivity - _prev_cam_exposure_min_sensitivity = _attributes.auto_exposure_min_sensitivity - - elif camera_3d.attributes is CameraAttributesPhysical: - _attributes = _attributes as CameraAttributesPhysical - - _prev_cam_frustum_focus_distance = _attributes.frustum_focus_distance - _prev_cam_frustum_focal_length = _attributes.frustum_focal_length - _prev_cam_frustum_far = _attributes.frustum_far - _prev_cam_frustum_near = _attributes.frustum_near - _prev_cam_exposure_aperture = _attributes.exposure_aperture - _prev_cam_exposure_shutter_speed = _attributes.exposure_shutter_speed - - if _attributes.auto_exposure_enabled: - _prev_cam_exposure_min_exposure_value = _attributes.auto_exposure_min_exposure_value - _prev_cam_exposure_max_exposure_value = _attributes.auto_exposure_max_exposure_value - - _prev_cam_h_offset = camera_3d.h_offset - _prev_cam_v_offset = camera_3d.v_offset - _prev_cam_fov = camera_3d.fov - _prev_cam_size = camera_3d.size - _prev_cam_frustum_offset = camera_3d.frustum_offset - _prev_cam_near = camera_3d.near - _prev_cam_far = camera_3d.far - - else: - no_previous_pcam = true - - ## Assign newly active pcam - if _is_2d: - _active_pcam_2d = pcam - _active_pcam_priority = _active_pcam_2d.priority - _active_pcam_has_damping = _active_pcam_2d.follow_damping - _tween_duration = _active_pcam_2d.tween_duration - - if not _active_pcam_2d.physics_target_changed.is_connected(_check_pcam_physics): - _active_pcam_2d.physics_target_changed.connect(_check_pcam_physics) - - if not _active_pcam_2d.noise_emitted.is_connected(_noise_emitted_2d): - _active_pcam_2d.noise_emitted.connect(_noise_emitted_2d) - else: - _active_pcam_3d = pcam - _active_pcam_priority = _active_pcam_3d.priority - _active_pcam_has_damping = _active_pcam_3d.follow_damping - _tween_duration = _active_pcam_3d.tween_duration - - if not Engine.is_editor_hint(): - # Assigns a default shape to SpringArm3D node is none is supplied - if _active_pcam_3d.follow_mode == _active_pcam_3d.FollowMode.THIRD_PERSON: - if not _active_pcam_3d.shape: - - var pyramid_shape_data = Engine.get_singleton("PhysicsServer3D").call("shape_get_data", - camera_3d.get_pyramid_shape_rid() - ) - var shape = ClassDB.instantiate("ConvexPolygonShape3D") - shape.points = pyramid_shape_data - _active_pcam_3d.shape = shape - - if not _active_pcam_3d.physics_target_changed.is_connected(_check_pcam_physics): - _active_pcam_3d.physics_target_changed.connect(_check_pcam_physics) - - if not _active_pcam_3d.noise_emitted.is_connected(_noise_emitted_3d): - _active_pcam_3d.noise_emitted.connect(_noise_emitted_3d) - - if not _active_pcam_3d.camera_3d_resource_changed.is_connected(_camera_3d_resource_changed): - _active_pcam_3d.camera_3d_resource_changed.connect(_camera_3d_resource_changed) - - if not _active_pcam_3d.camera_3d_resource_property_changed.is_connected(_camera_3d_resource_property_changed): - _active_pcam_3d.camera_3d_resource_property_changed.connect(_camera_3d_resource_property_changed) - - # Checks if the Camera3DResource has changed from the previous active PCam3D - if _active_pcam_3d.camera_3d_resource: - # Signal to detect if the Camera3D properties are being changed in the inspector - # This is to prevent accidential misalignment between the Camera3D and Camera3DResource - if Engine.is_editor_hint(): - if not Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.is_connected(_camera_3d_edited): - Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.connect(_camera_3d_edited) - if _prev_cam_h_offset != _active_pcam_3d.h_offset: - _cam_h_offset_changed = true - if _prev_cam_v_offset != _active_pcam_3d.v_offset: - _cam_v_offset_changed = true - if _prev_cam_fov != _active_pcam_3d.fov: - _cam_fov_changed = true - if _prev_cam_size != _active_pcam_3d.size: - _cam_size_changed = true - if _prev_cam_frustum_offset != _active_pcam_3d.frustum_offset: - _cam_frustum_offset_changed = true - if _prev_cam_near != _active_pcam_3d.near: - _cam_near_changed = true - if _prev_cam_far != _active_pcam_3d.far: - _cam_far_changed = true - else: - _cam_h_offset_changed = false - _cam_v_offset_changed = false - _cam_fov_changed = false - _cam_size_changed = false - _cam_frustum_offset_changed = false - _cam_near_changed = false - _cam_far_changed = false - _cam_attribute_changed = false - if Engine.is_editor_hint(): - if Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.is_connected(_camera_3d_edited): - Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.disconnect(_camera_3d_edited) - - if _active_pcam_3d.attributes == null: - _cam_attribute_changed = false - else: - if _prev_cam_attributes != _active_pcam_3d.attributes: - _prev_cam_attributes = _active_pcam_3d.attributes - _cam_attribute_changed = true - var _attributes: CameraAttributes = _active_pcam_3d.attributes - - if _prev_cam_auto_exposure_scale != _attributes.auto_exposure_scale: - _cam_auto_exposure_scale_changed = true - if _prev_cam_auto_exposure_speed != _attributes.auto_exposure_speed: - _cam_auto_exposure_speed_changed = true - if _prev_cam_exposure_multiplier != _attributes.exposure_multiplier: - _cam_exposure_multiplier_changed = true - if _prev_cam_exposure_sensitivity != _attributes.exposure_sensitivity: - _cam_exposure_sensitivity_changed = true - - if _attributes is CameraAttributesPractical: - _cam_attribute_type = 0 - - if camera_3d.attributes == null: - camera_3d.attributes = CameraAttributesPractical.new() - camera_3d.attributes = _active_pcam_3d.attributes.duplicate() - _cam_attribute_assigned = true - - if _prev_cam_exposure_min_sensitivity != _attributes.auto_exposure_min_sensitivity: - _cam_exposure_min_sensitivity_changed = true - if _prev_cam_exposure_max_sensitivity != _attributes.auto_exposure_max_sensitivity: - _cam_exposure_max_sensitivity_changed = true - - if _prev_cam_dof_blur_amount != _attributes.dof_blur_amount: - _cam_dof_blur_amount_changed = true - - if _prev_cam_dof_blur_far_distance != _attributes.dof_blur_far_distance: - _cam_dof_blur_far_distance_changed = true - camera_3d.attributes.dof_blur_far_enabled = true - if _prev_cam_dof_blur_far_transition != _attributes.dof_blur_far_transition: - _cam_dof_blur_far_transition_changed = true - camera_3d.attributes.dof_blur_far_enabled = true - - if _prev_cam_dof_blur_near_distance != _attributes.dof_blur_near_distance: - _cam_dof_blur_near_distance_changed = true - camera_3d.attributes.dof_blur_near_enabled = true - if _prev_cam_dof_blur_near_transition != _attributes.dof_blur_near_transition: - _cam_dof_blur_near_transition_changed = true - camera_3d.attributes.dof_blur_near_enabled = true - elif _attributes is CameraAttributesPhysical: - _cam_attribute_type = 1 - - if camera_3d.attributes == null: - camera_3d.attributes = CameraAttributesPhysical.new() - camera_3d.attributes = _active_pcam_3d.attributes.duplicate() - - if _prev_cam_exposure_min_exposure_value != _attributes.auto_exposure_min_exposure_value: - _cam_exposure_min_exposure_value_changed = true - if _prev_cam_exposure_max_exposure_value != _attributes.auto_exposure_max_exposure_value: - _cam_exposure_max_exposure_value_changed = true - - if _prev_cam_exposure_aperture != _attributes.exposure_aperture: - _cam_exposure_aperture_changed = true - if _prev_cam_exposure_shutter_speed != _attributes.exposure_shutter_speed: - _cam_exposure_shutter_speed_changed = true - - if _prev_cam_frustum_far != _attributes.frustum_far: - _cam_frustum_far_changed = true - - if _prev_cam_frustum_focal_length != _attributes.frustum_focal_length: - _cam_frustum_focal_length_changed = true - - if _prev_cam_frustum_focus_distance != _attributes.frustum_focus_distance: - _cam_frustum_focus_distance_changed = true - - if _prev_cam_frustum_near != _attributes.frustum_near: - _cam_frustum_near_changed = true - - if OS.has_feature("debug"): - viewfinder_update.emit(false) - - if _is_2d: - if _active_pcam_2d.show_viewfinder_in_play: - _viewfinder_needed_check = true - - _active_pcam_2d.set_is_active(self, true) - _active_pcam_2d.became_active.emit() - pcam_became_active.emit(_active_pcam_2d) - _camera_zoom = camera_2d.zoom - else: - if _active_pcam_3d.show_viewfinder_in_play: - _viewfinder_needed_check = true - - _active_pcam_3d.set_is_active(self, true) - _active_pcam_3d.became_active.emit() - pcam_became_active.emit(_active_pcam_3d) - if _active_pcam_3d.camera_3d_resource: - camera_3d.keep_aspect = _active_pcam_3d.keep_aspect - camera_3d.cull_mask = _active_pcam_3d.cull_mask - camera_3d.projection = _active_pcam_3d.projection - - if no_previous_pcam: - if _is_2d: - _prev_active_pcam_2d_transform = _active_pcam_2d.get_transform_output() - else: - _prev_active_pcam_3d_transform = _active_pcam_3d.get_transform_output() - - if pcam.get_tween_skip() or pcam.tween_duration == 0: - _tween_elapsed_time = pcam.tween_duration - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor >= 3: - _tween_is_instant = true - else: - _tween_elapsed_time = 0 - - _check_pcam_physics() - - _trigger_pcam_tween = true - - -func _check_pcam_physics() -> void: - if _is_2d: - if _active_pcam_2d.get_follow_target_physics_based() and interpolation_mode != InterpolationMode.IDLE: - _follow_target_physics_based = true - camera_2d.reset_physics_interpolation() - camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON - if ProjectSettings.get_setting("physics/common/physics_interpolation"): - camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning - else: - camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE - else: - _follow_target_physics_based = false - camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_INHERIT - if get_tree().physics_interpolation: - camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_PHYSICS # Prevents a warning - else: - camera_2d.process_callback = Camera2D.CAMERA2D_PROCESS_IDLE - else: - ## NOTE - Only supported in Godot 4.4 or later - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor >= 4: - if (get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based()) and interpolation_mode != InterpolationMode.IDLE: - #if get_tree().physics_interpolation or _active_pcam_3d.get_follow_target_physics_based(): - _follow_target_physics_based = true - camera_3d.reset_physics_interpolation() - camera_3d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_ON - else: - _follow_target_physics_based = false - camera_3d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_INHERIT - - -## TODO - For 0.8 release -#func _find_pcam_with_highest_priority() -> void: - #var highest_priority_pcam: Node - #for pcam in _pcam_list: - #if not pcam.visible: continue # Prevents hidden PCams from becoming active - #if pcam.priority > _active_pcam_priority: - #_active_pcam_priority = pcam.priority - #highest_priority_pcam = pcam - #pcam.set_has_tweened(self, false) -# - #_active_pcam_missing = false -# - #if is_instance_valid(highest_priority_pcam): - #_assign_new_active_pcam(highest_priority_pcam) - #else: - #_active_pcam_missing = true - - -func _process(delta: float) -> void: - if _active_pcam_missing: return - - if not _follow_target_physics_based: _tween_follow_checker(delta) - - -func _physics_process(delta: float) -> void: - if _active_pcam_missing or not _follow_target_physics_based: return - _tween_follow_checker(delta) - - -func _tween_follow_checker(delta: float) -> void: - if _is_2d: - if not is_instance_valid(_active_pcam_2d): - _active_pcam_missing = true - return - - _active_pcam_2d.process_logic(delta) - _active_pcam_2d_glob_transform = _active_pcam_2d.get_transform_output() - - if _reset_noise_offset_2d: - camera_2d.offset = Vector2.ZERO # Resets noise position - _reset_noise_offset_2d = false - else: - if not is_instance_valid(_active_pcam_3d): - _active_pcam_missing = true - return - - _active_pcam_3d.process_logic(delta) - _active_pcam_3d_glob_transform = _active_pcam_3d.get_transform_output() - - if not _trigger_pcam_tween: - # Rechecks physics target if PCam transitioned with an instant tween - if _tween_is_instant: - _check_pcam_physics() - _tween_is_instant = false - _pcam_follow(delta) - else: - _pcam_tween(delta) - - # Camera Noise - if _is_2d: - if not _has_noise_emitted and not _active_pcam_2d.has_noise_resource(): return - camera_2d.offset += _active_pcam_2d.get_noise_transform().origin + _noise_emitted_output_2d.origin - if camera_2d.ignore_rotation and _noise_emitted_output_2d.get_rotation() != 0: - push_warning(camera_2d.name, " has ignore_rotation enabled. Uncheck the property if you want to apply rotational noise.") - else: - camera_2d.rotation += _active_pcam_2d.get_noise_transform().get_rotation() + _noise_emitted_output_2d.get_rotation() - _has_noise_emitted = false - _reset_noise_offset_2d = true - else: - if not _has_noise_emitted and not _active_pcam_3d.has_noise_resource(): return - camera_3d.global_transform *= _active_pcam_3d.get_noise_transform() * _noise_emitted_output_3d - _has_noise_emitted = false - - -func _pcam_follow(_delta: float) -> void: - if _active_pcam_missing or not _is_child_of_camera: return - - if _is_2d: - if _active_pcam_2d.snap_to_pixel: - var snap_to_pixel_glob_transform: Transform2D = _active_pcam_2d_glob_transform - snap_to_pixel_glob_transform.origin = snap_to_pixel_glob_transform.origin.round() - camera_2d.global_transform = snap_to_pixel_glob_transform - else: - camera_2d.global_transform = _active_pcam_2d_glob_transform - camera_2d.zoom = _active_pcam_2d.zoom - else: - camera_3d.global_transform = _active_pcam_3d_glob_transform - - if _viewfinder_needed_check: - _show_viewfinder_in_play() - _viewfinder_needed_check = false - - if Engine.is_editor_hint(): - if not _is_2d: - # TODO - Signal-based solution pending merge of: https://github.com/godotengine/godot/pull/99729 - if _active_pcam_3d.attributes != null: - camera_3d.attributes = _active_pcam_3d.attributes.duplicate() - - # TODO - Signal-based solution pending merge of: https://github.com/godotengine/godot/pull/99873 - if _active_pcam_3d.environment != null: - camera_3d.environment = _active_pcam_3d.environment.duplicate() - - -func _noise_emitted_2d(noise_output: Transform2D) -> void: - _noise_emitted_output_2d = noise_output - _has_noise_emitted = true - - -func _noise_emitted_3d(noise_output: Transform3D) -> void: - _noise_emitted_output_3d = noise_output - _has_noise_emitted = true - - -func _camera_3d_resource_changed() -> void: - if _active_pcam_3d.camera_3d_resource: - if Engine.is_editor_hint(): - if not Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.is_connected(_camera_3d_edited): - Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.connect(_camera_3d_edited) - camera_3d.keep_aspect = _active_pcam_3d.keep_aspect - camera_3d.cull_mask = _active_pcam_3d.cull_mask - camera_3d.h_offset = _active_pcam_3d.h_offset - camera_3d.v_offset = _active_pcam_3d.v_offset - camera_3d.projection = _active_pcam_3d.projection - camera_3d.fov = _active_pcam_3d.fov - camera_3d.size = _active_pcam_3d.size - camera_3d.frustum_offset = _active_pcam_3d.frustum_offset - camera_3d.near = _active_pcam_3d.near - camera_3d.far = _active_pcam_3d.far - else: - if Engine.is_editor_hint(): - if Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.is_connected(_camera_3d_edited): - Engine.get_singleton(&"EditorInterface").get_inspector().property_edited.disconnect(_camera_3d_edited) - -func _camera_3d_edited(value: String) -> void: - if not Engine.get_singleton(&"EditorInterface").get_inspector().get_edited_object() == camera_3d: return - camera_3d.set(value, _active_pcam_3d.camera_3d_resource.get(value)) - push_warning("Camera3D properties are being overridden by ", _active_pcam_3d.name, "'s Camera3DResource") - -func _camera_3d_resource_property_changed(property: StringName, value: Variant) -> void: - camera_3d.set(property, value) - - -func _pcam_tween(delta: float) -> void: - # TODO - Should be optimised - # Run at the first tween frame - if _tween_elapsed_time == 0: - if _is_2d: - _active_pcam_2d.tween_started.emit() - _active_pcam_2d.reset_limit() - else: - _active_pcam_3d.tween_started.emit() - - _tween_elapsed_time = min(_tween_duration, _tween_elapsed_time + delta) - - if _is_2d: - _active_pcam_2d.is_tweening.emit() - var interpolation_destination: Vector2 = _tween_interpolate_value( - _prev_active_pcam_2d_transform.origin, - _active_pcam_2d_glob_transform.origin, - _active_pcam_2d.tween_duration, - _active_pcam_2d.tween_transition, - _active_pcam_2d.tween_ease - ) - - if _active_pcam_2d.snap_to_pixel: - camera_2d.global_position = interpolation_destination.round() - else: - camera_2d.global_position = interpolation_destination - - camera_2d.rotation = _tween_interpolate_value( - _prev_active_pcam_2d_transform.get_rotation(), - _active_pcam_2d_glob_transform.get_rotation(), - _active_pcam_2d.tween_duration, - _active_pcam_2d.tween_transition, - _active_pcam_2d.tween_ease - ) - camera_2d.zoom = _tween_interpolate_value( - _camera_zoom, - _active_pcam_2d.zoom, - _active_pcam_2d.tween_duration, - _active_pcam_2d.tween_transition, - _active_pcam_2d.tween_ease - ) - else: - _active_pcam_3d.is_tweening.emit() - camera_3d.global_position = _tween_interpolate_value( - _prev_active_pcam_3d_transform.origin, - _active_pcam_3d_glob_transform.origin, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - var prev_active_pcam_3d_quat: Quaternion = Quaternion(_prev_active_pcam_3d_transform.basis.orthonormalized()) - camera_3d.quaternion = \ - Tween.interpolate_value( - prev_active_pcam_3d_quat, \ - prev_active_pcam_3d_quat.inverse() * Quaternion(_active_pcam_3d_glob_transform.basis.orthonormalized()), - _tween_elapsed_time, \ - _active_pcam_3d.tween_duration, \ - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_attribute_changed: - if _active_pcam_3d.attributes.auto_exposure_enabled: - if _cam_auto_exposure_scale_changed: - camera_3d.attributes.auto_exposure_scale = \ - _tween_interpolate_value( - _prev_cam_auto_exposure_scale, - _active_pcam_3d.attributes.auto_exposure_scale, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_auto_exposure_speed_changed: - camera_3d.attributes.auto_exposure_speed = \ - _tween_interpolate_value( - _prev_cam_auto_exposure_scale, - _active_pcam_3d.attributes.auto_exposure_scale, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_attribute_type == 0: # CameraAttributePractical - if _active_pcam_3d.attributes.auto_exposure_enabled: - if _cam_exposure_min_sensitivity_changed: - camera_3d.attributes.auto_exposure_min_sensitivity = \ - _tween_interpolate_value( - _prev_cam_exposure_min_sensitivity, - _active_pcam_3d.attributes.auto_exposure_min_sensitivity, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_exposure_max_sensitivity_changed: - camera_3d.attributes.auto_exposure_max_sensitivity = \ - _tween_interpolate_value( - _prev_cam_exposure_max_sensitivity, - _active_pcam_3d.attributes.auto_exposure_max_sensitivity, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_dof_blur_amount_changed: - camera_3d.attributes.dof_blur_amount = \ - _tween_interpolate_value( - _prev_cam_dof_blur_amount, - _active_pcam_3d.attributes.dof_blur_amount, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_dof_blur_far_distance_changed: - camera_3d.attributes.dof_blur_far_distance = \ - _tween_interpolate_value( - _prev_cam_dof_blur_far_distance, - _active_pcam_3d.attributes.dof_blur_far_distance, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_dof_blur_far_transition_changed: - camera_3d.attributes.dof_blur_far_transition = \ - _tween_interpolate_value( - _prev_cam_dof_blur_far_transition, - _active_pcam_3d.attributes.dof_blur_far_transition, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_dof_blur_near_distance_changed: - camera_3d.attributes.dof_blur_near_distance = \ - _tween_interpolate_value( - _prev_cam_dof_blur_near_distance, - _active_pcam_3d.attributes.dof_blur_near_distance, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_dof_blur_near_transition_changed: - camera_3d.attributes.dof_blur_near_transition = \ - _tween_interpolate_value( - _prev_cam_dof_blur_near_transition, - _active_pcam_3d.attributes.dof_blur_near_transition, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - elif _cam_attribute_type == 1: # CameraAttributePhysical - if _cam_dof_blur_near_transition_changed: - camera_3d.attributes.auto_exposure_max_exposure_value = \ - _tween_interpolate_value( - _prev_cam_exposure_max_exposure_value, - _active_pcam_3d.attributes.auto_exposure_max_exposure_value, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_exposure_min_exposure_value_changed: - camera_3d.attributes.auto_exposure_min_exposure_value = \ - _tween_interpolate_value( - _prev_cam_exposure_min_exposure_value, - _active_pcam_3d.attributes.auto_exposure_min_exposure_value, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_exposure_aperture_changed: - camera_3d.attributes.exposure_aperture = \ - _tween_interpolate_value( - _prev_cam_exposure_aperture, - _active_pcam_3d.attributes.exposure_aperture, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_exposure_shutter_speed_changed: - camera_3d.attributes.exposure_shutter_speed = \ - _tween_interpolate_value( - _prev_cam_exposure_shutter_speed, - _active_pcam_3d.attributes.exposure_shutter_speed, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_frustum_far_changed: - camera_3d.attributes.frustum_far = \ - _tween_interpolate_value( - _prev_cam_frustum_far, - _active_pcam_3d.attributes.frustum_far, - _active_pcam_3d.tween_duration(), - _active_pcam_3d.tween_transition(), - _active_pcam_3d.tween_ease - ) - if _cam_frustum_near_changed: - camera_3d.attributes.frustum_near = \ - _tween_interpolate_value( - _prev_cam_frustum_far, - _active_pcam_3d.attributes.frustum_near, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_frustum_focal_length_changed: - camera_3d.attributes.frustum_focal_length = \ - _tween_interpolate_value( - _prev_cam_frustum_focal_length, - _active_pcam_3d.attributes.frustum_focal_length, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - if _cam_frustum_focus_distance_changed: - camera_3d.attributes.frustum_focus_distance = \ - _tween_interpolate_value( - _prev_cam_frustum_focus_distance, - _active_pcam_3d.attributes.frustum_focus_distance, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_h_offset_changed: - camera_3d.h_offset = \ - _tween_interpolate_value( - _prev_cam_h_offset, - _active_pcam_3d.h_offset, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_v_offset_changed: - camera_3d.v_offset = \ - _tween_interpolate_value( - _prev_cam_v_offset, - _active_pcam_3d.v_offset, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_fov_changed: - camera_3d.fov = \ - _tween_interpolate_value( - _prev_cam_fov, - _active_pcam_3d.fov, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_size_changed: - camera_3d.size = \ - _tween_interpolate_value( - _prev_cam_size, - _active_pcam_3d.size, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_frustum_offset_changed: - camera_3d.frustum_offset = \ - _tween_interpolate_value( - _prev_cam_frustum_offset, - _active_pcam_3d.frustum_offset, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_near_changed: - camera_3d.near = \ - _tween_interpolate_value( - _prev_cam_near, - _active_pcam_3d.near, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - if _cam_far_changed: - camera_3d.far = \ - _tween_interpolate_value( - _prev_cam_far, - _active_pcam_3d.far, - _active_pcam_3d.tween_duration, - _active_pcam_3d.tween_transition, - _active_pcam_3d.tween_ease - ) - - # Forcefully disables physics interpolation when tweens are instant - if _tween_is_instant: - if _is_2d: - camera_2d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_OFF - camera_2d.reset_physics_interpolation() - else: - if Engine.get_version_info().major == 4 and \ - Engine.get_version_info().minor >= 4: - camera_3d.physics_interpolation_mode = Node.PHYSICS_INTERPOLATION_MODE_OFF - camera_3d.reset_physics_interpolation() - - if _tween_elapsed_time < _tween_duration: return - - _trigger_pcam_tween = false - _tween_elapsed_time = 0 - viewfinder_update.emit(true) - - if _is_2d: - _active_pcam_2d.update_limit_all_sides() - _active_pcam_2d.tween_completed.emit() - _active_pcam_2d.set_tween_skip(self, false) - if Engine.is_editor_hint(): - _active_pcam_2d.queue_redraw() - else: - if _active_pcam_3d.camera_3d_resource and _active_pcam_3d.attributes != null: - if _cam_attribute_type == 0: - if not _active_pcam_3d.attributes.dof_blur_far_enabled: - camera_3d.attributes.dof_blur_far_enabled = false - if not _active_pcam_3d.attributes.dof_blur_near_enabled: - camera_3d.attributes.dof_blur_near_enabled = false - _cam_h_offset_changed = false - _cam_v_offset_changed = false - _cam_fov_changed = false - _cam_size_changed = false - _cam_frustum_offset_changed = false - _cam_near_changed = false - _cam_far_changed = false - _cam_attribute_changed = false - - _active_pcam_3d.set_tween_skip(self, false) - _active_pcam_3d.tween_completed.emit() - - -func _tween_interpolate_value(from: Variant, to: Variant, duration: float, transition_type: int, ease_type: int) -> Variant: - return Tween.interpolate_value( - from, \ - to - from, - _tween_elapsed_time, \ - duration, \ - transition_type, - ease_type, - ) - - -func _show_viewfinder_in_play() -> void: - # Don't show the viewfinder in the actual editor or project builds - if Engine.is_editor_hint() or !OS.has_feature("editor"): return - - # Default the viewfinder node to be hidden - if is_instance_valid(_viewfinder_node): - _viewfinder_node.visible = false - - if _is_2d: - if not _active_pcam_2d.show_viewfinder_in_play: return - if _active_pcam_2d.follow_mode != _active_pcam_2d.FollowMode.FRAMED: return - else: - if not _active_pcam_3d.show_viewfinder_in_play: return - if _active_pcam_3d.follow_mode != _active_pcam_2d.FollowMode.FRAMED: return - - var canvas_layer: CanvasLayer = CanvasLayer.new() - get_tree().get_root().add_child(canvas_layer) - - # Instantiate the viewfinder scene if it isn't already - if not is_instance_valid(_viewfinder_node): - var _viewfinder_scene := load("res://addons/phantom_camera/panel/viewfinder/viewfinder_panel.tscn") - _viewfinder_node = _viewfinder_scene.instantiate() - canvas_layer.add_child(_viewfinder_node) - - _viewfinder_node.visible = true - _viewfinder_node.update_dead_zone() - - -func _update_limit_2d(side: int, limit: int) -> void: - if is_instance_valid(camera_2d): - camera_2d.set_limit(side, limit) - -func _draw_limit_2d(enabled: bool) -> void: - camera_2d.set_limit_drawing_enabled(enabled) - - -## Called when a [param PhantomCamera] is added to the scene.[br] -## [b]Note:[/b] This can only be called internally from a [param PhantomCamera] node. -func _pcam_added_to_scene(pcam: Node) -> void: - if not pcam.is_node_ready(): await pcam.ready - _check_pcam_priority(pcam) - - -## Called when a [param PhantomCamera] is removed from the scene.[br] -## [b]Note:[/b] This can only be called internally from a -## [param PhantomCamera] node. -func _pcam_removed_from_scene(pcam: Node) -> void: - if _is_2d: - if pcam == _active_pcam_2d: - _active_pcam_2d = null - _active_pcam_missing = true - _active_pcam_priority = -1 - _find_pcam_with_highest_priority() - else: - if pcam == _active_pcam_3d: - _active_pcam_3d = null - _active_pcam_missing = true - _active_pcam_priority = -1 - _find_pcam_with_highest_priority() - - -func _pcam_visibility_changed(pcam: Node) -> void: - if pcam == _active_pcam_2d or pcam == _active_pcam_3d: - _active_pcam_priority = -1 - _find_pcam_with_highest_priority() - return - _check_pcam_priority(pcam) - - -func _pcam_teleported(pcam: Node) -> void: - if _is_2d: - if not pcam == _active_pcam_2d: return - if not is_instance_valid(camera_2d): return - camera_2d.global_position = _active_pcam_2d.get_transform_output().origin - camera_2d.reset_physics_interpolation() - else: - if not pcam == _active_pcam_3d: return - if not is_instance_valid(camera_3d): return - camera_3d.global_position = _active_pcam_3d.get_transform_output().origin - camera_3d.reset_physics_interpolation() - - -func _set_layer(current_layers: int, layer_number: int, value: bool) -> int: - var mask: int = current_layers - - # From https://github.com/godotengine/godot/blob/51991e20143a39e9ef0107163eaf283ca0a761ea/scene/3d/camera_3d.cpp#L638 - if layer_number < 1 or layer_number > 20: - printerr("Render layer must be between 1 and 20.") - else: - if value: - mask |= 1 << (layer_number - 1) - else: - mask &= ~(1 << (layer_number - 1)) - - return mask - -#endregion - -#region Public Functions - -func pcam_priority_updated(pcam: Node) -> void: - if not is_instance_valid(pcam): return - if not _pcam_is_in_host_layer(pcam): return - - if Engine.is_editor_hint(): - if _is_2d: - if _active_pcam_2d.priority_override: return - if not is_instance_valid(_active_pcam_2d): return - else: - if _active_pcam_3d.priority_override: return - if not is_instance_valid(_active_pcam_3d): return - - ## Currently active PCam changed Priority - if pcam == _active_pcam_2d or pcam == _active_pcam_3d: - ## If PCam Node has become invisible / disabled - if not pcam.visible: - refresh_pcam_list_priorty() - ## If currently active PCam has a reduced Priority - elif pcam.priority < _active_pcam_priority: - _active_pcam_priority = pcam.priority - _find_pcam_with_highest_priority() - ## Another PCam changed Priority - else: - ## Make new PCam active if Priority is higher or equal to the currently active - if pcam.priority >= _active_pcam_priority: - if _is_2d: - if pcam != _active_pcam_2d: - _assign_new_active_pcam(pcam) - else: - if pcam != _active_pcam_3d: - _assign_new_active_pcam(pcam) - pcam.set_tween_skip(self, false) - _active_pcam_missing = false - - -## Updates the viewfinder when a [param PhantomCamera] has its -## [param priority_ovrride] enabled.[br] -## [b]Note:[/b] This only affects the editor. -func _pcam_priority_override(pcam: Node, should_override: bool) -> void: - if not Engine.is_editor_hint(): return - if not _pcam_is_in_host_layer(pcam): return - if should_override: - if _is_2d: - if is_instance_valid(_active_pcam_2d): - if _active_pcam_2d.priority_override: - _active_pcam_2d.priority_override = false - else: - if is_instance_valid(_active_pcam_3d): - if _active_pcam_3d.priority_override: - _active_pcam_3d.priority_override = false - _assign_new_active_pcam(pcam) - else: - _find_pcam_with_highest_priority() - - viewfinder_update.emit(false) - - -## Updates the viewfinder when a [param PhantomCamera] has its -## [param priority_ovrride] disabled.[br] -## [b]Note:[/b] This only affects the editor. -func pcam_priority_override_disabled() -> void: - viewfinder_update.emit(false) - - -## Returns the currently active [param PhantomCamera] -func get_active_pcam() -> Node: - if _is_2d: - return _active_pcam_2d - else: - return _active_pcam_3d - - -## Returns whether if a [param PhantomCamera] should tween when it becomes -## active. If it's already active, the value will always be false. -## [b]Note:[/b] This can only be called internally from a -## [param PhantomCamera] node. -func get_trigger_pcam_tween() -> bool: - return _trigger_pcam_tween - - -## Refreshes the [param PhantomCamera] list and checks for the highest priority. [br] -## [b]Note:[/b] This should [b]not[/b] be necessary to call manually. -func refresh_pcam_list_priorty() -> void: - _active_pcam_priority = -1 - _find_pcam_with_highest_priority() - -#endregion - -#region Setters / Getters - -func set_interpolation_mode(value: int) -> void: - interpolation_mode = value - if is_inside_tree(): - _check_pcam_physics() -func get_interpolation_mode() -> int: - return interpolation_mode - -## Sets the [member host_layers] value. -func set_host_layers(value: int) -> void: - host_layers = value - - if not _is_child_of_camera: return - - if not _active_pcam_missing: - if _is_2d: - _pcam_host_layer_changed(_active_pcam_2d) - else: - _pcam_host_layer_changed(_active_pcam_3d) - else: - _find_pcam_with_highest_priority() - -## Enables or disables a given layer of [member host_layers]. -func set_host_layers_value(layer: int, value: bool) -> void: - host_layers = _set_layer(host_layers, layer, value) - -## Returns the [member host_layers] value. -func get_host_layers() -> int: - return host_layers - -#endregion diff --git a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid b/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid deleted file mode 100644 index e96433d..0000000 --- a/addons/phantom_camera/scripts/phantom_camera_host/phantom_camera_host.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bd046eokvcnu2 diff --git a/addons/phantom_camera/scripts/resources/Camera3DResource.cs b/addons/phantom_camera/scripts/resources/Camera3DResource.cs deleted file mode 100644 index 54ad098..0000000 --- a/addons/phantom_camera/scripts/resources/Camera3DResource.cs +++ /dev/null @@ -1,116 +0,0 @@ -using Godot; - -namespace PhantomCamera; - -public enum KeepAspect -{ - KeepWidth, - KeepHeight -} - -public enum ProjectionType -{ - Perspective, - Orthogonal, - Frustum -} - -public class Camera3DResource(Resource resource) -{ - public readonly Resource Resource = resource; - - public KeepAspect KeepAspect - { - get => (KeepAspect)(int)Resource.Get(PropertyName.KeepAspect); - set => Resource.Set(PropertyName.KeepAspect, (int)value); - } - - public int CullMask - { - get => (int)Resource.Get(PropertyName.CullMask); - set => Resource.Set(PropertyName.CullMask, value); - } - - - public float HOffset - { - get => (float)Resource.Get(PropertyName.HOffset); - set => Resource.Set(PropertyName.HOffset, value); - } - - public float VOffset - { - get => (float)Resource.Get(PropertyName.VOffset); - set => Resource.Set(PropertyName.VOffset, value); - } - - public ProjectionType Projection - { - get => (ProjectionType)(int)Resource.Get(PropertyName.Projection); - set => Resource.Set(PropertyName.Projection, (int)value); - } - - public float Fov - { - get => (float)Resource.Get(PropertyName.Fov); - set => Resource.Set(PropertyName.Fov, Mathf.Clamp(value, 1, 179)); - } - - public float Size - { - get => (float)Resource.Get(PropertyName.Size); - set => Resource.Set(PropertyName.Size, Mathf.Clamp(value, 0.001f, float.PositiveInfinity)); - } - - public Vector2 FrustumOffset - { - get => (Vector2)Resource.Get(PropertyName.FrustumOffset); - set => Resource.Set(PropertyName.FrustumOffset, value); - } - - public float Near - { - get => (float)Resource.Get(PropertyName.Near); - set => Resource.Set(PropertyName.Near, Mathf.Clamp(value, 0.001f, float.PositiveInfinity)); - } - - public float Far - { - get => (float)Resource.Get(PropertyName.Far); - set => Resource.Set(PropertyName.Far, Mathf.Clamp(value, 0.01f, float.PositiveInfinity)); - } - - public static Camera3DResource New() - { - Resource resource = new(); -#if GODOT4_4_OR_GREATER - resource.SetScript(GD.Load("uid://b8hhnqsugykly")); -#else - resource.SetScript(GD.Load("res://addons/phantom_camera/scripts/resources/camera_3d_resource.gd")); -#endif - return new Camera3DResource(resource); - } - - public static class PropertyName - { - public static readonly StringName KeepAspect = new("keep_aspect"); - - public static readonly StringName CullMask = new("cull_mask"); - - public static readonly StringName HOffset = new("h_offset"); - - public static readonly StringName VOffset = new("v_offset"); - - public static readonly StringName Projection = new("projection"); - - public static readonly StringName Fov = new("fov"); - - public static readonly StringName Size = new("size"); - - public static readonly StringName FrustumOffset = new("frustum_offset"); - - public static readonly StringName Near = new("near"); - - public static readonly StringName Far = new("far"); - } -} diff --git a/addons/phantom_camera/scripts/resources/Camera3DResource.cs.uid b/addons/phantom_camera/scripts/resources/Camera3DResource.cs.uid deleted file mode 100644 index d66b43e..0000000 --- a/addons/phantom_camera/scripts/resources/Camera3DResource.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://jedyxlihuwbj diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs b/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs deleted file mode 100644 index f19d445..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs +++ /dev/null @@ -1,103 +0,0 @@ -using Godot; - -namespace PhantomCamera.Noise; - -public class PhantomCameraNoise2D(Resource resource) -{ - public readonly Resource Resource = resource; - - public float Amplitude - { - get => (float)Resource.Call(MethodName.GetAmplitude); - set => Resource.Call(MethodName.SetAmplitude, value); - } - - public float Frequency - { - get => (float)Resource.Call(MethodName.GetFrequency); - set => Resource.Call(MethodName.SetFrequency, value); - } - - public bool RandomizeNoiseSeed - { - get => (bool)Resource.Call(MethodName.GetRandomizeNoiseSeed); - set => Resource.Call(MethodName.SetRandomizeNoiseSeed, value); - } - - public int NoiseSeed - { - get => (int)Resource.Call(MethodName.GetNoiseSeed); - set => Resource.Call(MethodName.SetNoiseSeed, value); - } - - public bool RotationalNoise - { - get => (bool)Resource.Call(MethodName.GetRotationalNoise); - set => Resource.Call(MethodName.SetRotationalNoise, value); - } - - public bool PositionalNoise - { - get => (bool)Resource.Call(MethodName.GetPositionalNoise); - set => Resource.Call(MethodName.SetPositionalNoise, value); - } - - public float RotationalMultiplier - { - get => (float)Resource.Call(MethodName.GetRotationalMultiplier); - set => Resource.Call(MethodName.SetRotationalMultiplier, value); - } - - public float PositionalMultiplierX - { - get => (float)Resource.Call(MethodName.GetPositionalMultiplierX); - set => Resource.Call(MethodName.SetPositionalMultiplierX, value); - } - - public float PositionalMultiplierY - { - get => (float)Resource.Call(MethodName.GetPositionalMultiplierY); - set => Resource.Call(MethodName.SetPositionalMultiplierY, value); - } - - public static PhantomCameraNoise2D New() - { - Resource resource = new(); -#if GODOT4_4_OR_GREATER - resource.SetScript(GD.Load("uid://dimvdouy8g0sv")); -#else - resource.SetScript(GD.Load("res://addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd")); -#endif - return new PhantomCameraNoise2D(resource); - } - - public static class MethodName - { - public static readonly StringName GetAmplitude = new("get_amplitude"); - public static readonly StringName SetAmplitude = new("set_amplitude"); - - public static readonly StringName GetFrequency = new("get_frequency"); - public static readonly StringName SetFrequency = new("set_frequency"); - - public static readonly StringName GetRandomizeNoiseSeed = new("get_randomize_noise_seed"); - public static readonly StringName SetRandomizeNoiseSeed = new("set_randomize_noise_seed"); - - public static readonly StringName GetNoiseSeed = new("get_noise_seed"); - public static readonly StringName SetNoiseSeed = new("set_noise_seed"); - - public static readonly StringName GetRotationalNoise = new("get_rotational_noise"); - public static readonly StringName SetRotationalNoise = new("set_rotational_noise"); - - public static readonly StringName GetPositionalNoise = new("get_positional_noise"); - public static readonly StringName SetPositionalNoise = new("set_positional_noise"); - - public static readonly StringName GetRotationalMultiplier = new("get_rotational_multiplier"); - public static readonly StringName SetRotationalMultiplier = new("set_rotational_multiplier"); - - public static readonly StringName GetPositionalMultiplierX = new("get_positional_multiplier_x"); - public static readonly StringName SetPositionalMultiplierX = new("set_positional_multiplier_x"); - - public static readonly StringName GetPositionalMultiplierY = new("get_positional_multiplier_y"); - public static readonly StringName SetPositionalMultiplierY = new("set_positional_multiplier_y"); - } -} diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs.uid b/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs.uid deleted file mode 100644 index 16ddb84..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraNoise2D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://capjdoxs6gs6r diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs b/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs deleted file mode 100644 index 0c1a3ce..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs +++ /dev/null @@ -1,130 +0,0 @@ -using Godot; - -namespace PhantomCamera.Noise; - -public class PhantomCameraNoise3D(Resource resource) -{ - public readonly Resource Resource = resource; - - public float Amplitude - { - get => (float)Resource.Call(MethodName.GetAmplitude); - set => Resource.Call(MethodName.SetAmplitude, value); - } - - public float Frequency - { - get => (float)Resource.Call(MethodName.GetFrequency); - set => Resource.Call(MethodName.SetFrequency, value); - } - - public bool RandomizeNoiseSeed - { - get => (bool)Resource.Call(MethodName.GetRandomizeNoiseSeed); - set => Resource.Call(MethodName.SetRandomizeNoiseSeed, value); - } - - public int NoiseSeed - { - get => (int)Resource.Call(MethodName.GetNoiseSeed); - set => Resource.Call(MethodName.SetNoiseSeed, value); - } - - public bool RotationalNoise - { - get => (bool)Resource.Call(MethodName.GetRotationalNoise); - set => Resource.Call(MethodName.SetRotationalNoise, value); - } - - public bool PositionalNoise - { - get => (bool)Resource.Call(MethodName.GetPositionalNoise); - set => Resource.Call(MethodName.SetPositionalNoise, value); - } - - public float RotationalMultiplierX - { - get => (float)Resource.Call(MethodName.GetRotationalMultiplierX); - set => Resource.Call(MethodName.SetRotationalMultiplierX, value); - } - - public float RotationalMultiplierY - { - get => (float)Resource.Call(MethodName.GetRotationalMultiplierY); - set => Resource.Call(MethodName.SetRotationalMultiplierY, value); - } - - public float RotationalMultiplierZ - { - get => (float)Resource.Call(MethodName.GetRotationalMultiplierZ); - set => Resource.Call(MethodName.SetRotationalMultiplierZ, value); - } - - public float PositionalMultiplierX - { - get => (float)Resource.Call(MethodName.GetPositionalMultiplierX); - set => Resource.Call(MethodName.SetPositionalMultiplierX, value); - } - - public float PositionalMultiplierY - { - get => (float)Resource.Call(MethodName.GetPositionalMultiplierY); - set => Resource.Call(MethodName.SetPositionalMultiplierY, value); - } - - public float PositionalMultiplierZ - { - get => (float)Resource.Call(MethodName.GetPositionalMultiplierZ); - set => Resource.Call(MethodName.SetPositionalMultiplierZ, value); - } - - public static PhantomCameraNoise3D New() - { - Resource resource = new(); -#if GODOT4_4_OR_GREATER - resource.SetScript(GD.Load("uid://cuffvge5ad4aa")); -#else - resource.SetScript(GD.Load("res://addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd")); -#endif - return new PhantomCameraNoise3D(resource); - } - - public static class MethodName - { - public static readonly StringName GetAmplitude = new("get_amplitude"); - public static readonly StringName SetAmplitude = new("set_amplitude"); - - public static readonly StringName GetFrequency = new("get_frequency"); - public static readonly StringName SetFrequency = new("set_frequency"); - - public static readonly StringName GetRandomizeNoiseSeed = new("get_randomize_noise_seed"); - public static readonly StringName SetRandomizeNoiseSeed = new("set_randomize_noise_seed"); - - public static readonly StringName GetNoiseSeed = new("get_noise_seed"); - public static readonly StringName SetNoiseSeed = new("set_noise_seed"); - - public static readonly StringName GetRotationalNoise = new("get_rotational_noise"); - public static readonly StringName SetRotationalNoise = new("set_rotational_noise"); - - public static readonly StringName GetPositionalNoise = new("get_positional_noise"); - public static readonly StringName SetPositionalNoise = new("set_positional_noise"); - - public static readonly StringName GetRotationalMultiplierX = new("get_rotational_multiplier_x"); - public static readonly StringName SetRotationalMultiplierX = new("set_rotational_multiplier_x"); - - public static readonly StringName GetRotationalMultiplierY = new("get_rotational_multiplier_y"); - public static readonly StringName SetRotationalMultiplierY = new("set_rotational_multiplier_y"); - - public static readonly StringName GetRotationalMultiplierZ = new("get_rotational_multiplier_z"); - public static readonly StringName SetRotationalMultiplierZ = new("set_rotational_multiplier_z"); - - public static readonly StringName GetPositionalMultiplierX = new("get_positional_multiplier_x"); - public static readonly StringName SetPositionalMultiplierX = new("set_positional_multiplier_x"); - - public static readonly StringName GetPositionalMultiplierY = new("get_positional_multiplier_y"); - public static readonly StringName SetPositionalMultiplierY = new("set_positional_multiplier_y"); - - public static readonly StringName GetPositionalMultiplierZ = new("get_positional_multiplier_z"); - public static readonly StringName SetPositionalMultiplierZ = new("set_positional_multiplier_z"); - } -} diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs.uid b/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs.uid deleted file mode 100644 index 53d184f..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraNoise3D.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://chk7643ynhe4f diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs b/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs deleted file mode 100644 index 500e165..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs +++ /dev/null @@ -1,75 +0,0 @@ -using Godot; - -namespace PhantomCamera; - -public enum TransitionType -{ - Linear, - Sine, - Quint, - Quart, - Quad, - Expo, - Elastic, - Cubic, - Circ, - Bounce, - Back -} - -public enum EaseType -{ - EaseIn, - EaseOut, - EaseInOut, - EaseOutIn -} - -public static class PhantomCameraTweenExtensions -{ - public static PhantomCameraTween AsPhantomCameraTween(this Resource resource) - { - return new PhantomCameraTween(resource); - } -} - -public class PhantomCameraTween(Resource tweenResource) -{ - public Resource Resource { get; } = tweenResource; - - public float Duration - { - get => (float)Resource.Get(PropertyName.Duration); - set => Resource.Set(PropertyName.Duration, value); - } - - public TransitionType Transition - { - get => (TransitionType)(int)Resource.Get(PropertyName.Transition); - set => Resource.Set(PropertyName.Transition, (int)value); - } - - public EaseType Ease - { - get => (EaseType)(int)Resource.Get(PropertyName.Ease); - set => Resource.Set(PropertyName.Ease, (int)value); - } - - public static PhantomCameraTween New() - { - Resource resource = new(); -#if GODOT4_4_OR_GREATER - resource.SetScript(GD.Load("uid://8umksf8e80fw")); -#else - resource.SetScript(GD.Load("res://addons/phantom_camera/scripts/resources/tween_resource.gd")); -#endif - return new PhantomCameraTween(resource); - } - - public static class PropertyName - { - public static readonly StringName Duration = new("duration"); - public static readonly StringName Transition = new("transition"); - public static readonly StringName Ease = new("ease"); - } -} diff --git a/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs.uid b/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs.uid deleted file mode 100644 index dd50ead..0000000 --- a/addons/phantom_camera/scripts/resources/PhantomCameraTween.cs.uid +++ /dev/null @@ -1 +0,0 @@ -uid://ybr5c2s0tfvx diff --git a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd deleted file mode 100644 index c630e16..0000000 --- a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd +++ /dev/null @@ -1,110 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_camera_3d_resource.svg") -class_name Camera3DResource -extends Resource - -## Resource for [PhantomCamera3D] to override various [Camera3D] properties. -## -## The overrides defined here will be applied to the [Camera3D] upon the -## [PhantomCamera3D] becoming active. - -enum KeepAspect { - KEEP_WIDTH = 0, ## Preserves the horizontal aspect ratio; also known as Vert- scaling. This is usually the best option for projects running in portrait mode, as taller aspect ratios will benefit from a wider vertical FOV. - KEEP_HEIGHT = 1, ## Preserves the vertical aspect ratio; also known as Hor+ scaling. This is usually the best option for projects running in landscape mode, as wider aspect ratios will automatically benefit from a wider horizontal FOV. -} - -enum ProjectionType { - PERSPECTIVE = 0, ## Perspective projection. Objects on the screen becomes smaller when they are far away. - ORTHOGONAL = 1, ## Orthogonal projection, also known as orthographic projection. Objects remain the same size on the screen no matter how far away they are. - FRUSTUM = 2, ## Frustum projection. This mode allows adjusting frustum_offset to create "tilted frustum" effects. -} - -## Overrides [member Camera3D.keep_aspect]. -@export var keep_aspect: KeepAspect = KeepAspect.KEEP_HEIGHT: - set(value): - keep_aspect = value - emit_changed() - get: - return keep_aspect - -## Overrides [member Camera3D.cull_mask]. -@export_flags_3d_render var cull_mask: int = 1048575: - set(value): - cull_mask = value - emit_changed() - get: - return cull_mask - -## Overrides [member Camera3D.h_offset]. -@export_range(0, 1, 0.001, "or_greater", "or_less", "hide_slider", "suffix:m") var h_offset: float = 0: - set(value): - h_offset = value - emit_changed() - get: - return h_offset - -## Overrides [member Camera3D.v_offset]. -@export_range(0, 1, 0.001, "or_greater", "or_less", "hide_slider", "suffix:m") var v_offset: float = 0: - set(value): - v_offset = value - emit_changed() - -## Overrides [member Camera3D.projection]. -@export var projection: ProjectionType = ProjectionType.PERSPECTIVE: - set(value): - projection = value - notify_property_list_changed() - emit_changed() - get: - return projection - -## Overrides [member Camera3D.fov]. -@export_range(1, 179, 0.1, "degrees") var fov: float = 75: - set(value): - fov = value - emit_changed() - get: - return fov - -## Overrides [member Camera3D.size]. -@export_range(0.001, 100, 0.001, "suffix:m", "or_greater") var size: float = 1: - set(value): - size = value - emit_changed() - get: - return size - -## Overrides [member Camera3d.frustum_offset]. -@export var frustum_offset: Vector2 = Vector2.ZERO: - set(value): - frustum_offset = value - emit_changed() - get: - return frustum_offset - -## Overrides [member Camera3D.near]. -@export_range(0.001, 10, 0.001, "suffix:m", "or_greater") var near: float = 0.05: - set(value): - near = value - emit_changed() - get: - return near - -## Overrides [member Camera3D.far]. -@export_range(0.01, 4000, 0.001, "suffix:m","or_greater") var far: float = 4000: - set(value): - far = value - emit_changed() - get: - return far - - -func _validate_property(property: Dictionary) -> void: - if property.name == "fov" and not projection == ProjectionType.PERSPECTIVE: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "size" and projection == ProjectionType.PERSPECTIVE: - property.usage = PROPERTY_USAGE_NO_EDITOR - - if property.name == "frustum_offset" and not projection == ProjectionType.FRUSTUM: - property.usage = PROPERTY_USAGE_NO_EDITOR diff --git a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid b/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid deleted file mode 100644 index e8378eb..0000000 --- a/addons/phantom_camera/scripts/resources/camera_3d_resource.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://bc2tn187qiatpcheck diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd deleted file mode 100644 index cc87dba..0000000 --- a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd +++ /dev/null @@ -1,228 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") -class_name PhantomCameraNoise2D -extends Resource - -## A resource type used to apply noise, or shake, to [Camera2D]s that have a [PhantomCameraHost] as a child. -## -## Is a resource type that defines, calculates and outputs the noise values to a [Camera2D] through active -## [PhantomCamera3D].[br] -## It can be applied to either [PhantomCameraNoiseEmitter2D] or a [PhantomCamera2D] noise property directly - -#region Exported Properties - -## Defines the size of the noise pattern.[br] -## Higher values will increase the range the noise can reach. -@export_range(0, 1000, 0.001, "or_greater") var amplitude: float = 10: - set = set_amplitude, - get = get_amplitude - -## Sets the density of the noise pattern.[br] -## Higher values will result in more erratic noise. -@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.5: - set = set_frequency, - get = get_frequency - -## If true, randomizes the noise pattern every time the noise is run.[br] -## If disabled, [member seed] can be used to define a fixed noise pattern. -@export var randomize_noise_seed: bool = true: - set = set_randomize_noise_seed, - get = get_randomize_noise_seed - -## Sets a predetermined seed noise value.[br] -## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. -@export var noise_seed: int = 0: - set = set_noise_seed, - get = get_noise_seed - -## Enables noise changes to the [member Camera2D.offset] position. -@export var positional_noise: bool = true: - set = set_positional_noise, - get = get_positional_noise - -## Enables noise changes to the [Camera2D]'s rotation. -@export var rotational_noise: bool = false: - set = set_rotational_noise, - get = get_rotational_noise - -@export_group("Positional Multiplier") -## Multiplies positional noise amount in the X-axis.[br] -## Set the value to [param 0] to disable noise in the axis. -@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: - set = set_positional_multiplier_x, - get = get_positional_multiplier_x - -## Multiplies positional noise amount in the Y-axis.[br] -## Set the value to [param 0] to disable noise in the axis. -@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: - set = set_positional_multiplier_y, - get = get_positional_multiplier_y - -@export_group("Rotational Multiplier") -## Multiplies rotational noise amount. -@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier: float = 1: - set = set_rotational_multiplier, - get = get_rotational_multiplier - -#endregion - -#region Private Variables - -var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() - -var _noise_positional_multiplier: Vector2 = Vector2( - positional_multiplier_x, - positional_multiplier_y -) - -var _trauma: float = 0.0: - set(value): - _trauma = value - -var _noise_time: float = 0.0 - -#endregion - -#region Private Functions - -func _init(): - _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN - if randomize_noise_seed: _noise_algorithm.seed = randi() - _noise_algorithm.frequency = frequency - - -func _validate_property(property: Dictionary) -> void: - if randomize_noise_seed and property.name == "noise_seed": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not rotational_noise and property.name == "rotational_multiplier": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not positional_noise: - match property.name: - "positional_multiplier_x", \ - "positional_multiplier_y": - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _get_noise_from_seed(noise_seed: int) -> float: - return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude - - -func set_trauma(value: float) -> void: - _trauma = value - -#endregion - -#region Public Functions - -func get_noise_transform(delta: float) -> Transform2D: - var output_position: Vector2 = Vector2.ZERO - var output_rotation: float = 0.0 - _noise_time += delta - _trauma = maxf(_trauma, 0.0) - - if positional_noise: - for i in 2: - output_position[i] = _noise_positional_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) - if rotational_noise: - output_rotation = rotational_multiplier / 100 * pow(_trauma, 2) * _get_noise_from_seed(noise_seed) - - return Transform2D(output_rotation, output_position) - - -func reset_noise_time() -> void: - _noise_time = 0 - -#endregion - -#region Setters & Getters - -## Sets the [member amplitude] value. -func set_amplitude(value: float) -> void: - amplitude =value - -## Returns the [member amplitude] value. -func get_amplitude() -> float: - return amplitude - - -## Sets the [member frequency] value. -func set_frequency(value: float) -> void: - frequency = value - _noise_algorithm.frequency = value - -## Returns the [member frequency] value. -func get_frequency() -> float: - return frequency - - -## Sets the [member randomize_seed] value. -func set_randomize_noise_seed(value: int) -> void: - randomize_noise_seed = value - if value: _noise_algorithm.seed = randi() - notify_property_list_changed() - -## Returns the [member randomize_seed] value. -func get_randomize_noise_seed() -> int: - return randomize_noise_seed - - -## Sets the [member randomize_seed] value. -func set_noise_seed(value: int) -> void: - noise_seed = value - -## Returns the [member seed] value. -func get_noise_seed() -> int: - return noise_seed - - -## Sets the [member positional_noise] value. -func set_positional_noise(value: bool) -> void: - positional_noise = value - notify_property_list_changed() - -## Returns the [member positional_noise] value. -func get_positional_noise() -> bool: - return positional_noise - - -## Sets the [member rotational_noise] value. -func set_rotational_noise(value: bool) -> void: - rotational_noise = value - notify_property_list_changed() - -## Returns the [member rotational_noise] value. -func get_rotational_noise() -> bool: - return rotational_noise - - -## Sets the [member positional_multiplier_x] value. -func set_positional_multiplier_x(value: float) -> void: - positional_multiplier_x = value - _noise_positional_multiplier.x = value - -## Returns the [member positional_multiplier_x] value. -func get_positional_multiplier_x() -> float: - return positional_multiplier_x - - -## Sets the [member positional_multiplier_y] value. -func set_positional_multiplier_y(value: float) -> void: - positional_multiplier_y = value - _noise_positional_multiplier.y = value - -## Returns the [member positional_multiplier_y] value. -func get_positional_multiplier_y() -> float: - return positional_multiplier_y - - -## Sets the [member rotational_multiplier] value. -func set_rotational_multiplier(value: float) -> void: - rotational_multiplier = value - -## Returns the [member rotational_multiplier] value. -func get_rotational_multiplier() -> float: - return rotational_multiplier - -#endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid deleted file mode 100644 index 45ae480..0000000 --- a/addons/phantom_camera/scripts/resources/phantom_camera_noise_2d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dimvdouy8g0sv diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd deleted file mode 100644 index 6cf840f..0000000 --- a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd +++ /dev/null @@ -1,301 +0,0 @@ -@tool -@icon("res://addons/phantom_camera/icons/phantom_camera_noise_resource.svg") -class_name PhantomCameraNoise3D -extends Resource - -## A resource type used to apply noise, or shake, to [Camera3D]s that have a [PhantomCameraHost] as a child. -## -## Is a resource type that defines, calculates and outputs the noise values to a [Camera3D] through active -## [PhantomCamera3D].[br] -## It can be applied to either [PhantomCameraNoiseEmitter3D] or a [PhantomCamera3D] noise property directly - -#region Exported Properties - -## Defines the size of the noise pattern.[br] -## Higher values will increase the range the noise can reach. -@export_range(0, 100, 0.001, "or_greater") var amplitude: float = 10: - set = set_amplitude, - get = get_amplitude - -## Sets the density of the noise pattern.[br] -## Higher values will result in more erratic noise. -@export_range(0, 10, 0.001, "or_greater") var frequency: float = 0.2: - set = set_frequency, - get = get_frequency - -## If true, randomizes the noise pattern every time the noise is run.[br] -## If disabled, [member seed] can be used to define a fixed noise pattern. -@export var randomize_noise_seed: bool = true: - set = set_randomize_noise_seed, - get = get_randomize_noise_seed - -## Sets a predetermined seed noise value.[br] -## Useful if wanting to achieve a persistent noise pattern every time the noise is emitted. -@export var noise_seed: int = 0: - set = set_noise_seed, - get = get_noise_seed - -## Enables noise changes to the [Camera3D]'s rotation. -@export var rotational_noise: bool = true: - set = set_rotational_noise, - get = get_rotational_noise - -## Enables noise changes to the camera's position.[br][br] -## [b]Important[/b][br]This can cause geometry clipping if the camera gets too close while this is active. -@export var positional_noise: bool = false: - set = set_positional_noise, - get = get_positional_noise - -@export_group("Rotational Multiplier") -## Multiplies rotational noise amount in the X-axis.[br] -## Set the value to [param 0] to disable noise in the axis. -@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_x: float = 1: - set = set_rotational_multiplier_x, - get = get_rotational_multiplier_x - -## Multiplies rotational noise amount in the Y-axis.[br] -## Set the value to [param 0] to disable noise in the axis. -@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_y: float = 1: - set = set_rotational_multiplier_y, - get = get_rotational_multiplier_y - -## Multiplies rotational noise amount in the Z-axis.[br] -## Set the value to [param 0] to disable noise in the axis. -@export_range(0, 1, 0.001, "or_greater") var rotational_multiplier_z: float = 1: - set = set_rotational_multiplier_z, - get = get_rotational_multiplier_z - -@export_group("Positional Multiplier") -## Multiplies positional noise amount in the X-axis.[br] -## Set the value to [param 0] to disable noise in the axis.[br] -## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. -@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_x: float = 1: - set = set_positional_multiplier_x, - get = get_positional_multiplier_x - -## Multiplies positional noise amount in the Y-axis.[br] -## Set the value to [param 0] to disable noise in the axis.[br] -## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. -@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_y: float = 1: - set = set_positional_multiplier_y, - get = get_positional_multiplier_y - -## Multiplies positional noise amount in the Z-axis.[br] -## Set the value to [param 0] to disable noise in the axis.[br] -## [b]Note:[/b] Rotational Offset is recommended to avoid potential camera clipping with the environment. -@export_range(0, 1, 0.001, "or_greater") var positional_multiplier_z: float = 1: - set = set_positional_multiplier_z, - get = get_positional_multiplier_z - -#endregion - -#region Private Variables - -var _noise_algorithm: FastNoiseLite = FastNoiseLite.new() - -var _noise_rotational_multiplier: Vector3 = Vector3( - rotational_multiplier_x, - rotational_multiplier_y, - rotational_multiplier_z, -) - -var _noise_positional_multiplier: Vector3 = Vector3( - positional_multiplier_x, - positional_multiplier_y, - positional_multiplier_z, -) - -var _trauma: float = 0.0: - set(value): - _trauma = value - if _trauma == 0.0: - _noise_time = 0.0 - -var _noise_time: float = 0.0 - -#endregion - -#region Private Functions - -func _init(): - _noise_algorithm.noise_type = FastNoiseLite.TYPE_PERLIN - - if randomize_noise_seed: _noise_algorithm.seed = randi() - _noise_algorithm.frequency = frequency - - -func _validate_property(property: Dictionary) -> void: - if randomize_noise_seed and property.name == "noise_seed": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not rotational_noise: - match property.name: - "rotational_multiplier_x", \ - "rotational_multiplier_y", \ - "rotational_multiplier_z": - property.usage = PROPERTY_USAGE_NO_EDITOR - - if not positional_noise: - match property.name: - "positional_multiplier_x", \ - "positional_multiplier_y", \ - "positional_multiplier_z": - property.usage = PROPERTY_USAGE_NO_EDITOR - - -func _get_noise_from_seed(noise_seed: int) -> float: - return _noise_algorithm.get_noise_2d(noise_seed, _noise_time) * amplitude - - -func set_trauma(value: float) -> void: - _trauma = value - -#endregion - -#region Public Functions - -func get_noise_transform(delta: float) -> Transform3D: - var output_rotation: Vector3 = Vector3.ZERO - var output_position: Vector3 = Vector3.ZERO - _noise_time += delta - _trauma = maxf(_trauma, 0.0) - - for i in 3: - if rotational_noise: - output_rotation[i] = deg_to_rad( - _noise_rotational_multiplier[i] * pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) - ) - - if positional_noise: - output_position[i] += _noise_positional_multiplier[i] / 10 * \ - pow(_trauma, 2) * _get_noise_from_seed(i + noise_seed) - - return Transform3D(Quaternion.from_euler(output_rotation), output_position) - - -func reset_noise_time() -> void: - _noise_time = 0 - -#endregion - -#region Setters & Getters - -## Sets the [member amplitude] value. -func set_amplitude(value: float) -> void: - amplitude =value - -## Returns the [member amplitude] value. -func get_amplitude() -> float: - return amplitude - - -## Sets the [member frequency] value. -func set_frequency(value: float) -> void: - frequency = value - _noise_algorithm.frequency = value - -## Returns the [member frequency] value. -func get_frequency() -> float: - return frequency - - -## Sets the [member randomize_seed] value. -func set_randomize_noise_seed(value: int) -> void: - randomize_noise_seed = value - if value: _noise_algorithm.seed = randi() - notify_property_list_changed() - -## Returns the [member randomize_seed] value. -func get_randomize_noise_seed() -> int: - return randomize_noise_seed - - -## Sets the [member randomize_seed] value. -func set_noise_seed(value: int) -> void: - noise_seed = value - -## Returns the [member seed] value. -func get_noise_seed() -> int: - return noise_seed - - -## Sets the [member positional_noise] value. -func set_positional_noise(value: bool) -> void: - positional_noise = value - notify_property_list_changed() - -## Returns the [member positional_noise] value. -func get_positional_noise() -> bool: - return positional_noise - - -## Sets the [member rotational_noise] value. -func set_rotational_noise(value: bool) -> void: - rotational_noise = value - notify_property_list_changed() - -## Returns the [member rotational_noise] value. -func get_rotational_noise() -> bool: - return rotational_noise - - -## Sets the [member positional_multiplier_x] value. -func set_positional_multiplier_x(value: float) -> void: - positional_multiplier_x = value - _noise_positional_multiplier.x = value - -## Returns the [member positional_multiplier_x] value. -func get_positional_multiplier_x() -> float: - return positional_multiplier_x - - -## Sets the [member positional_multiplier_y] value. -func set_positional_multiplier_y(value: float) -> void: - positional_multiplier_y = value - _noise_positional_multiplier.y = value - -## Returns the [member positional_multiplier_y] value. -func get_positional_multiplier_y() -> float: - return positional_multiplier_y - - -## Sets the [member positional_multiplier_z] value. -func set_positional_multiplier_z(value: float) -> void: - positional_multiplier_z = value - _noise_positional_multiplier.z = value - -## Returns the [member positional_multiplier_z] value. -func get_positional_multiplier_z() -> float: - return positional_multiplier_z - - -## Sets the [member rotational_multiplier_x] value. -func set_rotational_multiplier_x(value: float) -> void: - rotational_multiplier_x = value - _noise_rotational_multiplier.x = value - -## Returns the [member rotational_multiplier_x] value. -func get_rotational_multiplier_x() -> float: - return rotational_multiplier_x - - -## Sets the [member rotational_multiplier_y] value. -func set_rotational_multiplier_y(value: float) -> void: - rotational_multiplier_y = value - _noise_rotational_multiplier.y = value - -## Returns the [member rotational_multiplier_y] value. -func get_rotational_multiplier_y() -> float: - return rotational_multiplier_y - - -## Sets the [member rotational_multiplier_z] value. -func set_rotational_multiplier_z(value: float) -> void: - rotational_multiplier_z = value - _noise_rotational_multiplier.z = value - -## Returns the [member rotational_multiplier_z] value. -func get_rotational_multiplier_z() -> float: - return rotational_multiplier_z - - #endregion diff --git a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid b/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid deleted file mode 100644 index 42a0694..0000000 --- a/addons/phantom_camera/scripts/resources/phantom_camera_noise_3d.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://cuffvge5ad4aa diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd b/addons/phantom_camera/scripts/resources/tween_resource.gd deleted file mode 100644 index 0a3b46f..0000000 --- a/addons/phantom_camera/scripts/resources/tween_resource.gd +++ /dev/null @@ -1,41 +0,0 @@ -@icon("res://addons/phantom_camera/icons/phantom_camera_tween.svg") -class_name PhantomCameraTween -extends Resource - -## Tweening resource for [PhantomCamera2D] and [PhantomCamera3D]. -## -## Defines how [param PhantomCameras] transition between one another. -## Changing the tween values for a given [param PhantomCamera] determines how -## transitioning to that instance will look like. - -enum TransitionType { - LINEAR = 0, ## The animation is interpolated linearly. - SINE = 1, ## The animation is interpolated using a sine function. - QUINT = 2, ## The animation is interpolated with a quintic (to the power of 5) function. - QUART = 3, ## The animation is interpolated with a quartic (to the power of 4) function. - QUAD = 4, ## The animation is interpolated with a quadratic (to the power of 2) function. - EXPO = 5, ## The animation is interpolated with an exponential (to the power of x) function. - ELASTIC = 6, ## The animation is interpolated with elasticity, wiggling around the edges. - CUBIC = 7, ## The animation is interpolated with a cubic (to the power of 3) function. - CIRC = 8, ## The animation is interpolated with a function using square roots. - BOUNCE = 9, ## The animation is interpolated by bouncing at the end. - BACK = 10, ## The animation is interpolated backing out at ends. -# CUSTOM = 11, -# NONE = 12, -} - -enum EaseType { - EASE_IN = 0, ## The interpolation starts slowly and speeds up towards the end. - EASE_OUT = 1, ## The interpolation starts quickly and slows down towards the end. - EASE_IN_OUT = 2, ## A combination of EASE_IN and EASE_OUT. The interpolation is slowest at both ends. - EASE_OUT_IN = 3, ## A combination of EASE_IN and EASE_OUT. The interpolation is fastest at both ends. -} - -## The time it takes to tween to this PhantomCamera in [param seconds]. -@export var duration: float = 1.0 - -## The transition bezier type for the tween. The options are defined in the [enum TransitionType]. -@export var transition: TransitionType = TransitionType.LINEAR - -## The ease type for the tween. The options are defined in the [enum EaseType]. -@export var ease: EaseType = EaseType.EASE_IN_OUT diff --git a/addons/phantom_camera/scripts/resources/tween_resource.gd.uid b/addons/phantom_camera/scripts/resources/tween_resource.gd.uid deleted file mode 100644 index a0f2cf1..0000000 --- a/addons/phantom_camera/scripts/resources/tween_resource.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://8umksf8e80fw diff --git a/addons/phantom_camera/themes/button_focus.tres b/addons/phantom_camera/themes/button_focus.tres deleted file mode 100644 index e6fcc45..0000000 --- a/addons/phantom_camera/themes/button_focus.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://p058hmj3uut0"] - -[resource] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 diff --git a/addons/phantom_camera/themes/button_hover.tres b/addons/phantom_camera/themes/button_hover.tres deleted file mode 100644 index 9d37a86..0000000 --- a/addons/phantom_camera/themes/button_hover.tres +++ /dev/null @@ -1,13 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://5weqvkjsfso3"] - -[resource] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.960784, 0.960784, 0.960784, 1) -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 diff --git a/addons/phantom_camera/themes/button_normal.tres b/addons/phantom_camera/themes/button_normal.tres deleted file mode 100644 index 4eae33d..0000000 --- a/addons/phantom_camera/themes/button_normal.tres +++ /dev/null @@ -1,17 +0,0 @@ -[gd_resource type="StyleBoxFlat" format=3 uid="uid://bclbwo3xrdat0"] - -[resource] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 diff --git a/addons/phantom_camera/themes/theme.tres b/addons/phantom_camera/themes/theme.tres deleted file mode 100644 index 7ce53d8..0000000 --- a/addons/phantom_camera/themes/theme.tres +++ /dev/null @@ -1,102 +0,0 @@ -[gd_resource type="Theme" load_steps=12 format=3 uid="uid://bhppejri5dbsf"] - -[ext_resource type="FontFile" uid="uid://dve7mgsjik4dg" path="res://addons/phantom_camera/fonts/Nunito-Regular.ttf" id="1_5rtjh"] -[ext_resource type="StyleBox" uid="uid://5weqvkjsfso3" path="res://addons/phantom_camera/themes/button_hover.tres" id="2_du6h5"] -[ext_resource type="StyleBox" uid="uid://bclbwo3xrdat0" path="res://addons/phantom_camera/themes/button_normal.tres" id="3_a8j1f"] - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ek0y3"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_rjkuq"] -content_margin_left = 8.0 -content_margin_top = 4.0 -content_margin_right = 8.0 -content_margin_bottom = 4.0 -bg_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_x7u0w"] -content_margin_top = 2.0 -content_margin_right = 8.0 -bg_color = Color(0.0784314, 0.109804, 0.129412, 1) -border_width_top = 2 -border_width_right = 2 -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_right = 10 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_dln2q"] -content_margin_top = 8.0 -content_margin_bottom = 8.0 -draw_center = false - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_wk7ot"] -bg_color = Color(0.227451, 0.72549, 0.603922, 1) -border_color = Color(0.227451, 0.72549, 0.603922, 1) -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_jidrt"] -bg_color = Color(0.960784, 0.960784, 0.960784, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_o2xwc"] -bg_color = Color(0.960784, 0.960784, 0.960784, 1) -border_width_left = 2 -border_width_top = 2 -border_width_right = 2 -border_width_bottom = 2 -corner_radius_top_left = 8 -corner_radius_top_right = 8 -corner_radius_bottom_right = 8 -corner_radius_bottom_left = 8 - -[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_ul127"] -draw_center = false -border_width_left = 4 -border_width_right = 4 -border_color = Color(0.8, 0.8, 0.8, 0) - -[resource] -default_font = ExtResource("1_5rtjh") -Button/colors/font_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/colors/font_focus_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/font_hover_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/font_hover_pressed_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/font_pressed_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/icon_focus_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/icon_hover_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/icon_hover_pressed_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/colors/icon_normal_color = Color(0.0784314, 0.109804, 0.129412, 1) -Button/colors/icon_pressed_color = Color(0.227451, 0.72549, 0.603922, 1) -Button/styles/focus = SubResource("StyleBoxFlat_ek0y3") -Button/styles/hover = ExtResource("2_du6h5") -Button/styles/hover_pressed = null -Button/styles/normal = ExtResource("3_a8j1f") -Button/styles/pressed = SubResource("StyleBoxFlat_rjkuq") -PanelContainer/styles/panel = SubResource("StyleBoxFlat_x7u0w") -ScrollContainer/styles/panel = SubResource("StyleBoxFlat_dln2q") -VBoxContainer/constants/separation = 8 -VScrollBar/styles/grabber = SubResource("StyleBoxFlat_wk7ot") -VScrollBar/styles/grabber_highlight = SubResource("StyleBoxFlat_jidrt") -VScrollBar/styles/grabber_pressed = SubResource("StyleBoxFlat_o2xwc") -VScrollBar/styles/scroll = SubResource("StyleBoxFlat_ul127") diff --git a/project.godot b/project.godot index 64d7af7..53652a9 100644 --- a/project.godot +++ b/project.godot @@ -17,7 +17,6 @@ config/icon="res://icon.svg" [autoload] -PhantomCameraManager="*res://addons/phantom_camera/scripts/managers/phantom_camera_manager.gd" CameraSystem="*res://_shared/camera/CameraSystem.tscn" GlobalEvent="*res://_shared/global_event.gd" ReedVFX="*res://addons/reedfx/vfx/ReedVFXSystem.tscn" @@ -33,7 +32,7 @@ window/stretch/mode="canvas_items" [editor_plugins] -enabled=PackedStringArray("res://addons/phantom_camera/plugin.cfg", "res://addons/reedcomponent/plugin.cfg", "res://addons/reedfx/plugin.cfg", "res://addons/reedinput/plugin.cfg", "res://addons/reedscene/plugin.cfg") +enabled=PackedStringArray("res://addons/reedcomponent/plugin.cfg", "res://addons/reedfx/plugin.cfg", "res://addons/reedinput/plugin.cfg", "res://addons/reedscene/plugin.cfg") [file_customization]