diff --git a/portal_camera.gd b/portal_camera.gd index 521f85b..d49db7e 100644 --- a/portal_camera.gd +++ b/portal_camera.gd @@ -10,6 +10,10 @@ extends Camera3D 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 @@ -41,13 +45,32 @@ func _process(delta: float) -> void: var relative_to_target = target.global_transform * flipped self.global_transform = relative_to_target + + 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)) + var corner_3:Vector3 = target.to_global(Vector3(_mesh_aabb.position.x + _mesh_aabb.size.x, _mesh_aabb.position.y + _mesh_aabb.size.y, 0)) + var corner_4:Vector3 = target.to_global(Vector3(_mesh_aabb.position.x, _mesh_aabb.position.y + _mesh_aabb.size.y, 0)) + + # Calculate the distance along the exit camera forward vector at which each of the portal corners projects + var camera_forward:Vector3 = -global_transform.basis.z.normalized() + + var d_1:float = (corner_1 - global_position).dot(camera_forward) + var d_2:float = (corner_2 - global_position).dot(camera_forward) + var d_3:float = (corner_3 - 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 + return max(0.01, min(d_1, d_2, d_3, d_4) - 0.05) func check() -> bool: return target != null and \ player_camera != null and \ home != null and \ - portal_mesh != null + portal_mesh != null and \ + _portal_mesh_aabb != null func _grab_editor_camera() -> void: if Engine.is_editor_hint(): diff --git a/world.tscn b/world.tscn index f40f2d8..7cd1f2f 100644 --- a/world.tscn +++ b/world.tscn @@ -23,21 +23,21 @@ glow_enabled = true [sub_resource type="BoxMesh" id="BoxMesh_fj7yv"] size = Vector3(20, 1, 20) -[sub_resource type="ViewportTexture" id="ViewportTexture_036b0"] +[sub_resource type="ViewportTexture" id="ViewportTexture_dwbse"] viewport_path = NodePath("PortalA/SubViewport") [sub_resource type="ShaderMaterial" id="ShaderMaterial_dwbse"] resource_local_to_scene = true render_priority = 0 shader = ExtResource("2_036b0") -shader_parameter/albedo = SubResource("ViewportTexture_036b0") +shader_parameter/albedo = SubResource("ViewportTexture_dwbse") [sub_resource type="PlaneMesh" id="PlaneMesh_pkg7o"] material = SubResource("ShaderMaterial_dwbse") size = Vector2(1.5, 2) orientation = 2 -[sub_resource type="Environment" id="Environment_dwbse"] +[sub_resource type="Environment" id="Environment_gbfbk"] background_mode = 2 sky = SubResource("Sky_dwbse") glow_enabled = true @@ -53,20 +53,20 @@ _surfaces = [{ "vertex_data": PackedByteArray("AACAvwAAoL8AAIC+AACAvwAAoL8AAIA+AABAvwAAoL8AAIC+AABAPwAAgD8AAIA+AACAPwAAoD8AAIA+AABAPwAAoL8AAIA+AACAvwAAoL8AAIA+AACAvwAAoL8AAIC+AACAvwAAoD8AAIC+AABAvwAAoL8AAIC+AACAvwAAoL8AAIA+AABAvwAAoL8AAIA+AABAvwAAoL8AAIA+AACAvwAAoL8AAIA+AABAvwAAgD8AAIA+AABAvwAAgD8AAIC+AACAvwAAoD8AAIC+AABAvwAAoL8AAIC+AABAvwAAgD8AAIC+AACAPwAAoD8AAIC+AACAvwAAoD8AAIC+AACAvwAAoD8AAIC+AACAvwAAoD8AAIA+AACAvwAAoL8AAIA+AACAvwAAoD8AAIA+AABAvwAAgD8AAIA+AACAvwAAoL8AAIA+AACAvwAAoD8AAIC+AACAPwAAoD8AAIA+AACAvwAAoD8AAIA+AABAvwAAgD8AAIA+AACAvwAAoD8AAIA+AABAPwAAgD8AAIA+AACAPwAAoL8AAIC+AABAPwAAoL8AAIC+AACAPwAAoL8AAIA+AACAvwAAoL8AAIC+AABAvwAAoL8AAIC+AACAvwAAoD8AAIC+AABAPwAAoL8AAIC+AACAPwAAoL8AAIC+AABAPwAAgD8AAIC+AACAPwAAoL8AAIA+AABAPwAAoL8AAIC+AABAPwAAoL8AAIA+AACAPwAAoL8AAIA+AACAPwAAoD8AAIA+AACAPwAAoL8AAIC+AACAPwAAoL8AAIA+AABAPwAAoL8AAIA+AACAPwAAoD8AAIA+AABAPwAAgD8AAIC+AACAPwAAoD8AAIC+AABAvwAAgD8AAIC+AACAPwAAoD8AAIC+AACAPwAAoD8AAIA+AACAvwAAoD8AAIC+AACAPwAAoD8AAIC+AABAPwAAgD8AAIC+AACAPwAAoL8AAIC+AACAPwAAoD8AAIA+AACAPwAAoD8AAIC+AACAPwAAoL8AAIC+AABAPwAAgD8AAIA+AACAvwAAoD8AAIA+AACAPwAAoD8AAIA+AABAvwAAgD8AAIA+AABAvwAAoL8AAIC+AABAvwAAoL8AAIA+AABAvwAAoL8AAIC+AABAvwAAgD8AAIA+AABAvwAAgD8AAIC+AABAPwAAgD8AAIC+AABAPwAAoL8AAIA+AABAPwAAoL8AAIC+AABAPwAAgD8AAIA+AABAPwAAgD8AAIC+AABAvwAAgD8AAIC+AABAPwAAoL8AAIA+AABAPwAAgD8AAIC+AABAPwAAgD8AAIA+AABAvwAAgD8AAIC+AABAvwAAgD8AAIA+AABAPwAAgD8AAIA+/38AAP//AAD/fwAA//8AAP9/AAD//wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8/AAD/f/9//n8AAP9//3/+fwAA/3//f/5//38AAP//AAD/fwAA//8AAP9/AAD//wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8//////wAA/z//////AAD/P/////8AAP8//////wAA/z//////AAD/P/////8AAP8/AAD/f/9//n8AAP9//3/+fwAA/3//f/5//3//fwAA/z//f/9/AAD/P/9//38AAP8//3//////AAD/f/////8AAP9//////wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8//38AAP//AAD/fwAA//8AAP9/AAD//wAA/////wAA/z//////AAD/P/////8AAP8//////wAA/z//////AAD/P/////8AAP8//38AAP//AAD/fwAA//8AAP9/AAD//wAA////f/9//n////9//3/+f////3//f/5//3//fwAA/z//f/9/AAD/P/9//38AAP8//////wAA/z//////AAD/P/////8AAP8//3//////AAD/f/////8AAP9//////wAA/////wAA/z//////AAD/P/////8AAP8/////f/9//n////9//3/+f////3//f/5//3//fwAA/z//f/9/AAD/P/9//38AAP8/////f/9/AID///9//38AgP///3//fwCA////f/9/AID///9//38AgP///3//fwCAAAD/f/9/AIAAAP9//38AgAAA/3//fwCA/38AAP//////fwAA//////9/AAD/////AAD/f/9/AIAAAP9//38AgAAA/3//fwCA/38AAP//////fwAA//////9/AAD/////") }] -[sub_resource type="ViewportTexture" id="ViewportTexture_pkg7o"] +[sub_resource type="ViewportTexture" id="ViewportTexture_ioo17"] viewport_path = NodePath("PortalB/SubViewport") [sub_resource type="ShaderMaterial" id="ShaderMaterial_aqk2v"] render_priority = 0 shader = ExtResource("2_036b0") -shader_parameter/albedo = SubResource("ViewportTexture_pkg7o") +shader_parameter/albedo = SubResource("ViewportTexture_ioo17") [sub_resource type="PlaneMesh" id="PlaneMesh_036b0"] material = SubResource("ShaderMaterial_aqk2v") size = Vector2(1.5, 2) orientation = 2 -[sub_resource type="Environment" id="Environment_gbfbk"] +[sub_resource type="Environment" id="Environment_wse8f"] background_mode = 2 sky = SubResource("Sky_dwbse") glow_enabled = true @@ -114,8 +114,9 @@ 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.085151, -0.730565, 0, 0.993276, 0.115771, 0.735511, -0.0784365, 0.672957, 1.96377, 1.7265, 7.70245) -environment = SubResource("Environment_dwbse") +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") @@ -142,8 +143,9 @@ 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.085151, 0.730565, 0, 0.993276, 0.115771, -0.735511, 0.0784365, -0.672957, 2.16021, 1.7265, -0.57847) -environment = SubResource("Environment_gbfbk") +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")