78 lines
2.5 KiB
GDScript
78 lines
2.5 KiB
GDScript
@tool
|
|
|
|
extends MeshInstance3D
|
|
class_name PlantetMeshFace
|
|
|
|
@export var normal : Vector3
|
|
|
|
func regenerate_mesh(planet_data):
|
|
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 : int = planet_data.resolution
|
|
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.x)
|
|
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
|
|
var point_on_sphere = point_on_cube.normalized()
|
|
var point_on_planet = planet_data.point_on_planet(point_on_sphere)
|
|
vertex_array[i] = point_on_planet
|
|
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
|
|
|
|
for a in range(0, index_array.size(), 3):
|
|
var b : int = a + 1
|
|
var c : int = a + 2
|
|
|
|
var ab : Vector3 = vertex_array[index_array[b]] - vertex_array[index_array[a]]
|
|
var bc : Vector3 = vertex_array[index_array[c]] - vertex_array[index_array[b]]
|
|
var ca : Vector3 = vertex_array[index_array[a]] - vertex_array[index_array[c]]
|
|
|
|
var cross_ab_bc : Vector3 = bc.cross(ab)
|
|
var cross_bc_ca : Vector3 = ca.cross(bc)
|
|
var cross_ca_ab : Vector3 = ab.cross(ca)
|
|
|
|
normal_array[index_array[a]] += cross_ab_bc + cross_bc_ca + cross_ca_ab
|
|
normal_array[index_array[b]] += cross_ab_bc + cross_bc_ca + cross_ca_ab
|
|
normal_array[index_array[c]] += cross_ab_bc + cross_bc_ca + cross_ca_ab
|
|
|
|
for i in range(normal_array.size()):
|
|
normal_array[i] = normal_array[i].normalized()
|
|
|
|
arrays[Mesh.ARRAY_VERTEX] = vertex_array
|
|
arrays[Mesh.ARRAY_NORMAL] = normal_array
|
|
arrays[Mesh.ARRAY_TEX_UV] = uv_array
|
|
arrays[Mesh.ARRAY_INDEX] = index_array
|
|
|
|
call_deferred("_update_mesh", arrays)
|
|
|
|
func _update_mesh(arrays : Array):
|
|
var _mesh := ArrayMesh.new()
|
|
_mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, arrays)
|
|
self.mesh = _mesh
|