My own buggy portal implementation
This commit is contained in:
parent
ded1600175
commit
50314f1ad8
4
hud.gd
4
hud.gd
@ -1,13 +1,17 @@
|
||||
extends VBoxContainer
|
||||
|
||||
@onready var fps_label: Label = $FPS_Label
|
||||
|
||||
func _ready() -> void:
|
||||
toggle_hud() # This should hide the HUD by default
|
||||
fps_label.reparent.call_deferred(get_parent())
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
if Input.is_action_just_pressed("ui_cancel"):
|
||||
toggle_hud()
|
||||
|
||||
fps_label.text = "FPS: %d" % Engine.get_frames_per_second()
|
||||
|
||||
func toggle_hud() -> void:
|
||||
|
||||
var should_show = Input.mouse_mode == Input.MOUSE_MODE_CAPTURED
|
||||
|
4
hud.tscn
4
hud.tscn
@ -12,6 +12,10 @@ unique_name_in_owner = true
|
||||
layout_mode = 2
|
||||
text = "Back to Menu"
|
||||
|
||||
[node name="FPS_Label" type="Label" parent="."]
|
||||
layout_mode = 2
|
||||
text = "FPS: -1"
|
||||
|
||||
[node name="HSeparator" type="HSeparator" parent="."]
|
||||
layout_mode = 2
|
||||
|
||||
|
@ -134,5 +134,5 @@ script = ExtResource("7_2gewm")
|
||||
base = NodePath("../WorldEnvironment")
|
||||
|
||||
[node name="ProceduralMeshMaker" parent="." node_paths=PackedStringArray("portal") instance=ExtResource("8_vdsn8")]
|
||||
width = 2.0
|
||||
portal = NodePath("../Portal_orange")
|
||||
width = 2.0
|
||||
|
15
levels/level_my_portals.gd
Normal file
15
levels/level_my_portals.gd
Normal file
@ -0,0 +1,15 @@
|
||||
extends Node3D
|
||||
|
||||
@onready var orange: Node3D = $Orange
|
||||
@onready var green: Node3D = $Green
|
||||
@onready var player: CharacterBody3D = $Player
|
||||
|
||||
|
||||
func _on_transport_to_orange_pressed() -> void:
|
||||
player.global_position = orange.global_position
|
||||
player.global_position.y += 10
|
||||
|
||||
|
||||
func _on_transport_to_green_pressed() -> void:
|
||||
player.global_position = green.global_position
|
||||
player.global_position.y += 10
|
1
levels/level_my_portals.gd.uid
Normal file
1
levels/level_my_portals.gd.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://c8vjum7jkvrv0
|
268
levels/level_my_portals.tscn
Normal file
268
levels/level_my_portals.tscn
Normal file
@ -0,0 +1,268 @@
|
||||
[gd_scene load_steps=25 format=4 uid="uid://rlienyx6av8u"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://cxopylew5786r" path="res://portal_environment_adapter.tscn" id="1_eoaoo"]
|
||||
[ext_resource type="Script" uid="uid://c8vjum7jkvrv0" path="res://levels/level_my_portals.gd" id="1_pccqs"]
|
||||
[ext_resource type="Material" uid="uid://bx6qeabdhq2s" path="res://addons/kenney_prototype_tools/materials/dark/material_01.tres" id="1_v6nyh"]
|
||||
[ext_resource type="Material" uid="uid://dn16yhnqtqh7i" path="res://addons/kenney_prototype_tools/materials/orange/material_02.tres" id="2_5nkxg"]
|
||||
[ext_resource type="PackedScene" uid="uid://cgdlowfuuorvi" path="res://player.tscn" id="3_ysrn6"]
|
||||
[ext_resource type="PackedScene" uid="uid://b5x7fmpwck335" path="res://hud.tscn" id="4_t21k5"]
|
||||
[ext_resource type="Material" uid="uid://oob6p5w3hsl5" path="res://addons/kenney_prototype_tools/materials/red/material_09.tres" id="6_2ffpc"]
|
||||
[ext_resource type="Material" uid="uid://b7kc8jfs4fowj" path="res://addons/kenney_prototype_tools/materials/green/material_02.tres" id="6_b88kk"]
|
||||
[ext_resource type="Script" uid="uid://dh8miiv7xc4ps" path="res://scripts/my_portal.gd" id="7_pvdtj"]
|
||||
[ext_resource type="Material" uid="uid://ci8rdsdqe5a61" path="res://addons/kenney_prototype_tools/materials/light/material_06.tres" id="8_dhtg5"]
|
||||
[ext_resource type="PackedScene" uid="uid://d1dtxvwk86ple" path="res://procedural_mesh_maker.tscn" id="9_dhtg5"]
|
||||
|
||||
[sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_t21k5"]
|
||||
sky_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
|
||||
ground_horizon_color = Color(0.662243, 0.671743, 0.686743, 1)
|
||||
|
||||
[sub_resource type="Sky" id="Sky_eoaoo"]
|
||||
sky_material = SubResource("ProceduralSkyMaterial_t21k5")
|
||||
|
||||
[sub_resource type="Environment" id="Environment_b88kk"]
|
||||
background_mode = 2
|
||||
sky = SubResource("Sky_eoaoo")
|
||||
tonemap_mode = 2
|
||||
glow_enabled = true
|
||||
|
||||
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_7nftg"]
|
||||
data = PackedVector3Array(-9, -1.5, -9, -10, -1.5, -10, -9, -1.5, 9, -10, -1.5, 10, -10, -1.5, -10, -10, 1.5, -10, -10, -1.5, -10, -9, -1.5, -9, 9, -1.5, -9, 10, -1.5, -10, -10, 1.5, -10, -10, -1.5, -10, -9, -1.5, 9, -10, -1.5, -10, -10, -1.5, 10, 10, -1.5, 10, -9, -1.5, 9, -10, -1.5, 10, -9, 1.5, -9, -10, 1.5, 10, -10, 1.5, -10, 10, 1.5, -10, -9, 1.5, -9, -10, 1.5, -10, -10, 1.5, -10, -10, 1.5, 10, -10, -1.5, 10, -9, 1.5, 9, -10, 1.5, 10, -9, 1.5, -9, -10, 1.5, 10, 10, 1.5, 10, -10, -1.5, 10, -10, 1.5, 10, -9, 1.5, 9, 9, 1.5, 9, -10, -1.5, -10, 9, -1.5, -9, 10, -1.5, -10, 9, -1.5, -9, 10, -1.5, 10, 10, -1.5, -10, 10, -1.5, 10, 9, -1.5, 9, -9, -1.5, 9, 10, 1.5, 10, 10, -1.5, 10, -10, -1.5, 10, 9, -1.5, 9, 10, -1.5, 10, 9, -1.5, -9, 10, -1.5, 10, 10, 1.5, 10, 10, -1.5, -10, 10, -1.5, -10, 10, 1.5, -10, -10, 1.5, -10, 10, 1.5, -10, 9, 1.5, -9, -9, 1.5, -9, 10, 1.5, 10, 10, 1.5, -10, 10, -1.5, -10, 9, 1.5, -9, 10, 1.5, -10, 9, 1.5, 9, -10, 1.5, 10, 9, 1.5, 9, 10, 1.5, 10, 9, 1.5, 9, 10, 1.5, -10, 10, 1.5, 10, -9, 1.5, -9, -9, -1.5, -9, -9, -1.5, 9, 9, -1.5, -9, -9, -1.5, -9, -9, 1.5, -9, -9, -1.5, 9, -9, 1.5, 9, -9, 1.5, -9, 9, 1.5, 9, -9, 1.5, 9, -9, -1.5, 9, -9, -1.5, 9, 9, -1.5, 9, 9, 1.5, 9, 9, 1.5, 9, 9, -1.5, 9, 9, -1.5, -9, -9, 1.5, -9, 9, 1.5, -9, 9, -1.5, -9, 9, -1.5, -9, 9, 1.5, -9, 9, 1.5, 9)
|
||||
|
||||
[sub_resource type="ArrayMesh" id="ArrayMesh_v6nyh"]
|
||||
_surfaces = [{
|
||||
"aabb": AABB(-10, -1.5, -10, 20, 3, 20),
|
||||
"attribute_data": PackedByteArray("MzNzP83MTD0AAIA/AAAAAM3MTD3NzEw9AACAPwAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAAAAzM3M/zcxMPTMzcz8zM3M/AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAzcxMPc3MTD0AAIA/AAAAAAAAAAAAAAAAAAAAAAAAgD/NzEw9zcxMPQAAAAAAAAAAMzNzPzMzcz8AAAAAAACAPwAAgD8AAIA/AACAPwAAAAAzM3M/MzNzPwAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/zcxMPTMzcz8AAAAAAACAPzMzcz8zM3M/AACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD/NzEw9MzNzP83MTD3NzEw9AACAPwAAAAAzM3M/MzNzPwAAgD8AAIA/MzNzPzMzcz8AAAAAAACAPwAAgD8AAIA/AAAAAAAAgD/NzEw9MzNzP83MTD3NzEw9AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/zcxMPTMzcz8AAAAAAACAPzMzcz8zM3M/AACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AACAPwAAAAAzM3M/zcxMPTMzcz8zM3M/AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/MzNzP83MTD0AAIA/AAAAAM3MTD3NzEw9AAAAAAAAgD/NzEw9zcxMPQAAAAAAAAAAzcxMPc3MTD0AAIA/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAIA/AAAAAAAAAAAAAIA/AAAAAAAAgD8AAIA/AACAPwAAgD8AAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAIA/AACAPwAAgD8AAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIA/AAAAAAAAgD8AAIA/AACAPwAAgD8AAAAAAACAPwAAAAAAAAAAAACAPwAAgD8AAAAAAACAPwAAAAAAAAAA"),
|
||||
"format": 34359738391,
|
||||
"primitive": 3,
|
||||
"uv_scale": Vector4(0, 0, 0, 0),
|
||||
"vertex_count": 96,
|
||||
"vertex_data": PackedByteArray("AAAQwQAAwL8AABDBAAAgwQAAwL8AACDBAAAQwQAAwL8AABBBAAAgwQAAwL8AACBBAAAgwQAAwL8AACDBAAAgwQAAwD8AACDBAAAgwQAAwL8AACDBAAAQwQAAwL8AABDBAAAQQQAAwL8AABDBAAAgQQAAwL8AACDBAAAgwQAAwD8AACDBAAAgwQAAwL8AACDBAAAQwQAAwL8AABBBAAAgwQAAwL8AACDBAAAgwQAAwL8AACBBAAAgQQAAwL8AACBBAAAQwQAAwL8AABBBAAAgwQAAwL8AACBBAAAQwQAAwD8AABDBAAAgwQAAwD8AACBBAAAgwQAAwD8AACDBAAAgQQAAwD8AACDBAAAQwQAAwD8AABDBAAAgwQAAwD8AACDBAAAgwQAAwD8AACDBAAAgwQAAwD8AACBBAAAgwQAAwL8AACBBAAAQwQAAwD8AABBBAAAgwQAAwD8AACBBAAAQwQAAwD8AABDBAAAgwQAAwD8AACBBAAAgQQAAwD8AACBBAAAgwQAAwL8AACBBAAAgwQAAwD8AACBBAAAQwQAAwD8AABBBAAAQQQAAwD8AABBBAAAgwQAAwL8AACDBAAAQQQAAwL8AABDBAAAgQQAAwL8AACDBAAAQQQAAwL8AABDBAAAgQQAAwL8AACBBAAAgQQAAwL8AACDBAAAgQQAAwL8AACBBAAAQQQAAwL8AABBBAAAQwQAAwL8AABBBAAAgQQAAwD8AACBBAAAgQQAAwL8AACBBAAAgwQAAwL8AACBBAAAQQQAAwL8AABBBAAAgQQAAwL8AACBBAAAQQQAAwL8AABDBAAAgQQAAwL8AACBBAAAgQQAAwD8AACBBAAAgQQAAwL8AACDBAAAgQQAAwL8AACDBAAAgQQAAwD8AACDBAAAgwQAAwD8AACDBAAAgQQAAwD8AACDBAAAQQQAAwD8AABDBAAAQwQAAwD8AABDBAAAgQQAAwD8AACBBAAAgQQAAwD8AACDBAAAgQQAAwL8AACDBAAAQQQAAwD8AABDBAAAgQQAAwD8AACDBAAAQQQAAwD8AABBBAAAgwQAAwD8AACBBAAAQQQAAwD8AABBBAAAgQQAAwD8AACBBAAAQQQAAwD8AABBBAAAgQQAAwD8AACDBAAAgQQAAwD8AACBBAAAQwQAAwD8AABDBAAAQwQAAwL8AABDBAAAQwQAAwL8AABBBAAAQQQAAwL8AABDBAAAQwQAAwL8AABDBAAAQwQAAwD8AABDBAAAQwQAAwL8AABBBAAAQwQAAwD8AABBBAAAQwQAAwD8AABDBAAAQQQAAwD8AABBBAAAQwQAAwD8AABBBAAAQwQAAwL8AABBBAAAQwQAAwL8AABBBAAAQQQAAwL8AABBBAAAQQQAAwD8AABBBAAAQQQAAwD8AABBBAAAQQQAAwL8AABBBAAAQQQAAwL8AABDBAAAQwQAAwD8AABDBAAAQQQAAwD8AABDBAAAQQQAAwL8AABDBAAAQQQAAwL8AABDBAAAQQQAAwD8AABDBAAAQQQAAwD8AABBB/38AAP//AAD/fwAA//8AAP9/AAD//wAAAAD/f/9//n8AAP9//3/+fwAA/3//f/5//38AAP//AAD/fwAA//8AAP9/AAD//wAA/////wAA/z//////AAD/P/////8AAP8//38AAP//AAD/fwAA//8AAP9/AAD//wAA/38AAP//AAD/fwAA//8AAP9/AAD//wAA/3//////AAD/f///AAAAAP9//////wAA/3//////AAD/f/////8AAP9//////wAAAAD/f/9//n8AAP9//3/+fwAA/3//f/5//3///wAAAAD/f///AAAAAP9//////wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8//3///wAAAAD/f///AAAAAP9///8AAAAA/38AAP//AAD/fwAA//8AAP9/AAD//wAA/38AAP//AAD/fwAA//8AAP9/AAD//wAA/38AAP//AAD/fwAA//8AAP9/AAD//wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8//38AAP//AAD/fwAA//8AAP9/AAD//wAA////f/9//n////9//3/+f////3//f/5//////wAA/z//////AAD/P/////8AAP8//3//////AAD/f/////8AAP9//////wAA////f/9//n////9//3/+f////3//f/5//3//////AAD/f/////8AAP9///8AAAAA/3///wAAAAD/f///AAAAAP9//////wAA/3///wAAAAD/f/////8AAP9//////wAA////f/9/AID///9//38AgP///3//fwCA/3//fwAA/7//f/9/AAD/v/9//38AAP+/////f/9/AID///9//38AgP///3//fwCA/////wAA/7//////AAD/v/////8AAP+//////wAA/7//////AAD/v/////8AAP+/AAD/f/9/AIAAAP9//38AgAAA/3//fwCA/3//fwAA/7//f/9/AAD/v/9//38AAP+/AAD/f/9/AIAAAP9//38AgAAA/3//fwCA")
|
||||
}]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ysrn6"]
|
||||
size = Vector3(20, 1, 20)
|
||||
|
||||
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_5nkxg"]
|
||||
points = PackedVector3Array(-10, -0.5, -10, -10, 0.5, -10, 10, -0.5, -10, -10, -0.5, 10, -10, 0.5, 10, 10, 0.5, -10, 10, -0.5, 10, 10, 0.5, 10)
|
||||
|
||||
[sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_eoaoo"]
|
||||
data = PackedVector3Array(0.125, 1.5, 1.25, 0.125, 1.25, -1, 0.125, 1.25, 1, -0.125, -1.5, -1.25, -0.125, 1.25, -1, -0.125, -1.25, -1, -0.125, -1.5, 1.25, 0.125, -1.5, -1.25, -0.125, -1.5, -1.25, 0.125, -1.5, -1.25, -0.125, 1.5, -1.25, -0.125, -1.5, -1.25, -0.125, -1.5, 1.25, -0.125, -1.25, -1, -0.125, -1.25, 1, -0.125, -1.5, 1.25, -0.125, -1.25, 1, -0.125, 1.5, 1.25, -0.125, 1.5, -1.25, -0.125, 1.25, -1, -0.125, -1.5, -1.25, -0.125, 1.5, -1.25, -0.125, 1.25, 1, -0.125, 1.25, -1, -0.125, 1.5, 1.25, -0.125, -1.25, 1, -0.125, 1.25, 1, -0.125, 1.5, 1.25, -0.125, 1.25, 1, -0.125, 1.5, -1.25, -0.125, 1.5, 1.25, 0.125, 1.5, 1.25, -0.125, -1.5, 1.25, -0.125, 1.5, -1.25, 0.125, 1.5, 1.25, -0.125, 1.5, 1.25, -0.125, -1.5, -1.25, -0.125, -1.25, -1, -0.125, -1.5, 1.25, 0.125, -1.5, -1.25, 0.125, -1.25, 1, 0.125, -1.25, -1, 0.125, -1.5, -1.25, 0.125, -1.25, -1, 0.125, 1.5, -1.25, -0.125, -1.5, 1.25, 0.125, -1.5, 1.25, 0.125, -1.5, -1.25, 0.125, 1.5, 1.25, 0.125, -1.5, 1.25, -0.125, -1.5, 1.25, 0.125, -1.5, 1.25, 0.125, -1.25, 1, 0.125, -1.5, -1.25, 0.125, -1.5, 1.25, 0.125, 1.25, 1, 0.125, -1.25, 1, 0.125, -1.5, -1.25, 0.125, 1.5, -1.25, -0.125, 1.5, -1.25, 0.125, 1.5, -1.25, 0.125, 1.5, 1.25, -0.125, 1.5, -1.25, 0.125, 1.5, -1.25, 0.125, -1.25, -1, 0.125, 1.25, -1, 0.125, 1.5, -1.25, 0.125, 1.25, -1, 0.125, 1.5, 1.25, 0.125, 1.5, 1.25, 0.125, 1.25, 1, 0.125, -1.5, 1.25, 0.125, -1.25, -1, -0.125, -1.25, -1, -0.125, 1.25, -1, -0.125, -1.25, 1, -0.125, -1.25, -1, 0.125, -1.25, 1, -0.125, 1.25, -1, -0.125, 1.25, 1, 0.125, 1.25, -1, 0.125, 1.25, 1, -0.125, 1.25, 1, -0.125, -1.25, 1, -0.125, -1.25, 1, 0.125, -1.25, 1, 0.125, 1.25, 1, -0.125, 1.25, -1, 0.125, 1.25, -1, 0.125, -1.25, -1, 0.125, 1.25, 1, 0.125, 1.25, -1, -0.125, 1.25, 1, 0.125, -1.25, -1, 0.125, -1.25, 1, -0.125, -1.25, -1)
|
||||
|
||||
[sub_resource type="ArrayMesh" id="ArrayMesh_b88kk"]
|
||||
_surfaces = [{
|
||||
"aabb": AABB(-0.125, -1.5, -1.25, 0.25, 3, 2.5),
|
||||
"attribute_data": PackedByteArray("AAAAAAAAAACrqqo9ZmZmP6uqqj3NzMw9AACAPwAAAACrqqo9zczMPauqaj/NzMw9AAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAAAAAAAAAAAAAIA/AACAPwAAgD8AAAAAAACAPwAAgD+rqmo/zczMPauqaj9mZmY/AACAPwAAgD+rqmo/ZmZmPwAAAAAAAIA/AAAAAAAAAACrqqo9zczMPQAAgD8AAAAAAAAAAAAAAACrqqo9ZmZmP6uqqj3NzMw9AAAAAAAAgD+rqmo/ZmZmP6uqqj1mZmY/AAAAAAAAgD+rqqo9ZmZmPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AACAPwAAgD8AAAAAAAAAAAAAAAAAAIA/AACAPwAAAACrqmo/zczMPQAAgD8AAIA/AACAPwAAgD+rqmo/zczMPauqaj9mZmY/AACAPwAAgD+rqmo/ZmZmPwAAAAAAAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AACAPwAAAACrqmo/zczMPQAAgD8AAIA/AACAPwAAAACrqqo9zczMPauqaj/NzMw9AAAAAAAAAAAAAAAAAACAPwAAgD8AAIA/AACAPwAAAAAAAAAAAAAAAAAAgD8AAIA/AAAAAAAAgD+rqmo/ZmZmP6uqqj1mZmY/AAAAAAAAgD+rqqo9ZmZmPwAAAAAAAAAAAAAAAAAAAACrqqo9zczMPQAAgD8AAAAAAADAPgAAAAAAACA/AAAAAAAAID8AAIA/AAAAAAAAwD4AAIA/AADAPgAAAAAAACA/AACAPwAAID8AAAAAAAAgPwAAgD8AAMA+AADAPgAAAAAAACA/AAAAAAAAID8AAIA/AAAgPwAAgD8AAMA+AACAPwAAwD4AAAAAAAAgPwAAgD8AAMA+AACAPwAAwD4AAAAAAAAAAAAAwD4AAIA/AADAPgAAAAAAACA/AACAPwAAID8AAAAAAAAgPwAAgD8AAMA+"),
|
||||
"format": 34359738391,
|
||||
"primitive": 3,
|
||||
"uv_scale": Vector4(0, 0, 0, 0),
|
||||
"vertex_count": 96,
|
||||
"vertex_data": PackedByteArray("AAAAPgAAwD8AAKA/AAAAPgAAoD8AAIC/AAAAPgAAoD8AAIA/AAAAvgAAwL8AAKC/AAAAvgAAoD8AAIC/AAAAvgAAoL8AAIC/AAAAvgAAwL8AAKA/AAAAPgAAwL8AAKC/AAAAvgAAwL8AAKC/AAAAPgAAwL8AAKC/AAAAvgAAwD8AAKC/AAAAvgAAwL8AAKC/AAAAvgAAwL8AAKA/AAAAvgAAoL8AAIC/AAAAvgAAoL8AAIA/AAAAvgAAwL8AAKA/AAAAvgAAoL8AAIA/AAAAvgAAwD8AAKA/AAAAvgAAwD8AAKC/AAAAvgAAoD8AAIC/AAAAvgAAwL8AAKC/AAAAvgAAwD8AAKC/AAAAvgAAoD8AAIA/AAAAvgAAoD8AAIC/AAAAvgAAwD8AAKA/AAAAvgAAoL8AAIA/AAAAvgAAoD8AAIA/AAAAvgAAwD8AAKA/AAAAvgAAoD8AAIA/AAAAvgAAwD8AAKC/AAAAvgAAwD8AAKA/AAAAPgAAwD8AAKA/AAAAvgAAwL8AAKA/AAAAvgAAwD8AAKC/AAAAPgAAwD8AAKA/AAAAvgAAwD8AAKA/AAAAvgAAwL8AAKC/AAAAvgAAoL8AAIC/AAAAvgAAwL8AAKA/AAAAPgAAwL8AAKC/AAAAPgAAoL8AAIA/AAAAPgAAoL8AAIC/AAAAPgAAwL8AAKC/AAAAPgAAoL8AAIC/AAAAPgAAwD8AAKC/AAAAvgAAwL8AAKA/AAAAPgAAwL8AAKA/AAAAPgAAwL8AAKC/AAAAPgAAwD8AAKA/AAAAPgAAwL8AAKA/AAAAvgAAwL8AAKA/AAAAPgAAwL8AAKA/AAAAPgAAoL8AAIA/AAAAPgAAwL8AAKC/AAAAPgAAwL8AAKA/AAAAPgAAoD8AAIA/AAAAPgAAoL8AAIA/AAAAPgAAwL8AAKC/AAAAPgAAwD8AAKC/AAAAvgAAwD8AAKC/AAAAPgAAwD8AAKC/AAAAPgAAwD8AAKA/AAAAvgAAwD8AAKC/AAAAPgAAwD8AAKC/AAAAPgAAoL8AAIC/AAAAPgAAoD8AAIC/AAAAPgAAwD8AAKC/AAAAPgAAoD8AAIC/AAAAPgAAwD8AAKA/AAAAPgAAwD8AAKA/AAAAPgAAoD8AAIA/AAAAPgAAwL8AAKA/AAAAPgAAoL8AAIC/AAAAvgAAoL8AAIC/AAAAvgAAoD8AAIC/AAAAvgAAoL8AAIA/AAAAvgAAoL8AAIC/AAAAPgAAoL8AAIA/AAAAvgAAoD8AAIC/AAAAvgAAoD8AAIA/AAAAPgAAoD8AAIC/AAAAPgAAoD8AAIA/AAAAvgAAoD8AAIA/AAAAvgAAoL8AAIA/AAAAvgAAoL8AAIA/AAAAPgAAoL8AAIA/AAAAPgAAoD8AAIA/AAAAvgAAoD8AAIC/AAAAPgAAoD8AAIC/AAAAPgAAoL8AAIC/AAAAPgAAoD8AAIA/AAAAPgAAoD8AAIC/AAAAvgAAoD8AAIA/AAAAPgAAoL8AAIC/AAAAPgAAoL8AAIA/AAAAvgAAoL8AAIC/////f/9//n////9//3/+f////3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5//38AAP//AAD/fwAA//8AAP9/AAD//wAA/////wAA/z//////AAD/P/////8AAP8/AAD/f/9//n8AAP9//3/+fwAA/3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5/AAD/f/9//n8AAP9//3/+fwAA/3//f/5//3//fwAA/z//f/9/AAD/P/9//38AAP8//3//////AAD/f/////8AAP9//////wAAAAD/f/9//n8AAP9//3/+fwAA/3//f/5/////f/9//n////9//3/+f////3//f/5/////f/9//n////9//3/+f////3//f/5//38AAP//AAD/fwAA//8AAP9/AAD//wAA/3//fwAA/z//f/9/AAD/P/9//38AAP8/////f/9//n////9//3/+f////3//f/5/////f/9//n////9//3/+f////3//f/5//////wAA/z//////AAD/P/////8AAP8//3//////AAD/f/////8AAP9//////wAA////f/9//n////9//3/+f////3//f/5/////f/9//n////9//3/+f////3//f/5/////f/9//n////9//3/+f////3//f/5//3//fwAA/7//f/9/AAD/v/9//38AAP+//3//////////f/////////9//////////38AAP//////fwAA//////9/AAD//////////wAA/7//////AAD/v/////8AAP+//////wAA/7//////AAD/v/////8AAP+//3//fwAA/7//f/9/AAD/v/9//38AAP+//38AAP//////fwAA//////9/AAD//////3//////////f/////////9/////////")
|
||||
}]
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_pvdtj"]
|
||||
material = ExtResource("6_2ffpc")
|
||||
|
||||
[sub_resource type="ArrayMesh" id="ArrayMesh_pccqs"]
|
||||
_surfaces = [{
|
||||
"aabb": AABB(-1, -1.25, -0.1, 2, 2.5, 0.1),
|
||||
"attribute_data": PackedByteArray("AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD/NzEw9CtcjPTMzcz8K1yM9zcxMPY/CdT8zM3M/j8J1Pw=="),
|
||||
"format": 34359742487,
|
||||
"index_count": 30,
|
||||
"index_data": PackedByteArray("AAABAAQABAABAAUAAQADAAUABQADAAcAAwACAAcABwACAAYAAgAAAAYABgAAAAQABAAFAAYABgAFAAcA"),
|
||||
"name": "Portal Material",
|
||||
"primitive": 3,
|
||||
"uv_scale": Vector4(0, 0, 0, 0),
|
||||
"vertex_count": 8,
|
||||
"vertex_data": PackedByteArray("AACAvwAAoD8AAAAAAACAPwAAoD8AAAAAAACAvwAAoL8AAAAAAACAPwAAoL8AAAAAZmZmvzMzkz/NzMy9ZmZmPzMzkz/NzMy9ZmZmvzMzk7/NzMy9ZmZmPzMzk7/NzMy9/3//f/9/AID/f/9//38AgP9//3//fwCA/3//f/9/AID/f/9//38AgP9//3//fwCA/3//f/9/AID/f/9//38AgA==")
|
||||
}]
|
||||
|
||||
[sub_resource type="SphereMesh" id="SphereMesh_pccqs"]
|
||||
material = ExtResource("8_dhtg5")
|
||||
|
||||
[sub_resource type="ArrayMesh" id="ArrayMesh_pvdtj"]
|
||||
_surfaces = [{
|
||||
"aabb": AABB(-1, -1.25, -0.1, 2, 2.5, 0.1),
|
||||
"attribute_data": PackedByteArray("AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD/NzEw9CtcjPTMzcz8K1yM9zcxMPY/CdT8zM3M/j8J1Pw=="),
|
||||
"format": 34359742487,
|
||||
"index_count": 30,
|
||||
"index_data": PackedByteArray("AAABAAQABAABAAUAAQADAAUABQADAAcAAwACAAcABwACAAYAAgAAAAYABgAAAAQABAAFAAYABgAFAAcA"),
|
||||
"name": "Portal Material",
|
||||
"primitive": 3,
|
||||
"uv_scale": Vector4(0, 0, 0, 0),
|
||||
"vertex_count": 8,
|
||||
"vertex_data": PackedByteArray("AACAvwAAoD8AAAAAAACAPwAAoD8AAAAAAACAvwAAoL8AAAAAAACAPwAAoL8AAAAAZmZmvzMzkz/NzMy9ZmZmPzMzkz/NzMy9ZmZmvzMzk7/NzMy9ZmZmPzMzk7/NzMy9/3//f/9/AID/f/9//38AgP9//3//fwCA/3//f/9/AID/f/9//38AgP9//3//fwCA/3//f/9/AID/f/9//38AgA==")
|
||||
}]
|
||||
|
||||
[node name="World" type="Node3D"]
|
||||
script = ExtResource("1_pccqs")
|
||||
|
||||
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
|
||||
transform = Transform3D(-0.866023, -0.433016, 0.250001, 0, 0.499998, 0.866027, -0.500003, 0.749999, -0.43301, 0, 0, 0)
|
||||
shadow_enabled = true
|
||||
|
||||
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
|
||||
environment = SubResource("Environment_b88kk")
|
||||
|
||||
[node name="PortalEnvironmentAdapter" parent="." node_paths=PackedStringArray("base") instance=ExtResource("1_eoaoo")]
|
||||
base = NodePath("../WorldEnvironment")
|
||||
|
||||
[node name="HUD" parent="." instance=ExtResource("4_t21k5")]
|
||||
offset_right = 219.0
|
||||
offset_bottom = 77.0
|
||||
|
||||
[node name="TransportToGreen" type="Button" parent="HUD"]
|
||||
layout_mode = 2
|
||||
text = "Transport to green"
|
||||
|
||||
[node name="TransportToOrange" type="Button" parent="HUD"]
|
||||
layout_mode = 2
|
||||
text = "Transport to orange"
|
||||
|
||||
[node name="Player" parent="." instance=ExtResource("3_ysrn6")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.68722, 0.942887, -13.7212)
|
||||
|
||||
[node name="Orange" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -12)
|
||||
|
||||
[node name="Room" type="Node3D" parent="Orange"]
|
||||
|
||||
[node name="Wall" type="StaticBody3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
|
||||
|
||||
[node name="CSGBakedCollisionShape3D" type="CollisionShape3D" parent="Orange/Room/Wall"]
|
||||
visible = false
|
||||
shape = SubResource("ConcavePolygonShape3D_7nftg")
|
||||
|
||||
[node name="CSGBakedMeshInstance3D" type="MeshInstance3D" parent="Orange/Room/Wall"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
material_override = ExtResource("1_v6nyh")
|
||||
mesh = SubResource("ArrayMesh_v6nyh")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="Orange/Room"]
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Orange/Room/Ground"]
|
||||
material_override = ExtResource("2_5nkxg")
|
||||
mesh = SubResource("BoxMesh_ysrn6")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Orange/Room/Ground"]
|
||||
shape = SubResource("ConvexPolygonShape3D_5nkxg")
|
||||
|
||||
[node name="PortalFrame" type="StaticBody3D" parent="Orange/Room"]
|
||||
|
||||
[node name="PortalFrame" type="CollisionShape3D" parent="Orange/Room/PortalFrame"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
shape = SubResource("ConcavePolygonShape3D_eoaoo")
|
||||
|
||||
[node name="PortalFrameCollision" type="MeshInstance3D" parent="Orange/Room/PortalFrame"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
material_override = ExtResource("1_v6nyh")
|
||||
mesh = SubResource("ArrayMesh_b88kk")
|
||||
|
||||
[node name="Cube" type="MeshInstance3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 1, -3.5)
|
||||
mesh = SubResource("BoxMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
|
||||
[node name="Cube2" type="MeshInstance3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 1, -6.5)
|
||||
mesh = SubResource("BoxMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
|
||||
[node name="Cube3" type="MeshInstance3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 1, -1)
|
||||
mesh = SubResource("BoxMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
|
||||
[node name="Cube4" type="MeshInstance3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 1, 1)
|
||||
mesh = SubResource("BoxMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
|
||||
[node name="Cube5" type="MeshInstance3D" parent="Orange/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 1, 3)
|
||||
mesh = SubResource("BoxMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
|
||||
[node name="OrangePortal" type="MeshInstance3D" parent="Orange" node_paths=PackedStringArray("exit_portal")]
|
||||
transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0, 2, 0)
|
||||
mesh = SubResource("ArrayMesh_pccqs")
|
||||
skeleton = NodePath("../..")
|
||||
script = ExtResource("7_pvdtj")
|
||||
exit_portal = NodePath("../../Green/GreenPortal")
|
||||
|
||||
[node name="Green" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 12.5)
|
||||
|
||||
[node name="Room" type="Node3D" parent="Green"]
|
||||
|
||||
[node name="Wall" type="StaticBody3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.5, 0)
|
||||
|
||||
[node name="CSGBakedCollisionShape3D" type="CollisionShape3D" parent="Green/Room/Wall"]
|
||||
visible = false
|
||||
shape = SubResource("ConcavePolygonShape3D_7nftg")
|
||||
|
||||
[node name="CSGBakedMeshInstance3D" type="MeshInstance3D" parent="Green/Room/Wall"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.5, 0)
|
||||
material_override = ExtResource("1_v6nyh")
|
||||
mesh = SubResource("ArrayMesh_v6nyh")
|
||||
|
||||
[node name="Ground" type="StaticBody3D" parent="Green/Room"]
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="Green/Room/Ground"]
|
||||
material_override = ExtResource("6_b88kk")
|
||||
mesh = SubResource("BoxMesh_ysrn6")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Green/Room/Ground"]
|
||||
shape = SubResource("ConvexPolygonShape3D_5nkxg")
|
||||
|
||||
[node name="PortalFrame" type="StaticBody3D" parent="Green/Room"]
|
||||
|
||||
[node name="PortalFrame" type="CollisionShape3D" parent="Green/Room/PortalFrame"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
shape = SubResource("ConcavePolygonShape3D_eoaoo")
|
||||
|
||||
[node name="PortalFrameCollision" type="MeshInstance3D" parent="Green/Room/PortalFrame"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0)
|
||||
material_override = ExtResource("1_v6nyh")
|
||||
mesh = SubResource("ArrayMesh_b88kk")
|
||||
|
||||
[node name="Ball6" type="MeshInstance3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.5, 1, -3.5)
|
||||
mesh = SubResource("SphereMesh_pccqs")
|
||||
skeleton = NodePath("../../../Orange")
|
||||
|
||||
[node name="Ball7" type="MeshInstance3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -5.5, 1, -6.5)
|
||||
mesh = SubResource("SphereMesh_pccqs")
|
||||
skeleton = NodePath("../../../Orange")
|
||||
|
||||
[node name="Ball8" type="MeshInstance3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.5, 1, -1)
|
||||
mesh = SubResource("SphereMesh_pccqs")
|
||||
skeleton = NodePath("../../../Orange")
|
||||
|
||||
[node name="Ball9" type="MeshInstance3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 1, 1)
|
||||
mesh = SubResource("SphereMesh_pccqs")
|
||||
skeleton = NodePath("../../../Orange")
|
||||
|
||||
[node name="Ball10" type="MeshInstance3D" parent="Green/Room"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.5, 1, 3)
|
||||
mesh = SubResource("SphereMesh_pccqs")
|
||||
skeleton = NodePath("../../../Orange")
|
||||
|
||||
[node name="GreenPortal" type="MeshInstance3D" parent="Green" node_paths=PackedStringArray("exit_portal")]
|
||||
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, 0, 2, 0)
|
||||
mesh = SubResource("ArrayMesh_pvdtj")
|
||||
skeleton = NodePath("../..")
|
||||
script = ExtResource("7_pvdtj")
|
||||
exit_portal = NodePath("../../Orange/OrangePortal")
|
||||
|
||||
[node name="ProceduralMeshMaker" parent="." node_paths=PackedStringArray("portal") instance=ExtResource("9_dhtg5")]
|
||||
portal = NodePath("../Orange/OrangePortal")
|
||||
height = 2.5
|
||||
width = 2.0
|
||||
|
||||
[connection signal="pressed" from="HUD/TransportToGreen" to="." method="_on_transport_to_green_pressed"]
|
||||
[connection signal="pressed" from="HUD/TransportToOrange" to="." method="_on_transport_to_orange_pressed"]
|
6
portal_environment_adapter.tscn
Normal file
6
portal_environment_adapter.tscn
Normal file
@ -0,0 +1,6 @@
|
||||
[gd_scene load_steps=2 format=3 uid="uid://cxopylew5786r"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cili3lyodjqel" path="res://portal_environment_adapter.gd" id="1_5srpn"]
|
||||
|
||||
[node name="PortalEnvironmentAdapter" type="Node"]
|
||||
script = ExtResource("1_5srpn")
|
@ -1,29 +1,35 @@
|
||||
@tool
|
||||
extends Node
|
||||
|
||||
@export_range(0.1, 10, 0.01) var height: float = 2.0
|
||||
@export_range(0.1, 10, 0.01) var width: float = 1.0
|
||||
## Player camera's NEAR clip distance
|
||||
@export_range(0, 0.2, 0.001) var indent: float = 0.1
|
||||
|
||||
@export var portal: Portal
|
||||
@export_tool_button("Generate Portal Mesh")
|
||||
var _generate_portal_mesh: Callable = generate_portal_mesh
|
||||
|
||||
@export_tool_button("Remove Mesh")
|
||||
var _remove_mesh: Callable = func(): portal.mesh = null
|
||||
|
||||
|
||||
@export var portal: MyPortal
|
||||
|
||||
@export_range(0.1, 10, 0.01) var height: float = 2.0:
|
||||
set(v):
|
||||
height = v
|
||||
if Engine.is_editor_hint(): generate_portal_mesh()
|
||||
|
||||
@export_range(0.1, 10, 0.01) var width: float = 1.0:
|
||||
set(v):
|
||||
width = v
|
||||
if Engine.is_editor_hint(): generate_portal_mesh()
|
||||
|
||||
## Player camera's NEAR clip distance
|
||||
@export_range(0, 0.2, 0.001) var indent: float = 0.1:
|
||||
set(v):
|
||||
indent = v
|
||||
generate_portal_mesh()
|
||||
|
||||
@export var portal_material: BaseMaterial3D
|
||||
|
||||
|
||||
func _add_inspector_buttons() -> Array:
|
||||
var buttons: Array = []
|
||||
|
||||
buttons.push_back({
|
||||
"name": "Generate Portal Mesh",
|
||||
"pressed": generate_portal_mesh
|
||||
})
|
||||
buttons.push_back({
|
||||
"name": "Remove Mesh",
|
||||
"pressed": func(): portal.mesh = null
|
||||
})
|
||||
|
||||
return buttons
|
||||
|
||||
func _get_configuration_warnings() -> PackedStringArray:
|
||||
var warnings: Array = []
|
||||
|
||||
|
87
scripts/my_portal.gd
Normal file
87
scripts/my_portal.gd
Normal file
@ -0,0 +1,87 @@
|
||||
extends MeshInstance3D
|
||||
class_name MyPortal
|
||||
|
||||
## My own portal implementation
|
||||
|
||||
@export var exit_portal: MyPortal
|
||||
|
||||
#preload("res://scripts/my_portal_material.tres")
|
||||
const MY_PORTAL_MATERIAL = preload("uid://cwobk5ik5k5aj")
|
||||
|
||||
var _viewport: SubViewport
|
||||
var _camera: Camera3D = Camera3D.new()
|
||||
var _main_camera: Camera3D = null
|
||||
|
||||
var exit_scale: int = 1 # This is not really needed I think
|
||||
|
||||
func _ready() -> void:
|
||||
assert(exit_portal != null)
|
||||
|
||||
_main_camera = get_viewport().get_camera_3d()
|
||||
|
||||
# NOTE: In case the exit portal is in a different world, better put the viewport and camera
|
||||
# onto IT, rather than me (?)
|
||||
_viewport = SubViewport.new()
|
||||
_viewport.name = name + "_Viewport"
|
||||
_viewport.size = get_viewport().size
|
||||
add_child(_viewport)
|
||||
|
||||
_camera.name = name + "_ExitCamera"
|
||||
_viewport.add_child(_camera)
|
||||
|
||||
var mat: ShaderMaterial = MY_PORTAL_MATERIAL
|
||||
material_override = mat
|
||||
mat.set_shader_parameter("albedo", _viewport.get_texture())
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
_camera.global_transform = real_to_exit_transform(_main_camera.global_transform)
|
||||
# TODO: Adjust near clip plane to the portal
|
||||
_camera.near = _main_camera.near
|
||||
_camera.far = _main_camera.far
|
||||
_camera.fov = _main_camera.fov
|
||||
_camera.keep_aspect = _main_camera.keep_aspect
|
||||
|
||||
|
||||
## Return a new Transform3D relative to the exit portal based on the real Transform3D relative to this portal.
|
||||
func real_to_exit_transform(real:Transform3D) -> Transform3D:
|
||||
# Convert from global space to local space at the entrance (this) portal
|
||||
var local:Transform3D = global_transform.affine_inverse() * real
|
||||
# Compensate for any scale the entrance portal may have
|
||||
var unscaled:Transform3D = local.scaled(global_transform.basis.get_scale())
|
||||
# Flip it (the portal always flips the view 180 degrees)
|
||||
var flipped:Transform3D = unscaled.rotated(Vector3.UP, PI)
|
||||
# Apply any scale the exit portal may have (and apply custom exit scale)
|
||||
var exit_scale_vector:Vector3 = exit_portal.global_transform.basis.get_scale()
|
||||
var scaled_at_exit:Transform3D = flipped.scaled(Vector3.ONE / exit_scale_vector * exit_scale)
|
||||
# Convert from local space at the exit portal to global space
|
||||
var local_at_exit:Transform3D = exit_portal.global_transform * scaled_at_exit
|
||||
return local_at_exit
|
||||
|
||||
## Return a new position relative to the exit portal based on the real position relative to this portal.
|
||||
func real_to_exit_position(real:Vector3) -> Vector3:
|
||||
# Convert from global space to local space at the entrance (this) portal
|
||||
var local:Vector3 = global_transform.affine_inverse() * real
|
||||
# Compensate for any scale the entrance portal may have
|
||||
var unscaled:Vector3 = local * global_transform.basis.get_scale()
|
||||
# Apply any scale the exit portal may have (and apply custom exit scale)
|
||||
var exit_scale_vector:Vector3 = Vector3(-1, 1, 1) * exit_portal.global_transform.basis.get_scale()
|
||||
var scaled_at_exit:Vector3 = unscaled / exit_scale_vector * exit_scale
|
||||
# Convert from local space at the exit portal to global space
|
||||
var local_at_exit:Vector3 = exit_portal.global_transform * scaled_at_exit
|
||||
return local_at_exit
|
||||
|
||||
## Return a new direction relative to the exit portal based on the real direction relative to this portal.
|
||||
func real_to_exit_direction(real:Vector3) -> Vector3:
|
||||
# Convert from global to local space at the entrance (this) portal
|
||||
var local:Vector3 = global_transform.basis.inverse() * real
|
||||
# Compensate for any scale the entrance portal may have
|
||||
var unscaled:Vector3 = local * global_transform.basis.get_scale()
|
||||
# Flip it (the portal always flips the view 180 degrees)
|
||||
var flipped:Vector3 = unscaled.rotated(Vector3.UP, PI)
|
||||
# Apply any scale the exit portal may have (and apply custom exit scale)
|
||||
var exit_scale_vector:Vector3 = exit_portal.global_transform.basis.get_scale()
|
||||
var scaled_at_exit:Vector3 = flipped / exit_scale_vector * exit_scale
|
||||
# Convert from local space at the exit portal to global space
|
||||
var local_at_exit:Vector3 = exit_portal.global_transform.basis * scaled_at_exit
|
||||
return local_at_exit
|
1
scripts/my_portal.gd.uid
Normal file
1
scripts/my_portal.gd.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://dh8miiv7xc4ps
|
25
scripts/my_portal.gdshader
Normal file
25
scripts/my_portal.gdshader
Normal file
@ -0,0 +1,25 @@
|
||||
shader_type spatial;
|
||||
render_mode unshaded;
|
||||
|
||||
|
||||
uniform sampler2D albedo: hint_default_black, source_color;
|
||||
|
||||
varying float pixel_distance;
|
||||
|
||||
void vertex() {
|
||||
// Calculate the world-space distance between the pixel and camera.
|
||||
// Pass the distance to the fragment shader using a varying attribute.
|
||||
vec3 world_position = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
|
||||
vec3 camera_position = (INV_VIEW_MATRIX * vec4(0.0, 0.0, 0.0, 1.0)).xyz;
|
||||
|
||||
pixel_distance = distance(world_position, camera_position);
|
||||
}
|
||||
|
||||
void fragment() {
|
||||
// The portal color is simply the screen-space color of the exit camera render target.
|
||||
// This is because the exit camera views the exit portal from the perspective of the player watching
|
||||
// the entrance portal, meaning the exit portal will occupy the same screen-space as the entrance portal.
|
||||
vec3 portal_color = texture(albedo, SCREEN_UV).rgb;
|
||||
|
||||
ALBEDO = portal_color;
|
||||
}
|
1
scripts/my_portal.gdshader.uid
Normal file
1
scripts/my_portal.gdshader.uid
Normal file
@ -0,0 +1 @@
|
||||
uid://b6cs66n3vj4di
|
7
scripts/my_portal_material.tres
Normal file
7
scripts/my_portal_material.tres
Normal file
@ -0,0 +1,7 @@
|
||||
[gd_resource type="ShaderMaterial" load_steps=2 format=3 uid="uid://cwobk5ik5k5aj"]
|
||||
|
||||
[ext_resource type="Shader" uid="uid://b6cs66n3vj4di" path="res://scripts/my_portal.gdshader" id="1_3tu08"]
|
||||
|
||||
[resource]
|
||||
render_priority = 0
|
||||
shader = ExtResource("1_3tu08")
|
Loading…
Reference in New Issue
Block a user