From Kristofer, "The osgSim::ScalarBar has a problem in that if the scalarbar has a color in one end that co-incides with the background color, one cannot see where the scalarbar ends. With this patch, we add a line around the perimiter of the bar to mark it.
Secondly, we thought the text-annotation missed ticks that mark out precisely where on the bar the texts relate to, so we added that as well."
This commit is contained in:
parent
8ae57c2797
commit
8a334e724b
@ -74,7 +74,7 @@ struct MyScalarPrinter: public ScalarBar::ScalarPrinter
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
osg::Node* createScalarBar()
|
osg::Node* createScalarBar(bool vertical)
|
||||||
{
|
{
|
||||||
#if 1
|
#if 1
|
||||||
//ScalarsToColors* stc = new ScalarsToColors(0.0f,1.0f);
|
//ScalarsToColors* stc = new ScalarsToColors(0.0f,1.0f);
|
||||||
@ -90,9 +90,17 @@ osg::Node* createScalarBar()
|
|||||||
|
|
||||||
|
|
||||||
ColorRange* cr = new ColorRange(0.0f,1.0f,cs);
|
ColorRange* cr = new ColorRange(0.0f,1.0f,cs);
|
||||||
ScalarBar* sb = new ScalarBar(20, 11, cr, "ScalarBar", ScalarBar::VERTICAL, 0.1f, new MyScalarPrinter);
|
ScalarBar* sb = new ScalarBar(20, 11, cr,
|
||||||
|
vertical ? "Vertical" : "Horizontal",
|
||||||
|
vertical ? ScalarBar::VERTICAL : ScalarBar::HORIZONTAL,
|
||||||
|
0.1f, new MyScalarPrinter);
|
||||||
sb->setScalarPrinter(new MyScalarPrinter);
|
sb->setScalarPrinter(new MyScalarPrinter);
|
||||||
|
|
||||||
|
if ( !vertical )
|
||||||
|
{
|
||||||
|
sb->setPosition( osg::Vec3(0.5f,-0.5f,0));
|
||||||
|
}
|
||||||
|
|
||||||
return sb;
|
return sb;
|
||||||
#else
|
#else
|
||||||
ScalarBar *sb = new ScalarBar;
|
ScalarBar *sb = new ScalarBar;
|
||||||
@ -137,7 +145,8 @@ int main(int , char **)
|
|||||||
osgViewer::Viewer viewer;
|
osgViewer::Viewer viewer;
|
||||||
|
|
||||||
osg::Group* group = new osg::Group;
|
osg::Group* group = new osg::Group;
|
||||||
group->addChild(createScalarBar());
|
group->addChild(createScalarBar(true));
|
||||||
|
group->addChild(createScalarBar(false));
|
||||||
group->addChild(createScalarBar_HUD());
|
group->addChild(createScalarBar_HUD());
|
||||||
|
|
||||||
// add model to viewer.
|
// add model to viewer.
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#include <osgSim/ScalarBar>
|
#include <osgSim/ScalarBar>
|
||||||
#include <osgText/Text>
|
#include <osgText/Text>
|
||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
|
#include <osg/Material>
|
||||||
|
#include <osg/PolygonOffset>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
using namespace osgSim;
|
using namespace osgSim;
|
||||||
@ -132,7 +134,7 @@ void ScalarBar::createDrawables()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
matrix = osg::Matrix::rotate(osg::DegreesToRadians(90.0f),1.0f,0.0f,0.0f) * osg::Matrix::translate(_position);
|
matrix = osg::Matrix::rotate(osg::DegreesToRadians(90.0f),0.0f,0.0f,-1.0f) * osg::Matrix::translate(_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. First the bar
|
// 1. First the bar
|
||||||
@ -175,6 +177,7 @@ void ScalarBar::createDrawables()
|
|||||||
cs->push_back(c);
|
cs->push_back(c);
|
||||||
cs->push_back(c);
|
cs->push_back(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
bar->setColorArray(cs.get(), osg::Array::BIND_PER_VERTEX);
|
bar->setColorArray(cs.get(), osg::Array::BIND_PER_VERTEX);
|
||||||
|
|
||||||
// Normal
|
// Normal
|
||||||
@ -184,9 +187,13 @@ void ScalarBar::createDrawables()
|
|||||||
|
|
||||||
// The Quad strip that represents the bar
|
// The Quad strip that represents the bar
|
||||||
bar->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,vs->size()));
|
bar->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,vs->size()));
|
||||||
|
bar->getOrCreateStateSet()->setAttributeAndModes( new osg::PolygonOffset(1,1),
|
||||||
|
osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON );
|
||||||
|
|
||||||
addDrawable(bar.get());
|
addDrawable(bar.get());
|
||||||
|
|
||||||
|
#define CHARACTER_OFFSET_FACTOR (0.3f)
|
||||||
|
|
||||||
// 2. Then the text labels
|
// 2. Then the text labels
|
||||||
// =======================
|
// =======================
|
||||||
|
|
||||||
@ -199,7 +206,8 @@ void ScalarBar::createDrawables()
|
|||||||
std::vector<osgText::Text*> texts(_numLabels); // We'll need to collect pointers to these for later
|
std::vector<osgText::Text*> texts(_numLabels); // We'll need to collect pointers to these for later
|
||||||
float labelIncr = (_numLabels>0) ? (_stc->getMax()-_stc->getMin())/(_numLabels-1) : 0.0f;
|
float labelIncr = (_numLabels>0) ? (_stc->getMax()-_stc->getMin())/(_numLabels-1) : 0.0f;
|
||||||
float labelxIncr = (_numLabels>0) ? (_width)/(_numLabels-1) : 0.0f;
|
float labelxIncr = (_numLabels>0) ? (_width)/(_numLabels-1) : 0.0f;
|
||||||
float labely = arOffset + characterSize*0.3f;
|
const float labely = arOffset + characterSize*CHARACTER_OFFSET_FACTOR;
|
||||||
|
|
||||||
for(i=0; i<_numLabels; ++i)
|
for(i=0; i<_numLabels; ++i)
|
||||||
{
|
{
|
||||||
osgText::Text* text = new osgText::Text;
|
osgText::Text* text = new osgText::Text;
|
||||||
@ -210,17 +218,15 @@ void ScalarBar::createDrawables()
|
|||||||
text->setText(_sp->printScalar(_stc->getMin()+(i*labelIncr)));
|
text->setText(_sp->printScalar(_stc->getMin()+(i*labelIncr)));
|
||||||
|
|
||||||
text->setPosition(osg::Vec3((i*labelxIncr), labely, 0.0f)*matrix);
|
text->setPosition(osg::Vec3((i*labelxIncr), labely, 0.0f)*matrix);
|
||||||
text->setAlignment(osgText::Text::CENTER_BASE_LINE);
|
text->setAlignment( (_orientation==HORIZONTAL) ? osgText::Text::CENTER_BASE_LINE : osgText::Text::LEFT_CENTER);
|
||||||
text->setAxisAlignment( (_orientation==HORIZONTAL) ? osgText::Text::XY_PLANE : osgText::Text::XZ_PLANE );
|
|
||||||
|
|
||||||
addDrawable(text);
|
addDrawable(text);
|
||||||
|
|
||||||
texts[i] = text;
|
texts[i] = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. The title
|
||||||
// 3. And finally the title
|
// ============
|
||||||
// ========================
|
|
||||||
|
|
||||||
if(_title != "")
|
if(_title != "")
|
||||||
{
|
{
|
||||||
@ -231,13 +237,60 @@ void ScalarBar::createDrawables()
|
|||||||
text->setCharacterSize(characterSize);
|
text->setCharacterSize(characterSize);
|
||||||
text->setText(_title);
|
text->setText(_title);
|
||||||
|
|
||||||
|
osg::Vec3 titlePos;
|
||||||
|
if ( _orientation==HORIZONTAL )
|
||||||
|
{
|
||||||
|
const float titleY = (_numLabels>0) ? labely + characterSize : labely;
|
||||||
|
titlePos = osg::Vec3((_width/2.0f), titleY, 0.0f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
titlePos = osg::Vec3( 0, arOffset/2, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
float titleY = (_numLabels>0) ? labely + characterSize : labely;
|
float titleY = (_numLabels>0) ? labely + characterSize : labely;
|
||||||
|
|
||||||
// Position the title at the middle of the bar above any labels.
|
// Position the title at the middle of the bar above any labels.
|
||||||
text->setPosition(osg::Vec3((_width/2.0f), titleY, 0.0f)*matrix);
|
text->setPosition(titlePos*matrix);
|
||||||
text->setAlignment(osgText::Text::CENTER_BASE_LINE);
|
text->setAlignment(
|
||||||
text->setAxisAlignment( (_orientation==HORIZONTAL) ? osgText::Text::XY_PLANE : osgText::Text::XZ_PLANE );
|
_orientation==HORIZONTAL ? osgText::Text::CENTER_BASE_LINE : osgText::Text::CENTER_BOTTOM);
|
||||||
|
|
||||||
addDrawable(text);
|
addDrawable(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4. The rectangular border and sticks
|
||||||
|
// ====================================
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Vec3Array> annotVertices = new osg::Vec3Array;
|
||||||
|
|
||||||
|
//Border
|
||||||
|
annotVertices->push_back( osg::Vec3(0.0f,0.0f,0.0f) * matrix );
|
||||||
|
annotVertices->push_back( osg::Vec3(0.0f,arOffset,0.0f) * matrix );
|
||||||
|
|
||||||
|
annotVertices->push_back( osg::Vec3(0.0f,arOffset,0.0f) * matrix );
|
||||||
|
annotVertices->push_back( osg::Vec3(_width,arOffset,0.0f) * matrix );
|
||||||
|
|
||||||
|
annotVertices->push_back( osg::Vec3(_width,arOffset,0.0f) * matrix );
|
||||||
|
annotVertices->push_back( osg::Vec3(_width,0.0f,0.0f) * matrix );
|
||||||
|
|
||||||
|
annotVertices->push_back( osg::Vec3(_width,0.0f,0.0f) * matrix );
|
||||||
|
annotVertices->push_back( osg::Vec3(0.0f,0.0f,0.0f) * matrix );
|
||||||
|
|
||||||
|
//Sticks
|
||||||
|
for(i=0; i<_numLabels; ++i)
|
||||||
|
{
|
||||||
|
const osg::Vec3 p1(osg::Vec3((i*labelxIncr), arOffset, 0.0f)*matrix);
|
||||||
|
const osg::Vec3 p2(osg::Vec3((i*labelxIncr), labely, 0.0f)*matrix);
|
||||||
|
annotVertices->push_back( p1 );
|
||||||
|
annotVertices->push_back( p2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Geometry> annotationGeom = new osg::Geometry();
|
||||||
|
annotationGeom->addPrimitiveSet( new osg::DrawArrays(GL_LINES,0,annotVertices->size()) );
|
||||||
|
annotationGeom->setVertexArray( annotVertices.get() );
|
||||||
|
osg::ref_ptr<osg::Material> annotMaterial = new osg::Material;
|
||||||
|
annotMaterial->setDiffuse( osg::Material::FRONT, _textProperties._color );
|
||||||
|
annotationGeom->getOrCreateStateSet()->setAttribute( annotMaterial.get() );
|
||||||
|
|
||||||
|
addDrawable( annotationGeom.get() );
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user