From 2438205535f8d58bc4ce2cd70dfcacdf15281a6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Struha=CC=81r?= Date: Tue, 4 Mar 2025 21:22:43 +0100 Subject: [PATCH] Try adding subviewports programmatically - doesn't work I hoped this would remove the frame lag in portals --- addons/freecam_3D/freecam.gd | 1 - portal_camera.gd | 24 +++++++++++++----- portal_camera.tscn | 1 + world.tscn | 48 ++++++++++++++++-------------------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/addons/freecam_3D/freecam.gd b/addons/freecam_3D/freecam.gd index b019470..1c92c7b 100644 --- a/addons/freecam_3D/freecam.gd +++ b/addons/freecam_3D/freecam.gd @@ -142,4 +142,3 @@ func _add_key_input_action(name: String, key: Key) -> void: InputMap.add_action(name) InputMap.action_add_event(name, ev) - diff --git a/portal_camera.gd b/portal_camera.gd index d49db7e..825a28b 100644 --- a/portal_camera.gd +++ b/portal_camera.gd @@ -7,15 +7,12 @@ extends Camera3D set(v): portal_mesh = v if v != null: - print("set: portal_mesh", v) - var mat = v.mesh.surface_get_material(0) as ShaderMaterial - mat.set_shader_parameter("albedo", get_parent().get_texture()) - _portal_mesh_aabb = v.get_aabb() var _portal_mesh_aabb: AABB @export var player_camera: Node3D +@export_range(0, 1, 0.01) var frame_width: float = 0.1 @export_tool_button("Grab editor camera", "Camera3D") var _tb_grab_editor_camera: Callable = _grab_editor_camera @@ -33,7 +30,21 @@ func _ready() -> void: env.tonemap_mode = Environment.TONE_MAPPER_LINEAR env.tonemap_exposure = 1 self.environment = env - + + if not Engine.is_editor_hint(): + assert(check()) + + var vp = SubViewport.new() + vp.name = home.name + "_SubViewport" + vp.size = get_viewport().size + await get_parent().ready + get_parent().add_child(vp) + + self.reparent(vp) + + var mat = portal_mesh.mesh.surface_get_material(0) as ShaderMaterial + mat.set_shader_parameter("albedo", vp.get_texture()) + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: @@ -48,6 +59,7 @@ func _process(delta: float) -> void: self.near = _get_near_plane(_portal_mesh_aabb) + func _get_near_plane(_mesh_aabb: AABB) -> float: var corner_1:Vector3 = target.to_global(Vector3(_mesh_aabb.position.x, _mesh_aabb.position.y, 0)) var corner_2:Vector3 = target.to_global(Vector3(_mesh_aabb.position.x + _mesh_aabb.size.x, _mesh_aabb.position.y, 0)) @@ -63,7 +75,7 @@ func _get_near_plane(_mesh_aabb: AABB) -> float: var d_4:float = (corner_4 - global_position).dot(camera_forward) # The near clip distance is the shortest distance which still contains all the corners - return max(0.01, min(d_1, d_2, d_3, d_4) - 0.05) + return max(0.01, min(d_1, d_2, d_3, d_4) - frame_width) func check() -> bool: return target != null and \ diff --git a/portal_camera.tscn b/portal_camera.tscn index f628c0a..65ed5a6 100644 --- a/portal_camera.tscn +++ b/portal_camera.tscn @@ -10,6 +10,7 @@ size = Vector3(1.5, 1, 0.68) [node name="PortalCamera" type="Camera3D"] script = ExtResource("1_jsd0o") +frame_width = null [node name="Cone" type="MeshInstance3D" parent="."] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, -0.5) diff --git a/world.tscn b/world.tscn index 7cd1f2f..4237b4f 100644 --- a/world.tscn +++ b/world.tscn @@ -37,7 +37,7 @@ material = SubResource("ShaderMaterial_dwbse") size = Vector2(1.5, 2) orientation = 2 -[sub_resource type="Environment" id="Environment_gbfbk"] +[sub_resource type="Environment" id="Environment_dwbse"] background_mode = 2 sky = SubResource("Sky_dwbse") glow_enabled = true @@ -66,7 +66,7 @@ material = SubResource("ShaderMaterial_aqk2v") size = Vector2(1.5, 2) orientation = 2 -[sub_resource type="Environment" id="Environment_wse8f"] +[sub_resource type="Environment" id="Environment_gbfbk"] background_mode = 2 sky = SubResource("Sky_dwbse") glow_enabled = true @@ -109,18 +109,15 @@ mesh = SubResource("PlaneMesh_pkg7o") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.49309, 0) text = "PortalA" -[node name="SubViewport" type="SubViewport" parent="PortalA"] -process_priority = 1000 -size = Vector2i(1920, 1080) - -[node name="PortalCamera" parent="PortalA/SubViewport" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] -transform = Transform3D(0.677513, 0.0851509, -0.730565, 0, 0.993276, 0.115771, 0.735511, -0.0784365, 0.672957, 1.96377, 1.7265, 7.70245) -environment = SubResource("Environment_gbfbk") -near = 4.73928 -home = NodePath("../..") -target = NodePath("../../../PortalB") -portal_mesh = NodePath("../../MeshA") -player_camera = NodePath("../../../Freecam3D") +[node name="PortalCamera" parent="PortalA" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] +transform = Transform3D(0.856264, 0.0598003, -0.513065, -5.47998e-09, 0.993276, 0.115771, 0.516539, -0.0991306, 0.850506, 4.87687, 1.7265, 4.89861) +environment = SubResource("Environment_dwbse") +near = 5.58832 +home = NodePath("..") +target = NodePath("../../PortalB") +portal_mesh = NodePath("../MeshA") +player_camera = NodePath("../../Freecam3D") +frame_width = 0.4 [node name="PortalFrame" type="MeshInstance3D" parent="PortalA"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) @@ -138,18 +135,15 @@ mesh = SubResource("PlaneMesh_036b0") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.49309, 0) text = "PortalB" -[node name="SubViewport" type="SubViewport" parent="PortalB"] -process_priority = 1000 -size = Vector2i(1920, 1080) - -[node name="PortalCamera" parent="PortalB/SubViewport" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] -transform = Transform3D(-0.677513, -0.0851509, 0.730565, 0, 0.993276, 0.115771, -0.735511, 0.0784365, -0.672957, 2.16021, 1.7265, -0.57847) -environment = SubResource("Environment_wse8f") -near = 4.98828 -home = NodePath("../..") -target = NodePath("../../../PortalA") -portal_mesh = NodePath("../../MeshB") -player_camera = NodePath("../../../Freecam3D") +[node name="PortalCamera" parent="PortalB" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] +transform = Transform3D(0.516539, -0.0991306, 0.850506, -5.47998e-09, 0.993276, 0.115771, -0.856264, -0.0598003, 0.513066, 1.39861, 1.7265, -1.25289) +environment = SubResource("Environment_gbfbk") +near = 4.72397 +home = NodePath("..") +target = NodePath("../../PortalA") +portal_mesh = NodePath("../MeshB") +player_camera = NodePath("../../Freecam3D") +frame_width = 0.4 [node name="PortalFrame2" type="MeshInstance3D" parent="PortalB"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) @@ -158,7 +152,7 @@ mesh = SubResource("ArrayMesh_tlwt5") skeleton = NodePath("../../PortalA") [node name="Freecam3D" type="Camera3D" parent="."] -transform = Transform3D(0.735511, -0.0784364, 0.672957, 0, 0.993276, 0.115771, -0.677513, -0.085151, 0.730565, 6.20245, 1.7265, 3.66021) +transform = Transform3D(0.516539, -0.0991306, 0.850506, -5.47998e-09, 0.993276, 0.115771, -0.856264, -0.0598004, 0.513066, 7.02259, 1.7265, 2.24711) script = ExtResource("5_036b0") metadata/_custom_type_script = "uid://hhinqn2b35ry"