43 lines
1.3 KiB
GDScript
43 lines
1.3 KiB
GDScript
extends MeshInstance3D
|
|
|
|
@export var normal : Vector3
|
|
|
|
func regenerate_mesh():
|
|
var arrays := []
|
|
arrays.resize(Mesh.ARRAY_MAX)
|
|
|
|
var vertex_array := PackedVector3Array()
|
|
var uv_array := PackedVector2Array()
|
|
var normal_array := PackedVector3Array()
|
|
|
|
var index_array := PackedInt32Array()
|
|
|
|
var resolution := 5
|
|
var num_vertices : int = resolution * resolution
|
|
var num_indices : int = (resolution-1) * (resolution-1) * 6
|
|
|
|
vertex_array.resize(num_vertices)
|
|
normal_array.resize(num_vertices)
|
|
uv_array.resize(num_vertices)
|
|
index_array.resize(num_indices)
|
|
|
|
var tri_index : int = 0
|
|
var a_axis := Vector3(normal.y, normal.z, normal.z)
|
|
var b_axis : Vector3 = normal.cross(a_axis)
|
|
for y in range(resolution):
|
|
for x in range(resolution):
|
|
var i : int = x + y*resolution
|
|
var percent := Vector2(x,y) / (resolution-1)
|
|
var point_on_cube : Vector3 = normal + (percent.x - 0.5)*2.0*a_axis + (percent.y - 0.5)*2.0*b_axis
|
|
vertex_array[i] = point_on_cube
|
|
if x != resolution-1 and y != resolution-1:
|
|
index_array[tri_index + 2] = i
|
|
index_array[tri_index + 1] = i+resolution+1
|
|
index_array[tri_index] = i+resolution
|
|
|
|
index_array[tri_index + 5] = i
|
|
index_array[tri_index + 4] = i+1
|
|
index_array[tri_index + 3] = i+resolution+1
|
|
tri_index += 6
|
|
|