Added mapping of texture modes to #define's to inject into shaders where required
This commit is contained in:
parent
1c9219560b
commit
5bfefdae6a
@ -170,7 +170,7 @@ bool setUpStateSet(osg::ArgumentParser& arguments, osg::StateSet* stateset)
|
|||||||
OSG_NOTICE<<"****** texture unit : "<<sstream.str()<<std::endl;
|
OSG_NOTICE<<"****** texture unit : "<<sstream.str()<<std::endl;
|
||||||
stateset->addUniform(new osg::Uniform(sstream.str().c_str(), static_cast<int>(i)));
|
stateset->addUniform(new osg::Uniform(sstream.str().c_str(), static_cast<int>(i)));
|
||||||
|
|
||||||
|
#if 0
|
||||||
// fragment shader texture defines
|
// fragment shader texture defines
|
||||||
sstream.str("");
|
sstream.str("");
|
||||||
sstream<<"TEXTURE_VERT_DECLARE"<<i;
|
sstream<<"TEXTURE_VERT_DECLARE"<<i;
|
||||||
@ -216,6 +216,7 @@ bool setUpStateSet(osg::ArgumentParser& arguments, osg::StateSet* stateset)
|
|||||||
sstream<<", "<<i<<"); }";
|
sstream<<", "<<i<<"); }";
|
||||||
|
|
||||||
stateset->setDefine(textureFragBodyDefine, sstream.str());
|
stateset->setDefine(textureFragBodyDefine, sstream.str());
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -896,7 +896,7 @@ class OSG_EXPORT State : public Referenced
|
|||||||
void print(std::ostream& fout) const;
|
void print(std::ostream& fout) const;
|
||||||
|
|
||||||
/** Initialize extension used by osg::State.*/
|
/** Initialize extension used by osg::State.*/
|
||||||
void initializeExtensionProcs();
|
virtual void initializeExtensionProcs();
|
||||||
|
|
||||||
/** Get the helper class for dispatching osg::Arrays as OpenGL attribute data.*/
|
/** Get the helper class for dispatching osg::Arrays as OpenGL attribute data.*/
|
||||||
inline AttributeDispatchers& getAttributeDispatchers() { return _arrayDispatchers; }
|
inline AttributeDispatchers& getAttributeDispatchers() { return _arrayDispatchers; }
|
||||||
@ -1022,6 +1022,8 @@ class OSG_EXPORT State : public Referenced
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef std::map<std::string, GLenum> StringModeMap;
|
typedef std::map<std::string, GLenum> StringModeMap;
|
||||||
|
typedef std::map<GLenum, std::string> ModeDefineMap;
|
||||||
|
typedef std::vector<ModeDefineMap> TextureModeDefineMapList;
|
||||||
|
|
||||||
typedef std::map<StateAttribute::GLMode,ModeStack> ModeMap;
|
typedef std::map<StateAttribute::GLMode,ModeStack> ModeMap;
|
||||||
typedef std::vector<ModeMap> TextureModeMapList;
|
typedef std::vector<ModeMap> TextureModeMapList;
|
||||||
@ -1251,7 +1253,13 @@ class OSG_EXPORT State : public Referenced
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Initialize ModeDefineMaps used in fixed function modes to shader defines. Called by initializeExtensionProcs().*/
|
||||||
|
virtual void initUpModeDefineMaps();
|
||||||
|
|
||||||
StringModeMap _stringModeMap;
|
StringModeMap _stringModeMap;
|
||||||
|
TextureModeDefineMapList _textureModeDefineMapList;
|
||||||
|
TextureModeDefineMapList _texenvModeDefineMapList;
|
||||||
|
TextureModeDefineMapList _texgenModeDefineMapList;
|
||||||
|
|
||||||
ModeMap _modeMap;
|
ModeMap _modeMap;
|
||||||
AttributeMap _attributeMap;
|
AttributeMap _attributeMap;
|
||||||
|
@ -628,7 +628,7 @@ void Shader::PerContextShader::compileShader(osg::State& state)
|
|||||||
GLint compiled = GL_FALSE;
|
GLint compiled = GL_FALSE;
|
||||||
|
|
||||||
// OSG_NOTICE<<"Compiling PerContextShader "<<this<<" ShaderDefine="<<getDefineString()<<std::endl;
|
// OSG_NOTICE<<"Compiling PerContextShader "<<this<<" ShaderDefine="<<getDefineString()<<std::endl;
|
||||||
bool printOutShaders = osg::getNotifyLevel()>=osg::INFO;//NOTICE;
|
bool printOutShaders = osg::getNotifyLevel()>=osg::NOTICE;//INFO;
|
||||||
|
|
||||||
if (_defineStr.empty())
|
if (_defineStr.empty())
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,8 @@
|
|||||||
#include <osg/Texture1D>
|
#include <osg/Texture1D>
|
||||||
#include <osg/GLDefines>
|
#include <osg/GLDefines>
|
||||||
|
|
||||||
|
#include <osg/io_utils>
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
@ -45,6 +47,13 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace osg;
|
using namespace osg;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
const char* s_LineEnding = "\r\n";
|
||||||
|
#else
|
||||||
|
const char* s_LineEnding = "\n";
|
||||||
|
#endif
|
||||||
|
|
||||||
static ApplicationUsageProxy State_e0(ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_GL_ERROR_CHECKING <type>","ONCE_PER_ATTRIBUTE | ON | on enables fine grained checking, ONCE_PER_FRAME enables coarse grained checking");
|
static ApplicationUsageProxy State_e0(ApplicationUsage::ENVIRONMENTAL_VARIABLE,"OSG_GL_ERROR_CHECKING <type>","ONCE_PER_ATTRIBUTE | ON | on enables fine grained checking, ONCE_PER_FRAME enables coarse grained checking");
|
||||||
|
|
||||||
State::State():
|
State::State():
|
||||||
@ -299,6 +308,11 @@ void State::initializeExtensionProcs()
|
|||||||
_graphicsCostEstimator->calibrate(renderInfo);
|
_graphicsCostEstimator->calibrate(renderInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
initUpModeDefineMaps();
|
||||||
|
}
|
||||||
|
|
||||||
|
void State::initUpModeDefineMaps()
|
||||||
|
{
|
||||||
|
|
||||||
#define ADDMODE(MODE) _stringModeMap[#MODE] = MODE;
|
#define ADDMODE(MODE) _stringModeMap[#MODE] = MODE;
|
||||||
ADDMODE(GL_LIGHTING)
|
ADDMODE(GL_LIGHTING)
|
||||||
@ -345,6 +359,24 @@ void State::initializeExtensionProcs()
|
|||||||
|
|
||||||
ADDMODE(GL_COLOR_MATERIAL)
|
ADDMODE(GL_COLOR_MATERIAL)
|
||||||
|
|
||||||
|
unsigned int maxNumTextureUnits = 16;
|
||||||
|
std::stringstream sstream;
|
||||||
|
_textureModeDefineMapList.resize(maxNumTextureUnits);
|
||||||
|
for(unsigned int i=0; i<maxNumTextureUnits; ++i)
|
||||||
|
{
|
||||||
|
std::string samplerString("sampler2D");
|
||||||
|
std::string textureString("texture2D");
|
||||||
|
std::string textureSuffixString("st");
|
||||||
|
|
||||||
|
// fragment shader texture defines
|
||||||
|
sstream.str("");
|
||||||
|
sstream<<"#define TEXTURE_VERT_DECLARE"<<i<<" varying vec4 TexCoord"<<i<<";"<<s_LineEnding;
|
||||||
|
sstream<<"#define TEXTURE_VERT_BODY"<<i<<" { TexCoord"<<i<<" = gl_MultiTexCoord"<<i<<"; if (GL_TEXTURE_GEN_MODE["<<i<<"]!=0) TexCoord0 = texgen(TexCoord"<<i<<", "<<i<<"); }"<<s_LineEnding;
|
||||||
|
sstream<<"#define TEXTURE_FRAG_DECLARE"<<i<<" uniform sampler2D sampler"<<i<<"; varying vec4 TexCoord"<<i<<";"<<s_LineEnding;
|
||||||
|
sstream<<"#define TEXTURE_FRAG_BODY"<<i<<"(color) { color = texenv(color, texture2D( sampler"<<i<<", TexCoord"<<i<<".st)"<<", "<<i<<"); }"<<s_LineEnding;
|
||||||
|
|
||||||
|
_textureModeDefineMapList[i][GL_TEXTURE_2D] = sstream.str();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1738,11 +1770,6 @@ bool State::DefineMap::updateCurrentDefines()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WIN32
|
|
||||||
const char* s_LineEnding = "\r\n";
|
|
||||||
#else
|
|
||||||
const char* s_LineEnding = "\n";
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderDefines& shaderDefines)
|
void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderDefines& shaderDefines)
|
||||||
{
|
{
|
||||||
@ -1774,6 +1801,8 @@ void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderDefin
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline std::stringstream& str_reset(std::stringstream& sstream) { sstream.str(""); return sstream; }
|
||||||
|
|
||||||
void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderPragmas& shaderPragmas)
|
void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderPragmas& shaderPragmas)
|
||||||
{
|
{
|
||||||
if (_defineMap.changed) _defineMap.updateCurrentDefines();
|
if (_defineMap.changed) _defineMap.updateCurrentDefines();
|
||||||
@ -1816,6 +1845,52 @@ void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderPragm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(unsigned int i=0; i<_textureModeMapList.size(); ++i)
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<" texture unit ="<<i<<std::endl;
|
||||||
|
const ModeMap& modeMap = _textureModeMapList[i];
|
||||||
|
|
||||||
|
bool enableTexGen = false;
|
||||||
|
Vec4 texgen_multiplier(0.0f,0.0f,0.f,0.0f);
|
||||||
|
GLenum textureMode = 0;
|
||||||
|
|
||||||
|
for(ModeMap::const_iterator tm_itr = modeMap.begin();
|
||||||
|
tm_itr != modeMap.end();
|
||||||
|
++tm_itr)
|
||||||
|
{
|
||||||
|
GLenum mode = tm_itr->first;
|
||||||
|
if (tm_itr->second.last_applied_value)
|
||||||
|
{
|
||||||
|
if (mode>=GL_TEXTURE_GEN_S && mode<=GL_TEXTURE_GEN_Q)
|
||||||
|
{
|
||||||
|
enableTexGen = true;
|
||||||
|
texgen_multiplier[mode-GL_TEXTURE_GEN_S] = 1.0f;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textureMode = mode;
|
||||||
|
}
|
||||||
|
OSG_NOTICE<<" enabled mode="<<std::hex<<mode<<std::dec<<std::endl;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
OSG_NOTICE<<" disabled mode="<<std::hex<<mode<<std::dec<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::stringstream sstream;
|
||||||
|
|
||||||
|
if (textureMode)
|
||||||
|
{
|
||||||
|
shaderDefineStr += _textureModeDefineMapList[i][textureMode];
|
||||||
|
|
||||||
|
if (enableTexGen)
|
||||||
|
{
|
||||||
|
// Need to get the TexGen mode.
|
||||||
|
OSG_NOTICE<<" enabled TexGen "<<texgen_multiplier<<std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for(unsigned int i=0; i<shaderPragmas.textureModes.size(); ++i)
|
for(unsigned int i=0; i<shaderPragmas.textureModes.size(); ++i)
|
||||||
{
|
{
|
||||||
if (i<_textureModeMapList.size())
|
if (i<_textureModeMapList.size())
|
||||||
@ -1860,7 +1935,7 @@ void State::getDefineString(std::string& shaderDefineStr, const osg::ShaderPragm
|
|||||||
convertVertexShaderSourceToOsgBuiltIns(shaderDefineStr);
|
convertVertexShaderSourceToOsgBuiltIns(shaderDefineStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// OSG_NOTICE<<"State::getDefineString(..) "<<shaderDefineStr<<std::endl;
|
OSG_NOTICE<<"State::getDefineString(..) "<<shaderDefineStr<<std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool State::supportsShaderRequirements(const osg::ShaderPragmas& shaderPragmas)
|
bool State::supportsShaderRequirements(const osg::ShaderPragmas& shaderPragmas)
|
||||||
|
@ -59,6 +59,7 @@ void RenderLeaf::render(osg::RenderInfo& renderInfo,RenderLeaf* previous)
|
|||||||
// modelview and projection matrices then apply them now.
|
// modelview and projection matrices then apply them now.
|
||||||
if (state.getUseModelViewAndProjectionUniforms()) state.applyModelViewAndProjectionUniformsIfRequired();
|
if (state.getUseModelViewAndProjectionUniforms()) state.applyModelViewAndProjectionUniformsIfRequired();
|
||||||
|
|
||||||
|
|
||||||
// draw the drawable
|
// draw the drawable
|
||||||
_drawable->draw(renderInfo);
|
_drawable->draw(renderInfo);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user