dp-konzultace/procedural_mesh_maker.gd

74 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
## 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")