Skip to content

Commit

Permalink
Simple shader fixes. (#8991)
Browse files Browse the repository at this point in the history
1. Pass current camera offset to shader, so shader have access to the global coordinates
2. Pass animation timer to fragment shader. C++ code is already there, just wasn't declared in the shader
3. Delay animation timer wrap-around (from 100s to about 16 minutes)
  • Loading branch information
lhofhansl committed Sep 26, 2019
1 parent 9e95bac commit 5fde697
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 1 deletion.
9 changes: 9 additions & 0 deletions client/shaders/nodes_shader/opengl_fragment.glsl
Expand Up @@ -6,7 +6,16 @@ uniform vec4 skyBgColor;
uniform float fogDistance;
uniform vec3 eyePosition;

// The cameraOffset is the current center of the visible world.
uniform vec3 cameraOffset;
uniform float animationTimer;

varying vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision.
// If the absolute position is required it can be calculated with
// cameraOffset + worldPosition (for large coordinates the limits of float
// precision must be considered).
varying vec3 worldPosition;
varying float area_enable_parallax;

Expand Down
8 changes: 8 additions & 0 deletions client/shaders/nodes_shader/opengl_vertex.glsl
Expand Up @@ -4,9 +4,17 @@ uniform mat4 mWorld;
// Color of the light emitted by the sun.
uniform vec3 dayLight;
uniform vec3 eyePosition;

// The cameraOffset is the current center of the visible world.
uniform vec3 cameraOffset;
uniform float animationTimer;

varying vec3 vPosition;
// World position in the visible world (i.e. relative to the cameraOffset.)
// This can be used for many shader effects without loss of precision.
// If the absolute position is required it can be calculated with
// cameraOffset + worldPosition (for large coordinates the limits of float
// precision must be considered).
varying vec3 worldPosition;

varying vec3 eyeVec;
Expand Down
18 changes: 17 additions & 1 deletion src/client/game.cpp
Expand Up @@ -413,6 +413,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
CachedPixelShaderSetting<float, 3> m_eye_position_pixel;
CachedVertexShaderSetting<float, 3> m_eye_position_vertex;
CachedPixelShaderSetting<float, 3> m_minimap_yaw;
CachedPixelShaderSetting<float, 3> m_camera_offset_pixel;
CachedPixelShaderSetting<float, 3> m_camera_offset_vertex;
CachedPixelShaderSetting<SamplerLayer_t> m_base_texture;
CachedPixelShaderSetting<SamplerLayer_t> m_normal_texture;
CachedPixelShaderSetting<SamplerLayer_t> m_texture_flags;
Expand Down Expand Up @@ -445,6 +447,8 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
m_eye_position_pixel("eyePosition"),
m_eye_position_vertex("eyePosition"),
m_minimap_yaw("yawVec"),
m_camera_offset_pixel("cameraOffset"),
m_camera_offset_vertex("cameraOffset"),
m_base_texture("baseTexture"),
m_normal_texture("normalTexture"),
m_texture_flags("textureFlags"),
Expand Down Expand Up @@ -493,7 +497,7 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
sunlight.b };
m_day_light.set(dnc, services);

u32 animation_timer = porting::getTimeMs() % 100000;
u32 animation_timer = porting::getTimeMs() % 1000000;
float animation_timer_f = (float)animation_timer / 100000.f;
m_animation_timer_vertex.set(&animation_timer_f, services);
m_animation_timer_pixel.set(&animation_timer_f, services);
Expand Down Expand Up @@ -523,6 +527,18 @@ class GameGlobalShaderConstantSetter : public IShaderConstantSetter
m_minimap_yaw.set(minimap_yaw_array, services);
}

float camera_offset_array[3];
v3f offset = intToFloat(m_client->getCamera()->getOffset(), BS);
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
camera_offset_array[0] = offset.X;
camera_offset_array[1] = offset.Y;
camera_offset_array[2] = offset.Z;
#else
offset.getAs3Values(camera_offset_array);
#endif
m_camera_offset_pixel.set(camera_offset_array, services);
m_camera_offset_vertex.set(camera_offset_array, services);

SamplerLayer_t base_tex = 0,
normal_tex = 1,
flags_tex = 2;
Expand Down

0 comments on commit 5fde697

Please sign in to comment.