|
From: Lasse Kärkkäi. <tr...@us...> - 2011-10-22 19:34:40
|
Author: Lasse Karkkainen <tro...@tr...> Date: Thu Jul 7 08:32:56 2011 +0300 Hack better guitar note lighting (eyecandy). Matrix system WIP and loading screens b0rked for now. --- data/shaders/core.frag | 30 +++++++++++++++++++++++++----- data/shaders/core.vert | 12 ++++++++++-- data/shaders/dancenote.vert | 5 +++-- data/shaders/stereo3d.geom | 3 +++ game/guitargraph.cc | 3 ++- game/video_driver.cc | 42 +++++++++++++++++++++++------------------- game/video_driver.hh | 4 +++- 7 files changed, 69 insertions(+), 30 deletions(-) diff --git a/data/shaders/core.frag b/data/shaders/core.frag index 9f5d966..6188127 100644 --- a/data/shaders/core.frag +++ b/data/shaders/core.frag @@ -12,6 +12,10 @@ in float bogus; // Workaround for http://www.nvnews.net/vbulletin/showthread.ph varying vec3 normal; varying vec4 color; +#ifdef ENABLE_LIGHTING +varying vec3 lightDir; +#endif + #ifdef ENABLE_TEXTURING varying vec4 texCoord; #if ENABLE_TEXTURING == 1 @@ -41,13 +45,29 @@ void main() { #endif #ifdef ENABLE_LIGHTING - vec3 lightDir = normalize(vec3(-50.0, 5.0, -15.0)); - const vec3 ambient = vec3(0.1, 0.1, 0.1); + vec3 n = normalize(normal); + vec3 l = normalize(lightDir); + + // Diffuse + float diff = max(dot(n, l), 0.0); + float power = 1.0 - 0.02 * length(lightDir); + frag = vec4(frag.rgb * power * diff, frag.a); + +#endif + + frag = colorMatrix * frag; // Colorize + +#ifdef ENABLE_LIGHTING - float NdotL = max(dot(normalize(normal), lightDir), 0.0); - frag = vec4(ambient + frag.rgb * NdotL, frag.a); + // Specular + vec3 refl = reflect(-l, n); + float spec = dot(refl, n); + if (power > 0.0) { + power *= pow(spec, 100); + frag.rgb += vec3(power, power, power); + } #endif - gl_FragColor = colorMatrix * frag; + gl_FragColor = frag; } diff --git a/data/shaders/core.vert b/data/shaders/core.vert index 926ca9b..5b06c4a 100644 --- a/data/shaders/core.vert +++ b/data/shaders/core.vert @@ -2,7 +2,8 @@ //DEFINES -uniform mat4 positionMatrix; +uniform mat4 projMatrix; +uniform mat4 mvMatrix; uniform mat3 normalMatrix; attribute vec4 vertPos; @@ -10,6 +11,8 @@ attribute vec4 vertTexCoord; attribute vec3 vertNormal; attribute vec4 vertColor; +varying vec3 lightDir; +varying vec3 vLightDir; varying vec4 texCoord; varying vec4 vTexCoord; varying vec3 normal; @@ -18,7 +21,12 @@ varying vec4 color; varying vec4 vColor; void main() { - gl_Position = positionMatrix * vertPos; + //const vec3 lightPos = vec3(0.0, -2.94, 1.0); + const vec3 lightPos = vec3(-10.0, 2.0, 15.0); + + vec4 posEye = mvMatrix * vertPos; // Vertex position in eye space + gl_Position = projMatrix * posEye; // Vertex position in normalized device coordinates + vLightDir = lightDir = lightPos - posEye.xyz / posEye.w; // Light position relative to vertex vTexCoord = texCoord = vertTexCoord; vNormal = normal = normalize(normalMatrix * vertNormal); vColor = color = vertColor; diff --git a/data/shaders/dancenote.vert b/data/shaders/dancenote.vert index c9b9c92..837101a 100644 --- a/data/shaders/dancenote.vert +++ b/data/shaders/dancenote.vert @@ -1,6 +1,7 @@ #version 120 -uniform mat4 positionMatrix; +uniform mat4 projMatrix; +uniform mat4 mvMatrix; uniform mat3 normalMatrix; uniform int noteType; uniform float hitAnim; @@ -75,6 +76,6 @@ void main() { ); } - gl_Position = positionMatrix * (vec4(position, 0, 0) + trans * vertPos); + gl_Position = projMatrix * mvMatrix * (vec4(position, 0, 0) + trans * vertPos); } diff --git a/data/shaders/stereo3d.geom b/data/shaders/stereo3d.geom index c94adb1..66d1d0e 100644 --- a/data/shaders/stereo3d.geom +++ b/data/shaders/stereo3d.geom @@ -7,11 +7,13 @@ uniform float z0; layout(triangles) in; layout(triangle_strip, max_vertices = 6) out; +in vec3 vLightDir[]; in vec4 vTexCoord[]; in vec3 vNormal[]; in vec4 vColor[]; out float bogus; // Workaround for http://www.nvnews.net/vbulletin/showthread.php?p=2401097 +out vec3 lightDir; out vec4 texCoord; out vec3 normal; out vec4 color; @@ -20,6 +22,7 @@ int i; void passthru() { gl_Position = gl_in[i].gl_Position; + lightDir = vLightDir[i]; texCoord = vTexCoord[i]; normal = vNormal[i]; color = vColor[i]; diff --git a/game/guitargraph.cc b/game/guitargraph.cc index f3519e9..aeb9d30 100644 --- a/game/guitargraph.cc +++ b/game/guitargraph.cc @@ -890,7 +890,8 @@ void GuitarGraph::drawNeckStuff(double time) { if (jumpanim == 1.0) m_drumJump.setTarget(0.0); if (jumpanim > 0) m = translate(vec3(0.0f, -m_drumJump.get() * 0.01, 0.0f)) * m; } - Transform trans(m); + //Transform trans(m); + ViewTrans trans(m); // Draw the neck { diff --git a/game/video_driver.cc b/game/video_driver.cc index e173d22..568e219 100644 --- a/game/video_driver.cc +++ b/game/video_driver.cc @@ -44,7 +44,7 @@ namespace { glmath::mat4 g_color = glmath::mat4::identity(); glmath::mat4 g_projection = glmath::mat4::identity(); - glmath::mat4 g_modelview = glmath::translate(glmath::vec3(0.0, 0.0, -z0)); + glmath::mat4 g_modelview = glmath::mat4::identity(); } @@ -155,12 +155,12 @@ void Window::updateColor() { void Window::updateTransforms() { using namespace glmath; - mat4 position = g_projection * g_modelview; mat3 normal(g_modelview); for (ShaderMap::iterator it = m_shaders.begin(); it != m_shaders.end(); ++it) { Shader& sh = *it->second; sh.bind(); - sh["positionMatrix"].setMat4(position); + sh["projMatrix"].setMat4(g_projection); + sh["mvMatrix"].setMat4(g_modelview); try { sh["normalMatrix"].setMat3(normal); } catch(...) {} // Not fatal if normalMatrix is missing (only 3d objects use it) @@ -315,6 +315,22 @@ void Window::screenshot() { std::clog << "video/info: Screenshot taken: " << filename << " (" << img.w << "x" << img.h << ")" << std::endl; } +ColorTrans::ColorTrans(Color const& c): m_old(g_color) { + using namespace glmath; + g_color = g_color * mat4::diagonal(vec4(c.r, c.g, c.b, c.a)); + ScreenManager::getSingletonPtr()->window().updateColor(); +} + +ColorTrans::ColorTrans(glmath::mat4 const& mat): m_old(g_color) { + g_color = g_color * mat; + ScreenManager::getSingletonPtr()->window().updateColor(); +} + +ColorTrans::~ColorTrans() { + g_color = m_old; + ScreenManager::getSingletonPtr()->window().updateColor(); +} + ViewTrans::ViewTrans(double offsetX, double offsetY, double frac): m_old(g_projection) { // Setup the projection matrix for 2D translates using namespace glmath; @@ -329,24 +345,13 @@ ViewTrans::ViewTrans(double offsetX, double offsetY, double frac): m_old(g_proje y1 -= persY; y2 -= persY; // Perspective projection + the rest of the offset in eye (world) space g_projection = frustum(f * x1, f * x2, f * y1, f * y2, near_, far_) - * translate(vec3(offsetX - persX, offsetY - persY, 0.0)); + * translate(vec3(offsetX - persX, offsetY - persY, -z0)); ScreenManager::getSingletonPtr()->window().updateTransforms(); } -ColorTrans::ColorTrans(Color const& c): m_old(g_color) { - using namespace glmath; - g_color = g_color * mat4::diagonal(vec4(c.r, c.g, c.b, c.a)); - ScreenManager::getSingletonPtr()->window().updateColor(); -} - -ColorTrans::ColorTrans(glmath::mat4 const& mat): m_old(g_color) { - g_color = g_color * mat; - ScreenManager::getSingletonPtr()->window().updateColor(); -} - -ColorTrans::~ColorTrans() { - g_color = m_old; - ScreenManager::getSingletonPtr()->window().updateColor(); +ViewTrans::ViewTrans(glmath::mat4 const& m): m_old(g_projection) { + g_projection = g_projection * m; + ScreenManager::getSingletonPtr()->window().updateTransforms(); } ViewTrans::~ViewTrans() { @@ -354,7 +359,6 @@ ViewTrans::~ViewTrans() { ScreenManager::getSingletonPtr()->window().updateTransforms(); } - Transform::Transform(glmath::mat4 const& m): m_old(g_modelview) { g_modelview = g_modelview * m; ScreenManager::getSingletonPtr()->window().updateTransforms(); diff --git a/game/video_driver.hh b/game/video_driver.hh index 54b1d50..3d38e1b 100644 --- a/game/video_driver.hh +++ b/game/video_driver.hh @@ -20,9 +20,11 @@ private: glmath::mat4 m_old; }; -/// Apply a subviewport with different perspective projection class ViewTrans { public: + /// Apply a translation on top of current viewport translation + ViewTrans(glmath::mat4 const& m); + /// Apply a subviewport with different perspective projection ViewTrans(double offsetX = 0.0, double offsetY = 0.0, double frac = 1.0); ~ViewTrans(); private: |