diff --git a/.gitignore b/.gitignore
index ca74f1c42..845c64ce0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,9 @@ data/textures
data/tracks
data/.svn
+# Ignore doxygen output
+src/html
+
*.o
*.d
*.a
diff --git a/TODO.md b/TODO.md
index 332f1386c..670dc93c3 100644
--- a/TODO.md
+++ b/TODO.md
@@ -20,7 +20,7 @@ no particular order):
- Esp. different platforms
6. Package creators
- Create packages for
- - most common Linux Distributors
+ - most common Linux distributions
- Windows
7. Writers
- Write documentation, ranging from man page, to
diff --git a/data/achievements.xml b/data/achievements.xml
index 1e090a61b..1cfd510fa 100644
--- a/data/achievements.xml
+++ b/data/achievements.xml
@@ -1,17 +1,29 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/data/models/banana-low.b3d b/data/models/banana-low.b3d
index 54771fe0c..ec6ee3cae 100644
Binary files a/data/models/banana-low.b3d and b/data/models/banana-low.b3d differ
diff --git a/data/models/banana.b3d b/data/models/banana.b3d
index 0c800d159..90888d701 100644
Binary files a/data/models/banana.b3d and b/data/models/banana.b3d differ
diff --git a/data/models/gift-box-low.b3d b/data/models/gift-box-low.b3d
index 99805bbe6..c435fea23 100644
Binary files a/data/models/gift-box-low.b3d and b/data/models/gift-box-low.b3d differ
diff --git a/data/models/gift-box.b3d b/data/models/gift-box.b3d
index 1eebb0c48..aa89d7c56 100644
Binary files a/data/models/gift-box.b3d and b/data/models/gift-box.b3d differ
diff --git a/data/shaders/billboard.frag b/data/shaders/billboard.frag
index 80a4942eb..9a9de2c5e 100644
--- a/data/shaders/billboard.frag
+++ b/data/shaders/billboard.frag
@@ -1,8 +1,13 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main(void)
{
diff --git a/data/shaders/billboard.vert b/data/shaders/billboard.vert
index c707ab548..f6ec9e5f1 100644
--- a/data/shaders/billboard.vert
+++ b/data/shaders/billboard.vert
@@ -1,12 +1,18 @@
-#version 330
uniform mat4 ModelViewMatrix;
uniform mat4 ProjectionMatrix;
uniform vec3 Position;
uniform vec2 Size;
+#if __VERSION__ >= 130
in vec2 Corner;
in vec2 Texcoord;
out vec2 uv;
+#else
+attribute vec2 Corner;
+attribute vec2 Texcoord;
+varying vec2 uv;
+#endif
+
void main(void)
{
diff --git a/data/shaders/bloom.frag b/data/shaders/bloom.frag
index 5025f23aa..3be3cb60f 100644
--- a/data/shaders/bloom.frag
+++ b/data/shaders/bloom.frag
@@ -1,9 +1,14 @@
-#version 330
uniform sampler2D tex;
uniform float low;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/bloomblend.frag b/data/shaders/bloomblend.frag
index edcac3f31..b1003229a 100644
--- a/data/shaders/bloomblend.frag
+++ b/data/shaders/bloomblend.frag
@@ -1,8 +1,13 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/bloompower.frag b/data/shaders/bloompower.frag
index 0c29ce9b2..dc2e1df5b 100644
--- a/data/shaders/bloompower.frag
+++ b/data/shaders/bloompower.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform float power;
uniform sampler2D tex;
diff --git a/data/shaders/bubble.frag b/data/shaders/bubble.frag
index 0e1f2d4f9..6f69dfa74 100644
--- a/data/shaders/bubble.frag
+++ b/data/shaders/bubble.frag
@@ -14,11 +14,18 @@
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#version 330
+
uniform sampler2D tex;
uniform float transparency;
+
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/bubble.vert b/data/shaders/bubble.vert
index 6e9981bfb..0d61b7d33 100644
--- a/data/shaders/bubble.vert
+++ b/data/shaders/bubble.vert
@@ -17,13 +17,21 @@
// Creates a bubble (wave) effect by distorting the texture depending on time
-#version 330
+
uniform mat4 ModelViewProjectionMatrix;
uniform float time;
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+varying vec2 uv;
+#endif
+
+
void main()
{
diff --git a/data/shaders/caustics.frag b/data/shaders/caustics.frag
index e92e03a8c..203bd2b40 100644
--- a/data/shaders/caustics.frag
+++ b/data/shaders/caustics.frag
@@ -1,20 +1,32 @@
-#version 330 compatibility
-uniform sampler2D tex;
+uniform sampler2D Albedo;
+uniform sampler2D DiffuseMap;
+uniform sampler2D SpecularMap;
+uniform sampler2D SSAO;
+uniform vec2 screen;
+uniform vec3 ambient;
uniform sampler2D caustictex;
uniform vec2 dir;
uniform vec2 dir2;
+#if __VERSION__ >= 130
+in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
- vec2 tc = gl_TexCoord[0].xy;
+ vec2 tc = gl_FragCoord.xy / screen;
+ vec3 DiffuseComponent = texture(DiffuseMap, tc).xyz;
+ vec3 SpecularComponent = texture(SpecularMap, tc).xyz;
+ vec4 color = texture(Albedo, uv);
+ float ao = texture(SSAO, tc).x;
- vec3 col = texture(tex, tc).xyz;
- float caustic = texture(caustictex, tc + dir).x;
- float caustic2 = texture(caustictex, (tc.yx + dir2 * vec2(-0.6, 0.3)) * vec2(0.6)).x;
+ float caustic = texture(caustictex, uv + dir).x;
+ float caustic2 = texture(caustictex, (uv.yx + dir2 * vec2(-0.6, 0.3)) * vec2(0.6)).x;
- col += caustic * caustic2 * 10.0;
-
- FragColor = vec4(col, 1.0);
+ vec3 LightFactor = ao * ambient + DiffuseComponent + SpecularComponent + caustic * caustic2 * 10;
+ FragColor = vec4(color.xyz * LightFactor, 1.);
}
diff --git a/data/shaders/collapse.frag b/data/shaders/collapse.frag
index 573631f9a..e4f0fc4c6 100644
--- a/data/shaders/collapse.frag
+++ b/data/shaders/collapse.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform sampler2D oldtex;
uniform vec2 pixel;
diff --git a/data/shaders/color_levels.frag b/data/shaders/color_levels.frag
index 58ccee832..c99d7d4d8 100644
--- a/data/shaders/color_levels.frag
+++ b/data/shaders/color_levels.frag
@@ -1,20 +1,34 @@
-#version 330
uniform sampler2D tex;
+uniform sampler2D dtex;
uniform vec3 inlevel;
uniform vec2 outlevel;
+uniform mat4 invprojm;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
+
void main()
{
- vec2 texc = uv;
- //texc.y = 1.0 - texc.y;
+ vec4 col = texture(tex, uv);
+ float curdepth = texture(dtex, uv).x;
+ vec4 FragPos = invprojm * (2.0 * vec4(uv, curdepth, 1.0f) - 1.0f);
+ FragPos /= FragPos.w;
+ float depth = clamp(FragPos.z / 180, 0, 1);
+ depth = (1 - depth);
- vec4 col = texture(tex, texc);
-
- //col = col / (1 - col);
+ // Compute the vignette
+ vec2 inside = uv - 0.5;
+ float vignette = 1 - dot(inside, inside);
+ vignette = clamp(pow(vignette, 0.8), 0, 1);
+ vignette = clamp(vignette + vignette - 0.5, 0, 1.15);
float inBlack = inlevel.x;
float inWhite = inlevel.z;
@@ -23,8 +37,11 @@ void main()
float outBlack = outlevel.x;
float outWhite = outlevel.y;
- col.rgb = (pow(((col.rgb * 255.0) - inBlack) / (inWhite - inBlack),
+ vec3 colSat = (pow(((col.rgb * 255.0) - inBlack) / (inWhite - inBlack),
vec3(1.0 / inGamma)) * (outWhite - outBlack) + outBlack) / 255.0;
+
+ vec3 colFinal = colSat * depth + col.rgb * (1 - depth);
- FragColor = vec4(col.rgb, 1.0);
+ FragColor = vec4(colFinal * vignette, 1.0);
+ //FragColor = vec4(vec3(depth), 1.0);
}
diff --git a/data/shaders/coloredquad.frag b/data/shaders/coloredquad.frag
index 9216e0503..26d01339e 100644
--- a/data/shaders/coloredquad.frag
+++ b/data/shaders/coloredquad.frag
@@ -1,7 +1,11 @@
-#version 330
uniform ivec4 color;
+#if __VERSION__ >= 130
out vec4 FragColor;
+#else
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/coloredquad.vert b/data/shaders/coloredquad.vert
index 31c2a0db1..2864e469a 100644
--- a/data/shaders/coloredquad.vert
+++ b/data/shaders/coloredquad.vert
@@ -1,8 +1,12 @@
-#version 330
uniform vec2 center;
uniform vec2 size;
+#if __VERSION__ >= 130
in vec2 position;
+#else
+attribute vec2 position;
+#endif
+
void main()
{
diff --git a/data/shaders/colorize.frag b/data/shaders/colorize.frag
index b82462c1f..022fe59c0 100644
--- a/data/shaders/colorize.frag
+++ b/data/shaders/colorize.frag
@@ -1,7 +1,11 @@
-#version 330
uniform vec3 col;
+#if __VERSION__ >= 130
out vec4 FragColor;
+#else
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/colorize_ref.frag b/data/shaders/colorize_ref.frag
deleted file mode 100644
index 743f32224..000000000
--- a/data/shaders/colorize_ref.frag
+++ /dev/null
@@ -1,14 +0,0 @@
-#version 130
-uniform vec3 col;
-uniform sampler2D tex;
-
-out vec4 FragColor;
-
-void main()
-{
- float alpha = texture(tex, gl_TexCoord[0].xy).a;
- if (alpha < 0.5)
- discard;
-
- FragColor = vec4(col, 1.0);
-}
diff --git a/data/shaders/colortexturedquad.frag b/data/shaders/colortexturedquad.frag
index 1e14e5985..6c1aa7396 100644
--- a/data/shaders/colortexturedquad.frag
+++ b/data/shaders/colortexturedquad.frag
@@ -1,9 +1,16 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
in vec4 col;
out vec4 FragColor;
+#else
+varying vec2 uv;
+varying vec4 col;
+#define FragColor gl_FragColor
+#endif
+
+
void main()
{
diff --git a/data/shaders/colortexturedquad.vert b/data/shaders/colortexturedquad.vert
index 4489e9cbf..c4e4d41a0 100644
--- a/data/shaders/colortexturedquad.vert
+++ b/data/shaders/colortexturedquad.vert
@@ -1,14 +1,22 @@
-#version 330
uniform vec2 center;
uniform vec2 size;
uniform vec2 texcenter;
uniform vec2 texsize;
+#if __VERSION__ >= 130
in vec2 position;
in vec2 texcoord;
in uvec4 color;
out vec2 uv;
out vec4 col;
+#else
+attribute vec2 position;
+attribute vec2 texcoord;
+attribute uvec4 color;
+varying vec2 uv;
+varying vec4 col;
+#endif
+
void main()
{
diff --git a/data/shaders/detailledobject_pass2.frag b/data/shaders/detailledobject_pass2.frag
index 7afaee691..c0c9527d0 100644
--- a/data/shaders/detailledobject_pass2.frag
+++ b/data/shaders/detailledobject_pass2.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D Albedo;
uniform sampler2D Detail;
uniform sampler2D DiffuseMap;
@@ -6,9 +5,18 @@ uniform sampler2D SpecularMap;
uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
+
+#if __VERSION__ >= 130
in vec2 uv;
in vec2 uv_bis;
out vec4 FragColor;
+#else
+varying vec2 uv;
+varying vec2 uv_bis;
+#define FragColor gl_FragColor
+#endif
+
+
void main(void)
{
diff --git a/data/shaders/diffuseenvmap.frag b/data/shaders/diffuseenvmap.frag
new file mode 100644
index 000000000..eb2822598
--- /dev/null
+++ b/data/shaders/diffuseenvmap.frag
@@ -0,0 +1,52 @@
+uniform float blueLmn[9];
+uniform float greenLmn[9];
+uniform float redLmn[9];
+uniform sampler2D ntex;
+uniform mat4 TransposeViewMatrix;
+
+#if __VERSION__ >= 130
+in vec2 uv;
+out vec4 Diff;
+out vec4 Spec;
+#else
+varying vec2 uv;
+#define Diff gl_FragData[0]
+#define Spec gl_FragData[1]
+#endif
+
+vec3 DecodeNormal(vec2 n)
+{
+ float z = dot(n, n) * 2. - 1.;
+ vec2 xy = normalize(n) * sqrt(1. - z * z);
+ return vec3(xy,z);
+}
+
+mat4 getMatrix(float L[9])
+{
+ float c1 = 0.429043, c2 = 0.511664, c3 = 0.743125, c4 = 0.886227, c5 = 0.247708;
+
+ return mat4(
+ c1 * L[8] /*L22*/, c1 * L[4] /*L2-2*/, c1 * L[7] /*L21*/, c2 * L[3] /*L11*/,
+ c1 * L[4], - c1 * L[8], c1 * L[5] /*L2-1*/, c2 * L[1] /*L1-1*/,
+ c1 * L[7], c1 * L[5], c3 * L[6] /*L20*/, c2 * L[2] /*L10*/,
+ c2 * L[3], c2 * L[1], c2 * L[2], c4 * L[0] /*L00*/ - c5 * L[6]
+ );
+}
+
+void main(void)
+{
+ vec3 normal = normalize(DecodeNormal(2. * texture(ntex, uv).xy - 1.));
+ // Convert normal in world space (where SH coordinates were computed)
+ vec4 extendednormal = TransposeViewMatrix * vec4(normal, 1.);
+ extendednormal.w = 1.;
+ mat4 rmat = getMatrix(redLmn);
+ mat4 gmat = getMatrix(greenLmn);
+ mat4 bmat = getMatrix(blueLmn);
+
+ float r = dot(extendednormal, rmat * extendednormal);
+ float g = dot(extendednormal, gmat * extendednormal);
+ float b = dot(extendednormal, bmat * extendednormal);
+
+ Diff = 0.25 * vec4(r, g, b, .1);
+ Spec = vec4(0.);
+}
diff --git a/data/shaders/displace.frag b/data/shaders/displace.frag
index 1c22fd42e..c54effa71 100644
--- a/data/shaders/displace.frag
+++ b/data/shaders/displace.frag
@@ -1,19 +1,29 @@
-#version 330
-uniform sampler2D tex;
+uniform sampler2D displacement_tex;
+uniform sampler2D mask_tex;
+uniform sampler2D color_tex;
+uniform vec2 screen;
uniform vec2 dir;
uniform vec2 dir2;
+#if __VERSION__ >= 130
in vec2 uv;
in vec2 uv_bis;
in float camdist;
out vec4 FragColor;
+#else
+varying vec2 uv;
+varying vec2 uv_bis;
+varying float camdist;
+#define FragColor gl_FragColor
+#endif
+
const float maxlen = 0.02;
void main()
{
- float horiz = texture(tex, uv + dir).x;
- float vert = texture(tex, (uv.yx + dir2) * vec2(0.9)).x;
+ float horiz = texture(displacement_tex, uv + dir).x;
+ float vert = texture(displacement_tex, (uv.yx + dir2) * vec2(0.9)).x;
vec2 offset = vec2(horiz, vert);
offset *= 2.0;
@@ -30,11 +40,20 @@ void main()
offset *= 50.0 * fade * maxlen;
- vec4 col;
- col.r = step(offset.x, 0.0) * -offset.x;
- col.g = step(0.0, offset.x) * offset.x;
- col.b = step(offset.y, 0.0) * -offset.y;
- col.a = step(0.0, offset.y) * offset.y;
+ vec4 shiftval;
+ shiftval.r = step(offset.x, 0.0) * -offset.x;
+ shiftval.g = step(0.0, offset.x) * offset.x;
+ shiftval.b = step(offset.y, 0.0) * -offset.y;
+ shiftval.a = step(0.0, offset.y) * offset.y;
- FragColor = col;
+ vec2 shift;
+ shift.x = -shiftval.x + shiftval.y;
+ shift.y = -shiftval.z + shiftval.w;
+ shift /= 50.;
+
+ vec2 tc = gl_FragCoord.xy / screen;
+ float mask = texture(mask_tex, tc + shift).x;
+ tc += (mask < 1.) ? vec2(0.) : shift;
+
+ FragColor = texture(color_tex, tc);
}
diff --git a/data/shaders/displace.vert b/data/shaders/displace.vert
index 7c811d4aa..48b052077 100644
--- a/data/shaders/displace.vert
+++ b/data/shaders/displace.vert
@@ -1,13 +1,23 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 ModelViewMatrix;
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec2 SecondTexcoord;
out vec2 uv;
out vec2 uv_bis;
out float camdist;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+attribute vec2 SecondTexcoord;
+varying vec2 uv;
+varying vec2 uv_bis;
+varying float camdist;
+#endif
+
+
void main() {
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
diff --git a/data/shaders/farplane.vert b/data/shaders/farplane.vert
index eea0eeede..9d3a1b7db 100644
--- a/data/shaders/farplane.vert
+++ b/data/shaders/farplane.vert
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform mat4 ModelViewProjectionMatrix;
void main() {
diff --git a/data/shaders/flipparticle.vert b/data/shaders/flipparticle.vert
index 24ce2773a..7b479ec9f 100644
--- a/data/shaders/flipparticle.vert
+++ b/data/shaders/flipparticle.vert
@@ -1,4 +1,3 @@
-#version 330
uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix;
diff --git a/data/shaders/fog.frag b/data/shaders/fog.frag
index 60dd7dcf0..ce03d04af 100644
--- a/data/shaders/fog.frag
+++ b/data/shaders/fog.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D tex;
uniform float fogmax;
@@ -9,8 +8,14 @@ uniform float end;
uniform vec3 col;
uniform mat4 ipvmat;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/gaussian3h.frag b/data/shaders/gaussian3h.frag
index 07f4d4092..d444ba11d 100644
--- a/data/shaders/gaussian3h.frag
+++ b/data/shaders/gaussian3h.frag
@@ -1,11 +1,15 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
// Gaussian separated blur with radius 3.
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
diff --git a/data/shaders/gaussian3v.frag b/data/shaders/gaussian3v.frag
index 365e25678..16e21a1a5 100644
--- a/data/shaders/gaussian3v.frag
+++ b/data/shaders/gaussian3v.frag
@@ -1,11 +1,15 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
// Gaussian separated blur with radius 3.
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
diff --git a/data/shaders/gaussian6h.frag b/data/shaders/gaussian6h.frag
index a2ee0eb26..c17766c4b 100644
--- a/data/shaders/gaussian6h.frag
+++ b/data/shaders/gaussian6h.frag
@@ -1,11 +1,15 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
// Gaussian separated blur with radius 6.
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
diff --git a/data/shaders/gaussian6v.frag b/data/shaders/gaussian6v.frag
index 8150cbbf6..31d361e60 100644
--- a/data/shaders/gaussian6v.frag
+++ b/data/shaders/gaussian6v.frag
@@ -1,11 +1,15 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
// Gaussian separated blur with radius 6.
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
diff --git a/data/shaders/glow.frag b/data/shaders/glow.frag
index 0821b420a..7902bd93b 100644
--- a/data/shaders/glow.frag
+++ b/data/shaders/glow.frag
@@ -1,8 +1,12 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
diff --git a/data/shaders/godfade.frag b/data/shaders/godfade.frag
index e44fdec04..fb60fe344 100644
--- a/data/shaders/godfade.frag
+++ b/data/shaders/godfade.frag
@@ -1,11 +1,17 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform vec3 col;
+
+#if __VERSION__ >= 130
+in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
- vec4 res = texture(tex, gl_TexCoord[0].xy);
+ vec4 res = texture(tex, uv);
// Keep the sun fully bright, but fade the sky
float mul = distance(res.xyz, col);
diff --git a/data/shaders/godray.frag b/data/shaders/godray.frag
index 83422eb9c..8880d434d 100644
--- a/data/shaders/godray.frag
+++ b/data/shaders/godray.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform vec2 sunpos;
@@ -6,14 +5,20 @@ uniform vec2 sunpos;
const float decaystep = 0.88;
+#if __VERSION__ >= 130
+in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main()
{
- vec2 texc = gl_TexCoord[0].xy;
+ vec2 texc = uv;
vec2 tosun = sunpos - texc;
- if (dot(tosun, tosun) > 0.49) discard;
+// if (dot(tosun, tosun) > 0.49) discard;
vec2 dist = tosun * 1.0/(float(SAMPLES) * 1.12);
diff --git a/data/shaders/grass_pass1.vert b/data/shaders/grass_pass1.vert
index 4d38b4f0a..647697da3 100644
--- a/data/shaders/grass_pass1.vert
+++ b/data/shaders/grass_pass1.vert
@@ -1,14 +1,24 @@
-#version 330
uniform vec3 windDir;
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+
+#if __VERSION__ >= 130
in vec3 Position;
in vec3 Normal;
in vec2 Texcoord;
in vec4 Color;
-noperspective out vec3 nor;
+out vec3 nor;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec3 Normal;
+attribute vec2 Texcoord;
+attribute vec4 Color;
+varying vec3 nor;
+varying vec2 uv;
+#endif
+
void main()
{
diff --git a/data/shaders/grass_pass2.vert b/data/shaders/grass_pass2.vert
index 0d60826ea..34ee95fd9 100644
--- a/data/shaders/grass_pass2.vert
+++ b/data/shaders/grass_pass2.vert
@@ -1,11 +1,17 @@
-#version 330
uniform vec3 windDir;
uniform mat4 ModelViewProjectionMatrix;
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec4 Color;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+attribute vec4 Color;
+varying vec2 uv;
+#endif
void main()
{
diff --git a/data/shaders/mipviz.frag b/data/shaders/mipviz.frag
index e63ca8158..da795da40 100644
--- a/data/shaders/mipviz.frag
+++ b/data/shaders/mipviz.frag
@@ -1,5 +1,3 @@
-#version 330 compatibility
-
uniform sampler2D tex;
uniform vec2 texsize;
uniform int notex;
diff --git a/data/shaders/motion_blur.frag b/data/shaders/motion_blur.frag
index 3be7cc652..43eb263bc 100644
--- a/data/shaders/motion_blur.frag
+++ b/data/shaders/motion_blur.frag
@@ -17,7 +17,6 @@
// motion_blur.frag
-#version 330
// The actual boost amount (which linearly scales the blur to be shown).
// should be in the range [0.0, 1.0], though a larger value might make
@@ -41,8 +40,13 @@ uniform float mask_radius;
// Maximum height of texture used
uniform float max_tex_height;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
// Number of samples used for blurring
#define NB_SAMPLES 8
diff --git a/data/shaders/motion_blur.vert b/data/shaders/motion_blur.vert
deleted file mode 100644
index 5c02f2bd3..000000000
--- a/data/shaders/motion_blur.vert
+++ /dev/null
@@ -1,26 +0,0 @@
-// SuperTuxKart - a fun racing game with go-kart
-// Copyright (C) 2013 the SuperTuxKart team
-//
-// This program is free software; you can redistribute it and/or
-// modify it under the terms of the GNU General Public License
-// as published by the Free Software Foundation; either version 3
-// of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
-
-// motion_blur.vert
-#version 330 compatibility
-
-void main()
-{
- gl_TexCoord[0].st = vec2(gl_MultiTexCoord0.s, gl_MultiTexCoord0.t);
- gl_Position = gl_Vertex;
-}
diff --git a/data/shaders/movingtexture.frag b/data/shaders/movingtexture.frag
deleted file mode 100644
index 7d4d81c27..000000000
--- a/data/shaders/movingtexture.frag
+++ /dev/null
@@ -1,22 +0,0 @@
-#version 330
-uniform sampler2D Albedo;
-uniform sampler2D DiffuseMap;
-uniform sampler2D SpecularMap;
-uniform sampler2D SSAO;
-uniform vec2 screen;
-uniform vec3 ambient;
-
-in vec2 uv;
-out vec4 FragColor;
-
-void main(void)
-{
- vec2 tc = gl_FragCoord.xy / screen;
- vec4 color = texture(Albedo, uv);
- vec3 DiffuseComponent = texture(DiffuseMap, tc).xyz;
- vec3 SpecularComponent = texture(SpecularMap, tc).xyz;
- float ao = texture(SSAO, tc).x;
- vec3 LightFactor = ao * ambient + DiffuseComponent + SpecularComponent * (1. - color.a);
- FragColor = vec4(color.xyz * LightFactor * (0.4 + ao*0.6), 1.);
- //FragColor = vec4(color.xyz * LightFactor, 1.);
-}
diff --git a/data/shaders/movingtexture.vert b/data/shaders/movingtexture.vert
deleted file mode 100644
index 87f40d795..000000000
--- a/data/shaders/movingtexture.vert
+++ /dev/null
@@ -1,16 +0,0 @@
-#version 330
-uniform mat4 ModelViewProjectionMatrix;
-uniform mat4 TextureMatrix;
-
-in vec3 Position;
-in vec2 Texcoord;
-in vec2 SecondTexcoord;
-out vec2 uv;
-out vec2 uv_bis;
-
-void main(void)
-{
- uv = (TextureMatrix * vec4(Texcoord, 1., 1.)).xy;
- uv_bis = SecondTexcoord;
- gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
-}
diff --git a/data/shaders/multiply.frag b/data/shaders/multiply.frag
index 1e9303bf1..d3d16cbdd 100644
--- a/data/shaders/multiply.frag
+++ b/data/shaders/multiply.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex1;
uniform sampler2D tex2;
diff --git a/data/shaders/normalmap.frag b/data/shaders/normalmap.frag
index 00410d916..b07c307eb 100644
--- a/data/shaders/normalmap.frag
+++ b/data/shaders/normalmap.frag
@@ -1,10 +1,17 @@
-#version 330
uniform sampler2D normalMap;
-noperspective in vec3 tangent;
-noperspective in vec3 bitangent;
+#if __VERSION__ >= 130
+in vec3 tangent;
+in vec3 bitangent;
in vec2 uv;
out vec2 EncodedNormal;
+#else
+varying vec3 tangent;
+varying vec3 bitangent;
+varying vec2 uv;
+#define EncodedNormal gl_FragColor.xy
+#endif
+
// from Crytek "a bit more deferred CryEngine"
vec2 EncodeNormal(vec3 n)
diff --git a/data/shaders/normalmap.vert b/data/shaders/normalmap.vert
index b7f74865d..5d5f79c21 100644
--- a/data/shaders/normalmap.vert
+++ b/data/shaders/normalmap.vert
@@ -1,14 +1,25 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec3 Tangent;
in vec3 Bitangent;
-noperspective out vec3 tangent;
-noperspective out vec3 bitangent;
+out vec3 tangent;
+out vec3 bitangent;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+attribute vec3 Tangent;
+attribute vec3 Bitangent;
+varying vec3 tangent;
+varying vec3 bitangent;
+varying vec2 uv;
+#endif
+
void main()
{
diff --git a/data/shaders/object_pass1.frag b/data/shaders/object_pass1.frag
index ff55a147d..e119e2e0a 100644
--- a/data/shaders/object_pass1.frag
+++ b/data/shaders/object_pass1.frag
@@ -1,6 +1,12 @@
-#version 330
-noperspective in vec3 nor;
+#if __VERSION__ >= 130
+in vec3 nor;
out vec2 EncodedNormal;
+#else
+varying vec3 nor;
+#define EncodedNormal gl_FragColor.xy
+#endif
+
+
// from Crytek "a bit more deferred CryEngine"
vec2 EncodeNormal(vec3 n)
diff --git a/data/shaders/object_pass1.vert b/data/shaders/object_pass1.vert
index edf27d885..12970e280 100644
--- a/data/shaders/object_pass1.vert
+++ b/data/shaders/object_pass1.vert
@@ -1,10 +1,16 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+#if __VERSION__ >= 130
in vec3 Position;
in vec3 Normal;
-noperspective out vec3 nor;
+out vec3 nor;
+#else
+attribute vec3 Position;
+attribute vec3 Normal;
+varying vec3 nor;
+#endif
+
void main(void)
{
diff --git a/data/shaders/object_pass2.frag b/data/shaders/object_pass2.frag
index 7d4d81c27..426a79ec4 100644
--- a/data/shaders/object_pass2.frag
+++ b/data/shaders/object_pass2.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D Albedo;
uniform sampler2D DiffuseMap;
uniform sampler2D SpecularMap;
@@ -6,8 +5,14 @@ uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main(void)
{
diff --git a/data/shaders/object_pass2.vert b/data/shaders/object_pass2.vert
index b20eeac18..c04d75dfd 100644
--- a/data/shaders/object_pass2.vert
+++ b/data/shaders/object_pass2.vert
@@ -1,15 +1,28 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
+uniform mat4 TextureMatrix =
+ mat4(1., 0., 0., 0.,
+ 0., 1., 0., 0.,
+ 0., 0., 1., 0.,
+ 0., 0., 0., 1.);
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec2 SecondTexcoord;
out vec2 uv;
out vec2 uv_bis;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+attribute vec2 SecondTexcoord;
+varying vec2 uv;
+varying vec2 uv_bis;
+#endif
+
void main(void)
{
- uv = Texcoord;
+ uv = (TextureMatrix * vec4(Texcoord, 1., 1.)).xy;
uv_bis = SecondTexcoord;
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
}
diff --git a/data/shaders/object_unlit.frag b/data/shaders/object_unlit.frag
index 3677baae3..5c60f9f43 100644
--- a/data/shaders/object_unlit.frag
+++ b/data/shaders/object_unlit.frag
@@ -1,7 +1,13 @@
-#version 330
uniform sampler2D tex;
+
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main(void)
{
diff --git a/data/shaders/objectpass_ref.frag b/data/shaders/objectpass_ref.frag
deleted file mode 100644
index 38b42a644..000000000
--- a/data/shaders/objectpass_ref.frag
+++ /dev/null
@@ -1,29 +0,0 @@
-#version 330
-uniform sampler2D tex;
-uniform int hastex;
-uniform float objectid;
-
-noperspective in vec3 nor;
-in vec2 uv0;
-in vec2 uv1;
-out vec4 Albedo;
-out vec4 NormalDepth;
-out vec4 Specular;
-
-void main() {
-
- //if (hastex != 0) {
- vec4 col = texture(tex, uv0);
-
- if (col.a < 0.5)
- discard;
-
- Albedo = vec4(col.xyz, 1.);
- //} else {
- // Albedo = gl_Color;
- //}
-
- NormalDepth = vec4(0.5 * normalize(nor) + 0.5, gl_FragCoord.z);
- Specular = vec4(1. - col.a);
-}
-
diff --git a/data/shaders/objectpass_rimlit.frag b/data/shaders/objectpass_rimlit.frag
index a17f533b9..907dd8e9f 100644
--- a/data/shaders/objectpass_rimlit.frag
+++ b/data/shaders/objectpass_rimlit.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D Albedo;
uniform sampler2D DiffuseMap;
uniform sampler2D SpecularMap;
@@ -6,10 +5,15 @@ uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
-noperspective in vec3 normal;
+#if __VERSION__ >= 130
+in vec3 normal;
in vec2 uv;
-
out vec4 FragColor;
+#else
+varying vec3 normal;
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
void main() {
float rim = 1.0 - dot(normal, vec3(0., 0., -1));
diff --git a/data/shaders/objectpass_rimlit.vert b/data/shaders/objectpass_rimlit.vert
index 7910ebb75..59f1feab3 100644
--- a/data/shaders/objectpass_rimlit.vert
+++ b/data/shaders/objectpass_rimlit.vert
@@ -1,16 +1,25 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+uniform mat4 TextureMatrix;
+#if __VERSION__ >= 130
in vec3 Position;
in vec3 Normal;
in vec2 Texcoord;
in vec4 Color;
out vec2 uv;
-noperspective out vec3 normal;
+out vec3 normal;
+#else
+attribute vec3 Position;
+attribute vec3 Normal;
+attribute vec2 Texcoord;
+attribute vec4 Color;
+varying vec2 uv;
+varying vec3 normal;
+#endif
void main() {
normal = (TransposeInverseModelView * vec4(Normal, 0)).xyz;
- uv = Texcoord;
+ uv = (TextureMatrix * vec4(Texcoord, 1., 1.)).xy;
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
}
diff --git a/data/shaders/objectpass_spheremap.frag b/data/shaders/objectpass_spheremap.frag
index 9d726b99a..13467bbad 100644
--- a/data/shaders/objectpass_spheremap.frag
+++ b/data/shaders/objectpass_spheremap.frag
@@ -1,22 +1,27 @@
-#version 330
-uniform sampler2D tex;
+uniform samplerCube tex;
+uniform mat4 invproj;
+uniform vec2 screen;
+uniform mat4 TransposeViewMatrix;
-noperspective in vec3 nor;
+#if __VERSION__ >= 130
+in vec3 nor;
out vec4 FragColor;
+#else
+varying vec3 nor;
+#define FragColor gl_FragColor
+#endif
+
void main() {
- // Calculate the spherical UV
- const vec3 forward = vec3(0.0, 0.0, 1.0);
+ vec3 fpos = gl_FragCoord.xyz / vec3(screen, 1.);
+ vec4 xpos = 2.0 * vec4(fpos, 1.0) - 1.0;
+ xpos = invproj * xpos;
- // get the angle between the forward vector and the horizontal portion of the normal
- vec3 normal_x = normalize(vec3(nor.x, 0.0, nor.z));
- float sin_theta_x = length(cross( forward, normal_x )) * nor.x / abs(nor.x);
+ xpos.xyz /= xpos.w;
+ vec3 viewSampleDir = reflect(xpos.xyz, nor);
+ // Convert sampleDir in world space (where tex was generated)
+ vec4 sampleDir = TransposeViewMatrix * vec4(viewSampleDir, 0.);
+ vec4 detail0 = texture(tex, sampleDir.xyz);
- // get the angle between the forward vector and the vertical portion of the normal
- vec3 normal_y = normalize(vec3(0.0, nor.y, nor.z));
- float sin_theta_y = length(cross( forward, normal_y )) * nor.y / abs(nor.y);
-
- vec4 detail0 = texture(tex, 0.5 * vec2(sin_theta_x, sin_theta_y) + 0.5);
-
- FragColor = vec4(detail0.xyz, 1.);
+ FragColor = vec4(detail0.xyz, 1.);
}
diff --git a/data/shaders/objectref_pass1.frag b/data/shaders/objectref_pass1.frag
index 06c8c413e..d322f9a5b 100644
--- a/data/shaders/objectref_pass1.frag
+++ b/data/shaders/objectref_pass1.frag
@@ -1,9 +1,15 @@
-#version 330
uniform sampler2D tex;
-noperspective in vec3 nor;
+#if __VERSION__ >= 130
+in vec3 nor;
in vec2 uv;
out vec2 EncodedNormal;
+#else
+varying vec3 nor;
+varying vec2 uv;
+#define EncodedNormal gl_FragColor.xy
+#endif
+
// from Crytek "a bit more deferred CryEngine"
vec2 EncodeNormal(vec3 n)
diff --git a/data/shaders/objectref_pass1.vert b/data/shaders/objectref_pass1.vert
index 462efa8ab..59fa0f3c5 100644
--- a/data/shaders/objectref_pass1.vert
+++ b/data/shaders/objectref_pass1.vert
@@ -1,16 +1,30 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+uniform mat4 TextureMatrix =
+ mat4(1., 0., 0., 0.,
+ 0., 1., 0., 0.,
+ 0., 0., 1., 0.,
+ 0., 0., 0., 1.);
+#if __VERSION__ >= 130
in vec3 Position;
in vec3 Normal;
in vec2 Texcoord;
-noperspective out vec3 nor;
+out vec3 nor;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec3 Normal;
+attribute vec2 Texcoord;
+varying vec3 nor;
+varying vec2 uv;
+#endif
+
+
void main(void)
{
- uv = Texcoord;
+ uv = (TextureMatrix * vec4(Texcoord, 1., 1.)).xy;
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
nor = (TransposeInverseModelView * vec4(Normal, 0.)).xyz;
}
diff --git a/data/shaders/objectref_pass2.frag b/data/shaders/objectref_pass2.frag
index e48755946..823d405d4 100644
--- a/data/shaders/objectref_pass2.frag
+++ b/data/shaders/objectref_pass2.frag
@@ -1,12 +1,18 @@
-#version 330
uniform sampler2D Albedo;
uniform sampler2D DiffuseMap;
uniform sampler2D SpecularMap;
uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
+
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main(void)
{
diff --git a/data/shaders/particle.frag b/data/shaders/particle.frag
index 1b6c5f200..cf405c01d 100644
--- a/data/shaders/particle.frag
+++ b/data/shaders/particle.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D tex;
uniform sampler2D dtex;
uniform mat4 invproj;
diff --git a/data/shaders/particle.vert b/data/shaders/particle.vert
index 73b0dd8de..2376b86bd 100644
--- a/data/shaders/particle.vert
+++ b/data/shaders/particle.vert
@@ -1,4 +1,3 @@
-#version 330
uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix;
diff --git a/data/shaders/particlesimheightmap.vert b/data/shaders/particlesimheightmap.vert
index 09fa55a98..b34fb360e 100644
--- a/data/shaders/particlesimheightmap.vert
+++ b/data/shaders/particlesimheightmap.vert
@@ -1,4 +1,3 @@
-#version 330
uniform int dt;
uniform mat4 sourcematrix;
uniform int level;
diff --git a/data/shaders/pass.frag b/data/shaders/pass.frag
index 327fcdffc..e5b1e7c69 100644
--- a/data/shaders/pass.frag
+++ b/data/shaders/pass.frag
@@ -1,9 +1,10 @@
-#version 330 compatibility
+#version 330
uniform sampler2D tex;
+in vec2 uv;
out vec4 FragColor;
void main()
{
- FragColor = texture(tex, gl_TexCoord[0].xy);
+ FragColor = texture(tex, uv);
}
diff --git a/data/shaders/pass.vert b/data/shaders/pass.vert
index f2003abef..4c495e0a7 100644
--- a/data/shaders/pass.vert
+++ b/data/shaders/pass.vert
@@ -1,9 +1,11 @@
// Passthrough shader for drawQuad()
-#version 330 compatibility
+#version 330
+in vec3 Position;
+in vec2 Texcoord;
out vec2 uv;
void main() {
- uv = gl_MultiTexCoord0.xy;
- gl_Position = gl_Vertex;
+ uv = Texcoord;
+ gl_Position = vec4(Position, 1.);
}
diff --git a/data/shaders/penumbrah.frag b/data/shaders/penumbrah.frag
index 481db2dc8..2504d9752 100644
--- a/data/shaders/penumbrah.frag
+++ b/data/shaders/penumbrah.frag
@@ -1,9 +1,14 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
// Separated penumbra, horizontal
void main()
diff --git a/data/shaders/penumbrav.frag b/data/shaders/penumbrav.frag
index 7afc88173..715e07091 100644
--- a/data/shaders/penumbrav.frag
+++ b/data/shaders/penumbrav.frag
@@ -1,9 +1,14 @@
-#version 330
uniform sampler2D tex;
uniform vec2 pixel;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
// Separated penumbra, vertical
diff --git a/data/shaders/pointemitter.vert b/data/shaders/pointemitter.vert
index 64a498dc7..333673f27 100644
--- a/data/shaders/pointemitter.vert
+++ b/data/shaders/pointemitter.vert
@@ -1,4 +1,3 @@
-#version 330
uniform int dt;
uniform mat4 sourcematrix;
uniform int level;
diff --git a/data/shaders/pointlight.frag b/data/shaders/pointlight.frag
index f21f49492..0c2c9a1cf 100644
--- a/data/shaders/pointlight.frag
+++ b/data/shaders/pointlight.frag
@@ -1,15 +1,14 @@
-#version 330
uniform sampler2D ntex;
uniform sampler2D dtex;
-
-uniform vec4 center[16];
-uniform vec4 col[16];
-uniform float energy[16];
uniform float spec;
uniform mat4 invproj;
-uniform mat4 viewm;
+uniform mat4 ViewMatrix;
+uniform vec2 screen;
+
+flat in vec3 center;
+flat in float energy;
+flat in vec3 col;
-in vec2 uv;
out vec4 Diffuse;
out vec4 Specular;
@@ -21,7 +20,7 @@ vec3 DecodeNormal(vec2 n)
}
void main() {
- vec2 texc = uv;
+ vec2 texc = gl_FragCoord.xy / screen;
float z = texture(dtex, texc).x;
vec3 norm = normalize(DecodeNormal(2. * texture(ntex, texc).xy - 1.));
@@ -32,26 +31,23 @@ void main() {
vec3 diffuse = vec3(0.), specular = vec3(0.);
- for (int i = 0; i < 16; ++i) {
- vec4 pseudocenter = viewm * vec4(center[i].xyz, 1.0);
- pseudocenter /= pseudocenter.w;
- vec3 light_pos = pseudocenter.xyz;
- vec3 light_col = col[i].xyz;
- float d = distance(light_pos, xpos.xyz);
- float att = energy[i] * 200. / (4. * 3.14 * d * d);
- float spec_att = (energy[i] + 10.) * 200. / (4. * 3.14 * d * d);
+ vec4 pseudocenter = ViewMatrix * vec4(center.xyz, 1.0);
+ pseudocenter /= pseudocenter.w;
+ vec3 light_pos = pseudocenter.xyz;
+ vec3 light_col = col.xyz;
+ float d = distance(light_pos, xpos.xyz);
+ float att = energy * 200. / (4. * 3.14 * d * d);
+ float spec_att = (energy + 10.) * 200. / (4. * 3.14 * d * d);
- // Light Direction
- vec3 L = normalize(xpos.xyz - light_pos);
+ // Light Direction
+ vec3 L = normalize(xpos.xyz - light_pos);
- float NdotL = max(0.0, dot(norm, -L));
- diffuse += NdotL * light_col * att;
- // Reflected light dir
- vec3 R = reflect(-L, norm);
- float RdotE = max(0.0, dot(R, eyedir));
- float Specular = pow(RdotE, spec);
- specular += Specular * light_col * spec_att;
- }
+ float NdotL = max(0.0, dot(norm, -L));
+ diffuse += NdotL * light_col * att;
+ // Reflected light dir
+ vec3 R = reflect(-L, norm);
+ float RdotE = max(0.0, dot(R, eyedir));
+ specular += pow(RdotE, spec) * light_col * spec_att;
Diffuse = vec4(diffuse, 1.);
Specular = vec4(specular , 1.);
diff --git a/data/shaders/pointlight.vert b/data/shaders/pointlight.vert
new file mode 100644
index 000000000..540584c4c
--- /dev/null
+++ b/data/shaders/pointlight.vert
@@ -0,0 +1,38 @@
+uniform mat4 ViewMatrix;
+uniform mat4 ProjectionMatrix;
+
+in vec3 Position;
+in float Energy;
+in vec3 Color;
+
+in vec2 Corner;
+
+flat out vec3 center;
+flat out float energy;
+flat out vec3 col;
+
+const float zNear = 1.;
+
+void main(void)
+{
+ // Beyond that value, light is too attenuated
+ float r = 40 * Energy;
+ center = Position;
+ energy = Energy;
+ vec4 Center = ViewMatrix * vec4(Position, 1.);
+ if (Center.z > zNear) // Light is in front of the cam
+ {
+ vec3 UnitCenter = normalize(-Center.xyz);
+ float clampedR = min(r, Center.z - 1.);
+ float cosTheta = dot(UnitCenter, vec3(0., 0., -1));
+ float d = clampedR / cosTheta;
+ Center.xyz += d * UnitCenter;
+ }
+ else if (Center.z + r > zNear) // Light is behind the cam but in range
+ {
+ Center.z = zNear;
+ // TODO: Change r so that we make the screen aligned quad fits light range.
+ }
+ col = Color;
+ gl_Position = ProjectionMatrix * (Center + r * vec4(Corner, 0., 0.));
+}
diff --git a/data/shaders/ppdisplace.frag b/data/shaders/ppdisplace.frag
deleted file mode 100644
index 717f77881..000000000
--- a/data/shaders/ppdisplace.frag
+++ /dev/null
@@ -1,30 +0,0 @@
-#version 330
-uniform sampler2D tex;
-uniform sampler2D dtex;
-
-uniform int viz;
-
-in vec2 uv;
-out vec4 FragColor;
-
-void main()
-{
- vec2 tc = uv;
-
- vec4 shiftval = texture(dtex, tc) / vec4(50.0);
- vec2 shift;
- shift.x = -shiftval.x + shiftval.y;
- shift.y = -shiftval.z + shiftval.w;
-
- tc += shift;
-
- vec4 newcol = texture(tex, tc);
-
- if (viz < 1)
- {
- FragColor = newcol;
- } else
- {
- FragColor = shiftval * vec4(50.0);
- }
-}
diff --git a/data/shaders/rain.frag b/data/shaders/rain.frag
index 66af66dd3..39c1cde03 100644
--- a/data/shaders/rain.frag
+++ b/data/shaders/rain.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform sampler2D normals_and_depth;
uniform mat4 invproj;
diff --git a/data/shaders/rain.vert b/data/shaders/rain.vert
index e20bf80f3..6c999eb32 100644
--- a/data/shaders/rain.vert
+++ b/data/shaders/rain.vert
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform float screenw;
void main()
diff --git a/data/shaders/rainsim.vert b/data/shaders/rainsim.vert
index dca63e1bf..4a24d07e9 100644
--- a/data/shaders/rainsim.vert
+++ b/data/shaders/rainsim.vert
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform float time;
uniform vec3 campos;
uniform mat4 viewm;
diff --git a/data/shaders/screenquad.vert b/data/shaders/screenquad.vert
index 1ba822b26..f13fbba0a 100644
--- a/data/shaders/screenquad.vert
+++ b/data/shaders/screenquad.vert
@@ -1,8 +1,12 @@
-#version 330
-
in vec2 Position;
in vec2 Texcoord;
+
+#if __VERSION__ >= 130
out vec2 uv;
+#else
+varying vec2 uv;
+#endif
+
void main() {
uv = Texcoord;
diff --git a/data/shaders/shadow.geom b/data/shaders/shadow.geom
index 17754b677..a538974fe 100644
--- a/data/shaders/shadow.geom
+++ b/data/shaders/shadow.geom
@@ -1,4 +1,3 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix[4];
layout(triangles) in;
diff --git a/data/shaders/shadow.vert b/data/shaders/shadow.vert
index 0bff7c743..e58ec7c63 100644
--- a/data/shaders/shadow.vert
+++ b/data/shaders/shadow.vert
@@ -1,5 +1,3 @@
-#version 330
-
in vec3 Position;
in vec2 Texcoord;
diff --git a/data/shaders/shadowgen.frag b/data/shaders/shadowgen.frag
index 2a44707de..565e9345c 100644
--- a/data/shaders/shadowgen.frag
+++ b/data/shaders/shadowgen.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D halft; // half is a reserved word
uniform sampler2D quarter;
uniform sampler2D eighth;
diff --git a/data/shaders/shadowimportance.frag b/data/shaders/shadowimportance.frag
index 1bcc21cd0..7796780f1 100644
--- a/data/shaders/shadowimportance.frag
+++ b/data/shaders/shadowimportance.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D ntex;
uniform sampler2D ctex;
uniform vec3 campos;
diff --git a/data/shaders/shadowimportance.vert b/data/shaders/shadowimportance.vert
index bb3a8b4b9..ddd0bad18 100644
--- a/data/shaders/shadowimportance.vert
+++ b/data/shaders/shadowimportance.vert
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D dtex;
uniform mat4 ipvmat;
uniform mat4 shadowmat;
diff --git a/data/shaders/shadowpass.frag b/data/shaders/shadowpass.frag
index bcec0ee01..5de466456 100644
--- a/data/shaders/shadowpass.frag
+++ b/data/shaders/shadowpass.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform int hastex;
uniform int viz;
diff --git a/data/shaders/shadowpass.vert b/data/shaders/shadowpass.vert
index 009f4b295..f6e1cf3fe 100644
--- a/data/shaders/shadowpass.vert
+++ b/data/shaders/shadowpass.vert
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D warpx;
uniform sampler2D warpy;
diff --git a/data/shaders/shadowwarph.frag b/data/shaders/shadowwarph.frag
index 38d46dd89..2c22c20ee 100644
--- a/data/shaders/shadowwarph.frag
+++ b/data/shaders/shadowwarph.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform int size;
uniform vec2 pixel;
diff --git a/data/shaders/shadowwarpv.frag b/data/shaders/shadowwarpv.frag
index 5491d8f21..62bc6bf6c 100644
--- a/data/shaders/shadowwarpv.frag
+++ b/data/shaders/shadowwarpv.frag
@@ -1,4 +1,3 @@
-#version 330 compatibility
uniform sampler2D tex;
uniform int size;
uniform vec2 pixel;
diff --git a/data/shaders/sky.frag b/data/shaders/sky.frag
new file mode 100644
index 000000000..d6e44b383
--- /dev/null
+++ b/data/shaders/sky.frag
@@ -0,0 +1,21 @@
+uniform samplerCube tex;
+uniform mat4 InvProjView;
+uniform vec2 screen;
+
+
+#if __VERSION__ >= 130
+out vec4 FragColor;
+#else
+#define FragColor gl_FragColor
+#endif
+
+
+void main(void)
+{
+ vec3 eyedir = gl_FragCoord.xyz / vec3(screen, 1.);
+ eyedir = 2.0 * eyedir - 1.0;
+ vec4 tmp = (InvProjView * vec4(eyedir, 1.));
+ eyedir = tmp.xyz / tmp.w;
+ vec4 color = texture(tex, eyedir);
+ FragColor = vec4(color.xyz, 1.);
+}
diff --git a/data/shaders/skybox.frag b/data/shaders/skybox.frag
index 1d150e975..e9425c61b 100644
--- a/data/shaders/skybox.frag
+++ b/data/shaders/skybox.frag
@@ -14,7 +14,6 @@
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#version 330 compatibility
uniform sampler2D tex;
uniform sampler2D glow_tex;
uniform float transparency;
diff --git a/data/shaders/skybox.vert b/data/shaders/skybox.vert
index 7d3097ca5..45ded6b85 100644
--- a/data/shaders/skybox.vert
+++ b/data/shaders/skybox.vert
@@ -17,7 +17,6 @@
// Creates a bubble (wave) effect by distorting the texture depending on time
-#version 330 compatibility
uniform mat4 ModelViewProjectionMatrix;
uniform float time;
diff --git a/data/shaders/splatting.frag b/data/shaders/splatting.frag
index 38a8e9631..aada653ca 100644
--- a/data/shaders/splatting.frag
+++ b/data/shaders/splatting.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D tex_layout;
uniform sampler2D tex_detail0;
uniform sampler2D tex_detail1;
@@ -10,9 +9,16 @@ uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
+#if __VERSION__ >= 130
in vec2 uv;
in vec2 uv_bis;
out vec4 FragColor;
+#else
+varying vec2 uv;
+varying vec2 uv_bis;
+#define FragColor gl_FragColor
+#endif
+
void main() {
// Splatting part
diff --git a/data/shaders/splatting.vert b/data/shaders/splatting.vert
index c1a779ef1..2e7743b19 100644
--- a/data/shaders/splatting.vert
+++ b/data/shaders/splatting.vert
@@ -15,15 +15,23 @@
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView;
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec2 SecondTexcoord;
out vec2 uv;
out vec2 uv_bis;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+attribute vec2 SecondTexcoord;
+varying vec2 uv;
+varying vec2 uv_bis;
+#endif
+
void main()
{
diff --git a/data/shaders/ssao.frag b/data/shaders/ssao.frag
index 1ae1cba7d..dacabddbc 100644
--- a/data/shaders/ssao.frag
+++ b/data/shaders/ssao.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D ntex;
uniform sampler2D dtex;
uniform sampler2D noise_texture;
@@ -6,8 +5,13 @@ uniform mat4 invprojm;
uniform mat4 projm;
uniform vec4 samplePoints[16];
+#if __VERSION__ >= 130
in vec2 uv;
-out float ao;
+out float AO;
+#else
+varying vec2 uv;
+#define AO gl_FragColor.x
+#endif
const float strengh = 4.;
const float radius = .4f;
@@ -39,7 +43,7 @@ void main(void)
vec3 norm = normalize(DecodeNormal(2. * texture(ntex, uv).xy - 1.));
// Workaround for nvidia and skyboxes
float len = dot(vec3(1.0), abs(cur.xyz));
- if (len < 0.2 || curdepth > 0.999) discard;
+ if (len < 0.2 || curdepth > 0.9955) discard;
// Make a tangent as random as possible
vec3 randvect = rand(uv);
vec3 tangent = normalize(cross(norm, randvect));
@@ -65,5 +69,5 @@ void main(void)
bl += isOccluded ? smoothstep(radius, 0, distance(samplePos, FragPos)) : 0.;
}
- ao = 1.0 - bl * invSamples;
+ AO = 1.0 - bl * invSamples;
}
diff --git a/data/shaders/sunlight.frag b/data/shaders/sunlight.frag
index 68c1049ed..fccf941d2 100644
--- a/data/shaders/sunlight.frag
+++ b/data/shaders/sunlight.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D ntex;
uniform sampler2D dtex;
//uniform sampler2D cloudtex;
@@ -9,9 +8,16 @@ uniform mat4 invproj;
//uniform int hasclouds;
//uniform vec2 wind;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 Diff;
out vec4 Spec;
+#else
+varying vec2 uv;
+#define Diff gl_FragData[0]
+#define Spec gl_FragData[1]
+#endif
+
vec3 DecodeNormal(vec2 n)
{
diff --git a/data/shaders/sunlightshadow.frag b/data/shaders/sunlightshadow.frag
index 66c617afb..69ffafd41 100644
--- a/data/shaders/sunlightshadow.frag
+++ b/data/shaders/sunlightshadow.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D ntex;
uniform sampler2D dtex;
uniform sampler2DArrayShadow shadowtex;
@@ -13,9 +12,16 @@ uniform mat4 shadowmat[4];
//uniform vec2 wind;
//uniform float shadowoffset;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 Diff;
out vec4 Spec;
+#else
+varying vec2 uv;
+#define Diff gl_FragData[0]
+#define Spec gl_FragData[1]
+#endif
+
vec3 DecodeNormal(vec2 n)
{
diff --git a/data/shaders/texturedquad.frag b/data/shaders/texturedquad.frag
index 48f7335b7..995a3c572 100644
--- a/data/shaders/texturedquad.frag
+++ b/data/shaders/texturedquad.frag
@@ -1,8 +1,13 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/texturedquad.vert b/data/shaders/texturedquad.vert
index e8a73d3b8..bc6f1b03d 100644
--- a/data/shaders/texturedquad.vert
+++ b/data/shaders/texturedquad.vert
@@ -1,12 +1,18 @@
-#version 330
uniform vec2 center;
uniform vec2 size;
uniform vec2 texcenter;
uniform vec2 texsize;
+#if __VERSION__ >= 130
in vec2 position;
in vec2 texcoord;
out vec2 uv;
+#else
+attribute vec2 position;
+attribute vec2 texcoord;
+varying vec2 uv;
+#endif
+
void main()
{
diff --git a/data/shaders/transparent.frag b/data/shaders/transparent.frag
index e5b1e7c69..4de578afd 100644
--- a/data/shaders/transparent.frag
+++ b/data/shaders/transparent.frag
@@ -1,8 +1,13 @@
-#version 330
uniform sampler2D tex;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/transparent.vert b/data/shaders/transparent.vert
index b5451f0a5..9692fc549 100644
--- a/data/shaders/transparent.vert
+++ b/data/shaders/transparent.vert
@@ -1,10 +1,16 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TextureMatrix;
+#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
out vec2 uv;
+#else
+attribute vec3 Position;
+attribute vec2 Texcoord;
+varying vec2 uv;
+#endif
+
void main()
{
diff --git a/data/shaders/transparentfog.frag b/data/shaders/transparentfog.frag
index 545587044..9e0e9ad0f 100644
--- a/data/shaders/transparentfog.frag
+++ b/data/shaders/transparentfog.frag
@@ -1,4 +1,3 @@
-#version 330
uniform sampler2D tex;
uniform float fogmax;
@@ -10,8 +9,14 @@ uniform vec3 col;
uniform mat4 ipvmat;
uniform vec2 screen;
+#if __VERSION__ >= 130
in vec2 uv;
out vec4 FragColor;
+#else
+varying vec2 uv;
+#define FragColor gl_FragColor
+#endif
+
void main()
{
diff --git a/data/shaders/untextured_object.frag b/data/shaders/untextured_object.frag
index 24f4a54be..d4e7852ee 100644
--- a/data/shaders/untextured_object.frag
+++ b/data/shaders/untextured_object.frag
@@ -1,11 +1,17 @@
-#version 330
uniform sampler2D DiffuseMap;
uniform sampler2D SpecularMap;
uniform sampler2D SSAO;
uniform vec2 screen;
uniform vec3 ambient;
+
+#if __VERSION__ >= 130
in vec4 color;
out vec4 FragColor;
+#else
+varying vec4 color;
+#define FragColor gl_FragColor
+#endif
+
void main(void)
{
diff --git a/data/shaders/untextured_object.vert b/data/shaders/untextured_object.vert
index 5f0f91cf7..36020e0db 100644
--- a/data/shaders/untextured_object.vert
+++ b/data/shaders/untextured_object.vert
@@ -1,9 +1,15 @@
-#version 330
uniform mat4 ModelViewProjectionMatrix;
+#if __VERSION__ >= 130
in vec3 Position;
in vec4 Color;
out vec4 color;
+#else
+attribute vec3 Position;
+attribute vec4 Color;
+varying vec4 color;
+#endif
+
void main(void)
{
diff --git a/data/shaders/water.frag b/data/shaders/water.frag
index 1e9d434b3..29bac3458 100644
--- a/data/shaders/water.frag
+++ b/data/shaders/water.frag
@@ -8,9 +8,9 @@ uniform sampler2D DecalTex; //The texture
uniform vec2 delta1;
uniform vec2 delta2;
-noperspective in vec3 lightVec;
-noperspective in vec3 halfVec;
-noperspective in vec3 eyeVec;
+in vec3 lightVec;
+in vec3 halfVec;
+in vec3 eyeVec;
in vec2 uv;
out vec4 FragColor;
diff --git a/data/shaders/water.vert b/data/shaders/water.vert
index 78a1fe5c5..cf44b8e8c 100644
--- a/data/shaders/water.vert
+++ b/data/shaders/water.vert
@@ -7,9 +7,9 @@ uniform float waveLength;
uniform vec3 lightdir;
-noperspective out vec3 lightVec;
-noperspective out vec3 halfVec;
-noperspective out vec3 eyeVec;
+out vec3 lightVec;
+out vec3 halfVec;
+out vec3 eyeVec;
out vec2 uv;
void main()
diff --git a/data/shaders/white.frag b/data/shaders/white.frag
index 3017ace18..d48e4e724 100644
--- a/data/shaders/white.frag
+++ b/data/shaders/white.frag
@@ -1,5 +1,10 @@
-#version 330
+#if __VERSION__ >= 130
out vec4 FragColor;
+#else
+#define FragColor gl_FragColor
+#endif
+
+
void main()
{
FragColor = vec4(1.0);
diff --git a/data/skins/Ocean.stkskin b/data/skins/Ocean.stkskin
index 7f7c90768..031c1a9b6 100644
--- a/data/skins/Ocean.stkskin
+++ b/data/skins/Ocean.stkskin
@@ -105,7 +105,6 @@ when the border that intersect at this corner are enabled.
left_border="75" right_border="75" top_border="0" bottom_border="15"
hborder_out_portion="0.2" />
-
+
+
+
+
+
+
+
+
+
+
+
+
-
+ lbound-fraction is the lower bound fraction of speed when lost will
+ detach parachute. E.g. at nearly 0 speed, only 5% of speed
+ need to be lost.
+ ubound-fraction is the upper bound fraction of speed when lost will
+ detach parachute. E.g. at max-speed 30% of speed must be lost.
+ max-speed is a factor that decides the impact of rate of speed
+ (distance between bounds) -->
+
diff --git a/lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h b/lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h
index 822f114c6..757d416ee 100644
--- a/lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h
+++ b/lib/irrlicht/source/Irrlicht/COpenGLExtensionHandler.h
@@ -49,6 +49,7 @@
#define NO_SDL_GLEXT
#include
#include
+ typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
#include "glext.h"
#else
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
@@ -61,6 +62,7 @@
#include
#include
#if defined(_IRR_OPENGL_USE_EXTPOINTER_)
+ typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
#include
#undef GLX_ARB_get_proc_address // avoid problems with local glxext.h
#include
diff --git a/sources.cmake b/sources.cmake
index 7df0ad319..0a4f6f0ec 100644
--- a/sources.cmake
+++ b/sources.cmake
@@ -194,7 +194,7 @@ src/network/types.cpp
src/online/current_user.cpp
src/online/http_request.cpp
src/online/messages.cpp
-src/online/profile.cpp
+src/online/online_profile.cpp
src/online/profile_manager.cpp
src/online/request.cpp
src/online/request_manager.cpp
@@ -527,7 +527,7 @@ src/network/types.hpp
src/online/current_user.hpp
src/online/http_request.hpp
src/online/messages.hpp
-src/online/profile.hpp
+src/online/online_profile.hpp
src/online/profile_manager.hpp
src/online/request.hpp
src/online/request_manager.hpp
diff --git a/src/achievements/achievement.cpp b/src/achievements/achievement.cpp
index 0804ac1f7..8e07dd60b 100644
--- a/src/achievements/achievement.cpp
+++ b/src/achievements/achievement.cpp
@@ -1,6 +1,7 @@
//
// SuperTuxKart - a fun racing game with go-kart
-// Copyright (C) 2013 Glenn De Jonghe
+// Copyright (C) 2013-2014 Glenn De Jonghe
+// 2014 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -26,17 +27,15 @@
#include "utils/log.hpp"
#include "utils/translation.hpp"
-
-#include
-#include
-#include
#include
-
+/** Constructur, initialises this object with the data from the
+ * corresponding AchievementInfo.
+ */
Achievement::Achievement(const AchievementInfo * info)
- :m_achievement_info(info)
+ : m_achievement_info(info)
{
- m_id = info->getID();
+ m_id = info->getID();
m_achieved = false;
} // Achievement
@@ -52,6 +51,15 @@ void Achievement::load(const XMLNode *node)
{
node->get("id", &m_id );
node->get("achieved", &m_achieved);
+
+ for (unsigned int i = 0; i < node->getNumNodes(); i++)
+ {
+ const XMLNode *n = node->getNode(i);
+ std::string key = n->getName();
+ int value = 0;
+ n->get("value", &value);
+ m_progress_map[key] = value;
+ }
} // load
// ----------------------------------------------------------------------------
@@ -62,16 +70,118 @@ void Achievement::save(UTFWriter &out)
{
out << L" \n";
+ return;
+ }
+
+ out << ">\n";
+ std::map::iterator i;
+ for (i = m_progress_map.begin(); i != m_progress_map.end(); ++i)
+ {
+ out << " <" << i->first
+ << " value=\"" << i->second << "\"/>\n";
+ }
+ out << " \n";
} // save
// ----------------------------------------------------------------------------
+/** Returns the value for a key.
+ */
+int Achievement::getValue(const std::string & key)
+{
+ if (m_progress_map.find(key) != m_progress_map.end())
+ return m_progress_map[key];
+ return 0;
+}
+// ----------------------------------------------------------------------------
+/** Resets all currently key values to 0. Called if the reset-after-race flag
+ * is set for the corresponding AchievementInfo.
+ */
+void Achievement::reset()
+{
+ std::map::iterator iter;
+ for (iter = m_progress_map.begin(); iter != m_progress_map.end(); ++iter)
+ {
+ iter->second = 0;
+ }
+} // reset
+
+// ----------------------------------------------------------------------------
+/** Returns how much of an achievement has been achieved in the form n/m.
+ * The AchievementInfo adds up all goal values to get 'm', and this
+ * this class end up all current key values for 'n'.
+ */
+irr::core::stringw Achievement::getProgressAsString() const
+{
+ int progress = 0;
+ std::map::const_iterator iter;
+
+ // For now return N/N in case of an achieved achievement.
+ if (m_achieved)
+ return getInfo()->toString() +"/" + getInfo()->toString();
+
+ switch (m_achievement_info->getCheckType())
+ {
+ case AchievementInfo::AC_ALL_AT_LEAST:
+ for (iter = m_progress_map.begin(); iter != m_progress_map.end(); ++iter)
+ {
+ progress += iter->second;
+ }
+ break;
+ case AchievementInfo::AC_ONE_AT_LEAST:
+ for (iter = m_progress_map.begin(); iter != m_progress_map.end(); ++iter)
+ {
+ if(iter->second>progress) progress = iter->second;
+ }
+ break;
+ default:
+ Log::fatal("Achievement", "Missing getProgressAsString for type %d.",
+ m_achievement_info->getCheckType());
+ }
+ return StringUtils::toWString(progress) + "/" + getInfo()->toString();
+} // getProgressAsString
+
+// ----------------------------------------------------------------------------
+/** Increases the value of a key by a specified amount, but make sure to not
+ * increase the value above the goal (otherwise the achievement progress
+ * could be 12/10 (e.g. if one track is used 12 times for the Christoffel
+ * achievement), even though the achievement is not achieved.
+ * \param key The key whose value is increased.
+ * \param increase Amount to add to the value of this key.
+ */
+void Achievement::increase(const std::string & key, int increase)
+{
+ std::map::iterator it;
+ it = m_progress_map.find(key);
+ if (it != m_progress_map.end())
+ {
+ it->second += increase;
+ if (it->second > m_achievement_info->getGoalValue(key))
+ it->second = m_achievement_info->getGoalValue(key);
+ }
+ else
+ {
+ if (increase>m_achievement_info->getGoalValue(key))
+ increase = m_achievement_info->getGoalValue(key);
+ m_progress_map[key] = increase;
+ }
+ check();
+} // increase
+
+// ----------------------------------------------------------------------------
+/** Called at the end of a race to potentially reset values.
+ */
void Achievement::onRaceEnd()
{
if(m_achievement_info->needsResetAfterRace())
- this->reset();
-}
+ reset();
+} // onRaceEnd
// ----------------------------------------------------------------------------
+/** Checks if this achievement has been achieved.
+ */
void Achievement::check()
{
if(m_achieved)
@@ -80,169 +190,14 @@ void Achievement::check()
if(m_achievement_info->checkCompletion(this))
{
//show achievement
+ core::stringw s = StringUtils::insertValues(_("Completed achievement \"%s\"."),
+ m_achievement_info->getTitle());
GUIEngine::DialogQueue::get()->pushDialog(
- new NotificationDialog(NotificationDialog::T_Achievements,
- irr::core::stringw(_("Completed achievement")) + irr::core::stringw(" \"") + m_achievement_info->getTitle() + irr::core::stringw("\".")
- ));
+ new NotificationDialog(NotificationDialog::T_Achievements, s));
+
//send to server
Online::CurrentUser::get()->onAchieving(m_id);
m_achieved = true;
}
-}
-
-// ----------------------------------------------------------------------------
-/** Constructor for a SingleAchievement.
- */
-SingleAchievement::SingleAchievement(const AchievementInfo * info)
- : Achievement(info)
-{
- m_progress = 0;
- m_achieved = false;
-} // SingleAchievement
-
-// ----------------------------------------------------------------------------
-/** Loads the state from an xml node.
- * \param node The XML data.
- */
-void SingleAchievement::load(const XMLNode *node)
-{
- Achievement::load(node);
- if (!isAchieved())
- node->get("progress", &m_progress);
-} // load
-
-// ----------------------------------------------------------------------------
-/** Save the state to a file. The progress is only saved if the achievement
- * has not been achieved yet.
- * \param out The output file.
- */
-void SingleAchievement::save(UTFWriter &out)
-{
- Achievement::save(out);
- if (!m_achieved)
- {
- out << L" progress=\"" << m_progress << L"\"";
- }
- out << L"/>\n";
-} // save
-
-// ----------------------------------------------------------------------------
-/** Resets the challenge. Calls if necessary (i.e. if a challenge needs to
- * be fulfilled in a single race).
- */
-void SingleAchievement::reset()
-{
- m_progress = 0;
-} // reset
-
-// ----------------------------------------------------------------------------
-/** Adds a value to this counter.
- * \param increase Value to add.
- */
-void SingleAchievement::increase(int increase)
-{
- m_progress += increase;
- check();
-} // increase
-
-// ----------------------------------------------------------------------------
-/** Returns a "k/n" string indicating how much of an achievement was achieved.
- */
-irr::core::stringw SingleAchievement::getProgressAsString()
-{
- // The info class returns the goal value
- return StringUtils::toWString(m_progress) + "/"
- +getInfo()->toString();
-} // getProgressAsString
-
-// ============================================================================
-
-/** Constructor for a MapAchievement.
- */
-MapAchievement::MapAchievement(const AchievementInfo * info)
- : Achievement(info)
-{
-} // MapAchievement
-
-// ----------------------------------------------------------------------------
-/** Loads the status from an XML node.
- * \param node The XML data to load the status from.
- */
-void MapAchievement::load(const XMLNode *node)
-{
- Achievement::load(node);
- for (unsigned int i = 0; i < node->getNumNodes(); i++)
- {
- const XMLNode *n = node->getNode(i);
- std::string key = n->getName();
- int value = 0;
- n->get("value", &value);
- m_progress_map[key] = value;
- }
-} // load
-
-// ----------------------------------------------------------------------------
-/** Saves the status of this achievement to a file.
- * \param out The file to write the state to.
- */
-void MapAchievement::save(UTFWriter &out)
-{
- Achievement::save(out);
- if (isAchieved())
- {
- out << "/>\n";
- return;
- }
- out << ">\n";
- std::map::iterator i;
- for (i = m_progress_map.begin(); i != m_progress_map.end(); ++i)
- {
- out << " <" << i->first
- << " value=\"" << i->second << "\"/>\n";
- }
- out << " \n";
-} // save
-
-// ----------------------------------------------------------------------------
-
-int MapAchievement::getValue(const std::string & key)
-{
- if ( m_progress_map.find(key) != m_progress_map.end())
- return m_progress_map[key];
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-void MapAchievement::reset()
-{
- std::map::iterator iter;
- for ( iter = m_progress_map.begin(); iter != m_progress_map.end(); ++iter )
- {
- iter->second = 0;
- }
-} // reset
-
-// ----------------------------------------------------------------------------
-void MapAchievement::increase(const std::string & key, int increase)
-{
- if (m_progress_map.find(key) != m_progress_map.end())
- {
- m_progress_map[key] += increase;
- check();
- }
- else
- m_progress_map[key] = increase;
-}
-
-// ----------------------------------------------------------------------------
-irr::core::stringw MapAchievement::getProgressAsString()
-{
- int progress = 0;
- std::map::const_iterator iter;
- for ( iter = m_progress_map.begin(); iter != m_progress_map.end(); ++iter)
- {
- progress += iter->second;
- }
- return StringUtils::toWString(progress) + "/" + getInfo()->toString();
-}
+} // check
diff --git a/src/achievements/achievement.hpp b/src/achievements/achievement.hpp
index bca93442d..ec3790aad 100644
--- a/src/achievements/achievement.hpp
+++ b/src/achievements/achievement.hpp
@@ -30,40 +30,45 @@ class UTFWriter;
class XMLNode;
// ============================================================================
-
/** This is the base class for any achievement. It allows achievement status
- * to be saved, and detects when an achievement is fulfilled.
+ * to be saved, and detects when an achievement is fulfilled. It provides
+ * storage for state information by a generic key-value mapping. The values
+ * are stored as strings, but can be used to store numerical values. E.g.
+ * you can call increase("key", 10) for an achievement, which will convert
+ * the string to int, add 10, then convert the result back to string for
+ * storage.
* \ingroup achievements
*/
class AchievementInfo;
class Achievement
{
-protected:
+private:
/** The id of this achievement. */
uint32_t m_id;
/** True if this achievement has been achieved. */
bool m_achieved;
+ /** The map of key-value pairs. */
+ std::map m_progress_map;
+
/** A pointer to the corresponding AchievementInfo instance. */
const AchievementInfo *m_achievement_info;
void check();
public:
- enum AchievementType
- {
- AT_SINGLE,
- AT_MAP
- };
- Achievement(const AchievementInfo * info);
- virtual ~Achievement ();
- virtual void load (const XMLNode *node) ;
- virtual void save (UTFWriter &out) ;
- virtual void reset () = 0;
- virtual irr::core::stringw getProgressAsString() = 0;
+ Achievement(const AchievementInfo * info);
+ virtual ~Achievement();
+ virtual void load(const XMLNode *node);
+ virtual void save(UTFWriter &out);
+ virtual int getValue(const std::string & key);
+ void increase(const std::string & key, int increase = 1);
+
+ virtual void reset();
+ virtual irr::core::stringw getProgressAsString() const;
void onRaceEnd();
// ------------------------------------------------------------------------
/** Returns the id of this achievement. */
@@ -77,56 +82,10 @@ public:
// ------------------------------------------------------------------------
/** Returns if this achievement has been fulfilled. */
bool isAchieved() const { return m_achieved; }
-
+ // ------------------------------------------------------------------------
+ const std::map& getProgress() const
+ {
+ return m_progress_map;
+ } // getProgress
}; // class Achievement
-
-// ============================================================================
-/** This is a base class for an achievement that counts how often an event
- * happened, and triggers the achievement to be fulfilled when a certain
- * goal value is reached.
- * \ingroup achievements
- */
-class SingleAchievement : public Achievement
-{
-protected:
- int m_progress;
-
-public:
- SingleAchievement (const AchievementInfo * info);
- virtual ~SingleAchievement () {};
-
- void load (const XMLNode *node);
- int getValue () const { return m_progress; }
- void save (UTFWriter &out);
- void increase (int increase = 1);
- void reset ();
- virtual irr::core::stringw getProgressAsString ();
-}; // class SingleAchievement
-
-// ============================================================================
-/** This achievement can keep track of a set of key-value pairs. Fulfillment is
- * triggered when all values defined in the data/achievements.xml file have
- * been reached.
-* \ingroup achievements
-*/
-class MapAchievement : public Achievement
-{
-protected:
- /** The map of key-value pairs. */
- std::map m_progress_map;
-
-public:
- MapAchievement (const AchievementInfo * info);
- virtual ~MapAchievement () {};
-
- void load (const XMLNode *node);
- int getValue (const std::string & key);
- void increase (const std::string & key, int increase = 1);
- void save (UTFWriter &out);
- void reset ();
- virtual irr::core::stringw getProgressAsString ();
-}; // class MapAchievement
-
-#endif
-
-/*EOF*/
+#endif
\ No newline at end of file
diff --git a/src/achievements/achievement_info.cpp b/src/achievements/achievement_info.cpp
index eb09700ee..98602cd32 100644
--- a/src/achievements/achievement_info.cpp
+++ b/src/achievements/achievement_info.cpp
@@ -1,6 +1,7 @@
//
// SuperTuxKart - a fun racing game with go-kart
-// Copyright (C) 2013 Glenn De Jonghe
+// Copyright (C) 2013-2014 Glenn De Jonghe
+// 2014 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -25,7 +26,9 @@
#include
#include
-
+/** The constructor reads the dat from the xml information.
+ * \param input XML node for this achievement info.
+ */
AchievementInfo::AchievementInfo(const XMLNode * input)
{
m_reset_after_race = false;
@@ -45,68 +48,110 @@ AchievementInfo::AchievementInfo(const XMLNode * input)
m_description.c_str());
}
input->get("reset-after-race", &m_reset_after_race);
-} // AchievementInfo
-// ============================================================================
-SingleAchievementInfo::SingleAchievementInfo(const XMLNode * input)
- : AchievementInfo(input)
-{
- input->get("goal", &m_goal_value);
-} // SingleAchievementInfo
+ m_check_type = AC_ALL_AT_LEAST;
+ std::string s;
+ input->get("check-type", &s);
+ if (s == "all-at-least")
+ m_check_type = AC_ALL_AT_LEAST;
+ else if (s == "one-at-least")
+ m_check_type = AC_ONE_AT_LEAST;
+ else
+ Log::warn("AchievementInfo", "Achievement check type '%s' unknown.",
+ s.c_str());
-// ----------------------------------------------------------------------------
-irr::core::stringw SingleAchievementInfo::toString() const
-{
- return StringUtils::toWString(m_goal_value);
-} // toString
-
-// ----------------------------------------------------------------------------
-bool SingleAchievementInfo::checkCompletion(Achievement * achievement) const
-{
- SingleAchievement * single_achievement = (SingleAchievement *) achievement;
- if(single_achievement->getValue() >= m_goal_value)
- return true;
- return false;
-}
-
-// ============================================================================
-MapAchievementInfo::MapAchievementInfo(const XMLNode * input)
- : AchievementInfo(input)
-{
- std::vector xml_entries;
- input->getNodes("entry", xml_entries);
- for (unsigned int n=0; n < xml_entries.size(); n++)
+ // Now load the goal nodes
+ for (unsigned int n = 0; n < input->getNumNodes(); n++)
{
- std::string key("");
- xml_entries[n]->get("key", &key);
- int goal(0);
- xml_entries[n]->get("goal", &goal);
+ const XMLNode *node = input->getNode(n);
+ std::string key = node->getName();
+ int goal = 0;
+ node->get("goal", &goal);
m_goal_values[key] = goal;
}
- if(m_goal_values.size() != xml_entries.size())
- Log::error("MapAchievementInfo","Duplicate keys for the entries of a MapAchievement found.");
-}
+ if (m_goal_values.size() != input->getNumNodes())
+ Log::fatal("AchievementInfo",
+ "Duplicate keys for the entries of a MapAchievement found.");
+
+ if (m_check_type == AC_ONE_AT_LEAST)
+ {
+ if (m_goal_values.size() != 1)
+ Log::fatal("AchievementInfo",
+ "A one-at-least achievement must have exactly one goal.");
+ }
+} // AchievementInfo
+
// ----------------------------------------------------------------------------
-irr::core::stringw MapAchievementInfo::toString() const
+/** Returns a string with a numerical value to display the progress of
+ * this achievement. It adds up all the goal values
+ */
+irr::core::stringw AchievementInfo::toString() const
{
int count = 0;
std::map::const_iterator iter;
- for (iter = m_goal_values.begin(); iter != m_goal_values.end(); iter++)
+ switch (m_check_type)
{
- count += iter->second;
+ case AC_ALL_AT_LEAST:
+ // If all values need to be reached, add up all goal values
+ for (iter = m_goal_values.begin(); iter != m_goal_values.end(); iter++)
+ {
+ count += iter->second;
+ }
+ break;
+ case AC_ONE_AT_LEAST:
+ // Only one goal is defined for a one-at-least
+ count = m_goal_values.begin()->second;
+ break;
+ default:
+ Log::fatal("AchievementInfo", "Missing toString for tpye %d.",
+ m_check_type);
}
return StringUtils::toWString(count);
+
} // toString
// ----------------------------------------------------------------------------
-bool MapAchievementInfo::checkCompletion(Achievement * achievement) const
+bool AchievementInfo::checkCompletion(Achievement * achievement) const
{
- MapAchievement * map_achievement = (MapAchievement *) achievement;
std::map::const_iterator iter;
- for ( iter = m_goal_values.begin(); iter != m_goal_values.end(); iter++ )
+
+ switch (m_check_type)
{
- if(map_achievement->getValue(iter->first) < iter->second)
- return false;
+ case AC_ALL_AT_LEAST:
+ for (iter = m_goal_values.begin(); iter != m_goal_values.end(); iter++)
+ {
+ if (achievement->getValue(iter->first) < iter->second)
+ return false;
+ }
+ return true;
+ case AC_ONE_AT_LEAST:
+ {
+ // Test all progress values the kart has.
+ const std::map &progress = achievement->getProgress();
+ for (iter = progress.begin(); iter != progress.end(); iter++)
+ {
+ // A one-at-least achievement has only one goal, so use it
+ if (iter->second >= m_goal_values.begin()->second)
+ return true;
+ }
+ return false;
}
- return true;
+ default:
+ Log::fatal("AchievementInfo", "Missing check for tpye %d.",
+ m_check_type);
+ } // switch
+
+ // Avoid compiler warning
+ return false;
}
+// ----------------------------------------------------------------------------
+int AchievementInfo::getGoalValue(const std::string &key) const
+{
+ std::map::const_iterator it;
+ it = m_goal_values.find(key);
+ if (it != m_goal_values.end())
+ return it->second;
+ else
+ return 0;
+} // getGoalValue
+// ----------------------------------------------------------------------------
diff --git a/src/achievements/achievement_info.hpp b/src/achievements/achievement_info.hpp
index 78ae538d9..6b8bab458 100644
--- a/src/achievements/achievement_info.hpp
+++ b/src/achievements/achievement_info.hpp
@@ -1,6 +1,8 @@
//
// SuperTuxKart - a fun racing game with go-kart
-// Copyright (C) 2013 Glenn De Jonghe
+// Copyright (C) 2013-2014 Glenn De Jonghe
+// 2014 Joerg Henrichs
+
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -38,7 +40,26 @@ class Achievement;
*/
class AchievementInfo
{
-protected:
+public:
+ /** Some handy names for the various achievements. */
+ enum { ACHIEVE_COLUMBUS = 1,
+ ACHIEVE_FIRST = ACHIEVE_COLUMBUS,
+ ACHIEVE_STRIKE = 2,
+ ACHIEVE_ARCH_ENEMY = 3,
+ ACHIEVE_MARATHONER = 4,
+ ACHIEVE_LAST = ACHIEVE_MARATHONER
+ };
+ /** Achievement check type:
+ * ALL_AT_LEAST: All goal values must be reached (or exceeded).
+ * ONE_AT_LEAST: At least one current value reaches or exceedes the goal.
+ */
+ enum AchievementCheckType
+ {
+ AC_ALL_AT_LEAST,
+ AC_ONE_AT_LEAST
+ };
+
+private:
/** The id of this Achievement. */
uint32_t m_id;
@@ -48,15 +69,22 @@ protected:
/** The description of this achievement. */
irr::core::stringw m_description;
+ /** Determines how this achievement is checked if it is successful. */
+ AchievementCheckType m_check_type;
+
+ /** The target values needed to be reached. */
+ std::map m_goal_values;
+
/** True if the achievement needs to be reset after each race. */
bool m_reset_after_race;
public:
- AchievementInfo (const XMLNode * input);
- virtual ~AchievementInfo () {};
- virtual Achievement::AchievementType getType() const = 0;
- virtual irr::core::stringw toString() const = 0;
- virtual bool checkCompletion(Achievement * achievement) const = 0;
+ AchievementInfo(const XMLNode * input);
+ virtual ~AchievementInfo() {};
+
+ virtual irr::core::stringw toString() const;
+ virtual bool checkCompletion(Achievement * achievement) const;
+ int getGoalValue(const std::string &key) const;
// ------------------------------------------------------------------------
/** Returns the id of this achievement. */
@@ -69,64 +97,13 @@ public:
irr::core::stringw getTitle() const { return m_title; }
// ------------------------------------------------------------------------
bool needsResetAfterRace() const { return m_reset_after_race; }
+ // ------------------------------------------------------------------------
+ /** Returns the check type for this achievement. */
+ AchievementCheckType getCheckType() const { return m_check_type; }
+ // ------------------------------------------------------------------------
}; // class AchievementInfo
-// ============================================================================
-/** This class stores the information about an achievement that count a
- * single value.
- */
-class SingleAchievementInfo : public AchievementInfo
-{
-private:
- /** Which value must be reached in order to achieve this achievement. */
- int m_goal_value;
-
-public:
- SingleAchievementInfo(const XMLNode * input);
- virtual ~SingleAchievementInfo() {};
- virtual irr::core::stringw toString() const;
- virtual bool checkCompletion(Achievement * achievement) const;
- // ------------------------------------------------------------------------
- int getGoalValue() const { return m_goal_value; }
- // ------------------------------------------------------------------------
- virtual Achievement::AchievementType getType() const
- {
- return Achievement::AT_SINGLE;
- } // getType
-}; // class SingleAchievementInfo
-
-
-// ============================================================================
-/** This class stores a set of key-value pairs.
- */
-class MapAchievementInfo : public AchievementInfo
-{
-protected:
-
- /** The target values needed to be reached. */
- std::map m_goal_values;
-
-public:
- MapAchievementInfo(const XMLNode * input);
- virtual ~MapAchievementInfo() {};
- virtual bool checkCompletion(Achievement * achievement) const;
- virtual irr::core::stringw toString() const;
- // ------------------------------------------------------------------------
- int getGoalValue(const std::string & key) { return m_goal_values[key]; }
- // ------------------------------------------------------------------------
- const std::map & getGoalValues() const
- {
- return m_goal_values;
- } // getGoalValues
- // ------------------------------------------------------------------------
- virtual Achievement::AchievementType getType() const
- {
- return Achievement::AT_MAP;
- } // getType
-
-}; // class MapAchievementInfo
-
#endif
/*EOF*/
diff --git a/src/achievements/achievements_manager.cpp b/src/achievements/achievements_manager.cpp
index c26b163d7..e13af174e 100644
--- a/src/achievements/achievements_manager.cpp
+++ b/src/achievements/achievements_manager.cpp
@@ -1,6 +1,7 @@
//
// SuperTuxKart - a fun racing game with go-kart
-// Copyright (C) 2013 Glenn De Jonghe
+// Copyright (C) 2013-2014 Glenn De Jonghe
+// 2014 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -35,11 +36,27 @@
AchievementsManager* AchievementsManager::m_achievements_manager = NULL;
// ----------------------------------------------------------------------------
-/** Constructor, which reads data/achievements.xml.
+/** Constructor, which reads data/achievements.xml and stores the information
+ * in AchievementInfo objects.
*/
AchievementsManager::AchievementsManager()
{
- parseAssetFile();
+ const std::string file_name = file_manager->getAsset("achievements.xml");
+ const XMLNode *root = file_manager->createXMLTree(file_name);
+ unsigned int num_nodes = root->getNumNodes();
+ for (unsigned int i = 0; i < num_nodes; i++)
+ {
+ const XMLNode *node = root->getNode(i);
+ std::string type("");
+ node->get("type", &type);
+ AchievementInfo * achievement_info = new AchievementInfo(node);
+ m_achievements_info[achievement_info->getID()] = achievement_info;
+ }
+ if (num_nodes != m_achievements_info.size())
+ Log::error("AchievementsManager",
+ "Multiple achievements with the same id!");
+
+ delete root;
} // AchievementsManager
// ----------------------------------------------------------------------------
@@ -52,46 +69,6 @@ AchievementsManager::~AchievementsManager()
m_achievements_info.clear();
} // ~AchievementsManager
-// ----------------------------------------------------------------------------
-/** Parses the data/achievements.xml file and stores the information about
- * all achievements in its internal map.
- */
-void AchievementsManager::parseAssetFile()
-{
- const std::string file_name = file_manager->getAsset("achievements.xml");
- const XMLNode *root = file_manager->createXMLTree(file_name);
- unsigned int num_nodes = root->getNumNodes();
- for(unsigned int i = 0; i < num_nodes; i++)
- {
- const XMLNode *node = root->getNode(i);
- std::string type("");
- node->get("type", &type);
- AchievementInfo * achievement_info;
- if(type == "single")
- {
- achievement_info = new SingleAchievementInfo(node);
- }
- else if(type == "map")
- {
- achievement_info = new MapAchievementInfo(node);
- }
- else
- {
- Log::error("AchievementsManager",
- "Non-existent achievement type '%s'. Skipping - "
- "definitely results in unwanted behaviour.",
- type.c_str());
- continue;
- }
- m_achievements_info[achievement_info->getID()] = achievement_info;
- }
- if(num_nodes != m_achievements_info.size())
- Log::error("AchievementsManager::parseAchievements",
- "Multiple achievements with the same id!");
-
- delete root;
-} // parseAssetFile
-
// ----------------------------------------------------------------------------
/** Create a new AchievementStatus object that stores all achievement status
* information for a single player.
@@ -107,16 +84,8 @@ AchievementsStatus*
for (it = m_achievements_info.begin();
it != m_achievements_info.end(); ++it)
{
- Achievement::AchievementType achievement_type = it->second->getType();
Achievement * achievement;
- if (achievement_type == Achievement::AT_SINGLE)
- {
- achievement = new SingleAchievement(it->second);
- }
- else if (achievement_type == Achievement::AT_MAP)
- {
- achievement = new MapAchievement(it->second);
- }
+ achievement = new Achievement(it->second);
status->add(achievement);
}
diff --git a/src/achievements/achievements_manager.hpp b/src/achievements/achievements_manager.hpp
index ba024d611..67cebf888 100644
--- a/src/achievements/achievements_manager.hpp
+++ b/src/achievements/achievements_manager.hpp
@@ -31,8 +31,9 @@ class AchievementsStatus;
#include