diff --git a/data/shaders/pointlight.frag b/data/shaders/pointlight.frag index 30a933b8f..bd900c24d 100644 --- a/data/shaders/pointlight.frag +++ b/data/shaders/pointlight.frag @@ -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; diff --git a/src/graphics/callbacks.cpp b/src/graphics/callbacks.cpp index 283dddaa7..96c5a2eac 100644 --- a/src/graphics/callbacks.cpp +++ b/src/graphics/callbacks.cpp @@ -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) { diff --git a/src/graphics/callbacks.hpp b/src/graphics/callbacks.hpp index df1239cb3..a1953d217 100644 --- a/src/graphics/callbacks.hpp +++ b/src/graphics/callbacks.hpp @@ -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; }; // diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index d56292c5d..c72e4cade 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -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); diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index acf6f1843..1bc552c4f 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -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(); diff --git a/src/graphics/light.cpp b/src/graphics/light.cpp index 09d9465d1..4c2fb6e0f 100644 --- a/src/graphics/light.cpp +++ b/src/graphics/light.cpp @@ -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); diff --git a/src/graphics/light.hpp b/src/graphics/light.hpp index 245a3250e..d48ea7708 100644 --- a/src/graphics/light.hpp +++ b/src/graphics/light.hpp @@ -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 diff --git a/src/graphics/sun.cpp b/src/graphics/sun.cpp index 462e4a89f..cd3dc3cf7 100644 --- a/src/graphics/sun.cpp +++ b/src/graphics/sun.cpp @@ -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()); diff --git a/src/tracks/track.cpp b/src/tracks/track.cpp index 507b863a8..ca1cae2da 100644 --- a/src/tracks/track.cpp +++ b/src/tracks/track.cpp @@ -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()) {