Maxon Developers Maxon Developers
    • Documentation
      • Cinema 4D Python API
      • Cinema 4D C++ API
      • Cineware API
      • ZBrush Python API
      • ZBrush GoZ API
      • Code Examples on Github
    • Forum
    • Downloads
    • Support
      • Support Procedures
      • Registered Developer Program
      • Plugin IDs
      • Contact Us
    • Categories
      • Overview
      • News & Information
      • Cinema 4D SDK Support
      • Cineware SDK Support
      • ZBrush 4D SDK Support
      • Bugs
      • General Talk
    • Recent
    • Tags
    • Users
    • Login

    Objects can't access point info from my generator

    Scheduled Pinned Locked Moved SDK Help
    5 Posts 0 Posters 414 Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • H Offline
      Helper
      last edited by

      THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

      On 12/10/2010 at 13:42, xxxxxxxx wrote:

      User Information:
      Cinema 4D Version:   11.5 
      Platform:   Windows  ;   
      Language(s) :     C++  ;

      ---------
      hi guys,

      I was wondering if anyone's experienced this problem before. I've got a generator object that creates a polygon mesh for a gear. It reacts to deformers and everything else normally and can be made editable without issue. The thing is, before it's converted to an editable poly, there are certain objects that ignore it:

      Boolean, Connect, Atom Array, HyperNURBS, and Mograph's Fracture Object set to Explode Segments & Connect.

      Also, object primitives are visible while they're in point/edge/polygon mode, albeit they can't be modified. The thing is, my object just disappears from the viewport when it's selected in the Object Manager.

      It's like other objects can't access its point/polygon  information. I used the roundedTube object from the included SDK examples as a reference when I did my code. I've scanned through it several times but I still couldn't find anything different. Maybe it's a flag that I forgot to include? Maybe I accidentally protected something?

      1 Reply Last reply Reply Quote 0
      • H Offline
        Helper
        last edited by

        THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

        On 12/10/2010 at 20:26, xxxxxxxx wrote:

        I don't have much experience with that, but I have had objects disappear on me before.
        This was due to not cloning an object before I made it editable, or due to allocating an object, inserting it into the document,
        and then deleting it (by mistake), rather than letting Cinema4D take control of it.

        1 Reply Last reply Reply Quote 0
        • H Offline
          Helper
          last edited by

          THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

          On 13/10/2010 at 02:11, xxxxxxxx wrote:

          Please post some reduced code that still shows the problem otherwise it's hard to tell what's going on.

          cheers,
          Matthias

          1 Reply Last reply Reply Quote 0
          • H Offline
            Helper
            last edited by

            THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

            On 13/10/2010 at 03:08, xxxxxxxx wrote:

            Here's the stripped version of my plugin.

              
            #define ID_TOOTHEDWHEEL 1025798  
              
            #include "c4d.h"  
            #include "c4d_symbols.h"  
            #include "Otoothedwheel.h"  
            ///////////////////////////////////////////////////////////////////////////////  
            class ToothedWheel : public ObjectData{    // TOOTHED WHEEL OBJECT  
              
            public:  
              String test;  
              
              virtual Bool Read            (GeListNode *node, HyperFile *hf, LONG level);  
              virtual Bool Write            (GeListNode *node, HyperFile *hf);  
              
              virtual void GetDimension    (PluginObject *op, Vector *mp, Vector *rad);  
              
              virtual BaseObject* GetVirtualObjects(PluginObject*op, HierarchyHelp *hh);  
              virtual Bool Message(GeListNode *node, LONG type, void *t_data);  
              
              static NodeData *Alloc(void) { return gNew ToothedWheel; }  
              
            };  
            ///////////////////////////////////////////////////////////////////////////////  
            // read from hyperfile  
            Bool ToothedWheel::Read(GeListNode *node, HyperFile *hf, LONG level){  
              if (level>=0){  
                  hf->ReadString(&test);  
                  }  
              return TRUE;  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            // Write to hyperfile  
            Bool ToothedWheel::Write(GeListNode *node, HyperFile *hf){  
              hf->WriteString(test);  
              return TRUE;  
            }  
              
            ///////////////////////////////////////////////////////////////////////////////  
            // respond to messages  
            Bool ToothedWheel::Message(GeListNode *node, LONG type, void *t_data){  
              if(type == MSG_DESCRIPTION_VALIDATE){//check if values are valid  
              
                  }  
              else if(type==MSG_MENUPREPARE){  
                  ((BaseObject* )node)->SetPhong(TRUE,TRUE, pi/6);  
                  }  
              return TRUE;  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            // for object's bounding box  
            void ToothedWheel::GetDimension(PluginObject *op, Vector *mp, Vector *rad){  
              BaseContainer *data = op->GetDataInstance();  
              Real r, h, th;  
              r = data->GetReal(TOOTHEDWHEELOBJECT_R);  
              h = data->GetReal(TOOTHEDWHEELOBJECT_H);  
              th = data->GetReal(TOOTHEDWHEELOBJECT_TOOTHHEIGHT);  
              *mp = 0.0;  
              *rad = Vector(r+th, h*.5, r+th);  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            // create geometry  
            static BaseObject *GenerateLathe(Vector *cpadr, LONG loopCount, Real segmentAngle, LONG toothCount, BaseThread *bt){  
              
              PolygonObject *op = NULL;  
              Vector *vadr = NULL;  
              CPolygon *padr = NULL;  
              LONG i,j,segmentNumber,vcnt,pcnt,a,b,c,d;  
              Real len = 0.0, sn, cs, v1, v2, *uvadr = NULL;//sn = sine component, cs = cosine component  
              segmentNumber = toothCount*3;  
              
              vcnt = loopCount*segmentNumber;//vertex count  
              pcnt = loopCount*segmentNumber;//polygon count  
              
              op = PolygonObject::Alloc(vcnt, pcnt);  
              if (!op) goto Error;  
              
              vadr = op->GetPointW();//writable point array  
              padr = op->GetPolygonW();//writable polygon array  
              pcnt = 0;  
              
              for(i = 0; i<segmentNumber; i++){//loop for point locations + polygon assignments aound circle  
                  v1=Real(i  )/Real(segmentNumber);  
                  v2=Real(i+1)/Real(segmentNumber);  
              
                  if (bt && bt->TestBreak()) goto Error;  
              
                  for(j = 0; j<loopCount; j++){//0-7  
                      a = loopCount*i    \+ j;  
                      SinCos(segmentAngle*(Real(i)+0.5), sn, cs);  
                      a = loopCount*i    \+ j;  
                      vadr[a] = Vector(cpadr[j].x*cs, cpadr[j].y, cpadr[j].x*sn);  
              
                      if(i<segmentNumber){  
                          b = loopCount*i                            \+ (j+1)%loopCount;  
                          c = loopCount*( (i+1)%segmentNumber)    \+ (j+1)%loopCount;  
                          d = loopCount*( (i+1)%segmentNumber)    \+ j;  
                          }  
              
                      if(j<loopCount-1) padr[pcnt++] = CPolygon(a,b,c,d);  
                      }  
                  }  
              
              op->Message(MSG_UPDATE);  
              op->SetPhong(TRUE, TRUE, Rad(80.0));  
              return op;  
            Error:  
              blDelete(op);  
              return NULL;  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            // virtual objects  
            BaseObject *ToothedWheel::GetVirtualObjects(PluginObject *op, HierarchyHelp *hh){  
              LineObject *lop = NULL;  
              BaseObject *ret = NULL;      
              ///////////////////////////////////////  
              Bool dirty = op->CheckCache(hh) || op->IsDirty(DIRTY_DATA);//check chache data  
              if (!dirty) return op->GetCache(hh);  
              
              BaseContainer *data = op->GetDataInstance();//get ToothedWheel object data  
              
              Real r = data->GetReal(TOOTHEDWHEELOBJECT_R);  
              Real h = data->GetReal(TOOTHEDWHEELOBJECT_H);  
              Real br = data->GetReal(TOOTHEDWHEELOBJECT_BR);  
              Real bd = data->GetReal(TOOTHEDWHEELOBJECT_BD);  
              Real holer = data->GetReal(TOOTHEDWHEELOBJECT_HOLER);  
              Real holebr = data->GetReal(TOOTHEDWHEELOBJECT_HOLEBR);  
              Real holebd = data->GetReal(TOOTHEDWHEELOBJECT_HOLEBD);  
              LONG tc = data->GetLong(TOOTHEDWHEELOBJECT_TOOTHCOUNT);  
              Real tr = data->GetReal(TOOTHEDWHEELOBJECT_TOOTHHEIGHT);  
              
              LONG segmentNumber = tc*3;  
              Real sectorAngle = pi2/tc;  
              Real segmentAngle = pi2/tc/3;  
                
              ///////////////////////////////////////  
              LONG loopCount = 8;//eight reference circles: (bevel radius, hole bevel radius, hole bevel depth)*(upper and lower)  
              Vector *cpadr = (Vector* )GeAlloc(loopCount*sizeof(Vector));//allocate memory for ring array  
              if(!cpadr) return NULL;  
              /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
              // cylindrical distance array for rings. [radial distance, height, 0.0]  
              if(tr > br){  
                  cpadr[0] = Vector(r, h*.5, 0.0);  
                  cpadr[7] = Vector(r, -h*.5, 0.0);  
                  }  
              else{  
                  cpadr[0] = Vector(r, tr*bd/br+(h*0.5-bd), 0.0);  
                  cpadr[7] = Vector(r, -tr*bd/br-(h*0.5-bd), 0.0);  
                  }  
              
              if(tr > br){  
                  cpadr[1] = Vector(r, h*.5, 0.0);  
                  cpadr[6] = Vector(r, -h*.5, 0.0);  
                  }  
              else{  
                  cpadr[1] = Vector(r+tr-br, h*.5, 0.0);  
                  cpadr[6] = Vector(r+tr-br, -h*.5, 0.0);  
                  }  
              cpadr[2] = Vector(holer+holebr,    h*.5, 0.0);  
              cpadr[5] = Vector(holer+holebr,    -h*.5, 0.0);  
              cpadr[3] = Vector(holer, h*.5-holebd, 0.0);  
              cpadr[4] = Vector(holer, -h*.5+holebd, 0.0);  
              
              if(hh->GetVFlags()&VFLAG_POLYGONAL){  
                  ret = GenerateLathe(cpadr, loopCount, segmentAngle, tc, hh->GetThread());//third item is point count, toothcount*3  
                  if (!ret) goto Error;  
                  ret->KillTag(Tphong);  
                  if(!op->CopyTagsTo(ret, TRUE, FALSE, FALSE, NULL) ) goto Error;  
                  }  
              else{  
                  ret = PolygonObject::Alloc(0,0);  
                  if (!ret) goto Error;  
                  }  
              
              ret->SetName(op->GetName());  
              
              GeFree(cpadr);  
              return ret;  
              
              Error:  
                  GeFree(cpadr);  
                  blDelete(ret);  
                  return NULL;  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            //register plugin  
            Bool PluginStart(void){// the main function C4D calls to begin your plugin (think of it as main)  
              
              const Filename pluginPath = GeGetPluginPath();  
              if (!resource.Init(pluginPath)) return FALSE;  
              
              return RegisterObjectPlugin(ID_TOOTHEDWHEEL,"Toothed Wheel",  
                                          OBJECT_GENERATOR,  
                                          ToothedWheel::Alloc,"Otoothedwheel",  
                                          "toothed-wheel-icon.png", 0);  
                                          // registers a object plugin with C4D  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            void PluginEnd(void){// called when the plugin is unloaded from C4D  
            }  
            ///////////////////////////////////////////////////////////////////////////////  
            Bool PluginMessage(LONG id, void *data){  // allows you to receive plugin messages from C4D or other plugins   
              return TRUE;  
            }  
            

            Still trying to figure out what I missed. I'll just work on optimizing my code for now.

            Thanks for the help,

            -gene

            1 Reply Last reply Reply Quote 0
            • H Offline
              Helper
              last edited by

              THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED

              On 13/10/2010 at 12:05, xxxxxxxx wrote:

              I found the issue. I tried using a different pluginID to see if a fresh build of the plugin would work. Now everything works fine.

              I did several Edit>Set As Default... commands a while back to maintain the scene/object  for debugging. I think there was a parameter from an older build that was kept that brought about the glitch.

              I guess this means I'll have to clear my Prefs  folder now... O__o

              Thanks guys,

              -gene

              1 Reply Last reply Reply Quote 0
              • First post
                Last post