mirror of
https://github.com/Relintai/voxelman.git
synced 2025-04-15 21:06:06 +02:00
The transvoxel mesher now won't allocate small arrays constantly during generation.
This commit is contained in:
parent
45976ca387
commit
a22be7208c
@ -34,9 +34,7 @@ void VoxelMesherTransvoxel::set_texture_scale(const int value) {
|
|||||||
_texture_scale = value;
|
_texture_scale = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
int *VoxelMesherTransvoxel::get_voxel_type_array(VoxelChunk *chunk, const int x, const int y, const int z, const int size) {
|
void VoxelMesherTransvoxel::get_voxel_type_array(int *arr, VoxelChunk *chunk, const int x, const int y, const int z, const int size) {
|
||||||
int *arr = memnew_arr(int, 8);
|
|
||||||
|
|
||||||
arr[0] = chunk->get_voxel(x, y, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[0] = chunk->get_voxel(x, y, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
arr[1] = chunk->get_voxel(x, y + size, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[1] = chunk->get_voxel(x, y + size, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
arr[2] = chunk->get_voxel(x, y, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[2] = chunk->get_voxel(x, y, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
@ -45,8 +43,6 @@ int *VoxelMesherTransvoxel::get_voxel_type_array(VoxelChunk *chunk, const int x,
|
|||||||
arr[5] = chunk->get_voxel(x + size, y + size, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[5] = chunk->get_voxel(x + size, y + size, z, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
arr[6] = chunk->get_voxel(x + size, y, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[6] = chunk->get_voxel(x + size, y, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
arr[7] = chunk->get_voxel(x + size, y + size, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
arr[7] = chunk->get_voxel(x + size, y + size, z + size, VoxelChunk::DEFAULT_CHANNEL_TYPE);
|
||||||
|
|
||||||
return arr;
|
|
||||||
}
|
}
|
||||||
int VoxelMesherTransvoxel::get_case_code_from_arr(const int *data) {
|
int VoxelMesherTransvoxel::get_case_code_from_arr(const int *data) {
|
||||||
int case_code = 0;
|
int case_code = 0;
|
||||||
@ -157,6 +153,8 @@ void VoxelMesherTransvoxel::_add_chunk(Node *p_chunk) {
|
|||||||
|
|
||||||
chunk->generate_ao();
|
chunk->generate_ao();
|
||||||
|
|
||||||
|
int type_arr[8];
|
||||||
|
|
||||||
int x_size = chunk->get_size_x();
|
int x_size = chunk->get_size_x();
|
||||||
int y_size = chunk->get_size_y();
|
int y_size = chunk->get_size_y();
|
||||||
int z_size = chunk->get_size_z();
|
int z_size = chunk->get_size_z();
|
||||||
@ -167,11 +165,10 @@ void VoxelMesherTransvoxel::_add_chunk(Node *p_chunk) {
|
|||||||
for (int z = 0; z < z_size; z += lod_size) {
|
for (int z = 0; z < z_size; z += lod_size) {
|
||||||
for (int x = 0; x < x_size; x += lod_size) {
|
for (int x = 0; x < x_size; x += lod_size) {
|
||||||
|
|
||||||
int *type_arr = get_voxel_type_array(chunk, x, y, z, lod_size);
|
get_voxel_type_array(type_arr, chunk, x, y, z, lod_size);
|
||||||
int case_code = get_case_code_from_arr(type_arr);
|
int case_code = get_case_code_from_arr(type_arr);
|
||||||
|
|
||||||
if (case_code == 0 or case_code == 255) {
|
if (case_code == 0 or case_code == 255) {
|
||||||
memdelete_arr(type_arr);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,8 +392,6 @@ void VoxelMesherTransvoxel::_add_chunk(Node *p_chunk) {
|
|||||||
add_uv2(temp_uv2s[i]);
|
add_uv2(temp_uv2s[i]);
|
||||||
add_vertex(vert_pos);
|
add_vertex(vert_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
memdelete_arr(type_arr);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,7 +68,8 @@ public:
|
|||||||
int get_texture_scale() const;
|
int get_texture_scale() const;
|
||||||
void set_texture_scale(const int value);
|
void set_texture_scale(const int value);
|
||||||
|
|
||||||
int *get_voxel_type_array(VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
//arr should have a size of 8
|
||||||
|
void get_voxel_type_array(int *arr, VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
||||||
int get_case_code_from_arr(const int *data);
|
int get_case_code_from_arr(const int *data);
|
||||||
int get_case_code(VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
int get_case_code(VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
||||||
int get_voxel_type(VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
int get_voxel_type(VoxelChunk *chunk, const int x, const int y, const int z, const int size = 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user