Create Ngon with variable sides count [SOLVED]
-
On 21/08/2014 at 23:06, xxxxxxxx wrote:
User Information:
Cinema 4D Version: 15
Platform:
Language(s) : C++ ;---------
Hi, I can create Ngons fine with the example from the SDK. The question is, how can I create an Ngon with a user controlled number of points.//Generate N-Gon int mySides = 7; //this is a dynamic value, and therefore cannot be used with padr AutoAlloc<PolygonObject> obj(0,0); if (!obj) return FALSE; AutoAlloc<Modeling> mod; if (!mod || !mod->InitObject(obj)) return FALSE; //Create a circular point array maxon::BaseArray<Int32>myPoints; Matrix m; for (int i=0; i<mySides; i++) { m = MatrixRotY(Rad(i*360/ mySides)); int temp = mod->AddPoint(obj, m*Vector(100,0,0)); myPoints.Append(temp); } Int32 padr[] = {-1, -2, -3, -4, -5, -6, -7}; // I want padr to use mySides for its size!! Int32 cnt = mySides; Int32 i = mod->CreateNgon(obj, padr, cnt); if (!i) return FALSE; if (!mod->Commit()) return FALSE; doc->InsertObject(obj.Release(), NULL, NULL); EventAdd();
Please excuse the r15 code style
-
On 21/08/2014 at 23:19, xxxxxxxx wrote:
Int32 *padr = new Int32[mySides];
....
if(padr) { delete padr; padr = NULL}
-
On 21/08/2014 at 23:58, xxxxxxxx wrote:
Thanks a lot Mohamed. It works.
-
On 22/08/2014 at 00:20, xxxxxxxx wrote:
glad that it worked
don't forget to delete the pointer once you finish working with it (or it will create a memory leak), read more about heap memory in C++ on stackoverflow "google is your friend" -
On 22/08/2014 at 01:21, xxxxxxxx wrote:
I did, thanks!
A follow up question if you don't mind. I need to assign a different material tag (plus restriction and projection) to that created Ngon.
With regular polygons, I use this, where ret is the returned generator object:BaseTag* t = NULL; t = (static_cast<BaseTag*>(tex->GetClone(COPYFLAGS_0, NULL))); //get a copy of the texture tag defined in Init ret->InsertTag(t); sT = SelectionTag::Alloc(Tpolygonselection); //defined as a class variable ret->InsertTag(sT); sT->SetName("Selected Polygons 0"); BaseSelect* bs = sT->GetBaseSelect(); bs->SelectAll(0,10); //selecting forst 11 polygons t->SetParameter(DescID(TEXTURETAG_RESTRICTION), GeData(sT->GetName()), DESCFLAGS_SET_0); t->SetParameter(DescID(TEXTURETAG_PROJECTION), GeData(TEXTURETAG_PROJECTION_UVW), DESCFLAGS_SET_0);
Now how can I do this for the Ngon?
-
On 22/08/2014 at 01:30, xxxxxxxx wrote:
I'm not sure how it works "still my experience with the SDK near 0"
but I think this line:
bs->SelectAll(0,10); //try to select last polygon -
On 22/08/2014 at 08:36, xxxxxxxx wrote:
I just read the Ngons do not support UVs, so using them is moot.
I would have to build the cap manually with regular polygons and tris. -
On 22/08/2014 at 10:37, xxxxxxxx wrote:
I guess you can triangulate the NGons and use this, there must be a way to work with them similar to polygon containers
-
On 22/08/2014 at 17:08, xxxxxxxx wrote:
Yes, underneath, NGons are 'collections of polygon edges'. So, you will need to get the underlying polygons to work on the UVs. PolygonObject has a method, GetNGonTranslationMap() which will return a set of polygon indices. The NGon stuff is a bit complicated and there are several underlying classes, such as Pgon, to go between NGons and polygons.