83 lines
1.8 KiB
GLSL
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;
|
|
} |