From 3b20637b48e82a9a264d37aee2ee3752f11f2bd0 Mon Sep 17 00:00:00 2001 From: auria Date: Sun, 12 May 2013 00:14:53 +0000 Subject: [PATCH] Make grass speed and amplitude configurable git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@12735 178a84e3-b1eb-0310-8ba1-8eac791a3b58 --- data/shaders/grass.vert | 3 ++- src/graphics/material.cpp | 29 ++++++++++++++++++++--------- src/graphics/material.hpp | 3 +++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/data/shaders/grass.vert b/data/shaders/grass.vert index f5418c33b..17a154dfe 100644 --- a/data/shaders/grass.vert +++ b/data/shaders/grass.vert @@ -1,4 +1,5 @@ uniform float angle; +uniform float amplitude; varying vec4 coord; @@ -6,7 +7,7 @@ void main() { gl_TexCoord[0] = gl_MultiTexCoord0; vec4 vertexPosition = ftransform(); //gl_ModelViewMatrix * gl_Vertex; - vertexPosition += vec4(1,1,0,0) * 0.25 * gl_Color.r * sin(angle); + vertexPosition += vec4(1,1,0,0) * amplitude * gl_Color.r * sin(angle); gl_Position = vertexPosition; gl_FrontColor = vec4(1,1,1,1); gl_BackColor = vec4(1,1,1,1); diff --git a/src/graphics/material.cpp b/src/graphics/material.cpp index acac03722..fc24ee9cc 100644 --- a/src/graphics/material.cpp +++ b/src/graphics/material.cpp @@ -174,26 +174,31 @@ class GrassShaderProvider : public video::IShaderConstantSetCallBack { bool m_fog; float m_angle; + float m_amplitude; + float m_speed; public: LEAK_CHECK() + + GrassShaderProvider(float amplitude, float speed) + { + m_fog = false; + m_angle = 0.0f; + m_amplitude = amplitude; + m_speed = speed; + } + + void enableFog(bool enable) { m_fog = enable; } - - GrassShaderProvider() - { - m_fog = false; - m_angle = 0.0f; - } - virtual void OnSetConstants(irr::video::IMaterialRendererServices *services, s32 userData) { - m_angle += GUIEngine::getLatestDt()*0.4f; + m_angle += GUIEngine::getLatestDt()*m_speed; if (m_angle > M_PI*2) m_angle -= M_PI*2; services->setVertexShaderConstant("angle", &m_angle, 1); @@ -203,6 +208,8 @@ public: s32 tex = 0; services->setVertexShaderConstant("tex", &tex, 1); + services->setVertexShaderConstant("amplitude", &m_amplitude, 1); + if (m_fog) { Track* t = World::getWorld()->getTrack(); @@ -531,6 +538,10 @@ Material::Material(const XMLNode *node, int index, bool deprecated) else if (s == "grass") { m_graphical_effect = GE_GRASS; + m_grass_speed = 0.4f; + m_grass_amplitude = 0.25f; + node->get("grass-speed", &m_grass_speed); + node->get("grass-amplitude", &m_grass_amplitude); } else if (s == "none") { @@ -1292,7 +1303,7 @@ void Material::setMaterialProperties(video::SMaterial *m, scene::IMeshBuffer* m { if (m_shaders[GRASS_SHADER] == NULL) { - m_shaders[GRASS_SHADER] = new GrassShaderProvider(); + m_shaders[GRASS_SHADER] = new GrassShaderProvider(m_grass_speed, m_grass_amplitude); } bool fog = World::getWorld()->getTrack()->isFogEnabled(); diff --git a/src/graphics/material.hpp b/src/graphics/material.hpp index 8c02e3418..768a1266b 100644 --- a/src/graphics/material.hpp +++ b/src/graphics/material.hpp @@ -131,6 +131,9 @@ private: /** Particles to show on touch */ std::string m_collision_particles; + float m_grass_speed; + float m_grass_amplitude; + /** If the property should be ignored in the physics. Example would be * plants that a kart can just drive through. */ bool m_ignore;