chunk.h
Код: Выделить всё
#ifndef CHUNK_CLASS_H
#define CHUNK_CLASS_H
#include
#include
#include
#include
#include
#include
#include
class chunk
{
public:
model* chunk_mesh;
int*** blocks;
chunk(int size_x, int size_y, int size_z);
~chunk();
bool get_block_status(int*** block_data, int x_pos, int y_pos, int z_pos, int x_size, int y_size, int z_size);
void render(camera player_cam);
void destroy();
int*** create_blocks(int x_size, int y_size, int z_size);
};
#endif
Код: Выделить всё
#include
chunk::chunk(int size_x, int size_y, int size_z)
{
std::srand(static_cast(std::time(nullptr)));
std::vector vertex_data;
blocks = create_blocks(size_x, size_y, size_z);
for (int y = 0; y < size_y - 1; y++)
{
for (int x = 0; x < size_x; x++)
{
for (int z = 0; z < size_z; z++)
{
int block_id = blocks[x][y][z];
if (block_id == 0)
{
// front face
GLfloat front_face_data[] =
{
1.0 + x, 1.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 1.0, 1.0,
0.0 + x, 0.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 0.0, 0.0,
1.0 + x, 0.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 1.0, 0.0,
1.0 + x, 1.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 1.0, 1.0,
0.0 + x, 1.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 0.0, 1.0,
0.0 + x, 0.0 + y, 1.0 + z, 0.7, 0.7, 0.7, 0.0, 0.0,
};
for (float attr : front_face_data)
{
vertex_data.push_back(attr);
}
// back face
GLfloat back_face_data[] =
{
1.0 + x, 0.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 1.0, 0.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 0.0, 0.0,
1.0 + x, 1.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 1.0, 1.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 0.0, 0.0,
0.0 + x, 1.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 0.0, 1.0,
1.0 + x, 1.0 + y, 0.0 + z, 0.4, 0.4, 0.4, 1.0, 1.0,
};
for (float attr : back_face_data)
{
vertex_data.push_back(attr);
}
// left face
GLfloat left_face_data[] =
{
0.0 + x, 1.0 + y, 1.0 + z, 0.5, 0.5, 0.5, 1.0, 1.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.5, 0.5, 0.5, 0.0, 0.0,
0.0 + x, 0.0 + y, 1.0 + z, 0.5, 0.5, 0.5, 1.0, 0.0,
0.0 + x, 1.0 + y, 1.0 + z, 0.5, 0.5, 0.5, 1.0, 1.0,
0.0 + x, 1.0 + y, 0.0 + z, 0.5, 0.5, 0.5, 0.0, 1.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.5, 0.5, 0.5, 0.0, 0.0,
};
for (float attr : left_face_data)
{
vertex_data.push_back(attr);
}
// right face
GLfloat right_face_data[] =
{
1.0 + x, 0.0 + y, 1.0 + z, 0.3, 0.3, 0.3, 1.0, 0.0,
1.0 + x, 0.0 + y, 0.0 + z, 0.3, 0.3, 0.3, 0.0, 0.0,
1.0 + x, 1.0 + y, 1.0 + z, 0.3, 0.3, 0.3, 1.0, 1.0,
1.0 + x, 0.0 + y, 0.0 + z, 0.3, 0.3, 0.3, 0.0, 0.0,
1.0 + x, 1.0 + y, 0.0 + z, 0.3, 0.3, 0.3, 0.0, 1.0,
1.0 + x, 1.0 + y, 1.0 + z, 0.3, 0.3, 0.3, 1.0, 1.0,
};
for (float attr : right_face_data)
{
vertex_data.push_back(attr);
}
// top face
if (!get_block_status(blocks, x, y + 1, z, size_x, size_y, size_z))
{
GLfloat top_face_data[] =
{
1.0 + x, 1.0 + y, 1.0 + z, 1.0, 1.0, 1.0, 1.0, 1.0,
0.0 + x, 1.0 + y, 0.0 + z, 1.0, 1.0, 1.0, 0.0, 0.0,
0.0 + x, 1.0 + y, 1.0 + z, 1.0, 1.0, 1.0, 1.0, 0.0,
1.0 + x, 1.0 + y, 1.0 + z, 1.0, 1.0, 1.0, 1.0, 1.0,
1.0 + x, 1.0 + y, 0.0 + z, 1.0, 1.0, 1.0, 0.0, 1.0,
0.0 + x, 1.0 + y, 0.0 + z, 1.0, 1.0, 1.0, 0.0, 0.0,
};
for (float attr : top_face_data)
{
vertex_data.push_back(attr);
}
}
// bottom face
if (!get_block_status(blocks, x, y - 1, z, size_x, size_y, size_z))
{
GLfloat bottom_face_data[] =
{
0.0 + x, 0.0 + y, 1.0 + z, 0.15, 0.15, 0.15, 1.0, 0.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.15, 0.15, 0.15, 0.0, 0.0,
1.0 + x, 0.0 + y, 1.0 + z, 0.15, 0.15, 0.15, 1.0, 1.0,
0.0 + x, 0.0 + y, 0.0 + z, 0.15, 0.15, 0.15, 0.0, 0.0,
1.0 + x, 0.0 + y, 0.0 + z, 0.15, 0.15, 0.15, 0.0, 1.0,
1.0 + x, 0.0 + y, 1.0 + z, 0.15, 0.15, 0.15, 1.0, 1.0,
};
for (float attr : bottom_face_data)
{
vertex_data.push_back(attr);
}
}
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/78654422/only-2-layers-of-blocks-when-there-should-be-8[/url]
Мобильная версия