diff --git a/examples/osgscalarbar/osgscalarbar.cpp b/examples/osgscalarbar/osgscalarbar.cpp index 503bb74fa..618c93286 100644 --- a/examples/osgscalarbar/osgscalarbar.cpp +++ b/examples/osgscalarbar/osgscalarbar.cpp @@ -74,7 +74,7 @@ struct MyScalarPrinter: public ScalarBar::ScalarPrinter }; #endif -osg::Node* createScalarBar() +osg::Node* createScalarBar(bool vertical) { #if 1 //ScalarsToColors* stc = new ScalarsToColors(0.0f,1.0f); @@ -90,9 +90,17 @@ osg::Node* createScalarBar() 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); + if ( !vertical ) + { + sb->setPosition( osg::Vec3(0.5f,-0.5f,0)); + } + return sb; #else ScalarBar *sb = new ScalarBar; @@ -137,7 +145,8 @@ int main(int , char **) osgViewer::Viewer viewer; osg::Group* group = new osg::Group; - group->addChild(createScalarBar()); + group->addChild(createScalarBar(true)); + group->addChild(createScalarBar(false)); group->addChild(createScalarBar_HUD()); // add model to viewer. diff --git a/src/osgSim/ScalarBar.cpp b/src/osgSim/ScalarBar.cpp index 3280ac2c9..e2d3c9019 100644 --- a/src/osgSim/ScalarBar.cpp +++ b/src/osgSim/ScalarBar.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include using namespace osgSim; @@ -132,7 +134,7 @@ void ScalarBar::createDrawables() } 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 @@ -175,6 +177,7 @@ void ScalarBar::createDrawables() cs->push_back(c); cs->push_back(c); } + bar->setColorArray(cs.get(), osg::Array::BIND_PER_VERTEX); // Normal @@ -184,9 +187,13 @@ void ScalarBar::createDrawables() // The Quad strip that represents the bar 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()); +#define CHARACTER_OFFSET_FACTOR (0.3f) + // 2. Then the text labels // ======================= @@ -199,7 +206,8 @@ void ScalarBar::createDrawables() std::vector 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 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) { osgText::Text* text = new osgText::Text; @@ -210,17 +218,15 @@ void ScalarBar::createDrawables() text->setText(_sp->printScalar(_stc->getMin()+(i*labelIncr))); text->setPosition(osg::Vec3((i*labelxIncr), labely, 0.0f)*matrix); - text->setAlignment(osgText::Text::CENTER_BASE_LINE); - text->setAxisAlignment( (_orientation==HORIZONTAL) ? osgText::Text::XY_PLANE : osgText::Text::XZ_PLANE ); + text->setAlignment( (_orientation==HORIZONTAL) ? osgText::Text::CENTER_BASE_LINE : osgText::Text::LEFT_CENTER); addDrawable(text); texts[i] = text; } - - // 3. And finally the title - // ======================== + // 3. The title + // ============ if(_title != "") { @@ -231,13 +237,60 @@ void ScalarBar::createDrawables() text->setCharacterSize(characterSize); 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; // Position the title at the middle of the bar above any labels. - text->setPosition(osg::Vec3((_width/2.0f), titleY, 0.0f)*matrix); - text->setAlignment(osgText::Text::CENTER_BASE_LINE); - text->setAxisAlignment( (_orientation==HORIZONTAL) ? osgText::Text::XY_PLANE : osgText::Text::XZ_PLANE ); + text->setPosition(titlePos*matrix); + text->setAlignment( + _orientation==HORIZONTAL ? osgText::Text::CENTER_BASE_LINE : osgText::Text::CENTER_BOTTOM); addDrawable(text); } + + // 4. The rectangular border and sticks + // ==================================== + + osg::ref_ptr 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 annotationGeom = new osg::Geometry(); + annotationGeom->addPrimitiveSet( new osg::DrawArrays(GL_LINES,0,annotVertices->size()) ); + annotationGeom->setVertexArray( annotVertices.get() ); + osg::ref_ptr annotMaterial = new osg::Material; + annotMaterial->setDiffuse( osg::Material::FRONT, _textProperties._color ); + annotationGeom->getOrCreateStateSet()->setAttribute( annotMaterial.get() ); + + addDrawable( annotationGeom.get() ); }