here’s what I suggested doing with uv-mesh representation
don’t know why but subsequent execution of this code doing twice as fast than the first run after max start
t1=timestamp();hf = heapfree
max create mode
with redraw off
(
-- example scene
sp =
(
max create mode
delete objects
sp = teapot name:"test_mesh" mapcoords:on isSelected:true
addmodifier sp (Uvwmap maptype:0)
sp = converttopoly sp
for k=1 to 3 do polyop.attach sp (copy sp)
update sp
sp
)
fn GetAllMeshElements node =
(
local tmesh = snapshotasmesh node
local faces = #{1..tmesh.numfaces}
local verts = for v = 1 to tmesh.numverts collect #()
local undone = #{1..tmesh.numverts}
local elements = #()
for j in faces do
(
f = getface tmesh j
append verts[f[1]] j
append verts[f[2]] j
append verts[f[3]] j
)
for i in faces do
(
element = #(i)
for j in element where faces[j] do
(
faces[j] = false
f = getface tmesh j
if undone[f[1]] do (join element verts[f[1]]; undone[f[1]] = false )
if undone[f[2]] do (join element verts[f[2]]; undone[f[2]] = false )
if undone[f[3]] do (join element verts[f[3]]; undone[f[3]] = false )
)
append elements (element as bitarray)
)
elements
)
sel = selection[1]
convertToMesh sel
tri = snapshotasmesh sel
meshUV = mesh mesh:tri
channelInfo.CopyChannel meshUV 3 1
channelInfo.PasteChannel meshUV 1 0
collapseStack meshUV
elems = GetAllMeshElements meshUV
meshop_getVertsUsingFace = meshop.getVertsUsingFace
vts = #()
vts.count = tri.numverts
for el in elems do
(
fv = meshop_getVertsUsingFace meshUV el
shift = [ 1e9, 1e9, 0 ]
for v in fv do
(
vts[v] = vv = getVert meshUV v
if vv.x < shift.x do shift.x = vv.x
if vv.y < shift.y do shift.y = vv.y
)
for v in fv do setvert meshUV v (vts[v] - shift)
)
update meshUV
channelInfo.CopyChannel meshUV 1 0
channelInfo.PasteChannel sel 3 1
delete meshUV
free tri
)
format "Time: %sec. Mem: %\n" ((timestamp()-t1)/1000 as float) (hf-heapfree)