AABB blocks render fix

This commit is contained in:
MihailRis 2023-12-09 19:43:49 +03:00
parent a65bd020f9
commit 8e7f6e2518
2 changed files with 55 additions and 30 deletions

View File

@ -148,7 +148,8 @@ void BlocksRenderer::face(const ivec3& coord_,
float width, float width,
float height, float height,
float depth, float depth,
const UVRegion& region) { const UVRegion& region,
bool lights) {
if (vertexOffset + BlocksRenderer::VERTEX_SIZE * 4 > capacity) { if (vertexOffset + BlocksRenderer::VERTEX_SIZE * 4 > capacity) {
overflow = true; overflow = true;
return; return;
@ -158,17 +159,24 @@ void BlocksRenderer::face(const ivec3& coord_,
const vec3 Y(axisY); const vec3 Y(axisY);
const vec3 Z(axisZ); const vec3 Z(axisZ);
const vec3 sunVector = vec3(0.431934f, 0.863868f, 0.259161f); vec3 coord(vec3(coord_) + offset);
float d = glm::dot(Z, sunVector);
d = 0.75f + d*0.25f; if (lights) {
const vec3 sunVector = vec3(0.431934f, 0.863868f, 0.259161f);
vec4 tint(d); float d = glm::dot(Z, sunVector);
vec3 coord(vec3(coord_) + offset); d = 0.75f + d*0.25f;
vec4 tint(d);
vertex(coord + Z*depth, region.u1, region.v1, tint, axisX, axisY, laxisZ);
vertex(coord + Z*depth + X*width, region.u2, region.v1, tint, axisX, axisY, laxisZ); vertex(coord + Z*depth, region.u1, region.v1, tint, axisX, axisY, laxisZ);
vertex(coord + Z*depth + X*width + Y*height, region.u2, region.v2, tint, axisX, axisY, laxisZ); vertex(coord + Z*depth + X*width, region.u2, region.v1, tint, axisX, axisY, laxisZ);
vertex(coord + Z*depth + Y*height, region.u1, region.v2, tint, axisX, axisY, laxisZ); vertex(coord + Z*depth + X*width + Y*height, region.u2, region.v2, tint, axisX, axisY, laxisZ);
vertex(coord + Z*depth + Y*height, region.u1, region.v2, tint, axisX, axisY, laxisZ);
} else {
vertex(coord + Z*depth, region.u1, region.v1, vec4(1.0f));
vertex(coord + Z*depth + X*width, region.u2, region.v1, vec4(1.0f));
vertex(coord + Z*depth + X*width + Y*height, region.u2, region.v2, vec4(1.0f));
vertex(coord + Z*depth + Y*height, region.u1, region.v2, vec4(1.0f));
}
index(0, 1, 2, 0, 2, 3); index(0, 1, 2, 0, 2, 3);
} }
@ -230,12 +238,15 @@ void BlocksRenderer::blockXSprite(int x, int y, int z,
texface2, lights, vec4(tint)); texface2, lights, vec4(tint));
} }
// HINT: texture faces order: {east, west, bottom, top, south, north}
/* AABB blocks render method (WIP) */ /* AABB blocks render method (WIP) */
void BlocksRenderer::blockCubeShaded(const ivec3& icoord, void BlocksRenderer::blockAABB(const ivec3& icoord,
const vec3& offset, const vec3& offset,
const vec3& size, const vec3& size,
const UVRegion(&texfaces)[6], const UVRegion(&texfaces)[6],
const Block* block, ubyte rotation) { const Block* block, ubyte rotation,
bool lights) {
ivec3 X(1, 0, 0); ivec3 X(1, 0, 0);
ivec3 Y(0, 1, 0); ivec3 Y(0, 1, 0);
@ -255,16 +266,28 @@ void BlocksRenderer::blockCubeShaded(const ivec3& icoord,
vec3 fY(Y); vec3 fY(Y);
vec3 fZ(Z); vec3 fZ(Z);
vec3 local = offset.x*vec3(X)+offset.y*vec3(Y)+offset.z*-fZ; // TODO: simplify this pile of magic calculations and fix 5th arg (laxisZ)
vec3 local = offset.x*fX+offset.y*fY+offset.z*-fZ;
face(coord, X, Y, Z, Z+loff, local-size.z*fZ, size.x, size.y, size.z, texfaces[5]); // north ;;; face(coord, X, Y, Z, Z+loff,
face(coord, -X, Y, -Z, Z-Z-X+loff, local-size.z*fZ+fX*size.x, size.x, size.y, 0.0f, texfaces[4]); // south ;;; local-size.z*fZ-offset.y*fY,
size.x, size.y, size.z, texfaces[5], lights); // north
face(coord, -X, Y, -Z, Z-Z-X+loff,
local-size.z*fZ+fX*size.x-(offset.y)*fY,
size.x, size.y, 0.0f, texfaces[4], lights); // south
face(coord+Y, X, -Z, Y, Y-Y+loff, local, size.x, size.z, 0.0f, texfaces[3]); // top ;;; face(coord+Y, X, -Z, Y, Y-Y+loff,
face(coord+X, -X, -Z, -Y, -X-Y+loff, local+size.x*fX-fX, size.x, size.z, 0.0f, texfaces[2]); // bottom ;;; local-(1.0f-(size.y-offset.y))*fY,
size.x, size.z, 0.0f, texfaces[3], lights); // top
face(coord+X, -X, -Z, -Y, -X-Y+loff,
local+size.x*fX-fX-(offset.y)*fY,
size.x, size.z, 0.0f, texfaces[2], lights); // bottom
face(coord+X, -Z, Y, X, X-X+loff, local+size.x*fX-fX, size.z, size.y, 0.0f, texfaces[1]); // west ;;; face(coord+X, -Z, Y, X, X-X+loff,
face(coord+Y, -Z, -Y, -X, -X-Y+loff, local, size.z, size.y, 0.0f, texfaces[0]); // east ;;; local+size.x*fX-fX-(offset.y)*fY,
size.z, size.y, 0.0f, texfaces[1], lights); // west
face(coord+Y, -Z, -Y, -X, -X-Y+loff,
local-(1.0f-(size.y-offset.y))*fY,
size.z, size.y, 0.0f, texfaces[0], lights); // east
} }
/* Fastest solid shaded blocks render method */ /* Fastest solid shaded blocks render method */
@ -411,7 +434,7 @@ void BlocksRenderer::render(const voxel* voxels) {
vec3 size = hitbox.size(); vec3 size = hitbox.size();
vec3 off = hitbox.min(); vec3 off = hitbox.min();
blockCubeShaded(ivec3(x,y,z), off, size, texfaces, &def, vox.rotation()); blockAABB(ivec3(x,y,z), off, size, texfaces, &def, vox.rotation(), !def.rt.emissive);
break; break;
} }
default: default:

View File

@ -73,7 +73,8 @@ class BlocksRenderer {
float width, float width,
float height, float height,
float depth, float depth,
const UVRegion& region); const UVRegion& region,
bool lights);
void face(const glm::vec3& coord, float w, float h, void face(const glm::vec3& coord, float w, float h,
const glm::vec3& axisX, const glm::vec3& axisX,
@ -86,12 +87,13 @@ class BlocksRenderer {
void blockCube(int x, int y, int z, const UVRegion(&faces)[6], ubyte group); void blockCube(int x, int y, int z, const UVRegion(&faces)[6], ubyte group);
void blockCubeShaded(int x, int y, int z, const UVRegion(&faces)[6], const Block* block, ubyte states); void blockCubeShaded(int x, int y, int z, const UVRegion(&faces)[6], const Block* block, ubyte states);
void blockCubeShaded(const glm::ivec3& coord, void blockAABB(const glm::ivec3& coord,
const glm::vec3& offset, const glm::vec3& offset,
const glm::vec3& size, const glm::vec3& size,
const UVRegion(&faces)[6], const UVRegion(&faces)[6],
const Block* block, const Block* block,
ubyte rotation); ubyte rotation,
bool lights);
void blockXSprite(int x, int y, int z, const glm::vec3& size, const UVRegion& face1, const UVRegion& face2, float spread); void blockXSprite(int x, int y, int z, const glm::vec3& size, const UVRegion& face1, const UVRegion& face2, float spread);
bool isOpenForLight(int x, int y, int z) const; bool isOpenForLight(int x, int y, int z) const;