Indexing into mesh arrays more efficiently

This commit is contained in:
Vojtěch Struhár 2025-02-24 20:12:56 +01:00
parent 2c01143579
commit 2e8c1a5562
2 changed files with 78 additions and 20 deletions

View File

@ -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="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"] [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="ProceduralPortal" type="Node3D"]
[node name="MeshInstance3D" type="MeshInstance3D" parent="."] [node name="MeshInstance3D" type="MeshInstance3D" parent="."]
mesh = SubResource("ArrayMesh_4vena")
script = ExtResource("1_ksg6r") script = ExtResource("1_ksg6r")
[node name="ProceduralMeshMaker" parent="." node_paths=PackedStringArray("portal") instance=ExtResource("2_4vena")] [node name="ProceduralMeshMaker" parent="." node_paths=PackedStringArray("portal") instance=ExtResource("2_4vena")]
height = 2.25
width = 1.5
indent = null
portal = NodePath("../MeshInstance3D") 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

View File

@ -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 height: float = 2.0
@export_range(0.1, 10, 0.01) var width: float = 1.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 @export var portal: Portal
func _add_inspector_buttons() -> Array: func _add_inspector_buttons() -> Array:
@ -12,6 +14,10 @@ func _add_inspector_buttons() -> Array:
"name": "Generate Portal Mesh", "name": "Generate Portal Mesh",
"pressed": generate_portal_mesh "pressed": generate_portal_mesh
}) })
buttons.push_back({
"name": "Remove Mesh",
"pressed": func(): portal.mesh = null
})
return buttons return buttons
@ -43,28 +49,18 @@ func generate_portal_mesh() -> void:
var normals = PackedVector3Array() var normals = PackedVector3Array()
var indices = PackedInt32Array() var indices = PackedInt32Array()
# Bottom left triangle of a rect var TOP_LEFT = Vector3(-width / 2, height, 0)
verts.append(Vector3(-width/2, 0, 0)) var TOP_RIGHT = Vector3(width / 2, height, 0)
verts.append(Vector3(width/2, 0, 0)) var BOTTOM_LEFT = Vector3(-width / 2, 0, 0)
verts.append(Vector3(width/2, height, 0)) var BOTTOM_RIGHT = Vector3(width / 2, 0, 0)
uvs.append(Vector2(0, 1)) verts.append_array([TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT])
uvs.append(Vector2(1, 1)) uvs.append_array([Vector2(0, 0), Vector2(1, 0), Vector2(0, 1), Vector2(1, 1)])
uvs.append(Vector2(0, 0)) 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]) # top-left triangle
indices.append_array([0, 1, 2]) 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_VERTEX] = verts
surface_array[Mesh.ARRAY_TEX_UV] = uvs surface_array[Mesh.ARRAY_TEX_UV] = uvs