playscii/shaders/renderable_v.glsl

46 lines
1.2 KiB
GLSL

uniform mat4 projection;
uniform mat4 view;
uniform vec3 objectPosition;
uniform vec3 objectScale;
uniform int charMapWidth;
uniform int charMapHeight;
uniform float charUVWidth;
uniform float charUVHeight;
in vec3 vertPosition;
in float charIndex;
in vec2 uvMod;
in float fgColorIndex;
in float bgColorIndex;
out vec2 texCoords;
out float theFgColorIndex;
out float theBgColorIndex;
mat4 scale(float x, float y, float z)
{
return mat4(
vec4(x, 0.0, 0.0, 0.0),
vec4(0.0, y, 0.0, 0.0),
vec4(0.0, 0.0, z, 0.0),
vec4(0.0, 0.0, 0.0, 1.0)
);
}
void main()
{
vec4 model = vec4(vertPosition, 1);
model *= scale(objectScale.x, objectScale.y, objectScale.z);
model += vec4(objectPosition, 0);
gl_Position = projection * view * model;
// translate 1D character index into tile UV coordinates
// thanks Ian MacLarty, Sean Barrett and goldbuick for help with this!
float tileX = mod(charIndex, charMapWidth);
float tileY = charMapHeight - floor(charIndex / charMapWidth);
vec2 uv0 = vec2(tileX * charUVWidth, tileY * charUVHeight);
vec2 uv1 = vec2(uvMod.x * charUVWidth, uvMod.y * -charUVHeight);
texCoords = uv0 + uv1;
theFgColorIndex = fgColorIndex;
theBgColorIndex = bgColorIndex;
}