Adjust clip plane

I should add the tolerance (for portal frame) back in
This commit is contained in:
Vojtěch Struhár 2025-03-04 18:25:06 +01:00
parent da068feed1
commit 0ee4f5c250
2 changed files with 36 additions and 11 deletions

View File

@ -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():

View File

@ -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")