Implement mechanism to transfer seams after a merge or cleanup.

This commit is contained in:
Relintai 2022-01-18 22:21:50 +01:00
parent 5c70ceb63f
commit 9ab64c2301
3 changed files with 105 additions and 3 deletions

View File

@ -743,28 +743,44 @@ func remove_doubles():
if !_mdr: if !_mdr:
return return
_mdr.disconnect("changed", self, "on_mdr_changed")
var mdr_arr : Array = _mdr.array var mdr_arr : Array = _mdr.array
if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
return return
var merged_arrays : Array = MeshUtils.remove_doubles(mdr_arr) var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
var merged_arrays : Array = MeshUtils.remove_doubles(mdr_arr)
_mdr.array = merged_arrays _mdr.array = merged_arrays
MDRMeshUtils.points_to_seams(_mdr, seam_points)
_mdr.connect("changed", self, "on_mdr_changed")
on_mdr_changed()
func merge_optimize(): func merge_optimize():
if !_mdr: if !_mdr:
return return
_mdr.disconnect("changed", self, "on_mdr_changed")
var mdr_arr : Array = _mdr.array var mdr_arr : Array = _mdr.array
if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0: if mdr_arr.size() != ArrayMesh.ARRAY_MAX || mdr_arr[ArrayMesh.ARRAY_VERTEX] == null || mdr_arr[ArrayMesh.ARRAY_VERTEX].size() == 0:
return return
var merged_arrays : Array = MeshUtils.merge_mesh_array(mdr_arr) var seam_points : PoolVector3Array = MDRMeshUtils.seams_to_points(_mdr)
var merged_arrays : Array = MeshUtils.merge_mesh_array(mdr_arr)
_mdr.array = merged_arrays _mdr.array = merged_arrays
MDRMeshUtils.points_to_seams(_mdr, seam_points)
_mdr.connect("changed", self, "on_mdr_changed")
on_mdr_changed()
func onnect_to_first_selected(): func onnect_to_first_selected():
if !_mdr: if !_mdr:
return return

View File

@ -724,3 +724,86 @@ static func remove_seam(mdr : MeshDataResource, index0 : int, index1 : int) -> v
seams.remove(i) seams.remove(i)
mdr.seams = seams mdr.seams = seams
return return
static func is_verts_equal(v0 : Vector3, v1 : Vector3) -> bool:
return is_equal_approx(v0.x, v1.x) && is_equal_approx(v0.y, v1.y) && is_equal_approx(v0.z, v1.z)
static func points_to_seams(mdr : MeshDataResource, points : PoolVector3Array) -> void:
var arrays : Array = mdr.get_array()
if arrays.size() != ArrayMesh.ARRAY_MAX:
return
if arrays[ArrayMesh.ARRAY_VERTEX] == null:
return
var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
var indices : PoolIntArray = arrays[ArrayMesh.ARRAY_INDEX]
var seams : PoolIntArray = PoolIntArray()
for i in range(0, points.size(), 2):
var p0 : Vector3 = points[i]
var p1 : Vector3 = points[i + 1]
for j in range(0, indices.size(), 3):
var v0 : Vector3 = vertices[indices[j]]
var v1 : Vector3 = vertices[indices[j + 1]]
var v2 : Vector3 = vertices[indices[j + 2]]
var p0_index : int = -1
if is_verts_equal(p0, v0):
p0_index = indices[j]
elif is_verts_equal(p0, v1):
p0_index = indices[j + 1]
elif is_verts_equal(p0, v2):
p0_index = indices[j + 2]
if p0_index == -1:
continue
var p1_index : int = -1
if is_verts_equal(p1, v0):
p1_index = indices[j]
elif is_verts_equal(p1, v1):
p1_index = indices[j + 1]
elif is_verts_equal(p1, v2):
p1_index = indices[j + 2]
if p1_index == -1:
continue
if p0_index == p1_index:
continue
if p0_index > p1_index:
var t : int = p0_index
p0_index = p1_index
p1_index = t
seams.push_back(p0_index)
seams.push_back(p1_index)
break
mdr.seams = seams
static func seams_to_points(mdr : MeshDataResource) -> PoolVector3Array:
var points : PoolVector3Array = PoolVector3Array()
var arrays : Array = mdr.get_array()
if arrays.size() != ArrayMesh.ARRAY_MAX:
return points
if arrays[ArrayMesh.ARRAY_VERTEX] == null:
return points
var vertices : PoolVector3Array = arrays[ArrayMesh.ARRAY_VERTEX]
var seams : PoolIntArray = mdr.seams
for s in seams:
points.push_back(vertices[s])
return points

View File

@ -45,6 +45,9 @@ func initialize() -> bool:
return true return true
func get_vertex(index : int) -> Vector3: func get_vertex(index : int) -> Vector3:
if index > _vertices.size():
return Vector3()
var v : Vector3 = _vertices[index] var v : Vector3 = _vertices[index]
# This should reduce z fighting # This should reduce z fighting