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 stuffif(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
-- MeshTo 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; }