diff --git a/levels/test_procedural_portal.tscn b/levels/test_procedural_portal.tscn index 486f558..ae003c4 100644 --- a/levels/test_procedural_portal.tscn +++ b/levels/test_procedural_portal.tscn @@ -1,19 +1,24 @@ -[gd_scene load_steps=7 format=4 uid="uid://c0ieh1abu1xne"] +[gd_scene load_steps=9 format=4 uid="uid://c0ieh1abu1xne"] +[ext_resource type="Texture2D" uid="uid://c8nq55glypfp8" path="res://addons/kenney_prototype_tools/textures/light/texture_07.png" id="1_dn1le"] [ext_resource type="Script" uid="uid://d2bvvjsibau8c" path="res://addons/simple-portal-system/scripts/portal.gd" id="1_ksg6r"] [ext_resource type="PackedScene" uid="uid://d1dtxvwk86ple" path="res://procedural_mesh_maker.tscn" id="2_4vena"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_dn1le"] +albedo_texture = ExtResource("1_dn1le") + [sub_resource type="ArrayMesh" id="ArrayMesh_4vena"] _surfaces = [{ -"aabb": AABB(-0.75, 0, 0, 1.5, 2.25, 1e-05), -"attribute_data": PackedByteArray("AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8="), +"aabb": AABB(-1, -1.3, -0.1, 2, 2.6, 0.1), +"attribute_data": PackedByteArray("AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD/NzMw9zczMPWZmZj/NzMw9zczMPWZmZj9mZmY/ZmZmPw=="), "format": 34359742487, -"index_count": 6, -"index_data": PackedByteArray("AAABAAIAAQADAAIA"), +"index_count": 30, +"index_data": PackedByteArray("AAABAAQABAABAAUAAQADAAUABQADAAcAAwACAAcABwACAAYAAgAAAAYABgAAAAQABAAFAAYABgAFAAcA"), +"material": SubResource("StandardMaterial3D_dn1le"), "primitive": 3, "uv_scale": Vector4(0, 0, 0, 0), -"vertex_count": 4, -"vertex_data": PackedByteArray("AABAvwAAEEAAAAAAAABAPwAAEEAAAAAAAABAvwAAAAAAAAAAAABAPwAAAAAAAAAA/3//f/9/AID/f/9//38AgP9//3//fwCA/3//f/9/AIA=") +"vertex_count": 8, +"vertex_data": PackedByteArray("AACAv2Zmpj8AAAAAAACAP2Zmpj8AAAAAAACAv2Zmpr8AAAAAAACAP2Zmpr8AAAAAZmZmv5mZmT/NzMy9ZmZmP5mZmT/NzMy9ZmZmv5mZmb/NzMy9ZmZmP5mZmb/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="StandardMaterial3D" id="StandardMaterial3D_82kw5"] @@ -57,9 +62,8 @@ mesh = SubResource("ArrayMesh_4vena") script = ExtResource("1_ksg6r") [node name="ProceduralMeshMaker" parent="." node_paths=PackedStringArray("portal") instance=ExtResource("2_4vena")] -height = 2.25 -width = 1.5 -indent = null +height = 2.6 +width = 2.0 portal = NodePath("../MeshInstance3D") [node name="OmniLight3D" type="OmniLight3D" parent="."] diff --git a/procedural_mesh_maker.gd b/procedural_mesh_maker.gd index 2bc8130..f78eaf3 100644 --- a/procedural_mesh_maker.gd +++ b/procedural_mesh_maker.gd @@ -4,7 +4,8 @@ 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.1, 0.001) var indent: float = 0.1 +@export_range(0, 0.2, 0.001) var indent: float = 0.1 + @export var portal: Portal func _add_inspector_buttons() -> Array: @@ -49,18 +50,62 @@ func generate_portal_mesh() -> void: var normals = PackedVector3Array() var indices = PackedInt32Array() - var TOP_LEFT = Vector3(-width / 2, height, 0) - var TOP_RIGHT = Vector3(width / 2, height, 0) - var BOTTOM_LEFT = Vector3(-width / 2, 0, 0) - var BOTTOM_RIGHT = Vector3(width / 2, 0, 0) + # Just to save some chars + var w = width / 2 + var h = height / 2 + var i = indent - verts.append_array([TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT]) - uvs.append_array([Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1)]) - normals.append_array([Vector3.BACK, Vector3.BACK, Vector3.BACK, Vector3.BACK]) + # Outside rect + var TOP_LEFT = Vector3(-w, h, 0) + var TOP_RIGHT = Vector3(w, h, 0) + var BOTTOM_LEFT = Vector3(-w, -h, 0) + var BOTTOM_RIGHT = Vector3(w, -h, 0) + # Inside rect, indented + var INDENT_TL = TOP_LEFT + Vector3(indent, -indent, -indent) + var INDENT_TR = TOP_RIGHT + Vector3(-indent, -indent, -indent) + var INDENT_BL = BOTTOM_LEFT + Vector3(indent, indent, -indent) + var INDENT_BR = BOTTOM_RIGHT + Vector3(-indent, indent, -indent) - indices.append_array([0, 1, 2]) # top-left triangle - indices.append_array([1, 3, 2]) # bottom-right triangle + verts.append_array([ + TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, + INDENT_TL, INDENT_TR, INDENT_BL, INDENT_BR + ]) + uvs.append_array([ + Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1), # Outside UVs + Vector2(i, i), Vector2(1-i, i), Vector2(i, 1-i), Vector2(1-i, 1-i) # Indented UVs + ]) + + # We are going for a flat-surface look here. Portals should be unshaded anyways. + normals.append_array([ + Vector3.BACK, Vector3.BACK, Vector3.BACK, Vector3.BACK, + Vector3.BACK, Vector3.BACK, Vector3.BACK, Vector3.BACK + ]) + + # 0 ----------- 1 + # | \ / | + # | 4-------5 | + # | | | | + # | | | | + # | 6-------7 | + # | / \ | + # 2 ----------- 3 + + # Triangles are clockwise! + + indices.append_array([ + 0, 1, 4, + 4, 1, 5, # Top section done + 1, 3, 5, + 5, 3, 7, # right section done + 3, 2, 7, + 7, 2, 6, # bottom section done + 2, 0, 6, + 6, 0, 4, # left section done + + 4, 5, 6, + 6, 5, 7 # middle done + ]) surface_array[Mesh.ARRAY_VERTEX] = verts surface_array[Mesh.ARRAY_TEX_UV] = uvs