Update overworld with 'force fields' to guard the entrance to challenges as discussed. I <3 my new shader\!

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@10491 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria 2011-12-26 16:46:29 +00:00
parent 5c7d45576e
commit f23f537620
4 changed files with 107 additions and 4 deletions

9
data/shaders/bubble.frag Normal file
View File

@ -0,0 +1,9 @@
uniform sampler2D main_texture;
varying vec2 uv;
void main()
{
gl_FragColor = texture2D(main_texture, uv);
}

15
data/shaders/bubble.vert Normal file
View File

@ -0,0 +1,15 @@
// Creates a bubble (wave) effect by distorting the texture depending on time
uniform float time;
varying vec2 uv;
void main()
{
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
float delta_x = cos(time*3.0) * sin( 4.0 * gl_TexCoord[0].st.s * 6.28318531 );
float delta_y = cos(time*2.0) * sin( 3.0 * gl_TexCoord[0].st.t * 6.28318531 );
uv = gl_TexCoord[0].st + vec2(0.02*delta_x, 0.02*delta_y);
}

View File

@ -120,6 +120,30 @@ public:
} }
}; };
//-----------------------------------------------------------------------------
class BubbleEffectProvider : public video::IShaderConstantSetCallBack
{
irr::u32 initial_time;
public:
LEAK_CHECK()
BubbleEffectProvider()
{
initial_time = irr_driver->getDevice()->getTimer()->getRealTime();
}
virtual void OnSetConstants(
irr::video::IMaterialRendererServices *services,
s32 userData)
{
float time = (irr_driver->getDevice()->getTimer()->getRealTime() - initial_time) / 1000.0f;
services->setVertexShaderConstant("time", &time, 1);
}
};
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
/** Create a new material using the parameters specified in the xml file. /** Create a new material using the parameters specified in the xml file.
* \param node Node containing the parameters for this material. * \param node Node containing the parameters for this material.
@ -230,12 +254,16 @@ Material::Material(const XMLNode *node, int index)
} }
s=""; s="";
node->get("graphical-effect", &s ); node->get("graphical-effect", &s);
if (s == "water") if (s == "water")
{ {
m_graphical_effect = GE_WATER; m_graphical_effect = GE_WATER;
} }
else if (s == "bubble")
{
m_graphical_effect = GE_BUBBLE;
}
else if (s == "none") else if (s == "none")
{ {
} }
@ -365,7 +393,8 @@ void Material::init(unsigned int index)
m_alpha_to_coverage = false; m_alpha_to_coverage = false;
m_normal_map_provider = NULL; m_normal_map_provider = NULL;
m_splatting_provider = NULL; m_splatting_provider = NULL;
m_splatting = NULL; m_bubble_provider = NULL;
m_splatting = false;
for (int n=0; n<EMIT_KINDS_COUNT; n++) for (int n=0; n<EMIT_KINDS_COUNT; n++)
{ {
@ -431,6 +460,11 @@ Material::~Material()
m_splatting_provider->drop(); m_splatting_provider->drop();
m_splatting_provider = NULL; m_splatting_provider = NULL;
} }
if (m_bubble_provider != NULL)
{
m_bubble_provider->drop();
m_bubble_provider = NULL;
}
// If a special sfx is installed (that isn't part of stk itself), the // If a special sfx is installed (that isn't part of stk itself), the
// entry needs to be removed from the sfx_manager's mapping, since other // entry needs to be removed from the sfx_manager's mapping, since other
@ -764,6 +798,43 @@ void Material::setMaterialProperties(video::SMaterial *m)
m->MaterialType = (E_MATERIAL_TYPE)material_type; m->MaterialType = (E_MATERIAL_TYPE)material_type;
} }
if (m_graphical_effect == GE_BUBBLE)
{
IVideoDriver* video_driver = irr_driver->getVideoDriver();
if (UserConfigParams::m_pixel_shaders &&
video_driver->queryFeature(video::EVDF_ARB_GLSL) &&
video_driver->queryFeature(video::EVDF_PIXEL_SHADER_2_0))
{
if (m_bubble_provider == NULL)
{
m_bubble_provider = new BubbleEffectProvider();
}
// Material and shaders
IGPUProgrammingServices* gpu = video_driver->getGPUProgrammingServices();
s32 material_type = gpu->addHighLevelShaderMaterialFromFiles(
(file_manager->getDataDir() + "shaders/bubble.vert").c_str(),
"main",
video::EVST_VS_2_0,
(file_manager->getDataDir() + "shaders/bubble.frag").c_str(),
"main",
video::EPST_PS_2_0,
m_bubble_provider,
(m_alpha_blending ?
video::EMT_TRANSPARENT_ALPHA_CHANNEL :
video::EMT_SOLID)
);
m->MaterialType = (E_MATERIAL_TYPE)material_type;
// alpha blending and bubble shading can work together so when both are enabled
// don't increment the 'modes' counter to not get the 'too many modes' warning
if (!m_alpha_blending)
{
modes++;
}
}
}
if (modes > 1) if (modes > 1)
{ {
std::cerr << "[Material::setMaterialProperties] More than one main " std::cerr << "[Material::setMaterialProperties] More than one main "

View File

@ -39,6 +39,7 @@ class ParticleKind;
class NormalMapProvider; class NormalMapProvider;
class SplattingProvider; class SplattingProvider;
class BubbleEffectProvider;
/** /**
* \ingroup graphics * \ingroup graphics
@ -46,7 +47,11 @@ class SplattingProvider;
class Material : public NoCopy class Material : public NoCopy
{ {
public: public:
enum GraphicalEffect {GE_NONE, GE_WATER}; enum GraphicalEffect {GE_NONE,
/** Water splash effect. This is set on the seabed material. */
GE_WATER,
/** Effect where the UV texture is moved in a wave pattern */
GE_BUBBLE};
enum ParticleConditions enum ParticleConditions
{ {
@ -95,7 +100,7 @@ private:
bool m_add; bool m_add;
bool m_fog; bool m_fog;
ParticleKind* m_particles_effects[EMIT_KINDS_COUNT]; ParticleKind* m_particles_effects[EMIT_KINDS_COUNT];
/** For normal maps */ /** For normal maps */
@ -185,6 +190,9 @@ private:
/** Only used if splatting is used */ /** Only used if splatting is used */
SplattingProvider* m_splatting_provider; SplattingProvider* m_splatting_provider;
/** Only used if bubble effect is enabled */
BubbleEffectProvider* m_bubble_provider;
void init (unsigned int index); void init (unsigned int index);
void install (bool is_full_path=false); void install (bool is_full_path=false);
void initCustomSFX(const XMLNode *sfx); void initCustomSFX(const XMLNode *sfx);