#include <simgear/debug/logstream.hxx>
#include <simgear/math/sg_types.hxx>
+#include <simgear/scene/material/Effect.hxx>
+#include <simgear/scene/material/EffectGeode.hxx>
#include <simgear/scene/material/mat.hxx>
#include <simgear/scene/material/matlib.hxx>
#define SIGN "OBJECT_SIGN: "
#define RWY "OBJECT_RUNWAY_SIGN: "
-SG_USING_STD(vector);
+using std::vector;
+using namespace simgear;
// for temporary storage of sign elements
struct element_info {
- element_info(SGMaterial *m, osg::StateSet *s, SGMaterialGlyph *g, double h)
+ element_info(SGMaterial *m, Effect *s, SGMaterialGlyph *g, double h)
: material(m), state(s), glyph(g), height(h)
{
scale = h * m->get_xsize()
/ (m->get_ysize() < 0.001 ? 1.0 : m->get_ysize());
}
SGMaterial *material;
- osg::StateSet *state;
+ Effect *state;
SGMaterialGlyph *glyph;
double height;
double scale;
const char *keyword;
const char *glyph_name;
} cmds[] = {
- {"@u", "up"},
- {"@d", "down"},
- {"@l", "left"},
- {"@lu", "left-up"},
- {"@ul", "left-up"},
- {"@ld", "left-down"},
- {"@dl", "left-down"},
- {"@r", "right"},
- {"@ru", "right-up"},
- {"@ur", "right-up"},
- {"@rd", "right-down"},
- {"@dr", "right-down"},
+ {"@u", "^u"},
+ {"@d", "^d"},
+ {"@l", "^l"},
+ {"@lu", "^lu"},
+ {"@ul", "^lu"},
+ {"@ld", "^ld"},
+ {"@dl", "^ld"},
+ {"@r", "^r"},
+ {"@ru", "^ru"},
+ {"@ur", "^ru"},
+ {"@rd", "^rd"},
+ {"@dr", "^rd"},
{0, 0},
};
osg::Group* object = new osg::Group;
object->setName(content);
- SGMaterial *material;
- osg::StateSet *lighted_state;
- osg::StateSet *unlighted_state;
-
// Part I: parse & measure
for (const char *s = content.data(); *s; s++) {
string name;
}
}
- if (newmat.size()) {
- material = matlib->find(newmat);
- if (!material) {
- SG_LOG(SG_TERRAIN, SG_ALERT, SIGN "ignoring unknown material `" << newmat << '\'');
- continue;
- }
- // set material states (lighted & unlighted)
- lighted_state = material->get_state();
- string u = newmat + ".unlighted";
+ if (newmat.size() == 0 )
+ continue;
- SGMaterial *m = matlib->find(u);
- if (m) {
- unlighted_state = m->get_state();
- } else {
- SG_LOG(SG_TERRAIN, SG_ALERT, SIGN "ignoring unknown material `" << u << '\'');
- unlighted_state = lighted_state;
- }
- newmat = "";
+ SGMaterial *material = matlib->find(newmat);
+ if (!material) {
+ SG_LOG(SG_TERRAIN, SG_ALERT, SIGN "ignoring unknown material `" << newmat << '\'');
+ continue;
}
+
+ // set material states (lighted & unlighted)
+ Effect *lighted_state = material->get_effect();
+ Effect *unlighted_state;
+ string u = newmat + ".unlighted";
+
+ SGMaterial *m = matlib->find(u);
+ if (m) {
+ unlighted_state = m->get_effect();
+ } else {
+ SG_LOG(SG_TERRAIN, SG_ALERT, SIGN "ignoring unknown material `" << u << '\'');
+ unlighted_state = lighted_state;
+ }
+ newmat = "";
+
SGMaterialGlyph *glyph = material->get_glyph(name);
if (!glyph) {
SG_LOG( SG_TERRAIN, SG_ALERT, SIGN "unsupported glyph `" << *s << '\'');
}
// in managed mode push frame stop and frame start first
- osg::StateSet *state = lighted ? lighted_state : unlighted_state;
+ Effect *state = lighted ? lighted_state : unlighted_state;
element_info *e;
if (newtype && newtype != oldtype) {
if (close) {
geometry->setColorBinding(osg::Geometry::BIND_OVERALL);
geometry->setTexCoordArray(0, tl);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, vl->size()));
- osg::Geode* geode = new osg::Geode;
+ EffectGeode* geode = new EffectGeode;
geode->addDrawable(geometry);
- geode->setStateSet(element->state);
+ geode->setEffect(element->state);
object->addChild(geode);
hpos += abswidth;
geometry->setNormalArray(nl);
geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);
geometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLE_STRIP, 0, vl->size()));
- osg::Geode* geode = new osg::Geode;
+ EffectGeode* geode = new EffectGeode;
geode->addDrawable(geometry);
SGMaterial *mat = matlib->find("BlackSign");
if (mat)
- geode->setStateSet(mat->get_state());
+ geode->setEffect(mat->get_effect());
object->addChild(geode);
return object;
osg::Vec3 heightVec(0, 0, 1);
osg::Geometry* geometry;
geometry = osg::createTexturedQuadGeometry(corner, widthVec, heightVec);
-
- SGMaterial *mat = matlib->find(name);
- if (mat)
- geometry->setStateSet(mat->get_state());
-
- osg::Geode* geode = new osg::Geode;
+ EffectGeode* geode = new EffectGeode;
geode->setName(name);
geode->addDrawable(geometry);
+ SGMaterial *mat = matlib->find(name);
+ if (mat)
+ geode->setEffect(mat->get_effect());
return geode;
}