Hello, I'm trying to add pistons to Crafti, and when creating a simple block renderer with the following code, half the faces are incorrectly culled and are not visible without the TEXTURE_DRAW_BACKFACE
flag, is there any reason as to why this is happening?
void PistonRenderer::renderSpecialBlock(const BLOCK_WDATA block, GLFix x, GLFix y, GLFix z, Chunk &c)
{
TextureAtlasEntry piston_side = terrain_atlas[12][6].current;
TextureAtlasEntry piston_back = terrain_atlas[13][6].current;
TextureAtlasEntry piston_front = terrain_atlas[11][6].current;
/////
// Get the piston data
/////
const uint8_t piston_type = static_cast<uint8_t>((getBLOCKDATA(block) & piston_data_bits) >> piston_bit_shift);
//////
// GL CODE
//////
glPushMatrix();
glLoadIdentity();
glTranslatef(x + BLOCK_SIZE/2, y + BLOCK_SIZE/2, z + BLOCK_SIZE/2);
std::vector<VERTEX> piston_vertices;
piston_vertices.reserve(24);
// Piston Front
piston_vertices.push_back({0, 0, 0, piston_front.left, piston_front.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, BLOCK_SIZE, 0, piston_front.left, piston_front.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, 0, piston_front.right, piston_front.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, 0, piston_front.right, piston_front.bottom, TEXTURE_DRAW_BACKFACE});
// Piston Bottom
piston_vertices.push_back({0, 0, BLOCK_SIZE, piston_side.left, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, 0, 0, piston_side.left, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, 0, piston_side.right, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, BLOCK_SIZE, piston_side.right, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
// Piston Top
piston_vertices.push_back({0, BLOCK_SIZE, BLOCK_SIZE, piston_side.left, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, BLOCK_SIZE, 0, piston_side.left, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, 0, piston_side.right, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE, piston_side.right, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
// Piston Left
piston_vertices.push_back({0, BLOCK_SIZE, BLOCK_SIZE, piston_side.left, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, BLOCK_SIZE, 0, piston_side.left, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, 0, 0, piston_side.right, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, 0, BLOCK_SIZE, piston_side.right, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
// Piston Right
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE, piston_side.left, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, 0, piston_side.left, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, 0, piston_side.right, piston_side.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, BLOCK_SIZE, piston_side.right, piston_side.bottom, TEXTURE_DRAW_BACKFACE});
// Piston Back
piston_vertices.push_back({0, 0, BLOCK_SIZE, piston_back.left, piston_back.bottom, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({0, BLOCK_SIZE, BLOCK_SIZE, piston_back.left, piston_back.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, BLOCK_SIZE, BLOCK_SIZE, piston_back.right, piston_back.top, TEXTURE_DRAW_BACKFACE});
piston_vertices.push_back({BLOCK_SIZE, 0, BLOCK_SIZE, piston_back.right, piston_back.bottom, TEXTURE_DRAW_BACKFACE});
// Rotate Piston According To Face
BLOCK_SIDE side = static_cast<BLOCK_SIDE>(getBLOCKDATA(block) & BLOCK_SIDE_BITS);
// Rotate GL stuff
switch(side)
{
default:
break;
case BLOCK_BACK:
nglRotateY(180);
break;
case BLOCK_FRONT:
nglRotateY(0);
break;
case BLOCK_LEFT:
nglRotateY(90);
break;
case BLOCK_RIGHT:
nglRotateY(270);
break;
}
glTranslatef(-BLOCK_SIZE / 2, -BLOCK_SIZE / 2, -BLOCK_SIZE / 2);
for(auto&& v : piston_vertices)
{
VERTEX v1;
nglMultMatVectRes(transformation, &v, &v1);
c.addUnalignedVertex(v1.x, v1.y, v1.z, v.u, v.v, v.c);
}
glPopMatrix();
}