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:
parent
8c44b06e9f
commit
c9b8734717
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
//
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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());
|
||||
|
@ -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())
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user