diff --git a/levels/test_procedural_portal.tscn b/levels/test_procedural_portal.tscn index f1638c5..486f558 100644 --- a/levels/test_procedural_portal.tscn +++ b/levels/test_procedural_portal.tscn @@ -1,12 +1,74 @@ -[gd_scene load_steps=3 format=3 uid="uid://c0ieh1abu1xne"] +[gd_scene load_steps=7 format=4 uid="uid://c0ieh1abu1xne"] [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="ArrayMesh" id="ArrayMesh_4vena"] +_surfaces = [{ +"aabb": AABB(-0.75, 0, 0, 1.5, 2.25, 1e-05), +"attribute_data": PackedByteArray("AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAgD8="), +"format": 34359742487, +"index_count": 6, +"index_data": PackedByteArray("AAABAAIAAQADAAIA"), +"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=") +}] + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_82kw5"] + +[sub_resource type="ArrayMesh" id="ArrayMesh_dn1le"] +_surfaces = [{ +"aabb": AABB(-1.02429, -1.3, -0.2, 2.04857, 2.60001, 0.20001), +"format": 34896613377, +"index_count": 30, +"index_data": PackedByteArray("BwAFAAQABwAEAAYAAQAHAAMAAQAFAAcAAgAEAAAAAgAGAAQAAwAGAAIAAwAHAAYAAAAFAAEAAAAEAAUA"), +"lods": [0.156674, PackedByteArray("AwAFAAAAAQAFAAMAAwAAAAIAAAAFAAEA")], +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 8, +"vertex_data": PackedByteArray("AAD+//v/AAAAAAAA+/8AAP///v/7/wAA/v8AAPv/AACZGWXmAAAAAJkZmRkAAAAAZeZl5gAAAABl5pkZAAAAAA==") +}] +blend_shape_mode = 0 + +[sub_resource type="ArrayMesh" id="ArrayMesh_u54xs"] +resource_name = "room_Plane_001" +_surfaces = [{ +"aabb": AABB(-1.02429, -1.3, -0.2, 2.04857, 2.60001, 0.20001), +"attribute_data": PackedByteArray("AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//"), +"format": 34896613399, +"index_count": 30, +"index_data": PackedByteArray("EQALAAgAEQAIAA4AAgASAAYAAgAMABIABAAJAAAABAAPAAkABwAQAAUABwATABAAAQANAAMAAQAKAA0A"), +"lods": [0.156674, PackedByteArray("BgAWAAAAAgAWAAYABgAAAAQAFAAXABUA")], +"material": SubResource("StandardMaterial3D_82kw5"), +"primitive": 3, +"uv_scale": Vector4(0, 0, 0, 0), +"vertex_count": 24, +"vertex_data": PackedByteArray("AAD+//v/SGUAAP7/+/8AagAAAAD7/0hlAAAAAPv/AGr///7/+/9IZf///v/7/wBq/v8AAPv/SGX+/wAA+/8AapkZZeYAAP5/mRll5gAASGWZGWXmAAAAapkZmRkAAP5/mRmZGQAASGWZGZkZAAAAamXmZeYAAP5/ZeZl5gAASGVl5mXmAAAAamXmmRkAAP5/ZeaZGQAASGVl5pkZAAAAagAA/v/7/wBqAAAAAPv/AGqZGZkZAAD1b5kZmRkAAABqAAD/f/9/AAD///9//38AAAAA/3//f///////f/9/////f///AAD/f/9/AAD/f///////f/9/AAD/f///AAD/f/9/////f///////f/9/////fwAA/38AAP///3//fwAA") +}] +blend_shape_mode = 0 +shadow_mesh = SubResource("ArrayMesh_dn1le") + [node name="ProceduralPortal" type="Node3D"] [node name="MeshInstance3D" type="MeshInstance3D" parent="."] +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 portal = NodePath("../MeshInstance3D") + +[node name="OmniLight3D" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.52963, 0, 1.51112) +light_color = Color(5.0056e-06, 0.824088, 0.326623, 1) +light_energy = 2.0 +metadata/_edit_lock_ = true + +[node name="OfficialPortal" type="MeshInstance3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.5, 0, 0) +mesh = SubResource("ArrayMesh_u54xs") +metadata/_edit_lock_ = true diff --git a/procedural_mesh_maker.gd b/procedural_mesh_maker.gd index cfaab15..2bc8130 100644 --- a/procedural_mesh_maker.gd +++ b/procedural_mesh_maker.gd @@ -3,6 +3,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 var portal: Portal func _add_inspector_buttons() -> Array: @@ -12,6 +14,10 @@ func _add_inspector_buttons() -> Array: "name": "Generate Portal Mesh", "pressed": generate_portal_mesh }) + buttons.push_back({ + "name": "Remove Mesh", + "pressed": func(): portal.mesh = null + }) return buttons @@ -43,28 +49,18 @@ func generate_portal_mesh() -> void: var normals = PackedVector3Array() var indices = PackedInt32Array() - # Bottom left triangle of a rect - verts.append(Vector3(-width/2, 0, 0)) - verts.append(Vector3(width/2, 0, 0)) - verts.append(Vector3(width/2, height, 0)) + 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) - uvs.append(Vector2(0, 1)) - uvs.append(Vector2(1, 1)) - uvs.append(Vector2(0, 0)) + 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]) - normals.append_array([Vector3.FORWARD, Vector3.FORWARD, Vector3.FORWARD]) - indices.append_array([0, 1, 2]) + indices.append_array([0, 1, 2]) # top-left triangle + indices.append_array([1, 3, 2]) # bottom-right triangle - # Top right triangle of a rect - verts.append(Vector3(-width/2, 0, 0)) - verts.append(Vector3(width/2, height, 0)) - verts.append(Vector3(-width/2, height, 0)) - - uvs.append(Vector2(0, 1)) - uvs.append(Vector2(1, 0)) - uvs.append(Vector2(0, 0)) - normals.append_array([Vector3.FORWARD, Vector3.FORWARD, Vector3.FORWARD]) - indices.append_array([3, 4, 5]) surface_array[Mesh.ARRAY_VERTEX] = verts surface_array[Mesh.ARRAY_TEX_UV] = uvs