ProjectZombie/src/resources/shader/environmentRenderer.vsh

83 lines
1.8 KiB
GLSL

#version 330
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aTex;
layout (location = 2) in vec2 aTexY;
layout (location = 3) in vec3 aOffset;
layout (location = 4) in vec2 aAnimate;
layout (location = 5) in vec3 aFlags;
out float pCameraDepth;
out vec3 pSunDepth;
out vec3 pLightMapPos;
out vec3 pTexture;
out vec2 pVertex;
out vec3 pPos;
flat out int pFlags;
flat out float pFade;
flat out int pRGB;
uniform mat4 camera;
uniform mat4 projection_sun;
uniform mat4 billboard;
uniform mat4 projection;
uniform mat4 model;
uniform mat4 rotated;
uniform float mist;
uniform int time;
uniform int mode;
float map(float x, float in_min, float in_max, float out_min, float out_max) {
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
mat4 translate(vec3 vec)
{
mat4 result = mat4(1);
result[0][3] = vec.x;
result[1][3] = vec.y;
result[2][3] = vec.z;
return result;
}
float getTexY()
{
float animate_count = aAnimate.x;
float animate_speed = aAnimate.y;
float animate_index = mod(time / int(animate_speed), animate_count);
float tex_y_size = (aTexY.y - aTexY.x) / animate_count;
float tex_y = map(
aTex.y, aTexY.x, aTexY.y,
aTexY.x + tex_y_size * animate_index,
aTexY.x + tex_y_size * (animate_index + 1));
return tex_y;
}
void main()
{
int type = int(aFlags.z);
vec4 pos = vec4(aPos, 1) * (mod(type >> 3, 2) == 1 ? billboard : (mod(type, 2) == 1 ? rotated : mat4(1))) *
translate(aOffset) * model;
gl_Position = pos * projection;
pVertex = pos.xy / pos.w;
if(mode == 0) {
pCameraDepth = mod(type >> 4, 2) == 1 ? 0 : min(1, mist * (-(pos * camera).z * 0.5 + 0.5));
pSunDepth = (pos * projection_sun).xyz;
pLightMapPos = pos.xyz;
pRGB = int(aFlags.y);
pFade = aFlags.x;
}
pTexture = vec3(aTex.x, getTexY(), aTex.z);
pFlags = type;
pPos = aPos;
}