Hi,


I have got a problem concening shareing a geometry core on a lower level. So I have some scenarios with many objects, all stored in obj files. Therefor I wrote my own loader that shares materials amd merges geometries really fast. Those geometries are stored in a search tree, so I can efficiently look up, if a file is already loaded. Than I want to share the fields of the geometry for a new node. This works fine with medium scenarios. But for example with 20000 eqal trees occurs an error (bad allocation). The last line in the console is:


WARNING: Compacting ChangeList ...


Here is my code that should share the geometries:


GroupPtr group = Group::create();

NodePtr res = Node::create();
beginEditCP(res, Node::CoreFieldMask);
res->setCore(group);
endEditCP(res, Node::CoreFieldMask);

TW_OBJ* search = this->_manager->getOBJ(filename);
if (search != NULL)
{
  for (int i = 0; i < search->getNode()->getNChildren(); i++)
  {
    //original geometry
    GeometryPtr go = GeometryPtr::dcast(search->getNode()->getChild(i)->getCore());

    //new geometry
    GeometryPtr g = Geometry::create();

    //share the geometry fields
    beginEditCP(g, Geometry::TypesFieldMask |
    Geometry::LengthsFieldMask |
    Geometry::PositionsFieldMask |
    Geometry::NormalsFieldMask |
    Geometry::TexCoordsFieldMask |
    Geometry::MaterialFieldMask);

    g->setTypes(go->getTypes());
    g->setLengths(go->getLengths());
    g->setPositions(go->getPositions());
    g->setNormals(go->getNormals());
    g->setTexCoords(go->getTexCoords());
    g->setMaterial(go->getMaterial());

    endEditCP(g, Geometry::TypesFieldMask |
    Geometry::LengthsFieldMask |
    Geometry::PositionsFieldMask |
    Geometry::NormalsFieldMask |
    Geometry::TexCoordsFieldMask |
    Geometry::MaterialFieldMask);

    //build new node
    NodePtr n = Node::create();
    beginEditCP(n, Node::CoreFieldMask);
    n->setCore(g);
    endEditCP(n, Node::CoreFieldMask);

    //append new node to a parent
    beginEditCP(res, Node::ChildrenFieldMask);
    res->addChild(n);
    endEditCP(res, Node::ChildrenFieldMask);
  }
  TW_OBJ* obj =
new TW_OBJ(filename, res, search->getMaterials(), this->_manager);
  return obj;
}


It is strange, when I share the whole geometry, then it works:


GroupPtr group = Group::create();

NodePtr res = Node::create();
beginEditCP(res, Node::CoreFieldMask);
res->setCore(group);
endEditCP(res, Node::CoreFieldMask);

TW_OBJ* search = this->_manager->getOBJ(filename);
if (search != NULL)
{
  for (int i = 0; i < search->getNode()->getNChildren(); i++)
  {
    //original geometry
    GeometryPtr go = GeometryPtr::dcast(search->getNode()->getChild(i)->getCore());

    //build new node
    NodePtr n = Node::create();

    beginEditCP(n, Node::CoreFieldMask);
    n->setCore(go);
    endEditCP(n, Node::CoreFieldMask);

    //append new node to a parent
    beginEditCP(res, Node::ChildrenFieldMask);
    res->addChild(n);
    endEditCP(res, Node::ChildrenFieldMask);
  }
  TW_OBJ* obj =
new TW_OBJ(filename, res, search->getMaterials(), this->_manager);
  return obj;
}

But in this case my interaction concept does not work!




Regards,

Mathias

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Opensg-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensg-users

Reply via email to