Make it possible to draw larger quads (although all of them are drawn at a 1×1 size at the moment).

more progress towards #133
This commit is contained in:
IntegratedQuantum 2024-07-04 21:14:11 +02:00
parent 0cc05368cc
commit b1bd04f1bc
3 changed files with 24 additions and 9 deletions

View File

@ -85,8 +85,8 @@ vec3 unpack15BitLight(uint val) {
} }
vec3 readLightValue() { vec3 readLightValue() {
uint x = uint(lightPosition.x); uint x = clamp(uint(lightPosition.x), 0, lightArea.x - 1);
uint y = uint(lightPosition.y); uint y = clamp(uint(lightPosition.y), 0, lightArea.y - 1);
uint light00 = lightData[lightBufferIndex + (x*lightArea.y + y)]; uint light00 = lightData[lightBufferIndex + (x*lightArea.y + y)];
uint light01 = lightData[lightBufferIndex + (x*lightArea.y + y + 1)]; uint light01 = lightData[lightBufferIndex + (x*lightArea.y + y + 1)];
uint light10 = lightData[lightBufferIndex + ((x + 1)*lightArea.y + y)]; uint light10 = lightData[lightBufferIndex + ((x + 1)*lightArea.y + y)];

View File

@ -98,10 +98,14 @@ void main() {
vec3 modelPosition = vec3(chunks[chunkID].position.xyz - playerPositionInteger) - playerPositionFraction; vec3 modelPosition = vec3(chunks[chunkID].position.xyz - playerPositionInteger) - playerPositionFraction;
int encodedPosition = faceData[faceID].encodedPosition; int encodedPosition = faceData[faceID].encodedPosition;
int textureAndQuad = faceData[faceID].textureAndQuad; int textureAndQuad = faceData[faceID].textureAndQuad;
uvec2 quadSize = uvec2(
encodedPosition >> 15 & 31,
encodedPosition >> 20 & 31
);
lightBufferIndex = (transparent ? chunks[chunkID].lightStartTransparent : chunks[chunkID].lightStartOpaque) + faceData[faceID].lightBufferIndex; lightBufferIndex = (transparent ? chunks[chunkID].lightStartTransparent : chunks[chunkID].lightStartOpaque) + faceData[faceID].lightBufferIndex;
lightArea = uvec2(2, 2); lightArea = quadSize + uvec2(1, 1);
lightPosition = vec2(vertexID >> 1, vertexID & 1); lightPosition = vec2(vertexID >> 1, vertexID & 1);
isBackFace = encodedPosition>>19 & 1; isBackFace = encodedPosition>>31 & 1;
ditherSeed = encodedPosition & 15; ditherSeed = encodedPosition & 15;
textureIndex = textureAndQuad & 65535; textureIndex = textureAndQuad & 65535;
@ -120,7 +124,17 @@ void main() {
normal = quads[quadIndex].normal; normal = quads[quadIndex].normal;
position += quads[quadIndex].corners[vertexID]; vec3 cornerPosition = quads[quadIndex].corners[0];
vec2 uvCornerPosition = quads[quadIndex].cornerUV[0];
if((vertexID & 2) != 0) {
cornerPosition += (quads[quadIndex].corners[2] - quads[quadIndex].corners[0])*quadSize.x;
uvCornerPosition += (quads[quadIndex].cornerUV[2] - quads[quadIndex].cornerUV[0])*quadSize.x;
}
if((vertexID & 1) != 0) {
cornerPosition += (quads[quadIndex].corners[vertexID] - quads[quadIndex].corners[vertexID & 2])*quadSize.y;
uvCornerPosition += (quads[quadIndex].cornerUV[vertexID] - quads[quadIndex].cornerUV[vertexID & 2])*quadSize.y;
}
position += cornerPosition;
position *= voxelSize; position *= voxelSize;
position += modelPosition; position += modelPosition;
@ -129,5 +143,5 @@ void main() {
vec4 mvPos = viewMatrix*vec4(position, 1); vec4 mvPos = viewMatrix*vec4(position, 1);
gl_Position = projectionMatrix*mvPos; gl_Position = projectionMatrix*mvPos;
mvVertexPos = mvPos.xyz; mvVertexPos = mvPos.xyz;
uv = quads[quadIndex].cornerUV[vertexID]*voxelSize; uv = uvCornerPosition*voxelSize;
} }

View File

@ -244,9 +244,10 @@ pub const FaceData = extern struct {
x: u5, x: u5,
y: u5, y: u5,
z: u5, z: u5,
padding: u4 = 0, xSize: u5,
ySize: u5,
padding: u6 = 0,
isBackFace: bool, isBackFace: bool,
padding2: u12 = 0,
}, },
blockAndQuad: packed struct(u32) { blockAndQuad: packed struct(u32) {
texture: u16, texture: u16,
@ -256,7 +257,7 @@ pub const FaceData = extern struct {
pub inline fn init(texture: u16, quadIndex: u16, x: i32, y: i32, z: i32, comptime backFace: bool) FaceData { pub inline fn init(texture: u16, quadIndex: u16, x: i32, y: i32, z: i32, comptime backFace: bool) FaceData {
return FaceData { return FaceData {
.position = .{.x = @intCast(x), .y = @intCast(y), .z = @intCast(z), .isBackFace = backFace}, .position = .{.x = @intCast(x), .y = @intCast(y), .z = @intCast(z), .xSize = 1, .ySize = 1, .isBackFace = backFace},
.blockAndQuad = .{.texture = texture, .quadIndex = quadIndex}, .blockAndQuad = .{.texture = texture, .quadIndex = quadIndex},
.lightBufferIndex = undefined, .lightBufferIndex = undefined,
}; };