Try adding subviewports programmatically - doesn't work

I hoped this would remove the frame lag in portals
This commit is contained in:
Vojtěch Struhár 2025-03-04 21:22:43 +01:00
parent 0ee4f5c250
commit 2438205535
4 changed files with 40 additions and 34 deletions

View File

@ -142,4 +142,3 @@ func _add_key_input_action(name: String, key: Key) -> void:
InputMap.add_action(name) InputMap.add_action(name)
InputMap.action_add_event(name, ev) InputMap.action_add_event(name, ev)

View File

@ -7,15 +7,12 @@ extends Camera3D
set(v): set(v):
portal_mesh = v portal_mesh = v
if v != null: 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() _portal_mesh_aabb = v.get_aabb()
var _portal_mesh_aabb: AABB var _portal_mesh_aabb: AABB
@export var player_camera: Node3D @export var player_camera: Node3D
@export_range(0, 1, 0.01) var frame_width: float = 0.1
@export_tool_button("Grab editor camera", "Camera3D") @export_tool_button("Grab editor camera", "Camera3D")
var _tb_grab_editor_camera: Callable = _grab_editor_camera 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_mode = Environment.TONE_MAPPER_LINEAR
env.tonemap_exposure = 1 env.tonemap_exposure = 1
self.environment = env 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. # Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void: func _process(delta: float) -> void:
@ -48,6 +59,7 @@ func _process(delta: float) -> void:
self.near = _get_near_plane(_portal_mesh_aabb) self.near = _get_near_plane(_portal_mesh_aabb)
func _get_near_plane(_mesh_aabb: AABB) -> float: 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_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)) 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) 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 # 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: func check() -> bool:
return target != null and \ return target != null and \

View File

@ -10,6 +10,7 @@ size = Vector3(1.5, 1, 0.68)
[node name="PortalCamera" type="Camera3D"] [node name="PortalCamera" type="Camera3D"]
script = ExtResource("1_jsd0o") script = ExtResource("1_jsd0o")
frame_width = null
[node name="Cone" type="MeshInstance3D" parent="."] [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) transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, -0.5)

View File

@ -37,7 +37,7 @@ material = SubResource("ShaderMaterial_dwbse")
size = Vector2(1.5, 2) size = Vector2(1.5, 2)
orientation = 2 orientation = 2
[sub_resource type="Environment" id="Environment_gbfbk"] [sub_resource type="Environment" id="Environment_dwbse"]
background_mode = 2 background_mode = 2
sky = SubResource("Sky_dwbse") sky = SubResource("Sky_dwbse")
glow_enabled = true glow_enabled = true
@ -66,7 +66,7 @@ material = SubResource("ShaderMaterial_aqk2v")
size = Vector2(1.5, 2) size = Vector2(1.5, 2)
orientation = 2 orientation = 2
[sub_resource type="Environment" id="Environment_wse8f"] [sub_resource type="Environment" id="Environment_gbfbk"]
background_mode = 2 background_mode = 2
sky = SubResource("Sky_dwbse") sky = SubResource("Sky_dwbse")
glow_enabled = true 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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.49309, 0)
text = "PortalA" text = "PortalA"
[node name="SubViewport" type="SubViewport" parent="PortalA"] [node name="PortalCamera" parent="PortalA" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")]
process_priority = 1000 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)
size = Vector2i(1920, 1080) environment = SubResource("Environment_dwbse")
near = 5.58832
[node name="PortalCamera" parent="PortalA/SubViewport" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] home = NodePath("..")
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) target = NodePath("../../PortalB")
environment = SubResource("Environment_gbfbk") portal_mesh = NodePath("../MeshA")
near = 4.73928 player_camera = NodePath("../../Freecam3D")
home = NodePath("../..") frame_width = 0.4
target = NodePath("../../../PortalB")
portal_mesh = NodePath("../../MeshA")
player_camera = NodePath("../../../Freecam3D")
[node name="PortalFrame" type="MeshInstance3D" parent="PortalA"] [node name="PortalFrame" type="MeshInstance3D" parent="PortalA"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) 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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.49309, 0)
text = "PortalB" text = "PortalB"
[node name="SubViewport" type="SubViewport" parent="PortalB"] [node name="PortalCamera" parent="PortalB" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")]
process_priority = 1000 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)
size = Vector2i(1920, 1080) environment = SubResource("Environment_gbfbk")
near = 4.72397
[node name="PortalCamera" parent="PortalB/SubViewport" node_paths=PackedStringArray("home", "target", "portal_mesh", "player_camera") instance=ExtResource("3_tlwt5")] home = NodePath("..")
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) target = NodePath("../../PortalA")
environment = SubResource("Environment_wse8f") portal_mesh = NodePath("../MeshB")
near = 4.98828 player_camera = NodePath("../../Freecam3D")
home = NodePath("../..") frame_width = 0.4
target = NodePath("../../../PortalA")
portal_mesh = NodePath("../../MeshB")
player_camera = NodePath("../../../Freecam3D")
[node name="PortalFrame2" type="MeshInstance3D" parent="PortalB"] [node name="PortalFrame2" type="MeshInstance3D" parent="PortalB"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) 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") skeleton = NodePath("../../PortalA")
[node name="Freecam3D" type="Camera3D" parent="."] [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") script = ExtResource("5_036b0")
metadata/_custom_type_script = "uid://hhinqn2b35ry" metadata/_custom_type_script = "uid://hhinqn2b35ry"