Add enchanted item glow to the shader

move
scrawl 9 years ago
parent 268594dcf1
commit 5e12a1b4ef

@ -52,8 +52,8 @@ namespace
class GlowUpdater : public SceneUtil::StateSetUpdater class GlowUpdater : public SceneUtil::StateSetUpdater
{ {
public: public:
GlowUpdater(osg::Vec4f color, const std::vector<osg::ref_ptr<osg::Texture2D> >& textures) GlowUpdater(int texUnit, osg::Vec4f color, const std::vector<osg::ref_ptr<osg::Texture2D> >& textures)
: mTexUnit(1) // FIXME: might not always be 1 : mTexUnit(texUnit)
, mColor(color) , mColor(color)
, mTextures(textures) , mTextures(textures)
{ {
@ -1055,17 +1055,27 @@ namespace MWRender
osg::ref_ptr<osg::Image> image = mResourceSystem->getImageManager()->getImage(stream.str()); osg::ref_ptr<osg::Image> image = mResourceSystem->getImageManager()->getImage(stream.str());
osg::ref_ptr<osg::Texture2D> tex (new osg::Texture2D(image)); osg::ref_ptr<osg::Texture2D> tex (new osg::Texture2D(image));
tex->setName("envMap");
tex->setWrap(osg::Texture::WRAP_S, osg::Texture2D::REPEAT); tex->setWrap(osg::Texture::WRAP_S, osg::Texture2D::REPEAT);
tex->setWrap(osg::Texture::WRAP_T, osg::Texture2D::REPEAT); tex->setWrap(osg::Texture::WRAP_T, osg::Texture2D::REPEAT);
mResourceSystem->getSceneManager()->applyFilterSettings(tex); mResourceSystem->getSceneManager()->applyFilterSettings(tex);
textures.push_back(tex); textures.push_back(tex);
} }
osg::ref_ptr<GlowUpdater> glowupdater (new GlowUpdater(glowColor, textures)); int texUnit = 1; // FIXME: might not always be 1
osg::ref_ptr<GlowUpdater> glowupdater (new GlowUpdater(texUnit, glowColor, textures));
node->addUpdateCallback(glowupdater); node->addUpdateCallback(glowupdater);
// TODO: regenerate shader // set a texture now so that the ShaderVisitor can find it
// allowedToModifyStatesets = false osg::ref_ptr<osg::StateSet> writableStateSet = NULL;
if (!node->getStateSet())
writableStateSet = node->getOrCreateStateSet();
else
writableStateSet = osg::clone(node->getStateSet(), osg::CopyOp::SHALLOW_COPY);
writableStateSet->setTextureAttributeAndModes(texUnit, textures.front(), osg::StateAttribute::ON);
writableStateSet->addUniform(new osg::Uniform("envMapColor", glowColor));
mResourceSystem->getSceneManager()->recreateShaders(node);
} }
// TODO: Should not be here // TODO: Should not be here

@ -152,7 +152,7 @@ namespace Shader
writableStateSet = getWritableStateSet(node); writableStateSet = getWritableStateSet(node);
ShaderManager::DefineMap defineMap; ShaderManager::DefineMap defineMap;
const char* defaultTextures[] = { "diffuseMap", "normalMap", "emissiveMap", "darkMap", "detailMap" }; const char* defaultTextures[] = { "diffuseMap", "normalMap", "emissiveMap", "darkMap", "detailMap", "envMap" };
for (unsigned int i=0; i<sizeof(defaultTextures)/sizeof(defaultTextures[0]); ++i) for (unsigned int i=0; i<sizeof(defaultTextures)/sizeof(defaultTextures[0]); ++i)
{ {
defineMap[defaultTextures[i]] = "0"; defineMap[defaultTextures[i]] = "0";

@ -26,6 +26,12 @@ varying vec2 normalMapUV;
varying vec3 viewTangent; varying vec3 viewTangent;
#endif #endif
#if @envMap
uniform sampler2D envMap;
varying vec2 envMapUV;
uniform vec4 envMapColor;
#endif
varying float depth; varying float depth;
#define PER_PIXEL_LIGHTING (@normalMap || @forcePPL) #define PER_PIXEL_LIGHTING (@normalMap || @forcePPL)
@ -35,7 +41,7 @@ varying vec4 lighting;
#else #else
varying vec3 passViewPos; varying vec3 passViewPos;
varying vec3 passViewNormal; varying vec3 passViewNormal;
varying vec4 passColour; varying vec4 passColor;
#endif #endif
#include "lighting.glsl" #include "lighting.glsl"
@ -73,13 +79,17 @@ void main()
#if !PER_PIXEL_LIGHTING #if !PER_PIXEL_LIGHTING
gl_FragData[0] *= lighting; gl_FragData[0] *= lighting;
#else #else
gl_FragData[0] *= doLighting(passViewPos, normalize(viewNormal), passColour); gl_FragData[0] *= doLighting(passViewPos, normalize(viewNormal), passColor);
#endif #endif
#if @emissiveMap #if @emissiveMap
gl_FragData[0].xyz += texture2D(emissiveMap, emissiveMapUV).xyz; gl_FragData[0].xyz += texture2D(emissiveMap, emissiveMapUV).xyz;
#endif #endif
#if @envMap
gl_FragData[0].xyz += texture2D(envMap, envMapUV).xyz * envMapColor.xyz;
#endif
float fogValue = clamp((depth - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0); float fogValue = clamp((depth - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0);
gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue); gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue);
} }

@ -21,6 +21,10 @@ varying vec2 normalMapUV;
varying vec3 viewTangent; varying vec3 viewTangent;
#endif #endif
#if @envMap
varying vec2 envMapUV;
#endif
varying float depth; varying float depth;
#define PER_PIXEL_LIGHTING (@normalMap || @forcePPL) #define PER_PIXEL_LIGHTING (@normalMap || @forcePPL)
@ -30,7 +34,7 @@ varying vec4 lighting;
#else #else
varying vec3 passViewPos; varying vec3 passViewPos;
varying vec3 passViewNormal; varying vec3 passViewNormal;
varying vec4 passColour; varying vec4 passColor;
#endif #endif
#include "lighting.glsl" #include "lighting.glsl"
@ -44,6 +48,13 @@ void main(void)
gl_ClipVertex = viewPos; gl_ClipVertex = viewPos;
vec3 viewNormal = normalize((gl_NormalMatrix * gl_Normal).xyz); vec3 viewNormal = normalize((gl_NormalMatrix * gl_Normal).xyz);
#if @envMap
vec3 viewVec = normalize(viewPos.xyz);
vec3 r = reflect( viewVec, viewNormal );
float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) );
envMapUV = vec2(r.x/m + 0.5, r.y/m + 0.5);
#endif
#if @diffuseMap #if @diffuseMap
diffuseMapUV = (gl_TextureMatrix[@diffuseMapUV] * gl_MultiTexCoord@diffuseMapUV).xy; diffuseMapUV = (gl_TextureMatrix[@diffuseMapUV] * gl_MultiTexCoord@diffuseMapUV).xy;
#endif #endif
@ -70,6 +81,6 @@ void main(void)
#else #else
passViewPos = viewPos.xyz; passViewPos = viewPos.xyz;
passViewNormal = viewNormal; passViewNormal = viewNormal;
passColour = gl_Color; passColor = gl_Color;
#endif #endif
} }

Loading…
Cancel
Save