Plug-in energy parameter into pointlight shader

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@14779 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj 2013-12-24 23:07:42 +00:00
parent 8c44b06e9f
commit c9b8734717
9 changed files with 21 additions and 9 deletions

View File

@ -6,6 +6,7 @@ uniform float r;
uniform float spec;
uniform vec2 screen;
uniform mat4 invproj;
uniform float energy;
void main() {
vec2 texc = gl_FragCoord.xy / screen;
@ -17,7 +18,7 @@ void main() {
float d = distance(center, xpos.xyz);
if (d > r) discard;
float att = 200.0 / (4. * 3.14 * d * d);
float att = energy * 200.0 / (4. * 3.14 * d * d);
vec3 norm = texture2D(ntex, texc).xyz;
norm = (norm - 0.5) * 2.0;

View File

@ -360,6 +360,7 @@ void PointLightProvider::OnSetConstants(IMaterialRendererServices *srv, int)
srv->setVertexShaderConstant("center", m_pos, 3);
srv->setVertexShaderConstant("r", &m_radius, 1);
srv->setVertexShaderConstant("invproj", m_invproj.pointer(), 16);
srv->setVertexShaderConstant("energy", &m_energy, 1);
if (!firstdone)
{

View File

@ -419,6 +419,10 @@ public:
m_specular = s;
}
void setEnergy(float e) {
m_energy = e;
}
void updateIPVMatrix()
{
const video::IVideoDriver * const drv = irr_driver->getVideoDriver();
@ -435,6 +439,7 @@ private:
float m_screen[2];
float m_radius;
float m_specular;
float m_energy;
};
//

View File

@ -2110,14 +2110,14 @@ void IrrDriver::applyObjectPassShader()
}
scene::ISceneNode *IrrDriver::addLight(const core::vector3df &pos, float radius,
float r, float g, float b, bool sun)
float energy, float r, float g, float b, bool sun)
{
if (m_glsl)
{
LightNode *light = NULL;
if (!sun)
light = new LightNode(m_scene_manager, radius, r, g, b);
light = new LightNode(m_scene_manager, radius, energy, r, g, b);
else
light = new SunNode(m_scene_manager, r, g, b);

View File

@ -454,7 +454,7 @@ public:
void applyObjectPassShader();
void applyObjectPassShader(scene::ISceneNode * const node, bool rimlit = false);
// ------------------------------------------------------------------------
scene::ISceneNode *addLight(const core::vector3df &pos, float radius = 1.0f, float r = 1.0f,
scene::ISceneNode *addLight(const core::vector3df &pos, float radius = 1.0f, float energy = 1., float r = 1.0f,
float g = 1.0f, float b = 1.0f, bool sun = false);
// ------------------------------------------------------------------------
void clearLights();

View File

@ -35,7 +35,7 @@ SMaterial LightNode::mat;
aabbox3df LightNode::box;
LightNode::LightNode(scene::ISceneManager* mgr, float radius, float r, float g, float b):
LightNode::LightNode(scene::ISceneManager* mgr, float radius, float e, float r, float g, float b):
ISceneNode(mgr->getRootSceneNode(), mgr, -1)
{
if (!sphere)
@ -63,6 +63,7 @@ LightNode::LightNode(scene::ISceneManager* mgr, float radius, float r, float g,
setScale(vector3df(radius));
m_radius = radius;
energy = e;
m_color[0] = r;
m_color[1] = g;
@ -79,6 +80,7 @@ void LightNode::render()
cb->setColor(m_color[0], m_color[1], m_color[2]);
cb->setPosition(getPosition().X, getPosition().Y, getPosition().Z);
cb->setRadius(m_radius);
cb->setEnergy(energy);
IVideoDriver * const drv = irr_driver->getVideoDriver();
drv->setTransform(ETS_WORLD, AbsoluteTransformation);

View File

@ -33,7 +33,7 @@ namespace irr
class LightNode: public scene::ISceneNode
{
public:
LightNode(scene::ISceneManager* mgr, float radius, float r, float g, float b);
LightNode(scene::ISceneManager* mgr, float radius, float energy, float r, float g, float b);
virtual ~LightNode();
virtual void render() OVERRIDE;
@ -59,6 +59,7 @@ protected:
float m_radius;
float m_color[3];
float energy;
};
#endif

View File

@ -35,7 +35,7 @@ using namespace scene;
using namespace core;
SunNode::SunNode(scene::ISceneManager* mgr, float r, float g, float b):
LightNode(mgr, 10000, r, g, b)
LightNode(mgr, 10000, 0., r, g, b)
{
sq = new ScreenQuad(irr_driver->getVideoDriver());

View File

@ -1590,10 +1590,12 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
float distance = 25.0f;
node->get("distance", &distance);
float energy = 1.;
node->get("energy", &energy);
if (irr_driver->isGLSL())
{
irr_driver->addLight(pos, distance, colorf.r, colorf.g, colorf.b);
irr_driver->addLight(pos, distance, energy, colorf.r, colorf.g, colorf.b);
} else
{
scene::ILightSceneNode* node = irr_driver->getSceneManager()->addLightSceneNode(NULL, pos, color, distance);
@ -1756,7 +1758,7 @@ void Track::loadTrackModel(bool reverse_track, unsigned int mode_id)
}
const video::SColorf tmpf(m_sun_diffuse_color);
m_sun = irr_driver->addLight(m_sun_position, 10000.0f, tmpf.r, tmpf.g, tmpf.b, true);
m_sun = irr_driver->addLight(m_sun_position, 10000.0f, 0., tmpf.r, tmpf.g, tmpf.b, true);
if (!irr_driver->isGLSL())
{