Hello
I am trying to move the tiles of my database creating a MatrixTransform, converting the external files (airports and buildings) to osgb and setting the path of the ProxyNode object to refer these external models, to avoid imprecision float flicks.
I am loading this models, visiting all nodes and moving the drawable vertex to origin ( 0, 0, 0 ), then, when i add the ProxyNode as child of the MatrixTransform obj and write the file, the osg::MatrixTransform cast to an osg::Group writing the external model in the tile model.
When i debug this Node, the hierarchy is correctly, but when i save it, the problem appears.
Can someone help me with that?
This is what i expected:
osg::MatrixTransform {
UniqueID 8854
DataVariance STATIC
Children 1 {
osg::ProxyNode {
UniqueID 8855
UserDataContainer TRUE {
osg::DefaultUserDataContainer {
UniqueID 8856
UDC_Descriptions 1 {
"VBS2AttrHdl:1190864"
}
}
}
FileNames 1 {
"gerador.FLT"
}
}
}
Matrix {
0.581112 0.813823 3.92761e-07 0
0.0764085 -0.0545602 0.995583 0
0.810226 -0.578549 -0.0938889 0
5.16795e+06 -3.69022e+06 -594853 1
}
}
===========================
This is what osg wrote:
osg::Group {
UniqueID 8882
Name "external__file"
DataVariance STATIC
Children 1 {
osg::Group {
UniqueID 8883
UserDataContainer TRUE {
osg::DefaultUserDataContainer {
UniqueID 8884
UDC_Descriptions 1 {
"VBS2AttrHdl:1190864"
}
}
}
Children 1 {
osg::Group {
UniqueID 8885
Name "db"
UserDataContainer TRUE {
osg::DefaultUserDataContainer {
UniqueID 8886
}
}
.....................
===========================
This is the code:
osg::ProxyNode* externalPointerNode = dynamic_cast <osg::ProxyNode*>( n );
if( externalPointerNode )
{
osg::Group* parent = ( externalPointerNode->getParent( 0 ) );
osg::MatrixTransform* parentMt = dynamic_cast< osg::MatrixTransform* >( parent );
if( !parentMt )
{
//create a copy to add in matrix
// osg::ProxyNode* externalPointerNodeCopy = new osg::ProxyNode();
// osg::ref_ptr< osg::ProxyNode > externalPointerNodeCopy = osg::clone( externalPointerNode, osg::CopyOp::DEEP_COPY_NODES );
osg::ref_ptr< osg::ProxyNode > externalPointerNodeCopy = osg::clone( externalPointerNode );
GeodeFinder parentFinder;
//File names
std::string originalFileName = externalPointerNode->getFileName(0);
std::string oldFilePath = mainPath + originalFileName;
std::string newFilePath = oldFilePath;
myReplace( newFilePath, ".flt", ".osgb" );
myReplace( newFilePath, ".FLT", ".osgb" );
myReplace( newFilePath, "\\", "/" );
//remove old pointer to airport file
parent->removeChild( externalPointerNode );
//load airport
osg::ref_ptr< osg::Node > loadedNode = osgDB::readNodeFile( oldFilePath );
//airport bounding sphere
auto bb = loadedNode->getBound();
//Creating new matrix that will hold the external pointer
osg::MatrixTransform* newMt = new osg::MatrixTransform;
newMt->setName( "external__file" );
newMt->setMatrix( osg::Matrixd::translate( bb.center() ) );
newMt->setDataVariance( osg::Object::DataVariance::STATIC );
newMt->addChild( externalPointerNodeCopy );
//add the matrix to old parent of pointer node
parent->addChild( newMt );
//find all geode node
parentFinder.find( loadedNode );
//Move nodes of external airport
moveAllVertex( parentFinder.getNodeList(), bb.center() );
//set file path
externalPointerNodeCopy->setFileName( 0, newFilePath );
//save converted model
osgDB::writeNodeFile( *loadedNode, newFilePath );
std::cout << "File saved " << newFilePath << std::endl;
}
}
Regaards,
Victor.