Merge branch 'master' into NewRTTMinimap

This commit is contained in:
Marianne Gagnon 2014-06-26 20:23:02 -04:00
commit 394fb9be9b
47 changed files with 684 additions and 485 deletions

View File

@ -1,5 +1,8 @@
##TODO ##TODO
THIS IS A 2nd TEST.
THIS IS A TEST.
SuperTuxKart is looking for additional man power to make this SuperTuxKart is looking for additional man power to make this
one of the best free linux games out there :) We need (in one of the best free linux games out there :) We need (in
no particular order): no particular order):

View File

@ -1,20 +1,25 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html // From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform layout(size1x16) restrict readonly image2D source; uniform layout(size1x16) restrict readonly image2D source;
uniform layout(size1x32) restrict readonly image2D depth;
uniform layout(size1x16) volatile restrict writeonly image2D dest; uniform layout(size1x16) volatile restrict writeonly image2D dest;
uniform float sigma = 5.; uniform float sigma = 5.;
layout (local_size_x = 8, local_size_y = 8) in; layout (local_size_x = 8, local_size_y = 8) in;
shared float local_src[8 + 2 * 8][8]; shared float local_src[8 + 2 * 8][8];
shared float local_depth[8 + 2 * 8][8];
void main() void main()
{ {
int x = int(gl_LocalInvocationID.x), y = int(gl_LocalInvocationID.y); int x = int(gl_LocalInvocationID.x), y = int(gl_LocalInvocationID.y);
ivec2 uv = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y); ivec2 uv = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
local_src[x][y] = imageLoad(source, ivec2(uv) - ivec2(8, 0)).x; local_src[x][y] = imageLoad(source, ivec2(uv) - ivec2(8, 0)).x;
local_depth[x][y] = imageLoad(depth, ivec2(uv) - ivec2(8, 0)).x;
local_src[x + 8][y] = imageLoad(source, ivec2(uv)).x; local_src[x + 8][y] = imageLoad(source, ivec2(uv)).x;
local_depth[x + 8][y] = imageLoad(depth, ivec2(uv)).x;
local_src[x + 16][y] = imageLoad(source, ivec2(uv) + ivec2(8, 0)).x; local_src[x + 16][y] = imageLoad(source, ivec2(uv) + ivec2(8, 0)).x;
local_depth[x + 16][y] = imageLoad(depth, ivec2(uv) + ivec2(8, 0)).x;
barrier(); barrier();
@ -23,14 +28,20 @@ void main()
g1 = exp(-0.5 / (sigma * sigma)); g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1; g2 = g1 * g1;
float sum = local_src[x + 8][y] * g0; float sum = local_src[x + 8][y] * g0;
float pixel_depth = local_depth[x + 8][y];
g0 *= g1; g0 *= g1;
g1 *= g2; g1 *= g2;
float tmp_weight, total_weight = g0;
for (int j = 1; j < 8; j++) { for (int j = 1; j < 8; j++) {
sum += local_src[8 + x - j][y] * g0; tmp_weight = max(0.0, 1.0 - .001 * abs(local_depth[8 + x - j][y] - pixel_depth));
sum += local_src[8 + x + j][y] * g0; total_weight += g0 * tmp_weight;
sum += local_src[8 + x - j][y] * g0 * tmp_weight;
tmp_weight = max(0.0, 1.0 - .001 * abs(local_depth[8 + x + j][y] - pixel_depth));
total_weight += g0 * tmp_weight;
sum += local_src[8 + x + j][y] * g0 * tmp_weight;
g0 *= g1; g0 *= g1;
g1 *= g2; g1 *= g2;
} }
imageStore(dest, ivec2(uv), vec4(sum)); imageStore(dest, ivec2(uv), vec4(sum / total_weight));
} }

View File

@ -0,0 +1,37 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform sampler2D tex;
uniform sampler2D depth;
uniform vec2 pixel;
uniform float sigma = 5.;
out vec4 FragColor;
void main()
{
vec2 uv = gl_FragCoord.xy * pixel;
float X = uv.x;
float Y = uv.y;
float g0, g1, g2;
g0 = 1.0 / (sqrt(2.0 * 3.14) * sigma);
g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1;
vec4 sum = texture(tex, vec2(X, Y)) * g0;
float pixel_depth = texture(depth, vec2(X, Y)).x;
g0 *= g1;
g1 *= g2;
float tmp_weight, total_weight = g0;
for (int i = 1; i < 9; i++) {
tmp_weight = max(0.0, 1.0 - .001 * abs(texture(depth, vec2(X - i * pixel.x, Y)).x - pixel_depth));
sum += texture(tex, vec2(X - i * pixel.x, Y)) * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
tmp_weight = max(0.0, 1.0 - .001 * abs(texture(depth, vec2(X + i * pixel.x, Y)).x - pixel_depth));
sum += texture(tex, vec2(X + i * pixel.x, Y)) * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
g0 *= g1;
g1 *= g2;
}
FragColor = sum / total_weight;
}

View File

@ -1,20 +1,25 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html // From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform layout(size1x16) restrict readonly image2D source; uniform layout(size1x16) restrict readonly image2D source;
uniform layout(size1x32) restrict readonly image2D depth;
uniform layout(size1x16) volatile restrict writeonly image2D dest; uniform layout(size1x16) volatile restrict writeonly image2D dest;
uniform float sigma = 5.; uniform float sigma = 5.;
layout (local_size_x = 8, local_size_y = 8) in; layout (local_size_x = 8, local_size_y = 8) in;
shared float local_src[8][8 + 2 * 8]; shared float local_src[8][8 + 2 * 8];
shared float local_depth[8][8 + 2 * 8];
void main() void main()
{ {
int x = int(gl_LocalInvocationID.x), y = int(gl_LocalInvocationID.y); int x = int(gl_LocalInvocationID.x), y = int(gl_LocalInvocationID.y);
ivec2 uv = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y); ivec2 uv = ivec2(gl_GlobalInvocationID.x, gl_GlobalInvocationID.y);
local_src[x][y] = imageLoad(source, ivec2(uv) - ivec2(0, 8)).x; local_src[x][y] = imageLoad(source, ivec2(uv) - ivec2(0, 8)).x;
local_depth[x][y] = imageLoad(depth, ivec2(uv) - ivec2(0, 8)).x;
local_src[x][y + 8] = imageLoad(source, ivec2(uv)).x; local_src[x][y + 8] = imageLoad(source, ivec2(uv)).x;
local_depth[x][y + 8] = imageLoad(depth, ivec2(uv)).x;
local_src[x][y + 16] = imageLoad(source, ivec2(uv) + ivec2(0, 8)).x; local_src[x][y + 16] = imageLoad(source, ivec2(uv) + ivec2(0, 8)).x;
local_depth[x][y + 16] = imageLoad(depth, ivec2(uv) + ivec2(0, 8)).x;
barrier(); barrier();
@ -23,14 +28,21 @@ void main()
g1 = exp(-0.5 / (sigma * sigma)); g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1; g2 = g1 * g1;
float sum = local_src[x][y + 8] * g0; float sum = local_src[x][y + 8] * g0;
float pixel_depth = local_depth[x][y + 8];
g0 *= g1; g0 *= g1;
g1 *= g2; g1 *= g2;
float tmp_weight, total_weight = g0;
for (int j = 1; j < 8; j++) { for (int j = 1; j < 8; j++) {
sum += local_src[x][y + 8 + j] * g0; tmp_weight = max(0.0, 1.0 - .001 * abs(local_depth[x][y + 8 + j] - pixel_depth));
sum += local_src[x][y + 8 - j] * g0; sum += local_src[x][y + 8 + j] * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
tmp_weight = max(0.0, 1.0 - .001 * abs(local_depth[x][y + 8 - j] - pixel_depth));
sum += local_src[x][y + 8 - j] * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
g0 *= g1; g0 *= g1;
g1 *= g2; g1 *= g2;
} }
imageStore(dest, ivec2(uv), vec4(sum)); imageStore(dest, ivec2(uv), vec4(sum / total_weight));
} }

View File

@ -0,0 +1,38 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform sampler2D tex;
uniform sampler2D depth;
uniform vec2 pixel;
uniform float sigma = 5.;
out vec4 FragColor;
void main()
{
vec2 uv = gl_FragCoord.xy * pixel;
float X = uv.x;
float Y = uv.y;
float g0, g1, g2;
g0 = 1.0 / (sqrt(2.0 * 3.14) * sigma);
g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1;
vec4 sum = texture(tex, vec2(X, Y)) * g0;
float pixel_depth = texture(depth, vec2(X, Y)).x;
g0 *= g1;
g1 *= g2;
float tmp_weight, total_weight = g0;
for (int i = 1; i < 9; i++) {
tmp_weight = max(0.0, 1.0 - .001 * abs(texture(depth, vec2(X, Y - i * pixel.y)).x - pixel_depth));
sum += texture(tex, vec2(X, Y - i * pixel.y)) * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
tmp_weight = max(0.0, 1.0 - .001 * abs(texture(depth, vec2(X, Y + i * pixel.y)).x - pixel_depth));
sum += texture(tex, vec2(X, Y + i * pixel.y)) * g0 * tmp_weight;
total_weight += g0 * tmp_weight;
g0 *= g1;
g1 *= g2;
}
FragColor = sum / total_weight;
}

View File

@ -1,27 +1,33 @@
uniform mat4 ModelViewProjectionMatrix; #ifdef UBO_DISABLED
uniform mat4 ModelViewMatrix; uniform mat4 ViewMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 InverseViewMatrix;
uniform mat4 InverseProjectionMatrix;
#else
layout (std140) uniform MatrixesData
{
mat4 ViewMatrix;
mat4 ProjectionMatrix;
mat4 InverseViewMatrix;
mat4 InverseProjectionMatrix;
mat4 ShadowViewProjMatrixes[4];
vec2 screen;
};
#endif
uniform mat4 ModelMatrix;
layout(location = 0) in vec3 Position;
layout(location = 3) in vec2 Texcoord;
layout(location = 4) in vec2 SecondTexcoord;
#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec2 SecondTexcoord;
out vec2 uv; out vec2 uv;
out vec2 uv_bis; out vec2 uv_bis;
out float camdist; 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() { void main() {
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.); gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * vec4(Position, 1.);
uv = Texcoord; uv = Texcoord;
uv_bis = SecondTexcoord; uv_bis = SecondTexcoord;
camdist = length(ModelViewMatrix * vec4(Position, 1.)); camdist = length(ViewMatrix * ModelMatrix * vec4(Position, 1.));
} }

View File

@ -1,30 +0,0 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform sampler2D tex;
uniform vec2 pixel;
uniform float sigma = 5.;
out vec4 FragColor;
void main()
{
vec2 uv = gl_FragCoord.xy * pixel;
float X = uv.x;
float Y = uv.y;
float g0, g1, g2;
g0 = 1.0 / (sqrt(2.0 * 3.14) * sigma);
g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1;
vec4 sum = texture(tex, vec2(X, Y)) * g0;
g0 *= g1;
g1 *= g2;
for (int i = 1; i < 9; i++) {
sum += texture(tex, vec2(X - i * pixel.x, Y)) * g0;
sum += texture(tex, vec2(X + i * pixel.x, Y)) * g0;
g0 *= g1;
g1 *= g2;
}
FragColor = sum;
}

View File

@ -1,31 +0,0 @@
// From http://http.developer.nvidia.com/GPUGems3/gpugems3_ch40.html
uniform sampler2D tex;
uniform vec2 pixel;
uniform float sigma = 5.;
out vec4 FragColor;
void main()
{
vec2 uv = gl_FragCoord.xy * pixel;
float X = uv.x;
float Y = uv.y;
float g0, g1, g2;
g0 = 1.0 / (sqrt(2.0 * 3.14) * sigma);
g1 = exp(-0.5 / (sigma * sigma));
g2 = g1 * g1;
vec4 sum = texture(tex, vec2(X, Y)) * g0;
g0 *= g1;
g1 *= g2;
for (int i = 1; i < 9; i++) {
sum += texture(tex, vec2(X, Y - i * pixel.y)) * g0;
sum += texture(tex, vec2(X, Y + i * pixel.y)) * g0;
g0 *= g1;
g1 *= g2;
}
FragColor = sum;
}

View File

@ -3,22 +3,14 @@ uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TransposeInverseModelView; uniform mat4 TransposeInverseModelView;
#if __VERSION__ >= 130
in vec3 Position; layout(location = 0) in vec3 Position;
in vec3 Normal; layout(location = 1) in vec3 Normal;
in vec2 Texcoord; layout(location = 2) in vec4 Color;
in vec4 Color; layout(location = 3) in vec2 Texcoord;
out vec3 nor; out vec3 nor;
out vec2 uv; 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() void main()
{ {

View File

@ -15,10 +15,10 @@ in vec3 Origin;
in vec3 Orientation; in vec3 Orientation;
in vec3 Scale; in vec3 Scale;
in vec3 Position; layout(location = 0) in vec3 Position;
in vec3 Normal; layout(location = 1) in vec3 Normal;
in vec2 Texcoord; layout(location = 2) in vec4 Color;
in vec4 Color; layout(location = 3) in vec2 Texcoord;
out vec3 nor; out vec3 nor;
out vec2 uv; out vec2 uv;

View File

@ -19,9 +19,9 @@ in vec3 Origin;
in vec3 Orientation; in vec3 Orientation;
in vec3 Scale; in vec3 Scale;
in vec3 Position; layout(location = 0) in vec3 Position;
in vec3 Normal; layout(location = 1) in vec3 Normal;
in vec2 Texcoord; layout(location = 3) in vec2 Texcoord;
out vec3 nor; out vec3 nor;
out vec2 uv; out vec2 uv;

View File

@ -11,8 +11,8 @@ in vec3 Origin;
in vec3 Orientation; in vec3 Orientation;
in vec3 Scale; in vec3 Scale;
in vec3 Position; layout(location = 0) in vec3 Position;
in vec2 Texcoord; layout(location = 3) in vec2 Texcoord;
#ifdef VSLayer #ifdef VSLayer
out vec2 uv; out vec2 uv;

View File

@ -10,24 +10,15 @@ layout (std140) uniform MatrixesData
uniform mat4 ModelMatrix; uniform mat4 ModelMatrix;
uniform mat4 InverseModelMatrix; uniform mat4 InverseModelMatrix;
#if __VERSION__ >= 130
in vec3 Position; layout(location = 0) in vec3 Position;
in vec2 Texcoord; layout(location = 3) in vec2 Texcoord;
in vec3 Tangent; layout(location = 5) in vec3 Tangent;
in vec3 Bitangent; layout(location = 6) in vec3 Bitangent;
out vec3 tangent; out vec3 tangent;
out vec3 bitangent; out vec3 bitangent;
out vec2 uv; 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() void main()
{ {

View File

@ -24,25 +24,17 @@ uniform mat4 TextureMatrix =
0., 0., 1., 0., 0., 0., 1., 0.,
0., 0., 0., 1.); 0., 0., 0., 1.);
#if __VERSION__ >= 130
in vec3 Position; layout(location = 0) in vec3 Position;
in vec2 Texcoord; layout(location = 1) in vec3 Normal;
in vec2 SecondTexcoord; layout(location = 2) in vec4 Color;
in vec3 Normal; layout(location = 3) in vec2 Texcoord;
in vec4 Color; layout(location = 4) in vec2 SecondTexcoord;
out vec3 nor; out vec3 nor;
out vec2 uv; out vec2 uv;
out vec2 uv_bis; out vec2 uv_bis;
out vec4 color; out vec4 color;
#else
attribute vec3 Position;
attribute vec3 Normal;
attribute vec2 Texcoord;
attribute vec2 SecondTexcoord;
varying vec3 nor;
varying vec2 uv;
varying vec2 uv_bis;
#endif
void main(void) void main(void)

View File

@ -9,9 +9,10 @@ uniform mat4 TextureMatrix =
0., 0., 0., 1.); 0., 0., 0., 1.);
in vec3 Position; layout(location = 0) in vec3 Position;
in vec2 Texcoord; layout(location = 1) in vec3 Normal;
in vec3 Normal; layout(location = 3) in vec2 Texcoord;
out vec3 nor; out vec3 nor;
out vec2 uv; out vec2 uv;

View File

@ -9,8 +9,8 @@ layout (std140) uniform MatrixesData
uniform mat4 ModelMatrix; uniform mat4 ModelMatrix;
in vec3 Position; layout(location = 0) in vec3 Position;
in vec2 Texcoord; layout(location = 3) in vec2 Texcoord;
#ifdef VSLayer #ifdef VSLayer
out vec2 uv; out vec2 uv;

View File

@ -56,7 +56,7 @@ void main(void)
vec3 norm = -normalize(cross(ddy, ddx)); vec3 norm = -normalize(cross(ddy, ddx));
float r = radius / FragPos.z; float r = radius / FragPos.z;
float phi = 30. * (x ^ y) + 10. * x * y; float phi = 3. * (x ^ y) + x * y;
float bl = 0.0; float bl = 0.0;
float m = log2(r) + 6 + log2(invSamples); float m = log2(r) + 6 + log2(invSamples);

View File

@ -1,22 +0,0 @@
uniform mat4 ModelViewProjectionMatrix;
uniform mat4 TextureMatrix;
#if __VERSION__ >= 130
in vec3 Position;
in vec2 Texcoord;
in vec4 Color;
out vec2 uv;
out vec4 color;
#else
attribute vec3 Position;
attribute vec2 Texcoord;
varying vec2 uv;
#endif
void main()
{
uv = (TextureMatrix * vec4(Texcoord, 1., 1.)).xy;
gl_Position = ModelViewProjectionMatrix * vec4(Position, 1.);
color = Color;
}

View File

@ -68,6 +68,14 @@ when the border that intersect at this corner are enabled.
<!-- Stateless --> <!-- Stateless -->
<element type="background" image="ocean/background.jpg" /> <element type="background" image="ocean/background.jpg" />
<element type="achievement-message" image="ocean/glassbutton.png"
left_border="13" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/>
<element type="friend-message" image="ocean/glassbutton.png"
left_border="13" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/>
<element type="button" state="neutral" image="ocean/glassbutton.png" <element type="button" state="neutral" image="ocean/glassbutton.png"
left_border="13" right_border="13" top_border="13" bottom_border="13" left_border="13" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/> preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/>

View File

@ -68,6 +68,14 @@ when the border that intersect at this corner are enabled.
<!-- Stateless --> <!-- Stateless -->
<element type="background" image="peach/background.jpg" /> <element type="background" image="peach/background.jpg" />
<element type="achievement-message" image="peach/achievement.png"
left_border="128" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0.3" vborder_out_portion="0"/>
<element type="friend-message" image="peach/friend.png"
left_border="128" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/>
<element type="button" state="neutral" image="peach/glassbutton.png" <element type="button" state="neutral" image="peach/glassbutton.png"
left_border="13" right_border="13" top_border="13" bottom_border="13" left_border="13" right_border="13" top_border="13" bottom_border="13"
preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/> preserve_h_aspect_ratios="true" hborder_out_portion="0" vborder_out_portion="0"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
data/skins/peach/friend.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -264,7 +264,7 @@ bool CIrrDeviceLinux::switchToFullscreen(bool reset)
// enumerate video modes // enumerate video modes
s32 modeCount; s32 modeCount;
XF86VidModeModeInfo** modes; XF86VidModeModeInfo** modes;
float refresh_rate; float refresh_rate, refresh_rate_old;
XF86VidModeGetAllModeLines(display, screennr, &modeCount, &modes); XF86VidModeGetAllModeLines(display, screennr, &modeCount, &modes);
@ -273,22 +273,17 @@ bool CIrrDeviceLinux::switchToFullscreen(bool reset)
{ {
if (bestMode==-1 && modes[i]->hdisplay >= Width && modes[i]->vdisplay >= Height) if (bestMode==-1 && modes[i]->hdisplay >= Width && modes[i]->vdisplay >= Height)
{ {
float pixels_per_second = modes[i]->dotclock * 1000.0;
float pixels_per_frame = modes[i]->htotal * modes[i]->vtotal;
refresh_rate = pixels_per_second / pixels_per_frame;
bestMode = i; bestMode = i;
} }
else if (bestMode!=-1 && else if (bestMode!=-1 &&
modes[i]->hdisplay == modes[bestMode]->hdisplay && modes[i]->hdisplay == modes[bestMode]->hdisplay &&
modes[i]->vdisplay == modes[bestMode]->vdisplay) modes[i]->vdisplay == modes[bestMode]->vdisplay)
{ {
float pixels_per_second = modes[i]->dotclock * 1000.0; refresh_rate_old = (modes[bestMode]->dotclock * 1000.0) / (modes[bestMode]->htotal * modes[bestMode]->vtotal);
float pixels_per_frame = modes[i]->htotal * modes[i]->vtotal; refresh_rate = (modes[i]->dotclock * 1000.0) / (modes[i]->htotal * modes[i]->vtotal);
float refresh_rate_tmp = pixels_per_second / pixels_per_frame;
if (refresh_rate_tmp > refresh_rate) if (refresh_rate > refresh_rate_old)
{ {
refresh_rate = refresh_rate_tmp;
bestMode = i; bestMode = i;
} }
} }
@ -298,9 +293,6 @@ bool CIrrDeviceLinux::switchToFullscreen(bool reset)
modes[i]->hdisplay <= modes[bestMode]->hdisplay && modes[i]->hdisplay <= modes[bestMode]->hdisplay &&
modes[i]->vdisplay <= modes[bestMode]->vdisplay) modes[i]->vdisplay <= modes[bestMode]->vdisplay)
{ {
float pixels_per_second = modes[i]->dotclock * 1000.0;
float pixels_per_frame = modes[i]->htotal * modes[i]->vtotal;
refresh_rate = pixels_per_second / pixels_per_frame;
bestMode = i; bestMode = i;
} }
} }

View File

@ -21,7 +21,7 @@
#include "achievements/achievement.hpp" #include "achievements/achievement.hpp"
#include "achievements/achievement_info.hpp" #include "achievements/achievement_info.hpp"
#include "guiengine/dialog_queue.hpp" #include "guiengine/message_queue.hpp"
#include "io/utf_writer.hpp" #include "io/utf_writer.hpp"
#include "config/player_manager.hpp" #include "config/player_manager.hpp"
#include "states_screens/dialogs/notification_dialog.hpp" #include "states_screens/dialogs/notification_dialog.hpp"
@ -202,8 +202,7 @@ void Achievement::check()
//show achievement //show achievement
core::stringw s = StringUtils::insertValues(_("Completed achievement \"%s\"."), core::stringw s = StringUtils::insertValues(_("Completed achievement \"%s\"."),
m_achievement_info->getTitle()); m_achievement_info->getTitle());
GUIEngine::DialogQueue::get()->pushDialog( MessageQueue::add(MessageQueue::MT_ACHIEVEMENT, s);
new NotificationDialog(NotificationDialog::T_Achievements, s));
// Sends a confirmation to the server that an achievement has been // Sends a confirmation to the server that an achievement has been
// completed, if a user is signed in. // completed, if a user is signed in.

View File

@ -33,6 +33,8 @@ AnimationBase::AnimationBase(const XMLNode &node)
node.get("fps", &fps); node.get("fps", &fps);
for(unsigned int i=0; i<node.getNumNodes(); i++) for(unsigned int i=0; i<node.getNumNodes(); i++)
{ {
if (node.getNode(i)->getName() == "animated-texture")
continue;
Ipo *ipo = new Ipo(*node.getNode(i), fps); Ipo *ipo = new Ipo(*node.getNode(i), fps);
m_all_ipos.push_back(ipo); m_all_ipos.push_back(ipo);
} }

View File

@ -415,7 +415,11 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
setTexture(0, in_fbo.getRTT()[0], GL_LINEAR, GL_LINEAR); setTexture(0, in_fbo.getRTT()[0], GL_LINEAR, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
setTexture(1, irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0], GL_LINEAR, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(FullScreenShader::Gaussian17TapHShader::uniform_tex, 0); glUniform1i(FullScreenShader::Gaussian17TapHShader::uniform_tex, 0);
glUniform1i(FullScreenShader::Gaussian17TapHShader::uniform_depth, 1);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
} }
@ -425,9 +429,11 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
glUseProgram(FullScreenShader::ComputeGaussian17TapHShader::Program); glUseProgram(FullScreenShader::ComputeGaussian17TapHShader::Program);
glBindImageTexture(0, in_fbo.getRTT()[0], 0, false, 0, GL_READ_ONLY, GL_R16F); glBindImageTexture(0, in_fbo.getRTT()[0], 0, false, 0, GL_READ_ONLY, GL_R16F);
glBindImageTexture(1, auxiliary.getRTT()[0], 0, false, 0, GL_WRITE_ONLY, GL_R16F); glBindImageTexture(1, irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0], 1, false, 0, GL_READ_ONLY, GL_R32F);
glBindImageTexture(2, auxiliary.getRTT()[0], 0, false, 0, GL_WRITE_ONLY, GL_R16F);
glUniform1i(FullScreenShader::ComputeGaussian17TapHShader::uniform_source, 0); glUniform1i(FullScreenShader::ComputeGaussian17TapHShader::uniform_source, 0);
glUniform1i(FullScreenShader::ComputeGaussian17TapHShader::uniform_dest, 1); glUniform1i(FullScreenShader::ComputeGaussian17TapHShader::uniform_depth, 1);
glUniform1i(FullScreenShader::ComputeGaussian17TapHShader::uniform_dest, 2);
glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1); glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1);
} }
#endif #endif
@ -446,7 +452,11 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
setTexture(0, auxiliary.getRTT()[0], GL_LINEAR, GL_LINEAR); setTexture(0, auxiliary.getRTT()[0], GL_LINEAR, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
setTexture(1, irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0], GL_LINEAR, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glUniform1i(FullScreenShader::Gaussian17TapVShader::uniform_tex, 0); glUniform1i(FullScreenShader::Gaussian17TapVShader::uniform_tex, 0);
glUniform1i(FullScreenShader::Gaussian17TapVShader::uniform_depth, 1);
glDrawArrays(GL_TRIANGLES, 0, 3); glDrawArrays(GL_TRIANGLES, 0, 3);
} }
@ -455,9 +465,11 @@ void PostProcessing::renderGaussian17TapBlur(FrameBuffer &in_fbo, FrameBuffer &a
{ {
glUseProgram(FullScreenShader::ComputeGaussian17TapVShader::Program); glUseProgram(FullScreenShader::ComputeGaussian17TapVShader::Program);
glBindImageTexture(0, auxiliary.getRTT()[0], 0, false, 0, GL_READ_ONLY, GL_R16F); glBindImageTexture(0, auxiliary.getRTT()[0], 0, false, 0, GL_READ_ONLY, GL_R16F);
glBindImageTexture(1, in_fbo.getRTT()[0], 0, false, 0, GL_WRITE_ONLY, GL_R16F); glBindImageTexture(1, irr_driver->getFBO(FBO_LINEAR_DEPTH).getRTT()[0], 1, false, 0, GL_READ_ONLY, GL_R32F);
glBindImageTexture(2, in_fbo.getRTT()[0], 0, false, 0, GL_WRITE_ONLY, GL_R16F);
glUniform1i(FullScreenShader::ComputeGaussian17TapVShader::uniform_source, 0); glUniform1i(FullScreenShader::ComputeGaussian17TapVShader::uniform_source, 0);
glUniform1i(FullScreenShader::ComputeGaussian17TapVShader::uniform_dest, 1); glUniform1i(FullScreenShader::ComputeGaussian17TapVShader::uniform_depth, 1);
glUniform1i(FullScreenShader::ComputeGaussian17TapVShader::uniform_dest, 2);
glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1); glDispatchCompute(in_fbo.getWidth() / 8, in_fbo.getHeight() / 8, 1);
} }
#endif #endif

View File

@ -48,6 +48,7 @@
#include "utils/profiler.hpp" #include "utils/profiler.hpp"
#include <algorithm> #include <algorithm>
#include <limits>
#define MAX2(a, b) ((a) > (b) ? (a) : (b)) #define MAX2(a, b) ((a) > (b) ? (a) : (b))
#define MIN2(a, b) ((a) > (b) ? (b) : (a)) #define MIN2(a, b) ((a) > (b) ? (b) : (a))
@ -539,7 +540,7 @@ void IrrDriver::renderSolidFirstPass()
GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ONE }; GLint swizzleMask[] = { GL_ONE, GL_ONE, GL_ONE, GL_ONE };
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);
} }
draw<MeshShader::ObjectPass1Shader>(mesh, mesh.vao_first_pass, GroupedFPSM<FPSM_DEFAULT>::MVPSet[i], GroupedFPSM<FPSM_DEFAULT>::TIMVSet[i], 0); draw<MeshShader::ObjectPass1Shader>(mesh, mesh.vao, GroupedFPSM<FPSM_DEFAULT>::MVPSet[i], GroupedFPSM<FPSM_DEFAULT>::TIMVSet[i], 0);
if (!mesh.textures[0]) if (!mesh.textures[0])
{ {
GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA }; GLint swizzleMask[] = { GL_RED, GL_GREEN, GL_BLUE, GL_ALPHA };
@ -553,7 +554,7 @@ void IrrDriver::renderSolidFirstPass()
const GLMesh &mesh = *GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MeshSet[i]; const GLMesh &mesh = *GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MeshSet[i];
compressTexture(mesh.textures[0], true); compressTexture(mesh.textures[0], true);
setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
draw<MeshShader::ObjectRefPass1Shader>(mesh, mesh.vao_first_pass, GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MVPSet[i], GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::TIMVSet[i], GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MeshSet[i]->TextureMatrix, 0); draw<MeshShader::ObjectRefPass1Shader>(mesh, mesh.vao, GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MVPSet[i], GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::TIMVSet[i], GroupedFPSM<FPSM_ALPHA_REF_TEXTURE>::MeshSet[i]->TextureMatrix, 0);
} }
glUseProgram(MeshShader::NormalMapShader::Program); glUseProgram(MeshShader::NormalMapShader::Program);
for (unsigned i = 0; i < GroupedFPSM<FPSM_NORMAL_MAP>::MeshSet.size(); ++i) for (unsigned i = 0; i < GroupedFPSM<FPSM_NORMAL_MAP>::MeshSet.size(); ++i)
@ -564,7 +565,7 @@ void IrrDriver::renderSolidFirstPass()
setTexture(0, getTextureGLuint(mesh.textures[1]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, getTextureGLuint(mesh.textures[1]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
compressTexture(mesh.textures[0], true); compressTexture(mesh.textures[0], true);
setTexture(1, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(1, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
draw<MeshShader::NormalMapShader>(mesh, mesh.vao_first_pass, GroupedFPSM<FPSM_NORMAL_MAP>::MVPSet[i], GroupedFPSM<FPSM_NORMAL_MAP>::TIMVSet[i], 0, 1); draw<MeshShader::NormalMapShader>(mesh, mesh.vao, GroupedFPSM<FPSM_NORMAL_MAP>::MVPSet[i], GroupedFPSM<FPSM_NORMAL_MAP>::TIMVSet[i], 0, 1);
} }
} }
} }
@ -689,8 +690,6 @@ void IrrDriver::renderParticles()
void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, size_t width, size_t height) void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, size_t width, size_t height)
{ {
static int tick = 0;
tick++;
m_scene_manager->drawAll(scene::ESNRP_CAMERA); m_scene_manager->drawAll(scene::ESNRP_CAMERA);
irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION)); irr_driver->setProjMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION));
irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW)); irr_driver->setViewMatrix(irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW));
@ -771,9 +770,12 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz
core::aabbox3df box = smallcambox; core::aabbox3df box = smallcambox;
box = box.intersect(trackbox); box = box.intersect(trackbox);
float xmin = INFINITY, xmax = -INFINITY; float xmin = std::numeric_limits<float>::infinity();
float ymin = INFINITY, ymax = -INFINITY; float xmax = -std::numeric_limits<float>::infinity();
float zmin = INFINITY, zmax = -INFINITY; float ymin = std::numeric_limits<float>::infinity();
float ymax = -std::numeric_limits<float>::infinity();
float zmin = std::numeric_limits<float>::infinity();
float zmax = -std::numeric_limits<float>::infinity();
const vector3df vectors[] = const vector3df vectors[] =
{ {
frustrum->getFarLeftDown(), frustrum->getFarLeftDown(),
@ -831,7 +833,7 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz
sun_ortho_matrix.push_back(getVideoDriver()->getTransform(video::ETS_PROJECTION) * getVideoDriver()->getTransform(video::ETS_VIEW)); sun_ortho_matrix.push_back(getVideoDriver()->getTransform(video::ETS_PROJECTION) * getVideoDriver()->getTransform(video::ETS_VIEW));
} }
if ((tick % 100) == 2)
{ {
core::aabbox3df trackbox(vmin->toIrrVector(), vmax->toIrrVector() - core::aabbox3df trackbox(vmin->toIrrVector(), vmax->toIrrVector() -
core::vector3df(0, 30, 0)); core::vector3df(0, 30, 0));
@ -910,7 +912,7 @@ void IrrDriver::renderShadows()
continue; continue;
compressTexture(mesh.textures[0], true); compressTexture(mesh.textures[0], true);
setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
draw<MeshShader::RSMShader>(mesh, mesh.vao_rsm_pass, rsm_matrix, GroupedFPSM<FPSM_DEFAULT>::MVPSet[i], 0); draw<MeshShader::RSMShader>(mesh, mesh.vao, rsm_matrix, GroupedFPSM<FPSM_DEFAULT>::MVPSet[i], 0);
} }
} }

View File

@ -44,7 +44,7 @@ static GLuint generateRTT(const core::dimension2du &res, GLint internalFormat, G
glGenTextures(1, &result); glGenTextures(1, &result);
glBindTexture(GL_TEXTURE_2D, result); glBindTexture(GL_TEXTURE_2D, result);
#if WIN32 #if WIN32
if (irr_driver->getGLSLVersion() < 420) if (irr_driver->getGLSLVersion() >= 420)
glTexStorage2D(GL_TEXTURE_2D, mipmaplevel, internalFormat, res.Width, res.Height); glTexStorage2D(GL_TEXTURE_2D, mipmaplevel, internalFormat, res.Width, res.Height);
else else
#endif #endif
@ -269,21 +269,20 @@ RTT::~RTT()
glDeleteTextures(1, &DepthStencilTexture); glDeleteTextures(1, &DepthStencilTexture);
if (UserConfigParams::m_shadows) if (UserConfigParams::m_shadows)
{ {
delete m_shadow_FBO;
glDeleteTextures(1, &shadowColorTex); glDeleteTextures(1, &shadowColorTex);
glDeleteTextures(1, &shadowDepthTex); glDeleteTextures(1, &shadowDepthTex);
} }
if (UserConfigParams::m_gi) if (UserConfigParams::m_gi)
{ {
delete m_RH_FBO;
delete m_RSM;
glDeleteTextures(1, &RSM_Color); glDeleteTextures(1, &RSM_Color);
glDeleteTextures(1, &RSM_Normal); glDeleteTextures(1, &RSM_Normal);
glDeleteTextures(1, &RSM_Depth); glDeleteTextures(1, &RSM_Depth);
glDeleteTextures(1, &RH_Red); glDeleteTextures(1, &RH_Red);
glDeleteTextures(1, &RH_Green); glDeleteTextures(1, &RH_Green);
glDeleteTextures(1, &RH_Blue); glDeleteTextures(1, &RH_Blue);
delete m_shadow_FBO;
delete m_RH_FBO;
delete m_RSM;
} }
} }

View File

@ -1360,19 +1360,24 @@ namespace MeshShader
void TransparentShader::init() void TransparentShader::init()
{ {
Program = LoadProgram( Program = LoadProgram(
GL_VERTEX_SHADER, file_manager->getAsset("shaders/transparent.vert").c_str(), GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparent.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparent.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
attrib_texcoord = glGetAttribLocation(Program, "Texcoord"); attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
attrib_color = glGetAttribLocation(Program, "Color"); attrib_color = glGetAttribLocation(Program, "Color");
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix"); uniform_MVP = glGetUniformLocation(Program, "ModelMatrix");
uniform_TM = glGetUniformLocation(Program, "TextureMatrix"); uniform_TM = glGetUniformLocation(Program, "TextureMatrix");
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
if (!UserConfigParams::m_ubo_disabled)
{
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
}
} }
void TransparentShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &TextureMatrix, unsigned TU_tex) void TransparentShader::setUniforms(const core::matrix4 &ModelMatrix, const core::matrix4 &TextureMatrix, unsigned TU_tex)
{ {
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer()); glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelMatrix.pointer());
glUniformMatrix4fv(uniform_TM, 1, GL_FALSE, TextureMatrix.pointer()); glUniformMatrix4fv(uniform_TM, 1, GL_FALSE, TextureMatrix.pointer());
glUniform1i(uniform_tex, TU_tex); glUniform1i(uniform_tex, TU_tex);
} }
@ -1394,12 +1399,12 @@ namespace MeshShader
void TransparentFogShader::init() void TransparentFogShader::init()
{ {
Program = LoadProgram( Program = LoadProgram(
GL_VERTEX_SHADER, file_manager->getAsset("shaders/transparent.vert").c_str(), GL_VERTEX_SHADER, file_manager->getAsset("shaders/object_pass.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparentfog.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/transparentfog.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
attrib_texcoord = glGetAttribLocation(Program, "Texcoord"); attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
attrib_color = glGetAttribLocation(Program, "Color"); attrib_color = glGetAttribLocation(Program, "Color");
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix"); uniform_MVP = glGetUniformLocation(Program, "ModelMatrix");
uniform_TM = glGetUniformLocation(Program, "TextureMatrix"); uniform_TM = glGetUniformLocation(Program, "TextureMatrix");
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
uniform_fogmax = glGetUniformLocation(Program, "fogmax"); uniform_fogmax = glGetUniformLocation(Program, "fogmax");
@ -1415,9 +1420,9 @@ namespace MeshShader
} }
} }
void TransparentFogShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &TextureMatrix, float fogmax, float startH, float endH, float start, float end, const core::vector3df &col, const core::vector3df &campos, unsigned TU_tex) void TransparentFogShader::setUniforms(const core::matrix4 &ModelMatrix, const core::matrix4 &TextureMatrix, float fogmax, float startH, float endH, float start, float end, const core::vector3df &col, const core::vector3df &campos, unsigned TU_tex)
{ {
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer()); glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelMatrix.pointer());
glUniformMatrix4fv(uniform_TM, 1, GL_FALSE, TextureMatrix.pointer()); glUniformMatrix4fv(uniform_TM, 1, GL_FALSE, TextureMatrix.pointer());
glUniform1f(uniform_fogmax, fogmax); glUniform1f(uniform_fogmax, fogmax);
glUniform1f(uniform_startH, startH); glUniform1f(uniform_startH, startH);
@ -1728,12 +1733,14 @@ namespace MeshShader
GL_VERTEX_SHADER, file_manager->getAsset("shaders/displace.vert").c_str(), GL_VERTEX_SHADER, file_manager->getAsset("shaders/displace.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/white.frag").c_str());
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix"); uniform_MVP = glGetUniformLocation(Program, "ModelMatrix");
GLuint uniform_ViewProjectionMatrixesUBO = glGetUniformBlockIndex(Program, "MatrixesData");
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void DisplaceMaskShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix) void DisplaceMaskShader::setUniforms(const core::matrix4 &ModelMatrix)
{ {
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer()); glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelMatrix.pointer());
} }
GLuint DisplaceShader::Program; GLuint DisplaceShader::Program;
@ -1741,7 +1748,6 @@ namespace MeshShader
GLuint DisplaceShader::attrib_texcoord; GLuint DisplaceShader::attrib_texcoord;
GLuint DisplaceShader::attrib_second_texcoord; GLuint DisplaceShader::attrib_second_texcoord;
GLuint DisplaceShader::uniform_MVP; GLuint DisplaceShader::uniform_MVP;
GLuint DisplaceShader::uniform_MV;
GLuint DisplaceShader::uniform_displacement_tex; GLuint DisplaceShader::uniform_displacement_tex;
GLuint DisplaceShader::uniform_mask_tex; GLuint DisplaceShader::uniform_mask_tex;
GLuint DisplaceShader::uniform_color_tex; GLuint DisplaceShader::uniform_color_tex;
@ -1756,8 +1762,7 @@ namespace MeshShader
attrib_position = glGetAttribLocation(Program, "Position"); attrib_position = glGetAttribLocation(Program, "Position");
attrib_texcoord = glGetAttribLocation(Program, "Texcoord"); attrib_texcoord = glGetAttribLocation(Program, "Texcoord");
attrib_second_texcoord = glGetAttribLocation(Program, "SecondTexcoord"); attrib_second_texcoord = glGetAttribLocation(Program, "SecondTexcoord");
uniform_MVP = glGetUniformLocation(Program, "ModelViewProjectionMatrix"); uniform_MVP = glGetUniformLocation(Program, "ModelMatrix");
uniform_MV = glGetUniformLocation(Program, "ModelViewMatrix");
uniform_displacement_tex = glGetUniformLocation(Program, "displacement_tex"); uniform_displacement_tex = glGetUniformLocation(Program, "displacement_tex");
uniform_color_tex = glGetUniformLocation(Program, "color_tex"); uniform_color_tex = glGetUniformLocation(Program, "color_tex");
uniform_mask_tex = glGetUniformLocation(Program, "mask_tex"); uniform_mask_tex = glGetUniformLocation(Program, "mask_tex");
@ -1767,10 +1772,9 @@ namespace MeshShader
glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0); glUniformBlockBinding(Program, uniform_ViewProjectionMatrixesUBO, 0);
} }
void DisplaceShader::setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &ModelViewMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_displacement_tex, unsigned TU_mask_tex, unsigned TU_color_tex) void DisplaceShader::setUniforms(const core::matrix4 &ModelMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_displacement_tex, unsigned TU_mask_tex, unsigned TU_color_tex)
{ {
glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer()); glUniformMatrix4fv(uniform_MVP, 1, GL_FALSE, ModelMatrix.pointer());
glUniformMatrix4fv(uniform_MV, 1, GL_FALSE, ModelViewMatrix.pointer());
glUniform2f(uniform_dir, dir.X, dir.Y); glUniform2f(uniform_dir, dir.X, dir.Y);
glUniform2f(uniform_dir2, dir2.X, dir2.Y); glUniform2f(uniform_dir2, dir2.X, dir2.Y);
glUniform1i(uniform_displacement_tex, TU_displacement_tex); glUniform1i(uniform_displacement_tex, TU_displacement_tex);
@ -2495,27 +2499,31 @@ namespace FullScreenShader
GLuint Gaussian17TapHShader::Program; GLuint Gaussian17TapHShader::Program;
GLuint Gaussian17TapHShader::uniform_tex; GLuint Gaussian17TapHShader::uniform_tex;
GLuint Gaussian17TapHShader::uniform_depth;
GLuint Gaussian17TapHShader::uniform_pixel; GLuint Gaussian17TapHShader::uniform_pixel;
GLuint Gaussian17TapHShader::vao; GLuint Gaussian17TapHShader::vao;
void Gaussian17TapHShader::init() void Gaussian17TapHShader::init()
{ {
Program = LoadProgram( Program = LoadProgram(
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(), GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian17taph.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bilateralH.frag").c_str());
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
uniform_pixel = glGetUniformLocation(Program, "pixel"); uniform_pixel = glGetUniformLocation(Program, "pixel");
uniform_depth = glGetUniformLocation(Program, "depth");
vao = createFullScreenVAO(Program); vao = createFullScreenVAO(Program);
} }
GLuint ComputeGaussian17TapHShader::Program; GLuint ComputeGaussian17TapHShader::Program;
GLuint ComputeGaussian17TapHShader::uniform_source; GLuint ComputeGaussian17TapHShader::uniform_source;
GLuint ComputeGaussian17TapHShader::uniform_depth;
GLuint ComputeGaussian17TapHShader::uniform_dest; GLuint ComputeGaussian17TapHShader::uniform_dest;
void ComputeGaussian17TapHShader::init() void ComputeGaussian17TapHShader::init()
{ {
#if WIN32 #if WIN32
Program = LoadProgram( Program = LoadProgram(
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/gaussian.comp").c_str()); GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralH.comp").c_str());
uniform_source = glGetUniformLocation(Program, "source"); uniform_source = glGetUniformLocation(Program, "source");
uniform_depth = glGetUniformLocation(Program, "depth");
uniform_dest = glGetUniformLocation(Program, "dest"); uniform_dest = glGetUniformLocation(Program, "dest");
#endif #endif
} }
@ -2550,27 +2558,31 @@ namespace FullScreenShader
GLuint Gaussian17TapVShader::Program; GLuint Gaussian17TapVShader::Program;
GLuint Gaussian17TapVShader::uniform_tex; GLuint Gaussian17TapVShader::uniform_tex;
GLuint Gaussian17TapVShader::uniform_depth;
GLuint Gaussian17TapVShader::uniform_pixel; GLuint Gaussian17TapVShader::uniform_pixel;
GLuint Gaussian17TapVShader::vao; GLuint Gaussian17TapVShader::vao;
void Gaussian17TapVShader::init() void Gaussian17TapVShader::init()
{ {
Program = LoadProgram( Program = LoadProgram(
GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(), GL_VERTEX_SHADER, file_manager->getAsset("shaders/screenquad.vert").c_str(),
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/gaussian17tapv.frag").c_str()); GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/bilateralV.frag").c_str());
uniform_tex = glGetUniformLocation(Program, "tex"); uniform_tex = glGetUniformLocation(Program, "tex");
uniform_pixel = glGetUniformLocation(Program, "pixel"); uniform_pixel = glGetUniformLocation(Program, "pixel");
uniform_depth = glGetUniformLocation(Program, "depth");
vao = createFullScreenVAO(Program); vao = createFullScreenVAO(Program);
} }
GLuint ComputeGaussian17TapVShader::Program; GLuint ComputeGaussian17TapVShader::Program;
GLuint ComputeGaussian17TapVShader::uniform_source; GLuint ComputeGaussian17TapVShader::uniform_source;
GLuint ComputeGaussian17TapVShader::uniform_depth;
GLuint ComputeGaussian17TapVShader::uniform_dest; GLuint ComputeGaussian17TapVShader::uniform_dest;
void ComputeGaussian17TapVShader::init() void ComputeGaussian17TapVShader::init()
{ {
#if WIN32 #if WIN32
Program = LoadProgram( Program = LoadProgram(
GL_COMPUTE_SHADER, file_manager->getAsset("shaders/gaussianv.comp").c_str()); GL_COMPUTE_SHADER, file_manager->getAsset("shaders/bilateralV.comp").c_str());
uniform_source = glGetUniformLocation(Program, "source"); uniform_source = glGetUniformLocation(Program, "source");
uniform_depth = glGetUniformLocation(Program, "depth");
uniform_dest = glGetUniformLocation(Program, "dest"); uniform_dest = glGetUniformLocation(Program, "dest");
#endif #endif
} }

View File

@ -288,7 +288,7 @@ public:
static GLuint uniform_MVP, uniform_TM, uniform_tex; static GLuint uniform_MVP, uniform_TM, uniform_tex;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &TextureMatrix, unsigned TU_tex); static void setUniforms(const core::matrix4 &ModelMatrix, const core::matrix4 &TextureMatrix, unsigned TU_tex);
}; };
class TransparentFogShader class TransparentFogShader
@ -299,7 +299,7 @@ public:
static GLuint uniform_MVP, uniform_TM, uniform_tex, uniform_fogmax, uniform_startH, uniform_endH, uniform_start, uniform_end, uniform_col; static GLuint uniform_MVP, uniform_TM, uniform_tex, uniform_fogmax, uniform_startH, uniform_endH, uniform_start, uniform_end, uniform_col;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &TextureMatrix, float fogmax, float startH, float endH, float start, float end, const core::vector3df &col, const core::vector3df &campos, unsigned TU_tex); static void setUniforms(const core::matrix4 &ModelMatrix, const core::matrix4 &TextureMatrix, float fogmax, float startH, float endH, float start, float end, const core::vector3df &col, const core::vector3df &campos, unsigned TU_tex);
}; };
class BillboardShader class BillboardShader
@ -398,7 +398,7 @@ public:
static GLuint uniform_MVP; static GLuint uniform_MVP;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix); static void setUniforms(const core::matrix4 &ModelMatrix);
}; };
class DisplaceShader class DisplaceShader
@ -406,10 +406,10 @@ class DisplaceShader
public: public:
static GLuint Program; static GLuint Program;
static GLuint attrib_position, attrib_texcoord, attrib_second_texcoord; static GLuint attrib_position, attrib_texcoord, attrib_second_texcoord;
static GLuint uniform_MVP, uniform_MV, uniform_displacement_tex, uniform_mask_tex, uniform_color_tex, uniform_dir, uniform_dir2; static GLuint uniform_MVP, uniform_displacement_tex, uniform_mask_tex, uniform_color_tex, uniform_dir, uniform_dir2;
static void init(); static void init();
static void setUniforms(const core::matrix4 &ModelViewProjectionMatrix, const core::matrix4 &ModelViewMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_displacement_tex, unsigned TU_mask_tex, unsigned TU_color_tex); static void setUniforms(const core::matrix4 &ModelMatrix, const core::vector2df &dir, const core::vector2df &dir2, const core::vector2df &screen, unsigned TU_displacement_tex, unsigned TU_mask_tex, unsigned TU_color_tex);
}; };
class SkyboxShader class SkyboxShader
@ -647,7 +647,7 @@ class Gaussian17TapHShader
{ {
public: public:
static GLuint Program; static GLuint Program;
static GLuint uniform_tex, uniform_pixel; static GLuint uniform_tex, uniform_depth, uniform_pixel;
static GLuint vao; static GLuint vao;
static void init(); static void init();
@ -657,7 +657,7 @@ class ComputeGaussian17TapHShader
{ {
public: public:
static GLuint Program; static GLuint Program;
static GLuint uniform_source, uniform_dest; static GLuint uniform_source, uniform_depth, uniform_dest;
static void init(); static void init();
}; };
@ -686,7 +686,7 @@ class Gaussian17TapVShader
{ {
public: public:
static GLuint Program; static GLuint Program;
static GLuint uniform_tex, uniform_pixel; static GLuint uniform_tex, uniform_depth, uniform_pixel;
static GLuint vao; static GLuint vao;
static void init(); static void init();
@ -696,7 +696,7 @@ class ComputeGaussian17TapVShader
{ {
public: public:
static GLuint Program; static GLuint Program;
static GLuint uniform_source, uniform_dest; static GLuint uniform_source, uniform_depth, uniform_dest;
static void init(); static void init();
}; };

View File

@ -27,18 +27,8 @@ void STKAnimatedMesh::cleanGLMeshes()
GLMesh mesh = GLmeshes[i]; GLMesh mesh = GLmeshes[i];
if (!mesh.vertex_buffer) if (!mesh.vertex_buffer)
continue; continue;
if (mesh.vao_first_pass) if (mesh.vao)
glDeleteVertexArrays(1, &(mesh.vao_first_pass)); glDeleteVertexArrays(1, &(mesh.vao));
if (mesh.vao_second_pass)
glDeleteVertexArrays(1, &(mesh.vao_second_pass));
if (mesh.vao_glow_pass)
glDeleteVertexArrays(1, &(mesh.vao_glow_pass));
if (mesh.vao_displace_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_pass));
if (mesh.vao_displace_mask_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_mask_pass));
if (mesh.vao_shadow_pass)
glDeleteVertexArrays(1, &(mesh.vao_shadow_pass));
glDeleteBuffers(1, &(mesh.vertex_buffer)); glDeleteBuffers(1, &(mesh.vertex_buffer));
glDeleteBuffers(1, &(mesh.index_buffer)); glDeleteBuffers(1, &(mesh.index_buffer));
} }
@ -230,13 +220,13 @@ void STKAnimatedMesh::render()
for_in(mesh, TransparentMesh[TM_DEFAULT]) for_in(mesh, TransparentMesh[TM_DEFAULT])
{ {
TransparentMeshes<TM_DEFAULT>::MeshSet.push_back(mesh); TransparentMeshes<TM_DEFAULT>::MeshSet.push_back(mesh);
TransparentMeshes<TM_DEFAULT>::MVPSet.push_back(ModelViewProjectionMatrix); TransparentMeshes<TM_DEFAULT>::MVPSet.push_back(AbsoluteTransformation);
} }
for_in(mesh, TransparentMesh[TM_ADDITIVE]) for_in(mesh, TransparentMesh[TM_ADDITIVE])
{ {
TransparentMeshes<TM_ADDITIVE>::MeshSet.push_back(mesh); TransparentMeshes<TM_ADDITIVE>::MeshSet.push_back(mesh);
TransparentMeshes<TM_ADDITIVE>::MVPSet.push_back(ModelViewProjectionMatrix); TransparentMeshes<TM_ADDITIVE>::MVPSet.push_back(AbsoluteTransformation);
} }
return; return;
} }

View File

@ -25,16 +25,10 @@ void STKInstancedSceneNode::cleanGL()
GLMesh mesh = GLmeshes[i]; GLMesh mesh = GLmeshes[i];
if (!mesh.vertex_buffer) if (!mesh.vertex_buffer)
continue; continue;
if (mesh.vao_first_pass) if (mesh.vao)
glDeleteVertexArrays(1, &(mesh.vao_first_pass)); glDeleteVertexArrays(1, &(mesh.vao));
if (mesh.vao_second_pass) if (mesh.vao_second_pass)
glDeleteVertexArrays(1, &(mesh.vao_second_pass)); glDeleteVertexArrays(1, &(mesh.vao_second_pass));
if (mesh.vao_glow_pass)
glDeleteVertexArrays(1, &(mesh.vao_glow_pass));
if (mesh.vao_displace_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_pass));
if (mesh.vao_displace_mask_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_mask_pass));
if (mesh.vao_shadow_pass) if (mesh.vao_shadow_pass)
glDeleteVertexArrays(1, &(mesh.vao_shadow_pass)); glDeleteVertexArrays(1, &(mesh.vao_shadow_pass));
glDeleteBuffers(1, &(mesh.vertex_buffer)); glDeleteBuffers(1, &(mesh.vertex_buffer));
@ -81,36 +75,33 @@ void STKInstancedSceneNode::initinstancedvaostate(GLMesh &mesh, GeometricMateria
switch (GeoMat) switch (GeoMat)
{ {
case FPSM_DEFAULT: case FPSM_DEFAULT:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedObjectPass1Shader::attrib_position, MeshShader::InstancedObjectRefPass1Shader::attrib_texcoord, -1, MeshShader::InstancedObjectPass1Shader::attrib_normal, -1, -1, -1, mesh.Stride);
glGenBuffers(1, &instances_vbo); glGenBuffers(1, &instances_vbo);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW);
setInstanceAttribPointer<MeshShader::InstancedObjectPass1Shader, 1>(); setInstanceAttribPointer<MeshShader::InstancedObjectPass1Shader, 1>();
if (irr_driver->getGLSLVersion() >= 150) if (irr_driver->getGLSLVersion() >= 150)
{ {
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::InstancedShadowShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride); mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
setInstanceAttribPointer<MeshShader::InstancedShadowShader, 4>(); setInstanceAttribPointer<MeshShader::InstancedShadowShader, 4>();
} }
break; break;
case FPSM_ALPHA_REF_TEXTURE: case FPSM_ALPHA_REF_TEXTURE:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedObjectRefPass1Shader::attrib_position, MeshShader::InstancedObjectRefPass1Shader::attrib_texcoord, -1, MeshShader::InstancedObjectRefPass1Shader::attrib_normal, -1, -1, -1, mesh.Stride);
glGenBuffers(1, &instances_vbo); glGenBuffers(1, &instances_vbo);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW);
setInstanceAttribPointer<MeshShader::InstancedObjectRefPass1Shader, 1>(); setInstanceAttribPointer<MeshShader::InstancedObjectRefPass1Shader, 1>();
if (irr_driver->getGLSLVersion() >= 150) if (irr_driver->getGLSLVersion() >= 150)
{ {
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::InstancedRefShadowShader::attrib_position, MeshShader::InstancedRefShadowShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride); mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
setInstanceAttribPointer<MeshShader::InstancedRefShadowShader, 4>(); setInstanceAttribPointer<MeshShader::InstancedRefShadowShader, 4>();
} }
break; break;
case FPSM_GRASS: case FPSM_GRASS:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedGrassPass1Shader::attrib_position, MeshShader::InstancedGrassPass1Shader::attrib_texcoord, -1, MeshShader::InstancedGrassPass1Shader::attrib_normal, -1, -1, MeshShader::InstancedGrassPass1Shader::attrib_color, mesh.Stride);
glGenBuffers(1, &instances_vbo); glGenBuffers(1, &instances_vbo);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, instance_pos.size() * sizeof(float), instance_pos.data(), GL_STATIC_DRAW);
@ -125,20 +116,17 @@ void STKInstancedSceneNode::initinstancedvaostate(GLMesh &mesh, GeometricMateria
switch (ShadedMat) switch (ShadedMat)
{ {
case SM_DEFAULT: case SM_DEFAULT:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedObjectPass2Shader::attrib_position, MeshShader::InstancedObjectPass2Shader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
setInstanceAttribPointer<MeshShader::InstancedObjectPass2Shader, 1>(); setInstanceAttribPointer<MeshShader::InstancedObjectPass2Shader, 1>();
break; break;
case SM_ALPHA_REF_TEXTURE: case SM_ALPHA_REF_TEXTURE:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedObjectRefPass2Shader::attrib_position, MeshShader::InstancedObjectRefPass2Shader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
setInstanceAttribPointer<MeshShader::InstancedObjectRefPass2Shader, 1>(); setInstanceAttribPointer<MeshShader::InstancedObjectRefPass2Shader, 1>();
break; break;
case SM_GRASS: case SM_GRASS:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
MeshShader::InstancedGrassPass2Shader::attrib_position, MeshShader::InstancedGrassPass2Shader::attrib_texcoord, -1, MeshShader::InstancedGrassPass2Shader::attrib_normal, -1, -1, MeshShader::InstancedGrassPass2Shader::attrib_color, mesh.Stride);
glBindBuffer(GL_ARRAY_BUFFER, instances_vbo); glBindBuffer(GL_ARRAY_BUFFER, instances_vbo);
setInstanceAttribPointer<MeshShader::InstancedGrassPass2Shader, 1>(); setInstanceAttribPointer<MeshShader::InstancedGrassPass2Shader, 1>();
break; break;

View File

@ -56,54 +56,80 @@ TransparentMaterial MaterialTypeToTransparentMaterial(video::E_MATERIAL_TYPE typ
return TM_DEFAULT; return TM_DEFAULT;
} }
GLuint createVAO(GLuint vbo, GLuint idx, GLuint attrib_position, GLuint attrib_texcoord, GLuint attrib_second_texcoord, GLuint attrib_normal, GLuint attrib_tangent, GLuint attrib_bitangent, GLuint attrib_color, size_t stride) video::E_VERTEX_TYPE getVTXTYPEFromStride(size_t stride)
{
if (stride == sizeof(video::S3DVertex))
return video::EVT_STANDARD;
else if (stride == sizeof(video::S3DVertex2TCoords))
return video::EVT_2TCOORDS;
assert(stride == sizeof(video::S3DVertexTangents));
return video::EVT_TANGENTS;
}
GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type)
{ {
if (attrib_position == -1)
return 0;
GLuint vao; GLuint vao;
glGenVertexArrays(1, &vao); glGenVertexArrays(1, &vao);
glBindVertexArray(vao); glBindVertexArray(vao);
assert(vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo);
glEnableVertexAttribArray(attrib_position); switch (type)
if ((GLint)attrib_texcoord != -1)
glEnableVertexAttribArray(attrib_texcoord);
if ((GLint)attrib_second_texcoord != -1)
glEnableVertexAttribArray(attrib_second_texcoord);
if ((GLint)attrib_normal != -1)
glEnableVertexAttribArray(attrib_normal);
if ((GLint)attrib_tangent != -1)
glEnableVertexAttribArray(attrib_tangent);
if ((GLint)attrib_bitangent != -1)
glEnableVertexAttribArray(attrib_bitangent);
if ((GLint)attrib_color != -1)
glEnableVertexAttribArray(attrib_color);
glVertexAttribPointer(attrib_position, 3, GL_FLOAT, GL_FALSE, stride, 0);
if ((GLint)attrib_texcoord != -1)
glVertexAttribPointer(attrib_texcoord, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*) 28);
if ((GLint)attrib_second_texcoord != -1)
{ {
if (stride < 44) case video::EVT_STANDARD:
Log::error("material", "Second texcoords not present in VBO"); // Position
glVertexAttribPointer(attrib_second_texcoord, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*) 36); glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), 0);
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)12);
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitchFromType(type), (GLvoid*)24);
// Texcoord
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)28);
break;
case video::EVT_2TCOORDS:
// Position
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), 0);
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)12);
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitchFromType(type), (GLvoid*)24);
// Texcoord
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)28);
// SecondTexcoord
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 2, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)36);
break;
case video::EVT_TANGENTS:
// Position
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), 0);
// Normal
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)12);
// Color
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, getVertexPitchFromType(type), (GLvoid*)24);
// Texcoord
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)28);
// Tangent
glEnableVertexAttribArray(5);
glVertexAttribPointer(5, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)36);
// Bitangent
glEnableVertexAttribArray(6);
glVertexAttribPointer(6, 3, GL_FLOAT, GL_FALSE, getVertexPitchFromType(type), (GLvoid*)48);
break;
default:
assert(0 && "Wrong vertex type");
} }
if ((GLint)attrib_normal != -1) assert(idx);
glVertexAttribPointer(attrib_normal, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*) 12);
if ((GLint)attrib_tangent != -1)
{
if (stride < 48)
Log::error("material", "Tangents not present in VBO");
glVertexAttribPointer(attrib_tangent, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)36);
}
if ((GLint)attrib_bitangent != -1)
{
if (stride < 60)
Log::error("material", "Bitangents not present in VBO");
glVertexAttribPointer(attrib_bitangent, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)48);
}
if ((GLint)attrib_color != -1)
glVertexAttribPointer(attrib_color, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, (GLvoid*)24);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idx); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idx);
return vao; return vao;
} }
@ -124,6 +150,7 @@ GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb)
result.Stride = getVertexPitchFromType(vType); result.Stride = getVertexPitchFromType(vType);
const c8* vbuf = static_cast<const c8*>(vertices); const c8* vbuf = static_cast<const c8*>(vertices);
glBufferData(GL_ARRAY_BUFFER, vertexCount * result.Stride, vbuf, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, vertexCount * result.Stride, vbuf, GL_STATIC_DRAW);
assert(vertexCount);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, result.index_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, result.index_buffer);
const void* indices = mb->getIndices(); const void* indices = mb->getIndices();
@ -224,8 +251,8 @@ void drawGrassPass1(const GLMesh &mesh, const core::matrix4 & ModelViewProjectio
MeshShader::GrassPass1Shader::setUniforms(ModelViewProjectionMatrix, TransposeInverseModelView, windDir, 0); MeshShader::GrassPass1Shader::setUniforms(ModelViewProjectionMatrix, TransposeInverseModelView, windDir, 0);
assert(mesh.vao_first_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_first_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -250,8 +277,8 @@ void drawSphereMap(const GLMesh &mesh, const core::matrix4 &ModelMatrix, const c
setTexture(MeshShader::SphereMapShader::TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(MeshShader::SphereMapShader::TU_tex, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
MeshShader::SphereMapShader::setUniforms(ModelMatrix, InverseModelMatrix, irr_driver->getSceneManager()->getAmbientLight()); MeshShader::SphereMapShader::setUniforms(ModelMatrix, InverseModelMatrix, irr_driver->getSceneManager()->getAmbientLight());
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -330,8 +357,8 @@ void drawSplatting(const GLMesh &mesh, const core::matrix4 &ModelViewProjectionM
MeshShader::SplattingShader::setUniforms(ModelViewProjectionMatrix); MeshShader::SplattingShader::setUniforms(ModelViewProjectionMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -357,8 +384,8 @@ void drawObjectRefPass2(const GLMesh &mesh, const core::matrix4 &ModelViewProjec
MeshShader::ObjectRefPass2Shader::setUniforms(ModelViewProjectionMatrix, TextureMatrix); MeshShader::ObjectRefPass2Shader::setUniforms(ModelViewProjectionMatrix, TextureMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -386,8 +413,8 @@ void drawGrassPass2(const GLMesh &mesh, const core::matrix4 & ModelViewProjectio
MeshShader::GrassPass2Shader::setUniforms(ModelViewProjectionMatrix, windDir); MeshShader::GrassPass2Shader::setUniforms(ModelViewProjectionMatrix, windDir);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -400,8 +427,8 @@ void drawUntexturedObject(const GLMesh &mesh, const core::matrix4 &ModelMatrix)
MeshShader::UntexturedObjectShader::setUniforms(ModelMatrix); MeshShader::UntexturedObjectShader::setUniforms(ModelMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -427,8 +454,8 @@ void drawObjectRimLimit(const GLMesh &mesh, const core::matrix4 &ModelViewProjec
MeshShader::ObjectRimLimitShader::setUniforms(ModelViewProjectionMatrix, TransposeInverseModelView, TextureMatrix); MeshShader::ObjectRimLimitShader::setUniforms(ModelViewProjectionMatrix, TransposeInverseModelView, TextureMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -454,8 +481,8 @@ void drawObjectUnlit(const GLMesh &mesh, const core::matrix4 &ModelViewProjectio
MeshShader::ObjectUnlitShader::setUniforms(ModelViewProjectionMatrix); MeshShader::ObjectUnlitShader::setUniforms(ModelViewProjectionMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -483,8 +510,8 @@ void drawDetailledObjectPass2(const GLMesh &mesh, const core::matrix4 &ModelView
MeshShader::DetailledObjectPass2Shader::setUniforms(ModelViewProjectionMatrix); MeshShader::DetailledObjectPass2Shader::setUniforms(ModelViewProjectionMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -510,8 +537,8 @@ void drawObjectPass2(const GLMesh &mesh, const core::matrix4 &ModelViewProjectio
MeshShader::ObjectPass2Shader::setUniforms(ModelViewProjectionMatrix, TextureMatrix); MeshShader::ObjectPass2Shader::setUniforms(ModelViewProjectionMatrix, TextureMatrix);
assert(mesh.vao_second_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_second_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -527,8 +554,8 @@ void drawTransparentObject(const GLMesh &mesh, const core::matrix4 &ModelViewPro
MeshShader::TransparentShader::setUniforms(ModelViewProjectionMatrix, TextureMatrix, 0); MeshShader::TransparentShader::setUniforms(ModelViewProjectionMatrix, TextureMatrix, 0);
assert(mesh.vao_first_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_first_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -562,8 +589,8 @@ void drawTransparentFogObject(const GLMesh &mesh, const core::matrix4 &ModelView
glUseProgram(MeshShader::TransparentFogShader::Program); glUseProgram(MeshShader::TransparentFogShader::Program);
MeshShader::TransparentFogShader::setUniforms(ModelViewProjectionMatrix, TextureMatrix, fogmax, startH, endH, start, end, col, Camera::getCamera(0)->getCameraSceneNode()->getAbsolutePosition(), 0); MeshShader::TransparentFogShader::setUniforms(ModelViewProjectionMatrix, TextureMatrix, fogmax, startH, endH, start, end, col, Camera::getCamera(0)->getCameraSceneNode()->getAbsolutePosition(), 0);
assert(mesh.vao_first_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_first_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -582,8 +609,8 @@ void drawBubble(const GLMesh &mesh, const core::matrix4 &ModelViewProjectionMatr
MeshShader::BubbleShader::setUniforms(ModelViewProjectionMatrix, 0, time, transparency); MeshShader::BubbleShader::setUniforms(ModelViewProjectionMatrix, 0, time, transparency);
assert(mesh.vao_first_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_first_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -598,8 +625,8 @@ void drawShadowRef(const GLMesh &mesh, const core::matrix4 &ModelMatrix)
setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true); setTexture(0, getTextureGLuint(mesh.textures[0]), GL_LINEAR, GL_LINEAR_MIPMAP_LINEAR, true);
MeshShader::RefShadowShader::setUniforms(ModelMatrix, 0); MeshShader::RefShadowShader::setUniforms(ModelMatrix, 0);
assert(mesh.vao_shadow_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao);
glDrawElementsInstanced(ptype, count, itype, 0, 4); glDrawElementsInstanced(ptype, count, itype, 0, 4);
} }
@ -612,8 +639,8 @@ void drawShadow(const GLMesh &mesh, const core::matrix4 &ModelMatrix)
MeshShader::ShadowShader::setUniforms(ModelMatrix); MeshShader::ShadowShader::setUniforms(ModelMatrix);
assert(mesh.vao_shadow_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_shadow_pass); glBindVertexArray(mesh.vao);
glDrawElementsInstanced(ptype, count, itype, 0, 4); glDrawElementsInstanced(ptype, count, itype, 0, 4);
} }
@ -656,104 +683,11 @@ bool isObject(video::E_MATERIAL_TYPE type)
void initvaostate(GLMesh &mesh, GeometricMaterial GeoMat, ShadedMaterial ShadedMat) void initvaostate(GLMesh &mesh, GeometricMaterial GeoMat, ShadedMaterial ShadedMat)
{ {
switch (GeoMat) mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
{
case FPSM_DEFAULT:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectPass1Shader::attrib_position, MeshShader::ObjectPass1Shader::attrib_texcoord, -1, MeshShader::ObjectPass1Shader::attrib_normal, -1, -1, -1, mesh.Stride);
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::ShadowShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
mesh.vao_rsm_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::RSMShader::attrib_position, MeshShader::RSMShader::attrib_texcoord, -1, MeshShader::RSMShader::attrib_normal, -1, -1, -1, mesh.Stride);
break;
case FPSM_ALPHA_REF_TEXTURE:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectRefPass1Shader::attrib_position, MeshShader::ObjectRefPass1Shader::attrib_texcoord, -1, MeshShader::ObjectRefPass1Shader::attrib_normal, -1, -1, -1, mesh.Stride);
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::RefShadowShader::attrib_position, MeshShader::RefShadowShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
break;
case FPSM_NORMAL_MAP:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::NormalMapShader::attrib_position, MeshShader::NormalMapShader::attrib_texcoord, -1, -1, MeshShader::NormalMapShader::attrib_tangent, MeshShader::NormalMapShader::attrib_bitangent, -1, mesh.Stride);
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::ShadowShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
break;
case FPSM_GRASS:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::GrassPass1Shader::attrib_position, MeshShader::GrassPass1Shader::attrib_texcoord, -1, MeshShader::GrassPass1Shader::attrib_normal, -1, -1, MeshShader::GrassPass1Shader::attrib_color, mesh.Stride);
mesh.vao_shadow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::GrassShadowShader::attrib_position, MeshShader::GrassShadowShader::attrib_texcoord, -1, -1, -1, -1, MeshShader::GrassShadowShader::attrib_color, mesh.Stride);
break;
default:
assert(0 && "Unknow material");
break;
}
switch (ShadedMat)
{
case SM_SPHEREMAP:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::SphereMapShader::attrib_position, -1, -1, MeshShader::SphereMapShader::attrib_normal, -1, -1, -1, mesh.Stride);
break;
case SM_SPLATTING:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::SplattingShader::attrib_position, MeshShader::SplattingShader::attrib_texcoord, MeshShader::SplattingShader::attrib_second_texcoord, -1, -1, -1, -1, mesh.Stride);
break;
case SM_ALPHA_REF_TEXTURE:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectRefPass2Shader::attrib_position, MeshShader::ObjectRefPass2Shader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
break;
case SM_RIMLIT:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectRimLimitShader::attrib_position, MeshShader::ObjectRimLimitShader::attrib_texcoord, -1, MeshShader::ObjectRimLimitShader::attrib_normal, -1, -1, -1, mesh.Stride);
break;
case SM_GRASS:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::GrassPass2Shader::attrib_position, MeshShader::GrassPass2Shader::attrib_texcoord, -1, -1, -1, -1, MeshShader::GrassPass2Shader::attrib_color, mesh.Stride);
break;
case SM_UNLIT:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectUnlitShader::attrib_position, MeshShader::ObjectUnlitShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
break;
case SM_DETAILS:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::DetailledObjectPass2Shader::attrib_position, MeshShader::DetailledObjectPass2Shader::attrib_texcoord, MeshShader::DetailledObjectPass2Shader::attrib_second_texcoord, -1, -1, -1, -1, mesh.Stride);
break;
case SM_UNTEXTURED:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::UntexturedObjectShader::attrib_position, -1, -1, -1, -1, -1, MeshShader::UntexturedObjectShader::attrib_color, mesh.Stride);
break;
case SM_DEFAULT:
mesh.vao_second_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::ObjectPass2Shader::attrib_position, MeshShader::ObjectPass2Shader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
break;
default:
assert(0 && "unknow shaded material");
break;
}
mesh.vao_glow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::ColorizeShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
mesh.vao_displace_mask_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::DisplaceShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
if (mesh.Stride >= 44)
mesh.vao_displace_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::DisplaceShader::attrib_position, MeshShader::DisplaceShader::attrib_texcoord, MeshShader::DisplaceShader::attrib_second_texcoord, -1, -1, -1, -1, mesh.Stride);
} }
void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat) void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat)
{ {
switch (TranspMat) mesh.vao = createVAO(mesh.vertex_buffer, mesh.index_buffer, getVTXTYPEFromStride(mesh.Stride));
{
case TM_BUBBLE:
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::BubbleShader::attrib_position, MeshShader::BubbleShader::attrib_texcoord, -1, -1, -1, -1, -1, mesh.Stride);
break;
case TM_DEFAULT:
case TM_ADDITIVE:
if (World::getWorld() != NULL && World::getWorld()->isFogEnabled())
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::TransparentFogShader::attrib_position, MeshShader::TransparentFogShader::attrib_texcoord, -1, -1, -1, -1, MeshShader::TransparentFogShader::attrib_color, mesh.Stride);
else
mesh.vao_first_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer,
MeshShader::TransparentShader::attrib_position, MeshShader::TransparentShader::attrib_texcoord, -1, -1, -1, -1, MeshShader::TransparentShader::attrib_color, mesh.Stride);
break;
}
mesh.vao_glow_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::ColorizeShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
mesh.vao_displace_mask_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::DisplaceShader::attrib_position, -1, -1, -1, -1, -1, -1, mesh.Stride);
if (mesh.Stride >= 44)
mesh.vao_displace_pass = createVAO(mesh.vertex_buffer, mesh.index_buffer, MeshShader::DisplaceShader::attrib_position, MeshShader::DisplaceShader::attrib_texcoord, MeshShader::DisplaceShader::attrib_second_texcoord, -1, -1, -1, -1, mesh.Stride);
} }

View File

@ -42,6 +42,7 @@ enum TransparentMaterial
}; };
struct GLMesh { struct GLMesh {
GLuint vao;
GLuint vao_first_pass; GLuint vao_first_pass;
GLuint vao_second_pass; GLuint vao_second_pass;
GLuint vao_glow_pass; GLuint vao_glow_pass;
@ -59,8 +60,9 @@ struct GLMesh {
core::matrix4 TextureMatrix; core::matrix4 TextureMatrix;
}; };
GLuint createVAO(GLuint vbo, GLuint idx, GLuint attrib_position, GLuint attrib_texcoord, GLuint attrib_second_texcoord, GLuint attrib_normal, GLuint attrib_tangent, GLuint attrib_bitangent, GLuint attrib_color, size_t stride);
GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb); GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb);
video::E_VERTEX_TYPE getVTXTYPEFromStride(size_t stride);
GLuint createVAO(GLuint vbo, GLuint idx, video::E_VERTEX_TYPE type);
void initvaostate(GLMesh &mesh, GeometricMaterial GeoMat, ShadedMaterial ShadedMat); void initvaostate(GLMesh &mesh, GeometricMaterial GeoMat, ShadedMaterial ShadedMat);
void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat); void initvaostate(GLMesh &mesh, TransparentMaterial TranspMat);
core::matrix4 computeMVP(const core::matrix4 &ModelViewProjectionMatrix); core::matrix4 computeMVP(const core::matrix4 &ModelViewProjectionMatrix);

View File

@ -82,18 +82,8 @@ void STKMeshSceneNode::cleanGLMeshes()
GLMesh mesh = GLmeshes[i]; GLMesh mesh = GLmeshes[i];
if (!mesh.vertex_buffer) if (!mesh.vertex_buffer)
continue; continue;
if (mesh.vao_first_pass) if (mesh.vao)
glDeleteVertexArrays(1, &(mesh.vao_first_pass)); glDeleteVertexArrays(1, &(mesh.vao));
if (mesh.vao_second_pass)
glDeleteVertexArrays(1, &(mesh.vao_second_pass));
if (mesh.vao_glow_pass)
glDeleteVertexArrays(1, &(mesh.vao_glow_pass));
if (mesh.vao_displace_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_pass));
if (mesh.vao_displace_mask_pass)
glDeleteVertexArrays(1, &(mesh.vao_displace_mask_pass));
if (mesh.vao_shadow_pass)
glDeleteVertexArrays(1, &(mesh.vao_shadow_pass));
glDeleteBuffers(1, &(mesh.vertex_buffer)); glDeleteBuffers(1, &(mesh.vertex_buffer));
glDeleteBuffers(1, &(mesh.index_buffer)); glDeleteBuffers(1, &(mesh.index_buffer));
} }
@ -126,8 +116,8 @@ void STKMeshSceneNode::drawGlow(const GLMesh &mesh)
MeshShader::ColorizeShader::setUniforms(AbsoluteTransformation, cb->getRed(), cb->getGreen(), cb->getBlue()); MeshShader::ColorizeShader::setUniforms(AbsoluteTransformation, cb->getRed(), cb->getGreen(), cb->getBlue());
assert(mesh.vao_glow_pass); assert(mesh.vao);
glBindVertexArray(mesh.vao_glow_pass); glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -141,19 +131,14 @@ void STKMeshSceneNode::drawDisplace(const GLMesh &mesh)
GLenum itype = mesh.IndexType; GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount; size_t count = mesh.IndexCount;
ModelViewProjectionMatrix = computeMVP(AbsoluteTransformation);
core::matrix4 ModelViewMatrix = irr_driver->getViewMatrix();
ModelViewMatrix *= AbsoluteTransformation;
// Generate displace mask // Generate displace mask
// Use RTT_TMP4 as displace mask // Use RTT_TMP4 as displace mask
irr_driver->getFBO(FBO_TMP1_WITH_DS).Bind(); irr_driver->getFBO(FBO_TMP1_WITH_DS).Bind();
glUseProgram(MeshShader::DisplaceMaskShader::Program); glUseProgram(MeshShader::DisplaceMaskShader::Program);
MeshShader::DisplaceMaskShader::setUniforms(ModelViewProjectionMatrix); MeshShader::DisplaceMaskShader::setUniforms(AbsoluteTransformation);
assert(mesh.vao_displace_mask_pass); glBindVertexArray(mesh.vao);
glBindVertexArray(mesh.vao_displace_mask_pass);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
// Render the effect // Render the effect
@ -164,15 +149,13 @@ void STKMeshSceneNode::drawDisplace(const GLMesh &mesh)
setTexture(1, irr_driver->getRenderTargetTexture(RTT_TMP1), GL_LINEAR, GL_LINEAR, true); setTexture(1, irr_driver->getRenderTargetTexture(RTT_TMP1), GL_LINEAR, GL_LINEAR, true);
setTexture(2, irr_driver->getRenderTargetTexture(RTT_COLOR), GL_LINEAR, GL_LINEAR, true); setTexture(2, irr_driver->getRenderTargetTexture(RTT_COLOR), GL_LINEAR, GL_LINEAR, true);
glUseProgram(MeshShader::DisplaceShader::Program); glUseProgram(MeshShader::DisplaceShader::Program);
MeshShader::DisplaceShader::setUniforms(ModelViewProjectionMatrix, ModelViewMatrix, MeshShader::DisplaceShader::setUniforms(AbsoluteTransformation,
core::vector2df(cb->getDirX(), cb->getDirY()), core::vector2df(cb->getDirX(), cb->getDirY()),
core::vector2df(cb->getDir2X(), cb->getDir2Y()), core::vector2df(cb->getDir2X(), cb->getDir2Y()),
core::vector2df(float(UserConfigParams::m_width), core::vector2df(float(UserConfigParams::m_width),
float(UserConfigParams::m_height)), float(UserConfigParams::m_height)),
0, 1, 2); 0, 1, 2);
assert(mesh.vao_displace_pass);
glBindVertexArray(mesh.vao_displace_pass);
glDrawElements(ptype, count, itype, 0); glDrawElements(ptype, count, itype, 0);
} }
@ -420,13 +403,13 @@ void STKMeshSceneNode::render()
for_in(mesh, TransparentMesh[TM_DEFAULT]) for_in(mesh, TransparentMesh[TM_DEFAULT])
{ {
TransparentMeshes<TM_DEFAULT>::MeshSet.push_back(mesh); TransparentMeshes<TM_DEFAULT>::MeshSet.push_back(mesh);
TransparentMeshes<TM_DEFAULT>::MVPSet.push_back(ModelViewProjectionMatrix); TransparentMeshes<TM_DEFAULT>::MVPSet.push_back(AbsoluteTransformation);
} }
for_in(mesh, TransparentMesh[TM_ADDITIVE]) for_in(mesh, TransparentMesh[TM_ADDITIVE])
{ {
TransparentMeshes<TM_ADDITIVE>::MeshSet.push_back(mesh); TransparentMeshes<TM_ADDITIVE>::MeshSet.push_back(mesh);
TransparentMeshes<TM_ADDITIVE>::MVPSet.push_back(ModelViewProjectionMatrix); TransparentMeshes<TM_ADDITIVE>::MVPSet.push_back(AbsoluteTransformation);
} }
if (!TransparentMesh[TM_BUBBLE].empty()) if (!TransparentMesh[TM_BUBBLE].empty())

View File

@ -662,6 +662,7 @@ namespace GUIEngine
#include "io/file_manager.hpp" #include "io/file_manager.hpp"
#include "guiengine/event_handler.hpp" #include "guiengine/event_handler.hpp"
#include "guiengine/modaldialog.hpp" #include "guiengine/modaldialog.hpp"
#include "guiengine/message_queue.hpp"
#include "guiengine/scalable_font.hpp" #include "guiengine/scalable_font.hpp"
#include "guiengine/screen.hpp" #include "guiengine/screen.hpp"
#include "guiengine/skin.hpp" #include "guiengine/skin.hpp"
@ -1189,6 +1190,8 @@ namespace GUIEngine
// further render) // further render)
g_env->drawAll(); g_env->drawAll();
MessageQueue::update(elapsed_time);
// ---- some menus may need updating // ---- some menus may need updating
if (gamestate != GAME) if (gamestate != GAME)
{ {

180
src/guiengine/message_queue.cpp Executable file
View File

@ -0,0 +1,180 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 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
// 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.
/**
\page addons Addons
*/
#include "guiengine/message_queue.hpp"
#include "config/user_config.hpp"
#include "guiengine/engine.hpp"
#include "guiengine/scalable_font.hpp"
#include "guiengine/skin.hpp"
#include "IGUIElement.h"
using namespace GUIEngine;
namespace MessageQueue
{
/** A small helper class to store and sort messages to be displayed. */
class Message
{
private:
/** The type of the message. */
MessageQueue::MessageType m_message_type;
/** The message. */
core::stringw m_message;
/** The render type of the message: either achievement-message::neutral
* or friend-message::neutral. */
std::string m_render_type;
public:
Message(MessageQueue::MessageType mt, const core::stringw &message)
{
m_message_type = mt;
m_message = message;
if(mt==MessageQueue::MT_ACHIEVEMENT)
m_render_type = "achievement-message::neutral";
else
m_render_type = "friend-message::neutral";
} // Message
// ------------------------------------------------------------------------
/** Returns the message. */
const core::stringw & getMessage() const { return m_message; }
// ------------------------------------------------------------------------
/** Returns the type of the message (achievement or friend). */
MessageQueue::MessageType getMessageType() const { return m_message_type; }
// ------------------------------------------------------------------------
/** Returns the render type: either achievement-message::neutral or
* friend-message::neutral (see skin for details). */
const std::string &getRenderType() const
{
return m_render_type;
}
}; // class Message
// ============================================================================
/** A function class to compare messages, required for priority_queue. */
class CompareMessages
{
public:
/** Used to sort messages by priority in the priority queue. Achievement
* messages (1) need to have a higher priority than friend messages
* (value 0). */
bool operator() (const Message *a, const Message *b) const
{
return a->getMessageType() < b->getMessageType();
} // operator ()
}; // operator()
// ============================================================================
/** List of all messages. */
std::priority_queue<Message*, std::vector<Message*>,
CompareMessages> g_all_messages;
/** How long the current message has been displayed. The special value
* -1 indicates that a new message was added when the queue was empty. */
float g_current_display_time = -1.0f;
/** How long the current message should be displaed. */
float g_max_display_time = -1.0f;
/** The label widget used to show the current message. */
SkinWidgetContainer *g_container = NULL;
core::recti g_area;
// ============================================================================
void createLabel(const Message *message)
{
if(!g_container)
g_container = new SkinWidgetContainer();
gui::ScalableFont *font = GUIEngine::getFont();
core::dimension2du dim = font->getDimension(message->getMessage().c_str());
g_current_display_time = 0.0f;
// Maybe make this time dependent on message length as well?
g_max_display_time = 5.0f;
const GUIEngine::BoxRenderParams &brp =
GUIEngine::getSkin()->getBoxRenderParams(message->getRenderType());
dim.Width +=brp.m_left_border + brp.m_right_border;
int x = (UserConfigParams::m_width - dim.Width) / 2;
int y = UserConfigParams::m_height - int(1.5f*dim.Height);
g_area = irr::core::recti(x, y, x+dim.Width, y+dim.Height);
} // createLabel
// ----------------------------------------------------------------------------
/** Adds a message to the message queue.
* \param mt The MessageType of the message.
* \param message The actual message.
*/
void add(MessageType mt, const irr::core::stringw &message)
{
Message *m = new Message(mt, message);
if(g_all_messages.size()==0)
{
// Indicate that there is a new message, which should
// which needs a new label etc. to be computed.
g_current_display_time =-1.0f;
}
g_all_messages.push(m);
} // add
// ----------------------------------------------------------------------------
/** Update function called from the GUIEngine to handle displaying of the
* messages. It will make sure that each message is shown for a certain
* amount of time, before it is discarded and the next message (if any)
* is displayed.
* \param dt Time step size.
*/
void update(float dt)
{
if(g_all_messages.size()==0) return;
g_current_display_time += dt;
if(g_current_display_time > g_max_display_time)
{
Message *last = g_all_messages.top();
g_all_messages.pop();
delete last;
if(g_all_messages.size()==0) return;
g_current_display_time = -1.0f;
}
// Create new data for the display.
if(g_current_display_time < 0)
{
createLabel(g_all_messages.top());
}
Message *current = g_all_messages.top();
GUIEngine::getSkin()->drawMessage(g_container, g_area,
current->getRenderType());
gui::ScalableFont *font = GUIEngine::getFont();
video::SColor color(255, 0, 0, 0);
font->draw(current->getMessage(), g_area, color, true, true);
} // update
} // namespace GUIEngine
// ----------------------------------------------------------------------------

View File

@ -0,0 +1,43 @@
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 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
// 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.
#ifndef HEADER_MESSAGE_QUEUE_HPP
#define HEADER_MESSAGE_QUEUE_HPP
#include "guiengine/widgets/label_widget.hpp"
#include "irrString.h"
#include <queue>
#include <vector>
using namespace irr;
namespace MessageQueue
{
/** The various message type which can be shown (which might use a
* different look. This type is used to sort the messages, so it is
* important that messages that need to be shown as early as possible
* will be listed last (i.e. have highest priority). */
enum MessageType {MT_FRIEND, MT_ACHIEVEMENT};
void add(MessageType mt, const core::stringw &message);
void update(float dt);
}; // namespace GUIEngine
#endif

View File

@ -373,6 +373,28 @@ void Skin::drawBgImage()
irr_driver->getVideoDriver()->enableMaterial2D(false); irr_driver->getVideoDriver()->enableMaterial2D(false);
} // drawBgImage } // drawBgImage
// ----------------------------------------------------------------------------
/** Returns the BoxRenderParams data structure for a given type.
* \param type The type name of the box render param to get.
*/
const BoxRenderParams& Skin::getBoxRenderParams(const std::string &type)
{
return SkinConfig::m_render_params[type];
} // getBoxRenderParams
// ----------------------------------------------------------------------------
/** Draws a background box for an in-game notification message. Example would
* be an achievement, or friends comming online.
* \param w The SkinWidgetContainer for the outline.
* \param dest The destination rectangle to use.
* \param type The type of the message (achievement or friend).
*/
void Skin::drawMessage(SkinWidgetContainer* w, const core::recti &dest,
const std::string &type)
{
drawBoxFromStretchableTexture(w, dest, SkinConfig::m_render_params[type]);
} // drawMessage
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void Skin::drawBoxFromStretchableTexture(SkinWidgetContainer* w, void Skin::drawBoxFromStretchableTexture(SkinWidgetContainer* w,
const core::recti &dest, const core::recti &dest,

View File

@ -270,9 +270,7 @@ namespace GUIEngine
video::ITexture* bg_image; video::ITexture* bg_image;
std::vector<Widget*> m_tooltips; std::vector<Widget*> m_tooltips;
std::vector<bool> m_tooltip_at_mouse; std::vector<bool> m_tooltip_at_mouse;
#ifdef USE_PER_LINE_BACKGROUND
public:
#endif
LEAK_CHECK() LEAK_CHECK()
void drawBoxFromStretchableTexture(SkinWidgetContainer* w, void drawBoxFromStretchableTexture(SkinWidgetContainer* w,
@ -396,10 +394,11 @@ namespace GUIEngine
virtual const wchar_t* virtual const wchar_t*
getDefaultText(gui::EGUI_DEFAULT_TEXT text) const; getDefaultText(gui::EGUI_DEFAULT_TEXT text) const;
virtual gui::IGUIFont* getFont(gui::EGUI_DEFAULT_FONT which= virtual gui::IGUIFont* getFont(gui::EGUI_DEFAULT_FONT which=
gui::EGDF_DEFAULT) const ; gui::EGDF_DEFAULT) const;
virtual u32 getIcon (gui::EGUI_DEFAULT_ICON icon) const ; virtual u32 getIcon (gui::EGUI_DEFAULT_ICON icon) const;
virtual s32 getSize (gui::EGUI_DEFAULT_SIZE size) const ; virtual s32 getSize (gui::EGUI_DEFAULT_SIZE size) const;
virtual gui::IGUISpriteBank * getSpriteBank () const ; const BoxRenderParams& getBoxRenderParams(const std::string &type);
virtual gui::IGUISpriteBank * getSpriteBank () const;
virtual void setColor (gui::EGUI_DEFAULT_COLOR which, virtual void setColor (gui::EGUI_DEFAULT_COLOR which,
video::SColor newColor); video::SColor newColor);
virtual void setDefaultText (gui::EGUI_DEFAULT_TEXT which, virtual void setDefaultText (gui::EGUI_DEFAULT_TEXT which,
@ -411,6 +410,8 @@ namespace GUIEngine
virtual void setSpriteBank (gui::IGUISpriteBank *bank); virtual void setSpriteBank (gui::IGUISpriteBank *bank);
void drawTooltips(); void drawTooltips();
void drawMessage(SkinWidgetContainer* w, const core::recti &dest,
const std::string &type);
video::ITexture* getImage(const char* name); video::ITexture* getImage(const char* name);

View File

@ -2540,6 +2540,8 @@ void Kart::updateGraphics(float dt, const Vec3& offset_xyz,
center_shift.setY(m_skidding->getGraphicalJumpOffset() + lean_height center_shift.setY(m_skidding->getGraphicalJumpOffset() + lean_height
- m_kart_model->getLowestPoint() -chassis_delta ); - m_kart_model->getLowestPoint() -chassis_delta );
center_shift = getTrans().getBasis() * center_shift;
float heading = m_skidding->getVisualSkidRotation(); float heading = m_skidding->getVisualSkidRotation();
Moveable::updateGraphics(dt, center_shift, Moveable::updateGraphics(dt, center_shift,
btQuaternion(heading, 0, m_current_lean)); btQuaternion(heading, 0, m_current_lean));

View File

@ -176,7 +176,7 @@ void MainLoop::run()
PROFILER_SYNC_FRAME(); PROFILER_SYNC_FRAME();
PROFILER_POP_CPU_MARKER(); PROFILER_POP_CPU_MARKER();
} // while !m_exit } // while !m_abort
} // run } // run

View File

@ -628,7 +628,7 @@ void World::resetAllKarts()
{ {
if (count++ > 100) if (count++ > 100)
{ {
Log::error("World", "Infitine loop waiting for all_finished?"); Log::error("World", "Infinite loop waiting for all_finished?");
break; break;
} }
m_physics->update(1.f/60.f); m_physics->update(1.f/60.f);

View File

@ -22,7 +22,7 @@
#include "achievements/achievements_manager.hpp" #include "achievements/achievements_manager.hpp"
#include "config/player_manager.hpp" #include "config/player_manager.hpp"
#include "config/user_config.hpp" #include "config/user_config.hpp"
#include "guiengine/dialog_queue.hpp" #include "guiengine/message_queue.hpp"
#include "guiengine/screen.hpp" #include "guiengine/screen.hpp"
#include "online/online_profile.hpp" #include "online/online_profile.hpp"
#include "online/profile_manager.hpp" #include "online/profile_manager.hpp"
@ -379,11 +379,7 @@ namespace Online
message = _("%d friends are now online.", message = _("%d friends are now online.",
to_notify.size()); to_notify.size());
} }
NotificationDialog *dia = MessageQueue::add(MessageQueue::MT_FRIEND, message);
new NotificationDialog(NotificationDialog::T_Friends,
message);
GUIEngine::DialogQueue::get()->pushDialog(dia, false);
OnlineProfileFriends::getInstance()->refreshFriendsList();
} }
else if(went_offline) else if(went_offline)
{ {
@ -422,10 +418,7 @@ namespace Online
{ {
message = _("You have a new friend request!"); message = _("You have a new friend request!");
} }
NotificationDialog *dia = MessageQueue::add(MessageQueue::MT_FRIEND, message);
new NotificationDialog(NotificationDialog::T_Friends,
message);
GUIEngine::DialogQueue::get()->pushDialog(dia, false);
OnlineProfileFriends::getInstance()->refreshFriendsList(); OnlineProfileFriends::getInstance()->refreshFriendsList();
} }
} }

View File

@ -101,12 +101,6 @@ private:
video::ITexture *m_kart_icon; video::ITexture *m_kart_icon;
/** The times of all karts in the right order. */ /** The times of all karts in the right order. */
core::stringw m_finish_time_string; core::stringw m_finish_time_string;
#ifdef USE_PER_LINE_BACKGROUND
/** For the background bar behind each line. */
GUIEngine::SkinWidgetContainer m_widget_container;
/** The parameter for rendering the background box. */
GUIEngine::BoxRenderParams m_box_params;
#endif
}; // Rowinfo }; // Rowinfo
/** The team icons. */ /** The team icons. */

View File

@ -368,6 +368,9 @@ void TrackObjectPresentationMesh::init(const XMLNode* xml_node, scene::ISceneNod
m_node = irr_driver->addMesh(m_mesh, parent); m_node = irr_driver->addMesh(m_mesh, parent);
m_frame_start = 0; m_frame_start = 0;
m_frame_end = 0; m_frame_end = 0;
if (World::getWorld() != NULL && World::getWorld()->getTrack() != NULL)
World::getWorld()->getTrack()->handleAnimatedTextures(m_node, *xml_node);
} }
//#ifdef DEBUG //#ifdef DEBUG
// std::string debug_name = model_name+" (track-object)"; // std::string debug_name = model_name+" (track-object)";

27
tools/simplify_challenges.sh Executable file
View File

@ -0,0 +1,27 @@
#!/bin/bash
# This script simplifies all challenges by removing any time
# limit, position requirement, etc, and setting the number
# of laps to 0. This is meant to quickly test the story
# mode without having to fully play all challenges.
for i in data/challenges/*.challenge; do
echo "Simplifying $i"
cat $i | sed 's/position="[0-9]*"/position="99"/' \
| sed 's/laps="[0-9]*"/laps="0"/' \
| sed 's/energy="[0-9]*"/energy="0"/' \
| sed 's/time="[0-9]*"/time="9999"/' \
> $i.new
mv $i.new $i
done
for i in data/grandprix/*.grandprix; do
echo "Simplyfing GP $i"
cat $i | sed 's/laps="[0-9]*"/laps="0"/' > $i.new
mv $i.new $i
done
echo
echo "All challenges simplified."
echo "PLEASE do not commit the changes back to our repository!"
echo "========================================================"