Added setting of the Text::BackdropImplementation type to USE_SHADERS when setting up shaders

This commit is contained in:
Robert Osfield 2017-09-12 19:13:01 +01:00
parent 7a50bdafe3
commit 0d5a42f635
2 changed files with 80 additions and 4 deletions

View File

@ -147,12 +147,20 @@ struct TextSettings
font->setMaxAnisotropy(maxAnisotropy); font->setMaxAnisotropy(maxAnisotropy);
font->setGlyphInterval(glyphInterval); font->setGlyphInterval(glyphInterval);
font->setGyphTextureFeatures(glyphTextureFeatures); font->setGyphTextureFeatures(glyphTextureFeatures);
text.setFont(font.get()); // text.setFont(font.get());
text.setColor(textColor); text.setColor(textColor);
text.setBackdropType(backdropType); text.setBackdropType(backdropType);
text.setBackdropOffset(backdropOffset.x(), backdropOffset.y()); text.setBackdropOffset(backdropOffset.x(), backdropOffset.y());
text.setBackdropColor(backdropColor); text.setBackdropColor(backdropColor);
if (glyphTextureFeatures==osgText::GlyphTexture::ALL_FEATURES)
{
text.setBackdropImplementation(osgText::Text::USE_SHADERS);
}
text.setFont(font.get());
} }
std::string fontFilename; std::string fontFilename;

View File

@ -149,6 +149,8 @@ Text::~Text()
{ {
} }
#include <sstream>
osg::StateSet* Text::createStateSet() osg::StateSet* Text::createStateSet()
{ {
Font* activeFont = getActiveFont(); Font* activeFont = getActiveFont();
@ -156,13 +158,79 @@ osg::StateSet* Text::createStateSet()
Font::StateSets& statesets = activeFont->getCachedStateSets(); Font::StateSets& statesets = activeFont->getCachedStateSets();
if (!statesets.empty()) osg::StateSet::DefineList defineList;
if (_backdropType!=NONE && _backdropImplementation==USE_SHADERS)
{ {
return statesets.front().get(); std::stringstream ss;
ss.str("");
ss << "vec4("<<_backdropColor.r()<<", "<<_backdropColor.g()<<", "<<_backdropColor.b()<<", "<<_backdropColor.a()<<")";
defineList["BACKDROP_COLOR"] = osg::StateSet::DefinePair(ss.str(), osg::StateAttribute::ON);
if (_backdropType==OUTLINE)
{
ss.str("");
ss <<_backdropHorizontalOffset;
defineList["OUTLINE"] = osg::StateSet::DefinePair(ss.str(), osg::StateAttribute::ON);
}
else
{
osg::Vec2 offset(_backdropHorizontalOffset, _backdropVerticalOffset);
switch(_backdropType)
{
case(DROP_SHADOW_BOTTOM_RIGHT) : offset.set(_backdropHorizontalOffset, -_backdropVerticalOffset); break;
case(DROP_SHADOW_CENTER_RIGHT) : offset.set(_backdropHorizontalOffset, 0.0f); break;
case(DROP_SHADOW_TOP_RIGHT) : offset.set(_backdropHorizontalOffset, _backdropVerticalOffset); break;
case(DROP_SHADOW_BOTTOM_CENTER) : offset.set(0.0f, -_backdropVerticalOffset); break;
case(DROP_SHADOW_TOP_CENTER) : offset.set(0.0f, _backdropVerticalOffset); break;
case(DROP_SHADOW_BOTTOM_LEFT) : offset.set(-_backdropHorizontalOffset, -_backdropVerticalOffset); break;
case(DROP_SHADOW_CENTER_LEFT) : offset.set(-_backdropHorizontalOffset, 0.0f); break;
case(DROP_SHADOW_TOP_LEFT) : offset.set(-_backdropHorizontalOffset, _backdropVerticalOffset); break;
default : break;
}
ss.str("");
ss << "vec2("<<offset.x()<<", "<<offset.y()<<")";
defineList["SHADOW"] = osg::StateSet::DefinePair(ss.str(), osg::StateAttribute::ON);
}
} }
#if 0
OSG_NOTICE<<"Text::createStateSet() _backdropType="<<_backdropType<<", _backdropImplementation="<<_backdropImplementation<<std::endl;
OSG_NOTICE<<"Text::createStateSet() defines:"<<defineList.size()<<std::endl;
for(osg::StateSet::DefineList::iterator itr = defineList.begin();
itr != defineList.end();
++itr)
{
OSG_NOTICE<<" define["<<itr->first<<"] = "<<itr->second.first<<std::endl;
}
#endif
if (!statesets.empty())
{
for(Font::StateSets::iterator itr = statesets.begin();
itr != statesets.end();
++itr)
{
if ((*itr)->getDefineList()==defineList)
{
// OSG_NOTICE<<"Text::createStateSet() : Matched DefineList, return StateSet "<<itr->get()<<std::endl;
return itr->get();
}
else
{
}
}
}
// OSG_NOTICE<<"Text::createStateSet() : Not Matched DefineList, creating new StateSet"<<std::endl;
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet; osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
stateset->setDefineList(defineList);
statesets.push_back(stateset.get()); statesets.push_back(stateset.get());
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN); stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
@ -1281,7 +1349,7 @@ void Text::drawImplementationSinglePass(osg::State& state, const osg::Vec4& colo
} }
else else
{ {
OSG_NOTICE<<"Using shaders for backdrop"<<std::endl; // OSG_NOTICE<<"Using shaders for backdrop"<<std::endl;
} }
} }