|
|
|
|
@@ -24,6 +24,7 @@ SOFTWARE.
|
|
|
|
|
|
|
|
|
|
#include "game/engine/normal_meshing.hpp"
|
|
|
|
|
|
|
|
|
|
#include "common/logger.hpp"
|
|
|
|
|
#include "common/math/vector.hpp"
|
|
|
|
|
#include "common/world/chunk.hpp"
|
|
|
|
|
|
|
|
|
|
@@ -43,10 +44,10 @@ static void push_uvs(float texture_unit_size, unsigned texture_index, std::vecto
|
|
|
|
|
output_uvs.push_back(texture_unit_size*texture_index);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
|
|
|
|
|
output_uvs.push_back(texture_unit_size*texture_index+1.0f);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*texture_index+texture_unit_size);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
|
|
|
|
|
output_uvs.push_back(texture_unit_size*texture_index+1.0f);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*texture_index+texture_unit_size);
|
|
|
|
|
output_uvs.push_back(0.0f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -65,136 +66,89 @@ void polygun::engine::normal_meshing::generate_mesh(const world::Chunk& chunk, f
|
|
|
|
|
const bool front_node = (z<world::Chunk::CHUNK_SIZE-1 && chunk.get_node(math::Vector3i{x, y, z+1})>0);
|
|
|
|
|
const bool bottom_node = (y>0 && chunk.get_node(math::Vector3i{x, y-1, z})>0);
|
|
|
|
|
const bool top_node = (y<world::Chunk::CHUNK_SIZE-1 && chunk.get_node(math::Vector3i{x, y+1, z})>0);
|
|
|
|
|
unsigned side_vertices_indices[8] = {0};
|
|
|
|
|
if(!left_node) {
|
|
|
|
|
side_vertices_indices[0] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[1] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[2] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[3] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(node_id, texture_unit_size, output_uvs);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
if(!right_node) {
|
|
|
|
|
side_vertices_indices[4] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[5] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[6] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[7] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(node_id, texture_unit_size, output_uvs);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
if(!back_node) {
|
|
|
|
|
if(left_node) {
|
|
|
|
|
side_vertices_indices[0] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id);
|
|
|
|
|
output_uvs.push_back(0.0f);
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[1] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
}
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
output_indices.push_back(side_vertices_indices[0]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[1]);
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
if(right_node) {
|
|
|
|
|
side_vertices_indices[4] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id+1.0f);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[5] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id+1.0f);
|
|
|
|
|
output_uvs.push_back(0.0f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
output_indices.push_back(side_vertices_indices[5]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[5]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[0]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[4]);
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
if(!front_node) {
|
|
|
|
|
if(left_node) {
|
|
|
|
|
side_vertices_indices[2] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id);
|
|
|
|
|
output_uvs.push_back(0.0f);
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[3] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
}
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
output_indices.push_back(side_vertices_indices[3]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[2]);
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
if(right_node) {
|
|
|
|
|
side_vertices_indices[6] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id+1.0f);
|
|
|
|
|
output_uvs.push_back(1.0f);
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
|
|
|
|
|
side_vertices_indices[7] = vertex_count++;
|
|
|
|
|
output_vertices.push_back(x+1);
|
|
|
|
|
output_vertices.push_back(y+1);
|
|
|
|
|
output_vertices.push_back(z+1);
|
|
|
|
|
output_uvs.push_back(texture_unit_size*node_id+1.0f);
|
|
|
|
|
output_uvs.push_back(0.0f);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
output_indices.push_back(side_vertices_indices[6]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[6]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[3]);
|
|
|
|
|
output_indices.push_back(side_vertices_indices[7]);
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
if(!bottom_node) {
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
@@ -215,7 +169,7 @@ void polygun::engine::normal_meshing::generate_mesh(const world::Chunk& chunk, f
|
|
|
|
|
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(node_id, texture_unit_size, output_uvs);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
if(!top_node) {
|
|
|
|
|
output_vertices.push_back(x);
|
|
|
|
|
@@ -236,7 +190,7 @@ void polygun::engine::normal_meshing::generate_mesh(const world::Chunk& chunk, f
|
|
|
|
|
|
|
|
|
|
vertex_count+=4;
|
|
|
|
|
push_indices(vertex_count, output_indices);
|
|
|
|
|
push_uvs(node_id, texture_unit_size, output_uvs);
|
|
|
|
|
push_uvs(texture_unit_size, node_id-1, output_uvs);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|