mirror of
https://github.com/Relintai/voxelman.git
synced 2025-02-14 16:40:06 +01:00
Added a vector of jobs and an api for it into VoxelChunk.
This commit is contained in:
parent
71f69666cd
commit
be2cd7a4b3
@ -26,7 +26,7 @@ SOFTWARE.
|
|||||||
|
|
||||||
#include "../../../opensimplex/open_simplex_noise.h"
|
#include "../../../opensimplex/open_simplex_noise.h"
|
||||||
|
|
||||||
void VoxelJob::set_chunk(const Ref<VoxelChunkDefault> &chunk) {
|
void VoxelJob::set_chunk(const Ref<VoxelChunk> &chunk) {
|
||||||
_chunk = chunk;
|
_chunk = chunk;
|
||||||
|
|
||||||
_in_tree = true;
|
_in_tree = true;
|
||||||
@ -46,7 +46,11 @@ void VoxelJob::chunk_exit_tree() {
|
|||||||
void VoxelJob::_execute() {
|
void VoxelJob::_execute() {
|
||||||
ERR_FAIL_COND(!_chunk.is_valid());
|
ERR_FAIL_COND(!_chunk.is_valid());
|
||||||
|
|
||||||
if (!_chunk->has_next_phase()) {
|
Ref<VoxelChunkDefault> chunk = _chunk;
|
||||||
|
|
||||||
|
ERR_FAIL_COND(!chunk.is_valid());
|
||||||
|
|
||||||
|
if (!chunk->has_next_phase()) {
|
||||||
//_chunk->set_build_step_in_progress(false);
|
//_chunk->set_build_step_in_progress(false);
|
||||||
|
|
||||||
//if (!_in_tree) {
|
//if (!_in_tree) {
|
||||||
@ -56,30 +60,30 @@ void VoxelJob::_execute() {
|
|||||||
set_complete(true);
|
set_complete(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
ERR_FAIL_COND(!_chunk->has_next_phase());
|
ERR_FAIL_COND(!chunk->has_next_phase());
|
||||||
//ERR_FAIL_COND(_build_step_in_progress);
|
//ERR_FAIL_COND(_build_step_in_progress);
|
||||||
|
|
||||||
//_chunk->set_build_step_in_progress(true);
|
//_chunk->set_build_step_in_progress(true);
|
||||||
|
|
||||||
while (!get_cancelled() && _in_tree && _chunk->has_next_phase() && _chunk->get_active_build_phase_type() == VoxelChunkDefault::BUILD_PHASE_TYPE_NORMAL) {
|
while (!get_cancelled() && _in_tree && chunk->has_next_phase() && chunk->get_active_build_phase_type() == VoxelChunkDefault::BUILD_PHASE_TYPE_NORMAL) {
|
||||||
|
|
||||||
//int phase = _chunk->get_current_build_phase();
|
//int phase = _chunk->get_current_build_phase();
|
||||||
|
|
||||||
_chunk->build_phase();
|
chunk->build_phase();
|
||||||
|
|
||||||
//print_error(String::num(get_current_execution_time()) + " phase: " + String::num(phase));
|
//print_error(String::num(get_current_execution_time()) + " phase: " + String::num(phase));
|
||||||
|
|
||||||
if (_chunk->get_active_build_phase_type() == VoxelChunkDefault::BUILD_PHASE_TYPE_NORMAL && should_return())
|
if (chunk->get_active_build_phase_type() == VoxelChunkDefault::BUILD_PHASE_TYPE_NORMAL && should_return())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!_chunk->get_build_phase_done())
|
if (!chunk->get_build_phase_done())
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
_chunk->set_build_step_in_progress(false);
|
chunk->set_build_step_in_progress(false);
|
||||||
|
|
||||||
if (!_in_tree) {
|
if (!_in_tree) {
|
||||||
_chunk.unref();
|
chunk.unref();
|
||||||
}
|
}
|
||||||
|
|
||||||
set_complete(true);
|
set_complete(true);
|
||||||
|
@ -29,7 +29,7 @@ SOFTWARE.
|
|||||||
#include "core/resource.h"
|
#include "core/resource.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class VoxelChunkDefault;
|
class VoxelChunk;
|
||||||
|
|
||||||
#if THREAD_POOL_PRESENT
|
#if THREAD_POOL_PRESENT
|
||||||
class VoxelJob : public ThreadPoolJob {
|
class VoxelJob : public ThreadPoolJob {
|
||||||
@ -46,7 +46,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void set_chunk(const Ref<VoxelChunkDefault> &chunk);
|
void set_chunk(const Ref<VoxelChunk> &chunk);
|
||||||
void chunk_exit_tree();
|
void chunk_exit_tree();
|
||||||
|
|
||||||
void finalize_build();
|
void finalize_build();
|
||||||
@ -61,10 +61,8 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
private:
|
|
||||||
bool _in_tree;
|
bool _in_tree;
|
||||||
|
Ref<VoxelChunk> _chunk;
|
||||||
Ref<VoxelChunkDefault> _chunk;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
#if !THREAD_POOL_PRESENT
|
#if !THREAD_POOL_PRESENT
|
||||||
|
@ -28,6 +28,8 @@ SOFTWARE.
|
|||||||
|
|
||||||
#include "../defines.h"
|
#include "../defines.h"
|
||||||
|
|
||||||
|
#include "jobs/voxel_job.h"
|
||||||
|
|
||||||
_FORCE_INLINE_ bool VoxelChunk::get_is_build_threaded() const {
|
_FORCE_INLINE_ bool VoxelChunk::get_is_build_threaded() const {
|
||||||
return _is_build_threaded;
|
return _is_build_threaded;
|
||||||
}
|
}
|
||||||
@ -218,6 +220,28 @@ void VoxelChunk::set_voxel_world_bind(Node *world) {
|
|||||||
_voxel_world = Object::cast_to<VoxelWorld>(world);
|
_voxel_world = Object::cast_to<VoxelWorld>(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<VoxelMesher> VoxelChunk::get_job(int index) const {
|
||||||
|
ERR_FAIL_INDEX_V(index, _jobs.size(), Ref<VoxelMesher>());
|
||||||
|
|
||||||
|
return _jobs.get(index);
|
||||||
|
}
|
||||||
|
void VoxelChunk::set_job(int index, const Ref<VoxelMesher> &job) {
|
||||||
|
ERR_FAIL_INDEX(index, _jobs.size());
|
||||||
|
|
||||||
|
_jobs.set(index, job);
|
||||||
|
}
|
||||||
|
void VoxelChunk::remove_job(const int index) {
|
||||||
|
ERR_FAIL_INDEX(index, _jobs.size());
|
||||||
|
|
||||||
|
_jobs.remove(index);
|
||||||
|
}
|
||||||
|
void VoxelChunk::add_job(const Ref<VoxelMesher> &job) {
|
||||||
|
_jobs.push_back(job);
|
||||||
|
}
|
||||||
|
int VoxelChunk::get_job_count() const {
|
||||||
|
return _jobs.size();
|
||||||
|
}
|
||||||
|
|
||||||
Ref<VoxelMesher> VoxelChunk::get_mesher(int index) const {
|
Ref<VoxelMesher> VoxelChunk::get_mesher(int index) const {
|
||||||
ERR_FAIL_INDEX_V(index, _meshers.size(), Ref<VoxelMesher>());
|
ERR_FAIL_INDEX_V(index, _meshers.size(), Ref<VoxelMesher>());
|
||||||
|
|
||||||
@ -1070,6 +1094,8 @@ VoxelChunk::~VoxelChunk() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_colliders.clear();
|
_colliders.clear();
|
||||||
|
|
||||||
|
_jobs.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelChunk::_world_transform_changed() {
|
void VoxelChunk::_world_transform_changed() {
|
||||||
@ -1252,6 +1278,12 @@ void VoxelChunk::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("set_voxel_scale", "value"), &VoxelChunk::set_voxel_scale);
|
ClassDB::bind_method(D_METHOD("set_voxel_scale", "value"), &VoxelChunk::set_voxel_scale);
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::REAL, "voxel_scale"), "set_voxel_scale", "get_voxel_scale");
|
ADD_PROPERTY(PropertyInfo(Variant::REAL, "voxel_scale"), "set_voxel_scale", "get_voxel_scale");
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("get_job", "index"), &VoxelChunk::get_job);
|
||||||
|
ClassDB::bind_method(D_METHOD("set_job", "index", "job"), &VoxelChunk::set_job);
|
||||||
|
ClassDB::bind_method(D_METHOD("remove_job", "index"), &VoxelChunk::remove_job);
|
||||||
|
ClassDB::bind_method(D_METHOD("add_job", "job"), &VoxelChunk::add_job);
|
||||||
|
ClassDB::bind_method(D_METHOD("get_job_count"), &VoxelChunk::get_job_count);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_mesher", "index"), &VoxelChunk::get_mesher);
|
ClassDB::bind_method(D_METHOD("get_mesher", "index"), &VoxelChunk::get_mesher);
|
||||||
ClassDB::bind_method(D_METHOD("set_mesher", "index", "mesher"), &VoxelChunk::set_mesher);
|
ClassDB::bind_method(D_METHOD("set_mesher", "index", "mesher"), &VoxelChunk::set_mesher);
|
||||||
ClassDB::bind_method(D_METHOD("remove_mesher", "index"), &VoxelChunk::remove_mesher);
|
ClassDB::bind_method(D_METHOD("remove_mesher", "index"), &VoxelChunk::remove_mesher);
|
||||||
|
@ -58,7 +58,9 @@ include_pool_vector
|
|||||||
|
|
||||||
#include "../library/voxel_surface.h"
|
#include "../library/voxel_surface.h"
|
||||||
#include "../library/voxelman_library.h"
|
#include "../library/voxelman_library.h"
|
||||||
|
; //hackfix for a clang format issue
|
||||||
|
|
||||||
|
class VoxelJob;
|
||||||
class VoxelWorld;
|
class VoxelWorld;
|
||||||
|
|
||||||
class VoxelChunk : public Resource {
|
class VoxelChunk : public Resource {
|
||||||
@ -138,6 +140,13 @@ public:
|
|||||||
void set_voxel_world(VoxelWorld *world);
|
void set_voxel_world(VoxelWorld *world);
|
||||||
void set_voxel_world_bind(Node *world);
|
void set_voxel_world_bind(Node *world);
|
||||||
|
|
||||||
|
//Jobs
|
||||||
|
Ref<VoxelMesher> get_job(const int index) const;
|
||||||
|
void set_job(const int index, const Ref<VoxelMesher> &job);
|
||||||
|
void remove_job(const int index);
|
||||||
|
void add_job(const Ref<VoxelMesher> &job);
|
||||||
|
int get_job_count() const;
|
||||||
|
|
||||||
//Meshers
|
//Meshers
|
||||||
Ref<VoxelMesher> get_mesher(const int index) const;
|
Ref<VoxelMesher> get_mesher(const int index) const;
|
||||||
void set_mesher(const int index, const Ref<VoxelMesher> &mesher);
|
void set_mesher(const int index, const Ref<VoxelMesher> &mesher);
|
||||||
@ -346,6 +355,8 @@ protected:
|
|||||||
|
|
||||||
float _voxel_scale;
|
float _voxel_scale;
|
||||||
|
|
||||||
|
Vector<Ref<VoxelJob> > _jobs;
|
||||||
|
|
||||||
Ref<VoxelmanLibrary> _library;
|
Ref<VoxelmanLibrary> _library;
|
||||||
Vector<Ref<VoxelMesher> > _meshers;
|
Vector<Ref<VoxelMesher> > _meshers;
|
||||||
Vector<Ref<VoxelMesher> > _liquid_meshers;
|
Vector<Ref<VoxelMesher> > _liquid_meshers;
|
||||||
|
Loading…
Reference in New Issue
Block a user