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
