difference between BaseObjects???

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

On 14/03/2010 at 06:50, xxxxxxxx wrote:

User Information:
Cinema 4D Version:   r11 
Platform:      
Language(s) :

---------
Hi, i am using this to access a user defined object:

cloneOfBase = op->GetAndCheckHierarchyClone(hh,baseMesh,HCLONE_ASPOLY,&dirty,NULL,FALSE);  
  if (!cloneOfBase) goto Error;

and this to get its points and polygons:

  
      padr = ToPoint(cloneOfBase)->GetPointR();  
      pol = ToPoly(cloneOfBase)->GetPolygonR();  
      count = ToPoint(cloneOfBase)->GetPointCount();  

everything works fine, but as soon as i use this line (while 0<i<count) it crashes for certain objects (e.g. Ooiltank, Ofractal,Odisc), Oplane, Ocube, Opyramid and nearly all others work :

Vector mPoint = (padr[pol[i].a] + padr[pol[i].b] + padr[pol[i].c] + padr[pol[i].d])/(3 + (pol[i].c == pol[i].d));  

can anyone tell me why??
thank you very much!

cheers,
Ello

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

On 14/03/2010 at 12:40, xxxxxxxx wrote:

what do you have for "Error:"?    what is there?

you say

if (!cloneOfBase) goto Error;

what comes after "Error"  ?

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

On 14/03/2010 at 14:01, xxxxxxxx wrote:

nothing special, just this to free neccessary stuff and return nothing:

  
  
Error:  
  blDelete(main);  
  return NULL;  
}  

i found that i exceeded the maximum entries, after fixing that it works.  only thing i still dont understand is why it worked for some objects and others not

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

On 15/03/2010 at 14:59, xxxxxxxx wrote:

Hi there,

so, the issue is again fighting back in other dimensions. in the editor everything looks like it should (clones are placed properly), until i try to render it. than it crashes (sometimes with an general message, sometimes it hangs like i have to use the taskmanager to quit cinema)..

any ideas where to search for the bug??

cheers,
ello

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

On 15/03/2010 at 15:01, xxxxxxxx wrote:

Have you tried placing some GePrint() 's in there to see where it makes it to.   This will help you figure out which code is causing the crash.

🙂

~Shawn

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

On 15/03/2010 at 15:06, xxxxxxxx wrote:

also,  be sure to check all of your pointers..   for example,   if you have.....

BaseObject * op = BaseObject::Alloc(Osphere);

make sure you have

if (!op) return False;   or something like it.   🙂

~Shawn

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

On 16/03/2010 at 00:40, xxxxxxxx wrote:

ye, i'll try the thing with GePrint.. used it before. Sometimes i just dont see the wood because of the trees 🙂

pointers are all checked. the strange thing is that it just happens when rendering. the object itself works and i can convert (using c) and this works too... only rendering crashes...

cheers,
ello

btw, how can i know in an object plugin if the render has been called??

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

On 16/03/2010 at 00:53, xxxxxxxx wrote:

Originally posted by xxxxxxxx

btw, how can i know in an object plugin if the render has been called??

In GetVirtualObjects() check the HierarchyHelp's GetVFlags() method.

cheers,
Matthias

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

On 16/03/2010 at 02:12, xxxxxxxx wrote:

ok, i managed to find what is causing the crash now..
Here is the relevant code:

  
PolygonObject*  baseMesh = static_cast<PolygonObject*>(bc->GetLink(BASEMESH,doc));  
if (!baseMesh) goto Error;  
...  
op->NewDependenceList();  
op->AddDependence(hh,baseMesh); // <--- this is causing the crash  

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

On 16/03/2010 at 02:35, xxxxxxxx wrote:

can someone point me on how exactly i can check if GetVFlags() contains VFLAG_INTERNALRENDERER or VFLAG_EXTERNALRENDERER ?? it returns 18(if rendered in editor) and 20 (if rendered in the image manager) but if i try this:

if((hh->GetVFlags()!=18)&&(hh->GetVFlags()!=20))op->AddDependence(hh,baseMesh);  

it still crashes...
if i comment that line out, it doesnt crash anymore, but i need that line for performance reasons

thanks and cheers,
ello

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

On 16/03/2010 at 03:03, xxxxxxxx wrote:

GetVFlags() returns a bit mask. You have to mask the bits you want to check (single & and single | operator).

  
if (GetVFlags() & VFLAG_INTERNALRENDERER)  
{  
 //editor rendering  
}  
  
else if (GetVFlags() & VFLAG_EXTERNALRENDERER)  
{  
 //external rendering  
}  

cheers,
Matthias

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

On 16/03/2010 at 03:07, xxxxxxxx wrote:

thank you! than it must be something other.. if i use the following line and render in the editor, it crashes:

if (!(hh->GetVFlags() & VFLAG_INTERNALRENDERER))op->AddDependence(hh,baseMesh);

if i comment the whole thing out, it renders with no problem.

any ideas what could cause this strange behaviout? why does commenting works, but disabling when rendering doesnt??

cheers,
Ello

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

On 16/03/2010 at 03:38, xxxxxxxx wrote:

and to make it even more strange, rendering in into the image manager works, but rendering in the editor doesnt work:

Bool editing = TRUE;  
if (hh->GetVFlags() & VFLAG_INTERNALRENDERER) editing = FALSE;  
if (hh->GetVFlags() & VFLAG_EXTERNALRENDERER) editing = FALSE;  
if (editing) op->AddDependence(hh,baseMesh);  
else GePrint("rendering...");  

any ideas?

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

On 16/03/2010 at 03:56, xxxxxxxx wrote:

Can you post a simplified version of your GetVirtualObjects() method that shows the problem?

cheers,
Matthias

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

On 16/03/2010 at 04:27, xxxxxxxx wrote:

ok, here it is.. hope it makes sense.

  
BaseObject *cloneOnMesh::GetVirtualObjects(PluginObject *op, HierarchyHelp *hh)  
  {           
  editing = TRUE;  
  if (hh->GetVFlags() & VFLAG_INTERNALRENDERER)   
      {  
      //GePrint ("rendering in editor");  
      editing = FALSE;  
      }  
  if (hh->GetVFlags() & VFLAG_EXTERNALRENDERER)   
      {  
      //GePrint ("rendering in manager");  
      editing = FALSE;  
      }   
  Bool facing = FALSE;  
  BaseObject* child = NULL;  
  Bool autoCalculate = FALSE;  
  BaseObject* cloneOfBase = NULL;  
  BaseObject* baseMesh = NULL;  
  const Vector* padr;  
  const CPolygon* pol;  
  LONG numberofclones;  
  LONG maxcount;  
  BaseDocument* doc = op->GetDocument();  
  BaseContainer *bc=op->GetDataInstance();  
  BaseObject* targetHelper = NULL;  
  Bool dirty;  
  BaseObject *main = BaseObject::Alloc(Onull);  
  main->SetName(pluginName);        
  if (!main) goto Error;  
  
  //object which should be faced by clones  
  targetHelper = static_cast<PolygonObject*>(bc->GetLink(FACING,doc));  
  if (targetHelper) facing = TRUE;  
  //find object to be cloned  
  child = op->GetDown();   
  if(!child) goto Error;  
  //objects to place clones along  
  baseMesh = static_cast<PolygonObject*>(bc->GetLink(BASEMESH,doc));  
  if (!baseMesh) goto Error;  
  
  if (editing)  
      {  
      // start new list  
      op->NewDependenceList();  
      op->AddDependence(hh, child);  
      op->AddDependence(hh,baseMesh);  
      if (facing) op->AddDependence(hh, targetHelper);  
  
      dirty = op->CheckCache(hh) || op->IsDirty((autoCalculate*DIRTY_MATRIX)|DIRTY_DATA|DIRTY_CHILDREN);  
      dirty = dirty || !op->CompareDependenceList();  
      //return cache  
      if (!dirty)   
          {  
          blDelete(main);                    
          op->TouchDependenceList();  
          return op->GetCache(hh);  
          }  
      }  
  cloneOfBase = op->GetAndCheckHierarchyClone(hh,baseMesh,HCLONE_ASPOLY,&dirty,NULL,FALSE);  
  if (!cloneOfBase) goto Error;  
  
  padr = ToPoint(cloneOfBase)->GetPointR();  
  pol = ToPoly(cloneOfBase)->GetPolygonR();  
  numberofclones = maxcount = ToPoly(cloneOfBase)->GetPolygonCount();  
  maxcount = ToPoly(cloneOfBase)->GetPolygonCount();  
  
  for (int i=0;i<numberofclones;i++)  
      {  
      // ... create clones and modify them  
      }   
  if (cloneOfBase) blDelete(cloneOfBase);  
  
  if (editing)  
      {  
      //if i dont do the following things the caching doesnt work  
      //actually i dont understand why i need to do this again  
      op->NewDependenceList();  
      op->AddDependence(hh, child);  
      op->AddDependence(hh,baseMesh);  
      if (facing) op->AddDependence(hh, targetHelper);  
      op->TouchDependenceList();       
      }  
  
  return main;  
  
Error:  
  blDelete(main);  
  return NULL;  
  }  

cheers,
ello

edit: i updated the code and with using the GetVFlags, it works now, so i guess it must be something other in my code where i am creating the clones (i'll double check the whole stuff again)...  nevertheless if there is something generally wrong with how i use the dependeceList, it'd be great if someone can point me to it.

cheers,
ello