Hi,
I've some problem with OpenSG thread,
In my main function I create 3 node, a geometry
node, attach to the material group node, attach to
the transformation node.
At that point no problem, my object corectly appear in the scene.

Then I need to update it's geometry with information got via the network,
I implemented in my class a method that construct and return a geometry node:
NodePtr grimageMesh::createGeometry(){
    NodePtr N = Node::create();
    GeometryPtr geo = Geometry::create();
    GeoPositions3fPtr points =GeoPositions3f::create();
    GeoIndicesUI32Ptr index = GeoIndicesUI32::create();
    GeoPLengthsPtr lens = GeoPLengthsUI32::create();
    GeoPTypesPtr type = GeoPTypesUI8::create();
 
    beginEditCP(N, Node::CoreFieldMask);
    N->setCore(geo);
    endEditCP(N, Node::CoreFieldMask);

    beginEditCP(geo);
      geo->setPositions(points);
      geo->setIndices(index);
      geo->setLengths(lens);
      geo->setTypes(type);
    endEditCP(geo);

    // construct the geometry modifying the lens, index and types
    ...

    createSharedIndex(geo);
    calcVertexNormals(geo);
    return N;
}
    and then I have to sub the previous geometry node on it's parent (the material node)
    and add this new one instead, this is made by the setGeometry() function:
void grimageMesh::setGeometry(NodePtr N){
  beginEditCP(GrimageMeshMaterial);
    GrimageMeshMaterial->subChild(GrimageMeshGeo);
    GrimageMeshGeo = N;
    GrimageMeshMaterial->addChild(GrimageMeshGeo);
  endEditCP(GrimageMeshMaterial);
}

   If I call these methods in the Display() function it works fine :
    NodePtr N =  G->createGeometry();
    G->setGeomtry(N)

 But as the creation of the geometry take some time, it reduce  the display loop speed,
 so I would like a thread does this :

  here is what I made :
    In the main function I call LauchGrimageThread() that initialize the thread :
int LaunchGrimageThread(void *args){

  ...             // some other stuffs not important here

  GT = dynamic_cast<Thread *> (ThreadManager::the()->getThread("GrimageThread"));
  GT->runFunction(GrimageThread,Thread::getAspect(),args);
  return 1 ;
}
void  GrimageThread( void* args)
{
  while (true) {

    NodePtr N = G->createGeometry();   
    GTLock->aquire();
    G->setGeometry(N);
    GTLock->release();
      
    usleep(1);
// let the display loop acquire the mutex
  }
}

And the last thing is to apply the thread change list in the display function :

          GTLock->aquire();
          Thread::getCurrentChangeList()->merge(*(GT->getChangeList()));
          GT->getChangeList()->clearAll();
          GTLock->release();

Unfortunately this work a few second, where I can see my object "moving", wich means the geometry is correctly
updated, but after some time it segfault.
This problem come from the geometry. If I don't add my object to the scene root node but still update it no segfault .
And if I add it, but if in the GrimageThread() function I call createGeometry() between the Lock aquires()
and release() it also works. But it that case there is not point to use a thread as the display() loop have to wait
the calcul of the new geometry to aquire the Lock and aplly the change list.

So why is there problems? If the main processus interupt the creation of the geometry launched by the thread it's not
a problem, as we are working on local objects not part of the scene graph, when the traead will get the processor again
it will continue to construct the geometry. We only want that he is not interupted when he will update the scene graph
by removing the old node and adding the new one.

Does anyone know where this problem comes from?

Thanks,
Adrien


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to