From 04e95a081458db58995717c47fcc1f71b7549d77 Mon Sep 17 00:00:00 2001 From: Relintai Date: Wed, 19 Jan 2022 02:10:22 +0100 Subject: [PATCH] Wrote my own generate_normals method as apparently surface tool creates new vertices during normal generation. --- .../utilities/mdred_mesh_utils.gd | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd b/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd index 11a379f5..5373690c 100644 --- a/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd +++ b/game/addons/mesh_data_resource_editor/utilities/mdred_mesh_utils.gd @@ -625,10 +625,53 @@ static func add_into_surface_tool(mdr : MeshDataResource, st : SurfaceTool) -> v for ind in indices: st.add_index(ind) - static func generate_normals(mdr : MeshDataResource) -> void: var arrays : Array = mdr.get_array() + if arrays.size() != ArrayMesh.ARRAY_MAX: + arrays.resize(ArrayMesh.ARRAY_MAX) + + if arrays[ArrayMesh.ARRAY_INDEX] == null: + return + + + if arrays.size() != ArrayMesh.ARRAY_MAX: + arrays.resize(ArrayMesh.ARRAY_MAX) + + var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX] + var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX] + var normals : PoolVector3Array = PoolVector3Array() + normals.resize(vertices.size()) + var nc : PoolIntArray = PoolIntArray() + nc.resize(vertices.size()) + + for i in range(vertices.size()): + nc[i] = 0 + + for i in range(0, indices.size(), 3): + var i0 : int = indices[i] + + var v0 : Vector3 = vertices[i0] + var v1 : Vector3 = vertices[indices[i + 1]] + var v2 : Vector3 = vertices[indices[i + 2]] + + var n = Plane(v0, v1, v2).normal + + if nc[i0] == 0: + nc[i0] = 1 + normals[i0] = n + else: + normals[i0] = lerp(normals[i0], n, 0.5).normalized() + + arrays[ArrayMesh.ARRAY_NORMAL] = normals + mdr.array = arrays + + +# Apparently surfacetool adds more verts during normal generation +# Keeping this here for now +static func generate_normals_surface_tool(mdr : MeshDataResource) -> void: + var arrays : Array = mdr.get_array() + if arrays.size() != ArrayMesh.ARRAY_MAX: arrays.resize(ArrayMesh.ARRAY_MAX)