Yeah, I can share my code, maybe that will help.
func init_mesh():
var mdt = MeshDataTool.new()
var cube = get_node("Mesh")
var mesh = cube.get_mesh()
var mat = cube.get_surface_material(0)
mdt.create_from_surface(mesh, 0)
var done = {}
var bary = {}
randomize()
var rand_color = Color(randf(), randf(), randf())
var nors = {}
for j in range(mdt.get_face_count()):
var fid = mdt.get_face_vertex(j, 0)
var nor = mdt.get_vertex_normal(fid)
var coords = [Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1)]
for n in nors:
var dot = nor.dot(nors[n]["normal"])
if dot == 1:
rand_color = nors[n]["color"]
else:
rand_color = Color(randf(), randf(), randf())
nors[fid] = {"normal": nor, "color": rand_color}
for k in range(3):
var vid = mdt.get_face_vertex(j, k)
if bary.get(vid):
coords.erase(bary.get(vid))
for i in range(3):
var vid = mdt.get_face_vertex(j, i)
if !done.get(vid):
done[vid] = true
var removal = Vector3(0.0, 0.0, 0.0)
var vert_0 = mdt.get_face_vertex(j, 0)
var vert_1 = mdt.get_face_vertex(j, 1)
var vert_2 = mdt.get_face_vertex(j, 2)
var edge_a = mdt.get_vertex(vert_2).distance_to(mdt.get_vertex(vert_0))
var edge_b = mdt.get_vertex(vert_0).distance_to(mdt.get_vertex(vert_1))
var edge_c = mdt.get_vertex(vert_1).distance_to(mdt.get_vertex(vert_2))
if (edge_a > edge_b) && (edge_a > edge_c):
removal.y = 1.0
elif (edge_b > edge_c) && (edge_b > edge_a):
removal.x = 1.0
else:
removal.z = 1.0
var next = coords.pop_front()
if next:
bary[vid] = next + removal
else:
var coords2 = [Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1)]
for m in range(3):
if m == i:
continue
var vid2 = mdt.get_face_vertex(j, m)
if bary.get(vid2):
coords2.erase(bary.get(vid2))
bary[vid] = coords.pop_front() + removal
mdt.set_vertex_color(vid, Color(bary[vid].x, bary[vid].y, bary[vid].z))
mesh.surface_remove(0)
mdt.set_material(mat)
mdt.commit_to_surface(mesh)