Notifications
Clear all

[Closed] Maxscript – Update/Replace trimesh data in Editable Poly and Edit_Poly modifier?

Is it possible to directly change the trimesh in an editable poly and edit_poly modifier?

I want to create faces from verts on an existing model, but the “createFace” command is absurdly slow (seems to update the entire mesh for each individual face created). If a command existed to create many faces at once instead of needing to use loops maybe this could be avoided, but afaik no such command exists. I figured maybe if I can create a trimesh with the needed modifications and just use that to replace the old data this performance issue could be avoided.

10 Replies

have you tried using

MNMesh::setNumVerts
MNMesh::setNumFaces

and then create the face…

MNFace::MakePoly

?

this from my polyextrude mod…

static void BuildMeshFromPolyLine(MNMesh &pmesh, PolyLine& pline, float offset_amount)
{
	int num_polyline_points =  pline.numPts;
	if(!num_polyline_points) return;
	
	int num_segs = num_polyline_points;
	int num_verts = num_polyline_points * 2;
	int num_faces = num_polyline_points;

	pmesh.setNumVerts(num_verts);
	pmesh.setNumFaces(num_faces);

// verts

	int vi = 0;
	MNVert* verts = pmesh.v;
	for(int v = 0; v < num_polyline_points; ++v)
	{
		verts[vi].p = pline.pts[v].p;
		vi++;
	}
	
	for(int v = 0; v < num_polyline_points; ++v)
	{
		verts[vi].p = pline.pts[v].p;
		verts[vi].p.z = offset_amount;
		vi++;
	}

	int fi = 0;
	int fverts[4];
	MNFace* faces = pmesh.f;
	for(int f = 0; f < num_segs; ++f)
	{	
		fverts[0] = f;
		fverts[1] = (f + 1) % num_segs;
		fverts[2] = fverts[1] + num_segs;
		fverts[3] = fverts[0] + num_segs;
		faces[fi].MakePoly(4,fverts);
		fi++;
	}
	pmesh.FillInBorders();



	pmesh.InvalidateGeomCache();
	pmesh.InvalidateTopoCache();
	pmesh.FillInMesh();
}

doesn’t seem to suffer from any performance issues

Oops, should have mentioned I’m doing this in Maxscript.
Is it possible to set the number of faces and verts like that via maxscript for Editable_Poly and Edit_Poly?

You can append some trimesh to poly mesh using c# sdk.



with redraw off
(	
	g = (dotNetClass "Autodesk.Max.GlobalInterface").Instance

	-- make a demo trimesh
	global tmp_trimesh = TriMesh()
	tmp_trimesh.numfaces = 1
	tmp_trimesh.numverts = 3
	setvert tmp_trimesh 1 [0,0,7]
	setvert tmp_trimesh 2 [0,5,7]
	setvert tmp_trimesh 3 [5,5,7]
	
	setface tmp_trimesh 1 [1,2,3]

-- or you can use some built in primitive mesh
--  	tmp_trimesh = (createInstance GeoSphere radius:3).mesh
-- 	mesh mesh:tmp_trimesh wirecolor:yellow

	-- get native trimesh from temporary global mxs value
	fpv = g.fpvalue.create()	
	g.executemaxscriptscript "::tmp_trimesh" true fpv

	-- make a target poly object
	tea = Teapot radius:5 segments:4
	convertToPoly tea

	-- append this trimesh to poly mesh
	inode  = g.COREInterface7.GetINodeByHandle tea.inode.handle asdotnetobject:true
	iobj   = inode.evalworldstate (currenttime as integer) true asdotnetobject:true
	mnmesh = iobj.obj.mesh
		
	mnmesh.addtri fpv.msh

	globalVars.remove #tmp_trimesh

	update tea
)

tmp_trimesh -- should now be undefined

I see you are an active user c# sdk, Serejah … There is a good news for you. In modern versions of MAX (2020, 2021), the optional #asdotnetobject argument defaults to TRUE.

I’m just too lazy to dive into cpp to prototype something, so yeah turns out I’m a fan of c# sdk.
I hope AD won’t make c# deprecated too fast.

just whenever I write “asdotnetobject” it drives me crazy – why the hell did they do it by default FALSE … now I won’t

I have to check it again, but in max 2021 this problem is solved:


Swordslayer

Sep '19

This is the problem:

g = (dotNetClass "Autodesk.Max.GlobalInterface").Instance
g.CoreInterface --> this is all that's needed to break everything
g.CoreInterface7.SnapAngle_

Any CoreInterface that’s queried first is the one that gets returned for all the other ones after it. Here this returns true:

g.CoreInterface == g.CoreInterface7

It shouldn’t and I already filed a bugreport but don’t think it will help.

definitely this method must be used to get the latest coreinterface

(dotNetClass "Autodesk.Max.GlobalInterface").Instance.UtilGetCOREInterface***

Thanks for the help Serejah.
Had a follow up question; How would you go about setting edge visibility using this method? It seems that mnmesh discards edge data. I tried setting the edge visibility directly on the the mnmesh directly using setEdgeVis, but it always returns undefined.

Page 1 / 2