#include #include #include #include using namespace osgSim; ScalarBar::~ScalarBar() { } std::string ScalarBar::ScalarPrinter::printScalar(float scalar) { std::stringstream ostr; ostr< bar = new osg::Geometry(); // Create the bar - created in 'real' coordinate space the moment, // with xyz values reflecting those of the actual scalar values in play. // FIXME: Consider positioning at origin! Should be easy enough to do. // Vertices osg::ref_ptr vs(new osg::Vec3Array); vs->reserve(2*(_numColors+1)); float incr = (_stc->getMax() - _stc->getMin()) / _numColors; float xincr = (_width) / _numColors; float arOffset = _width * _aspectRatio; int i; for(i=1; i<=_numColors; ++i) { vs->push_back(osg::Vec3((i-1) * xincr, 0.0f, 0.0f)*matrix); vs->push_back(osg::Vec3((i-1) * xincr, arOffset, 0.0f)*matrix); vs->push_back(osg::Vec3(i * xincr, arOffset, 0.0f)*matrix); vs->push_back(osg::Vec3(i * xincr, 0.0f, 0.0f)*matrix); } bar->setVertexArray(vs.get()); // Colours osg::ref_ptr cs(new osg::Vec4Array); cs->reserve(_numColors); const float halfIncr = incr*0.5; for(i=0; i<_numColors; ++i) { // We add half an increment to the color look-up to get the color // square in the middle of the 'block'. cs->push_back(_stc->getColor(_stc->getMin() + (i*incr) + halfIncr)); } bar->setColorArray(cs.get()); bar->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); // Normal osg::ref_ptr ns(new osg::Vec3Array); ns->push_back(osg::Matrix::transform3x3(osg::Vec3(0.0f,0.0f,1.0f),matrix)); bar->setNormalArray(ns.get()); bar->setNormalBinding(osg::Geometry::BIND_OVERALL); // The Quad strip that represents the bar bar->addPrimitiveSet(new osg::DrawArrays(GL_QUADS,0,vs->size())); addDrawable(bar.get()); // 2. Then the text labels // ======================= // Check the character size, if it's 0, estimate a good character size float characterSize = _textProperties._characterSize; if(characterSize == 0) characterSize = _width * 0.03f; osgText::Font* font = osgText::readFontFile(_textProperties._fontFile.c_str()); 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; for(i=0; i<_numLabels; ++i) { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(_textProperties._color); text->setFontResolution(_textProperties._fontResolution.first,_textProperties._fontResolution.second); text->setCharacterSize(characterSize); 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 ); addDrawable(text); texts[i] = text; } // 3. And finally the title // ======================== if(_title != "") { osgText::Text* text = new osgText::Text; text->setFont(font); text->setColor(_textProperties._color); text->setFontResolution(_textProperties._fontResolution.first,_textProperties._fontResolution.second); text->setCharacterSize(characterSize); text->setText(_title); 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 ); addDrawable(text); } }