78 lines
1.9 KiB
GLSL
78 lines
1.9 KiB
GLSL
#version 460 core
|
|
|
|
#define FACE_YP 0
|
|
#define FACE_Y 1
|
|
#define FACE_XP 2
|
|
#define FACE_X 3
|
|
#define FACE_ZP 4
|
|
#define FACE_Z 5
|
|
|
|
layout(location = 0) in vec3 aPos;
|
|
layout(location = 1) in int packed_data;
|
|
layout(location = 2) in int block_id;
|
|
layout(std430, binding = 3) buffer ssbo {
|
|
int ssbo_data[];
|
|
};
|
|
|
|
uniform mat4 mvp;
|
|
uniform mat4 matView;
|
|
uniform mat4 matProjection;
|
|
uniform mat4 matModel;
|
|
|
|
out vec3 frag_pos;
|
|
out vec3 face_normal;
|
|
flat out int block_id_out;
|
|
flat out int face;
|
|
|
|
const vec3 NORMALS[6] = vec3[](
|
|
vec3( 0.0, 1.0, 0.0),
|
|
vec3( 0.0, -1.0, 0.0),
|
|
vec3( 1.0, 0.0, 0.0),
|
|
vec3(-1.0, 0.0, 0.0),
|
|
vec3( 0.0, 0.0, 1.0),
|
|
vec3( 0.0, 0.0, -1.0)
|
|
);
|
|
|
|
const mat3 ROTATIONS[6] = mat3[](
|
|
mat3(1,0,0, 0,0,-1, 0,1,0),
|
|
mat3(1,0,0, 0,0,1, 0,-1,0),
|
|
mat3(0,0,-1, 0,1,0, 1,0,0),
|
|
mat3(0,0,1, 0,1,0, -1,0,0),
|
|
mat3(1,0,0, 0,1,0, 0,0,1),
|
|
mat3(-1,0,0, 0,1,0, 0,0,-1)
|
|
);
|
|
|
|
const vec3 FACE_OFFSET[6] = vec3[](
|
|
vec3(0.0, 0.5, 0.5),
|
|
vec3(0.0, 0.0, 0.0),
|
|
vec3(0.5, 0.0, 0.5),
|
|
vec3(0.0, 0.0, 0.0),
|
|
vec3(0.0, 0.0, 0.5),
|
|
vec3(0.5, 0.0, 0.0)
|
|
);
|
|
|
|
void main() {
|
|
int x = (packed_data >> 0) & 0x3F;
|
|
int y = (packed_data >> 6) & 0x3F;
|
|
int z = (packed_data >> 12) & 0x3F;
|
|
int width = (packed_data >> 18) & 0x3F;
|
|
int height = (packed_data >> 24) & 0x3F;
|
|
|
|
face = block_id & 0x07;
|
|
block_id_out = (block_id >> 3) & 0x1FFF;
|
|
|
|
vec3 vox_pos = vec3(x, y, z) * 0.5;
|
|
vec3 vPos = vec3(aPos.x * width, aPos.y * height, aPos.z);
|
|
vec3 rotated_aPos = ROTATIONS[face] * vPos;
|
|
|
|
|
|
int packed_pos = ssbo_data[gl_DrawID];//need to be called via multi draw command ???
|
|
vec3 chunk_pos = vec3((packed_pos & 0x1f), ((packed_pos >> 5) & 0x1f), ((packed_pos >> 10) & 0x1f));
|
|
|
|
vec3 world_pos = vox_pos + FACE_OFFSET[face] + chunk_pos + rotated_aPos;
|
|
gl_Position = matProjection * matView * matModel * vec4(world_pos, 1.0);
|
|
|
|
frag_pos = world_pos;
|
|
face_normal = NORMALS[face];
|
|
}
|