# include <simgear_config.h>
#endif
+#include <cstdio>
+
#include "SGText.hxx"
#include <simgear/math/SGMath.hxx>
#include <simgear/misc/sg_path.hxx>
+#include <simgear/misc/strutils.hxx>
#include <osg/Geode>
#include <osg/MatrixTransform>
#include <osgText/Text>
#include <osgText/Font>
+using std::string;
+
class SGText::UpdateCallback : public osg::NodeCallback {
public:
- UpdateCallback( osgText::Text * aText, SGConstPropertyNode_ptr aProperty, double aScale, double aOffset, double aTruncate, double aNumeric, const char * aFormat ) :
+ UpdateCallback( osgText::Text * aText, SGConstPropertyNode_ptr aProperty, double aScale, double aOffset, bool aTruncate, bool aNumeric, const char * aFormat ) :
text( aText ),
property( aProperty ),
scale( aScale ),
offset( aOffset ),
truncate( aTruncate ),
numeric( aNumeric ),
- format( aFormat )
+ format( simgear::strutils::sanitizePrintfFormat( aFormat ) )
{
- if( format.size() == 0 ) {
+ if( format.empty() ) {
if( numeric ) format = "%f";
else format = "%s";
}
traverse( node, nv );
}
-osg::Group * SGText::appendText(const SGPropertyNode* configNode,
- SGPropertyNode* modelRoot, const osgDB::ReaderWriter::Options* options)
+osg::Node * SGText::appendText(const SGPropertyNode* configNode,
+ SGPropertyNode* modelRoot, const osgDB::Options* options)
{
SGConstPropertyNode_ptr p;
- SG_LOG(SG_GENERAL, SG_DEBUG, "Creating a text object");
-
- // Set up the alignment node ("stolen" from animation.cxx)
- // XXX Order of rotations is probably not correct.
- osg::MatrixTransform *align = new osg::MatrixTransform;
- osg::Matrix res_matrix;
- res_matrix.makeRotate(
- configNode->getFloatValue("offsets/pitch-deg", 0.0)*SG_DEGREES_TO_RADIANS,
- osg::Vec3(0, 1, 0),
- configNode->getFloatValue("offsets/roll-deg", 0.0)*SG_DEGREES_TO_RADIANS,
- osg::Vec3(1, 0, 0),
- configNode->getFloatValue("offsets/heading-deg", 0.0)*SG_DEGREES_TO_RADIANS,
- osg::Vec3(0, 0, 1));
-
- osg::Matrix tmat;
- tmat.makeTranslate(configNode->getFloatValue("offsets/x-m", 0.0),
- configNode->getFloatValue("offsets/y-m", 0.0),
- configNode->getFloatValue("offsets/z-m", 0.0));
-
- align->setMatrix(res_matrix * tmat);
-
- if( (p = configNode->getNode( "name" )) != NULL )
- align->setName(p->getStringValue());
- else
- align->setName("text align");
-/*
- Create a fragment of the graph:
- MatrixTransform
- +-Geode
- +-Text
-*/
osgText::Text * text = new osgText::Text();
osg::Geode * g = new osg::Geode;
g->addDrawable( text );
- align->addChild( g );
SGPath path("Fonts" );
path.append( configNode->getStringValue( "font", "Helvetica" ));
}
}
- return align;
+ osg::Node * reply = NULL;
+ if( (p = configNode->getNode( "offsets")) == NULL ) {
+ reply = g;
+ } else {
+ // Set up the alignment node ("stolen" from animation.cxx)
+ // XXX Order of rotations is probably not correct.
+ osg::MatrixTransform *align = new osg::MatrixTransform;
+ osg::Matrix res_matrix;
+ res_matrix.makeRotate(
+ p->getFloatValue("pitch-deg", 0.0)*SG_DEGREES_TO_RADIANS,
+ osg::Vec3(0, 1, 0),
+ p->getFloatValue("roll-deg", 0.0)*SG_DEGREES_TO_RADIANS,
+ osg::Vec3(1, 0, 0),
+ p->getFloatValue("heading-deg", 0.0)*SG_DEGREES_TO_RADIANS,
+ osg::Vec3(0, 0, 1));
+
+ osg::Matrix tmat;
+ tmat.makeTranslate(configNode->getFloatValue("offsets/x-m", 0.0),
+ configNode->getFloatValue("offsets/y-m", 0.0),
+ configNode->getFloatValue("offsets/z-m", 0.0));
+
+ align->setMatrix(res_matrix * tmat);
+ align->addChild( g );
+ reply = align;
+ }
+
+ if( (p = configNode->getNode( "name" )) != NULL )
+ reply->setName(p->getStringValue());
+ else
+ reply->setName("text");
+ return reply;
}