82 lines
3.3 KiB
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);
|
|
}
|