From 50314f1ad83a736b33e892f02fb6bfadaf668fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vojte=CC=8Cch=20Struha=CC=81r?= Date: Mon, 3 Mar 2025 22:31:31 +0100 Subject: [PATCH] My own buggy portal implementation --- .../shaders/spiraling_portal.gdshader | 2 +- hud.gd | 4 + hud.tscn | 4 + levels/level_3_rooms.tscn | 2 +- levels/level_my_portals.gd | 15 + levels/level_my_portals.gd.uid | 1 + levels/level_my_portals.tscn | 268 ++++++++++++++++++ portal_environment_adapter.tscn | 6 + procedural_mesh_maker.gd | 44 +-- scripts/my_portal.gd | 87 ++++++ scripts/my_portal.gd.uid | 1 + scripts/my_portal.gdshader | 25 ++ scripts/my_portal.gdshader.uid | 1 + scripts/my_portal_material.tres | 7 + 14 files changed, 446 insertions(+), 21 deletions(-) create mode 100644 levels/level_my_portals.gd create mode 100644 levels/level_my_portals.gd.uid create mode 100644 levels/level_my_portals.tscn create mode 100644 portal_environment_adapter.tscn create mode 100644 scripts/my_portal.gd create mode 100644 scripts/my_portal.gd.uid create mode 100644 scripts/my_portal.gdshader create mode 100644 scripts/my_portal.gdshader.uid create mode 100644 scripts/my_portal_material.tres diff --git a/addons/simple-portal-system/shaders/spiraling_portal.gdshader b/addons/simple-portal-system/shaders/spiraling_portal.gdshader index 967fe9c..8f74fc4 100644 --- a/addons/simple-portal-system/shaders/spiraling_portal.gdshader +++ b/addons/simple-portal-system/shaders/spiraling_portal.gdshader @@ -22,7 +22,7 @@ void vertex() { // 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); } diff --git a/hud.gd b/hud.gd index c84be38..fe797cc 100644 --- a/hud.gd +++ b/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 diff --git a/hud.tscn b/hud.tscn index 7270b4e..5b3ddd8 100644 --- a/hud.tscn +++ b/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 diff --git a/levels/level_3_rooms.tscn b/levels/level_3_rooms.tscn index ba48947..bae8339 100644 --- a/levels/level_3_rooms.tscn +++ b/levels/level_3_rooms.tscn @@ -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 diff --git a/levels/level_my_portals.gd b/levels/level_my_portals.gd new file mode 100644 index 0000000..748194d --- /dev/null +++ b/levels/level_my_portals.gd @@ -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 diff --git a/levels/level_my_portals.gd.uid b/levels/level_my_portals.gd.uid new file mode 100644 index 0000000..30cb8c0 --- /dev/null +++ b/levels/level_my_portals.gd.uid @@ -0,0 +1 @@ +uid://c8vjum7jkvrv0 diff --git a/levels/level_my_portals.tscn b/levels/level_my_portals.tscn new file mode 100644 index 0000000..b7edde2 --- /dev/null +++ b/levels/level_my_portals.tscn @@ -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"] diff --git a/portal_environment_adapter.tscn b/portal_environment_adapter.tscn new file mode 100644 index 0000000..e283048 --- /dev/null +++ b/portal_environment_adapter.tscn @@ -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") diff --git a/procedural_mesh_maker.gd b/procedural_mesh_maker.gd index 823ae41..b927949 100644 --- a/procedural_mesh_maker.gd +++ b/procedural_mesh_maker.gd @@ -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 = [] diff --git a/scripts/my_portal.gd b/scripts/my_portal.gd new file mode 100644 index 0000000..c2bfdf0 --- /dev/null +++ b/scripts/my_portal.gd @@ -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 diff --git a/scripts/my_portal.gd.uid b/scripts/my_portal.gd.uid new file mode 100644 index 0000000..b36f3db --- /dev/null +++ b/scripts/my_portal.gd.uid @@ -0,0 +1 @@ +uid://dh8miiv7xc4ps diff --git a/scripts/my_portal.gdshader b/scripts/my_portal.gdshader new file mode 100644 index 0000000..7035dc4 --- /dev/null +++ b/scripts/my_portal.gdshader @@ -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; +} diff --git a/scripts/my_portal.gdshader.uid b/scripts/my_portal.gdshader.uid new file mode 100644 index 0000000..d7604a5 --- /dev/null +++ b/scripts/my_portal.gdshader.uid @@ -0,0 +1 @@ +uid://b6cs66n3vj4di diff --git a/scripts/my_portal_material.tres b/scripts/my_portal_material.tres new file mode 100644 index 0000000..8a02b4c --- /dev/null +++ b/scripts/my_portal_material.tres @@ -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")