love-demo/vertex_minecraft.glsl

82 lines
3.3 KiB
GLSL

#pragma language glsl4
struct vertex_t {
vec3 position;
vec3 normal;
};
vertex_t vertices[] = vertex_t[](vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, 0.0, 1.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(-1.0, 0.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(-1.0, 0.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(-1.0, 0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, -1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(1.0, 0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(1.0, 0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(1.0, 0.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0)),
vertex_t(vec3(1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0)),
vertex_t(vec3(-1.0, -1.0, -1.0), vec3(0.0, 0.0, -1.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 1.0, 0.0)),
vertex_t(vec3(-1.0, 1.0, 1.0), vec3(0.0, 0.0, 1.0)),
vertex_t(vec3(-1.0, 1.0, -1.0), vec3(-1.0, 0.0, 0.0)),
vertex_t(vec3(1.0, -1.0, 1.0), vec3(0.0, -1.0, 0.0)),
vertex_t(vec3(1.0, 1.0, 1.0), vec3(1.0, 0.0, 0.0)),
vertex_t(vec3(1.0, 1.0, -1.0), vec3(0.0, 0.0, -1.0)));
uniform mat4 transform;
out vec3 PixelNormal;
out vec3 PixelColor;
out float PixelBlock;
struct block_t {
uint x_z_blockid;
uint block_index;
};
layout (std430) readonly buffer BlocksLayout
{
block_t Blocks[];
};
vec3 palette(float t) {
vec3 a = vec3(0.5, 0.5, 0.5);
vec3 b = vec3(0.5, 0.5, 0.5);
vec3 c = vec3(1.0, 1.0, 1.0);
vec3 d = vec3(0.263, 0.416, 0.557);
return a + b * cos(6.28318 * (c * t + d));
}
int sign_extend(uint x)
{
return int(((x + 0x80) & 0xff) - 0x80);
}
void vertexmain()
{
vertex_t vertex = vertices[gl_VertexID];
block_t block = Blocks[int(gl_InstanceID)];
float x = float(block.block_index / (128 * 16));
float y = float(block.block_index % 128);
float z = float(int(block.block_index / 128) % 16);
float chunk_x = float(sign_extend((block.x_z_blockid >> 0) & 0xff));
float chunk_z = float(sign_extend((block.x_z_blockid >> 8) & 0xff));
int block_id = int((block.x_z_blockid >> 16) & 0xff);
PixelNormal = vertex.normal;
PixelColor = palette(float(block_id) * 0.01);
PixelBlock = block_id;
vec3 position = ((vertex.position * 0.4) + vec3(x, z, y) + vec3(chunk_x * 16.0, chunk_z * 16.0, 0));
love_Position = transform * vec4(position, 1.0);
}