_texture.useImageCoords(true);
_texture.useStencil(true);
_texture.allocRT(_camera_callback);
- _texture.getCamera()->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f , 1.0f));
- _texture.getCamera()->addChild(_root_group->getMatrixTransform());
- _texture.getCamera()->setFinalDrawCallback(new DrawCallback(this));
+
+ osg::Camera* camera = _texture.getCamera();
+ camera->setClearColor(osg::Vec4(0.0f, 0.0f, 0.0f , 1.0f));
+ camera->addChild(_root_group->getMatrixTransform());
+ camera->setFinalDrawCallback(new DrawCallback(this));
+
+ // Ensure objects are drawn in order of traversal
+ camera->getOrCreateStateSet()->setBinName("TraversalOrderBin");
if( _texture.serviceable() )
{
}
}
+ //----------------------------------------------------------------------------
+ void Group::childChanged(SGPropertyNode* node)
+ {
+ if( node->getParent()->getParent() == _node
+ && node->getNameString() == "z-index" )
+ return handleZIndexChanged(node->getParent(), node->getIntValue());
+ }
+
+ //----------------------------------------------------------------------------
+ void Group::handleZIndexChanged(SGPropertyNode* node, int z_index)
+ {
+ ChildFinder pred(node);
+ ChildList::iterator child =
+ std::find_if(_children.begin(), _children.end(), pred);
+
+ if( child == _children.end() )
+ return;
+
+ osg::Node* tf = child->second->getMatrixTransform();
+ int index = _transform->getChildIndex(tf),
+ index_new = index;
+
+ ChildList::iterator next = child;
+ ++next;
+
+ while( next != _children.end()
+ && next->first->getIntValue("z-index", 0) < z_index )
+ {
+ ++index_new;
+ ++next;
+ }
+
+ if( index_new != index )
+ {
+ _children.insert(next, *child);
+ }
+ else
+ {
+ ChildList::iterator prev = child;
+ while( prev != _children.begin()
+ && (--prev)->first->getIntValue("z-index", 0) > z_index)
+ {
+ --index_new;
+ }
+
+ if( index == index_new )
+ return;
+
+ _children.insert(prev, *child);
+ }
+
+ _transform->removeChild(index);
+ _transform->insertChild(index_new, tf);
+
+ _children.erase(child);
+
+ SG_LOG
+ (
+ SG_GENERAL,
+ SG_INFO,
+ "canvas::Group: Moved element " << index << " to position " << index_new
+ );
+ }
+
} // namespace canvas
void Map::childChanged(SGPropertyNode * child)
{
if( child->getParent() != _node )
- return;
+ return Group::childChanged(child);
if( child->getNameString() == "ref-lat"
|| child->getNameString() == "ref-lon" )
else if( child->getNameString() == "range" )
_projection->setRange(child->getDoubleValue());
else
- return;
+ return Group::childChanged(child);
_projection_dirty = true;
}