144 lines
5.1 KiB
C
144 lines
5.1 KiB
C
#include "../include/chunk.h"
|
|
#include <GL/gl.h>
|
|
|
|
bool chunk_is_block_neighboring_block(Chunk* chunk, vec3i pos)
|
|
{
|
|
if (is_oob(pos.x-1, 0, CHUNK_MAX_X) || is_oob(pos.x+1, 0, CHUNK_MAX_X))
|
|
return false;
|
|
if (is_oob(pos.y-1, 0, CHUNK_MAX_Y) || is_oob(pos.y+1, 0, CHUNK_MAX_Y))
|
|
return false;
|
|
if (is_oob(pos.z-1, 0, CHUNK_MAX_Z) || is_oob(pos.z+1, 0, CHUNK_MAX_Z))
|
|
return false;
|
|
|
|
if (chunk->blocks[pos.x-1][pos.y][pos.z].type != BLOCKTYPE_AIR &&
|
|
chunk->blocks[pos.x+1][pos.y][pos.z].type != BLOCKTYPE_AIR &&
|
|
chunk->blocks[pos.x][pos.y-1][pos.z].type != BLOCKTYPE_AIR &&
|
|
chunk->blocks[pos.x][pos.y+1][pos.z].type != BLOCKTYPE_AIR &&
|
|
chunk->blocks[pos.x][pos.y][pos.z-1].type != BLOCKTYPE_AIR &&
|
|
chunk->blocks[pos.x][pos.y][pos.z+1].type != BLOCKTYPE_AIR)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void chunk_set_blocks_visibility(Chunk* chunk)
|
|
{
|
|
for (int x = 0; x < CHUNK_MAX_X; x++) {
|
|
for (int y = 0; y < CHUNK_MAX_Y; y++) {
|
|
for (int z = 0; z < CHUNK_MAX_Z; z++) {
|
|
vec3i v = {x, y, z};
|
|
if (chunk_is_block_neighboring_block(chunk, v))
|
|
chunk->blocks[x][y][z].visible = false;
|
|
else
|
|
chunk->blocks[x][y][z].visible = true;
|
|
|
|
if (chunk->blocks[x][y][z].type == BLOCKTYPE_AIR)
|
|
chunk->blocks[x][y][z].visible = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void chunk_update(ChunkManager *cm, Chunk *chunk)
|
|
{
|
|
chunk_set_blocks_visibility(chunk);
|
|
chunk_create_displayl(cm, chunk);
|
|
}
|
|
|
|
void draw_cube(ChunkManager *cm, Block_type type, float x, float y, float z)
|
|
{
|
|
/*x*=2;
|
|
y*=2;
|
|
z*=2;
|
|
*/
|
|
/*
|
|
for (int i = 0; i < cm->texture_count; i++) {
|
|
if (cm->textures[i].type == type)
|
|
glBindTexture(GL_TEXTURE_2D, cm->textures[i].tid);
|
|
}
|
|
*/
|
|
glBegin( GL_QUADS );
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x+1.0, y, z-1.0 );
|
|
glTexCoord2f(0, 1); glVertex3f(x, y, z-1.0);
|
|
glTexCoord2f(1, 1); glVertex3f(x, y, z);
|
|
glTexCoord2f(1, 0); glVertex3f(x+1.0, y, z);
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x+1.0, y-1.0, z-1.0);
|
|
glTexCoord2f(0, 1); glVertex3f(x, y-1.0, z-1.0);
|
|
glTexCoord2f(1, 1); glVertex3f(x, y-1.0, z);
|
|
glTexCoord2f(1, 0); glVertex3f(x+1.0, y-1.0, z);
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x+1.0, y, z);
|
|
glTexCoord2f(0, 1); glVertex3f(x, y, z);
|
|
glTexCoord2f(1, 1); glVertex3f(x, y-1.0, z);
|
|
glTexCoord2f(1, 0); glVertex3f(x+1.0, y-1.0, z);
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x, y, z-1.0); // Top-Right of back face
|
|
glTexCoord2f(0, 1); glVertex3f(x+1.0, y, z-1.0); // Top-Left of back face
|
|
glTexCoord2f(1, 1); glVertex3f(x+1.0, y-1.0, z-1.0); // Bottom-Left of back face
|
|
glTexCoord2f(1, 0); glVertex3f(x, y-1.0, z-1.0); // Bottom-Right of back face
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x, y, z); // Top-Right of left face
|
|
glTexCoord2f(0, 1); glVertex3f(x, y, z-1.0); // Top-Left of left face
|
|
glTexCoord2f(1, 1); glVertex3f(x, y-1.0, z-1.0); // Bottom-Left of left face
|
|
glTexCoord2f(1, 0); glVertex3f(x, y-1.0, z); // Bottom-Right of left face
|
|
|
|
glColor3f(1, 0, 1);
|
|
glTexCoord2f(0, 0); glVertex3f(x+1.0, y, z); // Top-Right of left face
|
|
glTexCoord2f(0, 1); glVertex3f(x+1.0, y, z-1.0); // Top-Left of left face
|
|
glTexCoord2f(1, 1); glVertex3f(x+1.0, y-1.0, z-1.0); // Bottom-Left of left face
|
|
glTexCoord2f(1, 0); glVertex3f(x+1.0, y-1.0, z); // Bottom-Right of left face
|
|
glEnd();
|
|
}
|
|
|
|
void chunk_create_displayl(ChunkManager *cm, Chunk *chunk)
|
|
{
|
|
chunk->id = glGenLists(1);
|
|
glBindTexture(GL_TEXTURE_2D, cm->textures[0].tid);
|
|
glNewList(chunk->id, GL_COMPILE);
|
|
for (int x = 0; x < CHUNK_MAX_X; x++) {
|
|
for (int y = 0; y < CHUNK_MAX_Y; y++) {
|
|
for (int z = 0; z < CHUNK_MAX_Z; z++) {
|
|
if (chunk->blocks[x][y][z].visible)
|
|
draw_cube(cm, chunk->blocks[x][y][z].type,
|
|
chunk->start_pos.x + x, chunk->start_pos.y + y, chunk->start_pos.z + z);
|
|
}
|
|
}
|
|
}
|
|
glEndList();
|
|
}
|
|
|
|
void chunk_render(Chunk* chunk)
|
|
{
|
|
glPushMatrix();
|
|
|
|
glCallList(chunk->id);
|
|
glPopMatrix();
|
|
}
|
|
|
|
int chunk_get_current_chunk_index(ChunkManager *cm, vec3f pos)
|
|
{
|
|
for (int i = 0; i < cm->chunk_count; i++) {
|
|
for (int x = 0; x < CHUNK_MAX_X; x++) {
|
|
for (int y = 0; y < CHUNK_MAX_Y; y++) {
|
|
for (int z = 0; z < CHUNK_MAX_Z; z++) {
|
|
if (pos.x < cm->chunks[i].start_pos.x + CHUNK_MAX_X &&
|
|
pos.x > cm->chunks[i].start_pos.x &&
|
|
pos.y < cm->chunks[i].start_pos.y + CHUNK_MAX_Y &&
|
|
pos.y > cm->chunks[i].start_pos.y) {
|
|
return i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|