@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.1, 0.001) var indent: float = 0.1 @export var portal: Portal func _add_inspector_buttons() -> Array: var buttons = [] 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 = [] if portal == null: warnings.append("Assign a portal to generate the mesh for") return warnings func generate_portal_mesh() -> void: if portal == null: push_error("No portal") return if portal.mesh != null: push_warning("The portal %s already has a mesh!" % portal.name) return var mesh = ArrayMesh.new() print("[PMM] Creating mesh") var surface_array = [] surface_array.resize(Mesh.ARRAY_MAX) var verts = PackedVector3Array() var uvs = PackedVector2Array() 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) 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]) indices.append_array([0, 1, 2]) # top-left triangle indices.append_array([1, 3, 2]) # bottom-right triangle surface_array[Mesh.ARRAY_VERTEX] = verts surface_array[Mesh.ARRAY_TEX_UV] = uvs surface_array[Mesh.ARRAY_NORMAL] = normals surface_array[Mesh.ARRAY_INDEX] = indices # No blendshapes, lods, or compression used. mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, surface_array) portal.mesh = mesh print("[PMM] Mesh assigned")