#include "canvas.hxx"
#include "elements/group.hxx"
+#include <Canvas/property_helper.hxx>
#include <osg/Camera>
#include <osg/Geode>
#include <iostream>
-//#include <Main/globals.hxx>
-//#include <Viewer/renderer.hxx>
-
//------------------------------------------------------------------------------
/**
* Callback used to disable/enable rendering to the texture if it is not
_view_width(-1),
_view_height(-1),
_status(0),
- _node(0),
- _sampling_dirty(false)
+ _sampling_dirty(false),
+ _color_dirty(true),
+ _node(0)
{
setStatusFlags(MISSING_SIZE_X | MISSING_SIZE_Y);
//------------------------------------------------------------------------------
Canvas::~Canvas()
{
+ clearPlacements();
+ unbind();
+ _node = 0;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void Canvas::reset(SGPropertyNode* node)
{
- if( _node )
- {
- _node->untie("size[0]");
- _node->untie("size[1]");
- _node->untie("view[0]");
- _node->untie("view[1]");
- _node->untie("status");
- _node->untie("status-msg");
- _node->removeChangeListener(this);
- _node = 0;
- }
+ if( node )
+ SG_LOG
+ (
+ SG_GL,
+ SG_INFO,
+ "Canvas::reset() texture[" << node->getIndex() << "]"
+ );
+
+ unbind();
+ _node = node;
setStatusFlags(MISSING_SIZE_X | MISSING_SIZE_Y);
- if( node )
+ if( _node )
{
- _node = node;
_node->tie
(
"size[0]",
SGRawValueMethods<Canvas, const char*>(*this, &Canvas::getStatusMsg)
);
_node->addChangeListener(this);
+
+ canvas::linkColorNodes
+ (
+ "color-background",
+ _node,
+ _color_background,
+ osg::Vec4f(0,0,0,1)
+ );
}
}
);
_sampling_dirty = false;
}
+ if( _color_dirty )
+ {
+ _texture.getCamera()->setClearColor
+ (
+ osg::Vec4( _color_background[0]->getFloatValue(),
+ _color_background[1]->getFloatValue(),
+ _color_background[2]->getFloatValue(),
+ _color_background[3]->getFloatValue() )
+ );
+ _color_dirty = false;
+ }
while( !_dirty_placements.empty() )
{
{
_dirty_placements.push_back(child);
}
-// else
-// std::cout << "Canvas::childAdded: " << child->getPath() << std::endl;
}
//------------------------------------------------------------------------------
if( child->getNameString() == "placement" )
clearPlacements(child->getIndex());
- else
- std::cout << "Canvas::childRemoved: " << child->getPath() << std::endl;
}
//----------------------------------------------------------------------------
void Canvas::valueChanged(SGPropertyNode * node)
{
- if( node->getParent()->getParent() == _node
- && node->getParent()->getNameString() == "placement" )
+ if( node->getParent()->getParent() == _node )
{
- // prevent double updates...
- for( size_t i = 0; i < _dirty_placements.size(); ++i )
+ if( !_color_background.empty()
+ && _color_background[0]->getParent() == node->getParent() )
{
- if( node->getParent() == _dirty_placements[i] )
- return;
+ _color_dirty = true;
}
+ else if( node->getParent()->getNameString() == "placement" )
+ {
+ // prevent double updates...
+ for( size_t i = 0; i < _dirty_placements.size(); ++i )
+ {
+ if( node->getParent() == _dirty_placements[i] )
+ return;
+ }
- _dirty_placements.push_back(node->getParent());
+ _dirty_placements.push_back(node->getParent());
+ }
}
else if( node->getParent() == _node )
{
parent->removeChild(group);
}
}
+
+//------------------------------------------------------------------------------
+void Canvas::clearPlacements()
+{
+ for(size_t i = 0; i < _placements.size(); ++i)
+ clearPlacements(i);
+ _placements.clear();
+}
+
+//------------------------------------------------------------------------------
+void Canvas::unbind()
+{
+ if( !_node )
+ return;
+
+ _node->untie("size[0]");
+ _node->untie("size[1]");
+ _node->untie("view[0]");
+ _node->untie("view[1]");
+ _node->untie("status");
+ _node->untie("status-msg");
+ _node->removeChangeListener(this);
+}