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

    Collider-cache Null-Object memleak

    Scheduled Pinned Locked Moved SDK Help
    2 Posts 0 Posters 201 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 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;
        }

      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 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;  
        }
        
        1 Reply Last reply Reply Quote 0
        • First post
          Last post