Objects can't access point info from my generator
-
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?
-
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. -
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 -
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
-
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