Create Ngon with variable sides count [SOLVED]

  • On 21/08/2014 at 23:06, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   15 
    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));
    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);

    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
    	sT = SelectionTag::Alloc(Tpolygonselection);  //defined as a class variable
    	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);

    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.

Log in to reply