78 lines
2.0 KiB
GDScript
78 lines
2.0 KiB
GDScript
@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
|
|
@export var portal: Portal
|
|
|
|
func _add_inspector_buttons() -> Array:
|
|
var buttons = []
|
|
|
|
buttons.push_back({
|
|
"name": "Generate Portal Mesh",
|
|
"pressed": generate_portal_mesh
|
|
})
|
|
|
|
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()
|
|
|
|
# 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))
|
|
|
|
uvs.append(Vector2(0, 1))
|
|
uvs.append(Vector2(1, 1))
|
|
uvs.append(Vector2(0, 0))
|
|
|
|
normals.append_array([Vector3.FORWARD, Vector3.FORWARD, Vector3.FORWARD])
|
|
indices.append_array([0, 1, 2])
|
|
|
|
# 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
|
|
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")
|