Collider-cache Null-Object memleak

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

On 22/07/2011 at 13:57, xxxxxxxx wrote:

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

---------
Hi,

i have a problem with te Collider Engine.
I want to fill the Collider Cache with all Objects in the Scene,
to make a hiddenline Test.

So all is ok with my function, but if there is a Null-Objekct in the Scene, than
my memory usage increases rapidly so that the plugin finaly crashes the computer
if I don't stop. I think the problem is in FillColliderCache which i have mostly taken from the SDK help.

I don't know why this happens and how to work around this.
Maybe you have an Idea ?

Thanks,🙂

Mackel

For the hiddenlineTest I use this:

while(opc){
  GePrint(opc->GetName());
  if(!FillColliderCache(cCache, opc)) GePrint("Fail Cache");
  else{
      GePrint(opc->GetName());
      for(int i = 0; i <= 100; i++){
          if(opc->GetType() != Onull) //make shure it is not my code in here that causes the problem
          {
              //Do some stuff

if(cEngine->DoRayCollide(cCache,wtail, !oray,op != opc ? ldist : (ldist-0.1)) != COL_OK)
                  GePrint("Error");

else if(cEngine->GetNumPairs() > 0){
                  count ++;
                  GePrint(opc->GetName() + "Collision begin" + LongToString(cEngine->GetNumPairs()));                          
                  collisions _= true;
              }
              else if(cEngine->GetNumPairs()== 0){
                  count ++;
              }
          }
      }
  }
                                         
  if(opc->GetDown()){
      level++;
      opc = opc->GetDown();
  }else if(opc->GetNext()){
      opc = opc->GetNext();
  }else if( level > 0){
      opc = opc->GetUp()->GetNext();
      level--;
  }else{
      opc = opc->GetNext();
  }
}

Filling the ColliderChace I using this:

Bool FillColliderCache(GeColliderCache* c, BaseObject* obj)
  { 
      // Get polygon object
      ModelingCommandData md1;
      md1.op = obj; md1.doc = obj->GetDocument();
      if (!SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT, md1)) return FALSE;
 
      // Triangulate it
      ModelingCommandData md2;
      md2.op = static_cast<BaseObject*>(md1.result->GetIndex(0));
      if (!SendModelingCommand(MCOMMAND_TRIANGULATE, md2)) return FALSE;
      AutoAlloc<PolygonObject> poly(static_cast<PolygonObject*>(md2.op)); if (!poly) return FALSE;
 
      // Get the polygon data
      const CPolygon* tris = poly->GetPolygonR();
      const Vector* points = poly->GetPointR();

//GeColliderCache* c = GeColliderCache::Alloc();
 
      // Fill the cache
      if (c->BeginInput(poly->GetPolygonCount()) != COL_OK) return FALSE;
      for (int i = 0; i < poly->GetPolygonCount(); ++i)
      {
        if (c->AddTriangle(obj->GetMg() * points[tris _.a], obj- >GetMg() * points[tris _.b], obj- >GetMg() * points[tris _.c], i) != COL_OK) return FALSE;
      }
      if (c->EndInput() != COL_OK) return FALSE;
 
      //bool succ = c->CopyTo(dest);

poly.Free();

//GeColliderCache::Free(c);

return true;//succ;
  }

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

On 22/07/2011 at 16:20, xxxxxxxx wrote:

1. The object for GeCollider must be a polygon object.

2. Current-State-To-Object returns the cache result so your polygon object may be under a Null object:

Null
-- Mesh

To avoid that situation, I call a method after doing the CSTO to find the polygon object that might be childed under something else.

  
{  
...  
  if (!SendModelingCommand(MCOMMAND_CURRENTSTATETOOBJECT, mcd) && mcd.result)  
      return NULL;  
  // Get result  
  PolygonObject*        cstoObj =    ToPoly(mcd.result->GetIndex(0L));  
  AtomArray::Free(mcd.result);  
  if (!cstoObj)                    return NULL;  
  return GetCSTOObject(cstoObj);  
}  
// Drill down into mainop and find the polygon object (if any)  
//*---------------------------------------------------------------------------*  
PolygonObject* CollisionDeformerObj::GetCSTOObject(BaseObject* op)  
//*---------------------------------------------------------------------------*  
{  
  PolygonObject*    pop    =    NULL;  
  for (; op; op = op->GetNext())  
  {  
      if (op->GetType() == Opolygon)    return ToPoly(op);  
      if (op->GetDown())  
      {  
          pop =        GetCSTOObject(op->GetDown());  
          if (pop)    return pop;  
      }  
  }  
  return NULL;  
}