mirror of
https://github.com/Relintai/voxelman.git
synced 2025-04-25 21:25:00 +02:00
More work on the logic, and api fixes.
This commit is contained in:
parent
235943f7ca
commit
eb1d55f05b
@ -833,16 +833,7 @@ void VoxelChunkDefault::free_chunk() {
|
|||||||
free_rids();
|
free_rids();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelChunkDefault::build() {
|
void VoxelChunkDefault::_finalize_build() {
|
||||||
if (get_is_generating()) {
|
|
||||||
_queued_generation = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
next_job();
|
|
||||||
}
|
|
||||||
|
|
||||||
void VoxelChunkDefault::finalize_build() {
|
|
||||||
ERR_FAIL_COND(!_library.is_valid());
|
ERR_FAIL_COND(!_library.is_valid());
|
||||||
|
|
||||||
#if TOOLS_ENABLED
|
#if TOOLS_ENABLED
|
||||||
@ -858,7 +849,6 @@ void VoxelChunkDefault::finalize_build() {
|
|||||||
|
|
||||||
VoxelChunkDefault::VoxelChunkDefault() {
|
VoxelChunkDefault::VoxelChunkDefault() {
|
||||||
_abort_build = false;
|
_abort_build = false;
|
||||||
_queued_generation = false;
|
|
||||||
|
|
||||||
_enabled = true;
|
_enabled = true;
|
||||||
|
|
||||||
@ -978,7 +968,7 @@ void VoxelChunkDefault::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("_world_light_added", "light"), &VoxelChunkDefault::_world_light_added);
|
ClassDB::bind_method(D_METHOD("_world_light_added", "light"), &VoxelChunkDefault::_world_light_added);
|
||||||
ClassDB::bind_method(D_METHOD("_world_light_removed", "light"), &VoxelChunkDefault::_world_light_removed);
|
ClassDB::bind_method(D_METHOD("_world_light_removed", "light"), &VoxelChunkDefault::_world_light_removed);
|
||||||
|
|
||||||
//ClassDB::bind_method(D_METHOD("get_job"), &VoxelChunkDefault::get_job);
|
ClassDB::bind_method(D_METHOD("_finalize_build"), &VoxelChunkDefault::_finalize_build);
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_TYPE);
|
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_TYPE);
|
||||||
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_ISOLEVEL);
|
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_ISOLEVEL);
|
||||||
|
@ -174,8 +174,7 @@ public:
|
|||||||
bool get_build_step_in_progress() const;
|
bool get_build_step_in_progress() const;
|
||||||
void set_build_step_in_progress(const bool value);
|
void set_build_step_in_progress(const bool value);
|
||||||
|
|
||||||
void build();
|
void _finalize_build();
|
||||||
void finalize_build();
|
|
||||||
|
|
||||||
VoxelChunkDefault();
|
VoxelChunkDefault();
|
||||||
~VoxelChunkDefault();
|
~VoxelChunkDefault();
|
||||||
@ -200,8 +199,6 @@ protected:
|
|||||||
|
|
||||||
int _build_flags;
|
int _build_flags;
|
||||||
|
|
||||||
bool _queued_generation;
|
|
||||||
|
|
||||||
bool _enabled;
|
bool _enabled;
|
||||||
|
|
||||||
bool _lights_dirty;
|
bool _lights_dirty;
|
||||||
|
@ -216,12 +216,12 @@ 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 {
|
Ref<VoxelJob> VoxelChunk::get_job(int index) const {
|
||||||
ERR_FAIL_INDEX_V(index, _jobs.size(), Ref<VoxelMesher>());
|
ERR_FAIL_INDEX_V(index, _jobs.size(), Ref<VoxelJob>());
|
||||||
|
|
||||||
return _jobs.get(index);
|
return _jobs.get(index);
|
||||||
}
|
}
|
||||||
void VoxelChunk::set_job(int index, const Ref<VoxelMesher> &job) {
|
void VoxelChunk::set_job(int index, const Ref<VoxelJob> &job) {
|
||||||
ERR_FAIL_INDEX(index, _jobs.size());
|
ERR_FAIL_INDEX(index, _jobs.size());
|
||||||
|
|
||||||
_jobs.set(index, job);
|
_jobs.set(index, job);
|
||||||
@ -231,7 +231,7 @@ void VoxelChunk::remove_job(const int index) {
|
|||||||
|
|
||||||
_jobs.remove(index);
|
_jobs.remove(index);
|
||||||
}
|
}
|
||||||
void VoxelChunk::add_job(const Ref<VoxelMesher> &job) {
|
void VoxelChunk::add_job(const Ref<VoxelJob> &job) {
|
||||||
_jobs.push_back(job);
|
_jobs.push_back(job);
|
||||||
}
|
}
|
||||||
int VoxelChunk::get_job_count() const {
|
int VoxelChunk::get_job_count() const {
|
||||||
@ -257,11 +257,12 @@ void VoxelChunk::next_job() {
|
|||||||
next_job();
|
next_job();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (j->get_build_phase_type() == VoxelJob::BUILD_PHASE_TYPE_NORMAL) {
|
j->set_complete(false);
|
||||||
j->set_complete(false);
|
|
||||||
|
|
||||||
|
if (j->get_build_phase_type() == VoxelJob::BUILD_PHASE_TYPE_NORMAL) {
|
||||||
#if THREAD_POOL_PRESENT
|
#if THREAD_POOL_PRESENT
|
||||||
ThreadPool::get_singleton()->add_job(j);
|
//ThreadPool::get_singleton()->add_job(j);
|
||||||
|
j->execute();
|
||||||
#else
|
#else
|
||||||
j->execute();
|
j->execute();
|
||||||
#endif
|
#endif
|
||||||
@ -566,13 +567,23 @@ void VoxelChunk::create_meshers() {
|
|||||||
call("_create_meshers");
|
call("_create_meshers");
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelChunk::build(const bool immediate) {
|
void VoxelChunk::build() {
|
||||||
ERR_FAIL_COND(!INSTANCE_VALIDATE(get_voxel_world()));
|
ERR_FAIL_COND(!INSTANCE_VALIDATE(get_voxel_world()));
|
||||||
ERR_FAIL_COND(!get_voxel_world()->is_inside_tree());
|
ERR_FAIL_COND(!get_voxel_world()->is_inside_tree());
|
||||||
ERR_FAIL_COND(!is_in_tree());
|
ERR_FAIL_COND(!is_in_tree());
|
||||||
ERR_FAIL_COND_MSG(!has_method("_build"), "VoxelChunk: _build(immediate : bool) is missing! Please implement it!");
|
|
||||||
|
|
||||||
call("_build", immediate);
|
call("_build");
|
||||||
|
}
|
||||||
|
|
||||||
|
void VoxelChunk::_build() {
|
||||||
|
if (get_is_generating()) {
|
||||||
|
_queued_generation = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_is_generating = true;
|
||||||
|
|
||||||
|
next_job();
|
||||||
}
|
}
|
||||||
|
|
||||||
void VoxelChunk::clear() {
|
void VoxelChunk::clear() {
|
||||||
@ -581,6 +592,12 @@ void VoxelChunk::clear() {
|
|||||||
call("_clear");
|
call("_clear");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void VoxelChunk::finalize_build() {
|
||||||
|
if (has_method("_finalize_build")) {
|
||||||
|
call("_finalize_build");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void VoxelChunk::bake_lights() {
|
void VoxelChunk::bake_lights() {
|
||||||
if (has_method("_bake_lights"))
|
if (has_method("_bake_lights"))
|
||||||
call("_bake_lights");
|
call("_bake_lights");
|
||||||
@ -952,6 +969,8 @@ VoxelChunk::VoxelChunk() {
|
|||||||
_margin_end = 0;
|
_margin_end = 0;
|
||||||
|
|
||||||
_current_job = 0;
|
_current_job = 0;
|
||||||
|
|
||||||
|
_queued_generation = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
VoxelChunk::~VoxelChunk() {
|
VoxelChunk::~VoxelChunk() {
|
||||||
@ -1115,6 +1134,8 @@ void VoxelChunk::_bind_methods() {
|
|||||||
BIND_VMETHOD(MethodInfo("_generation_process", PropertyInfo(Variant::REAL, "delta")));
|
BIND_VMETHOD(MethodInfo("_generation_process", PropertyInfo(Variant::REAL, "delta")));
|
||||||
BIND_VMETHOD(MethodInfo("_generation_physics_process", PropertyInfo(Variant::REAL, "delta")));
|
BIND_VMETHOD(MethodInfo("_generation_physics_process", PropertyInfo(Variant::REAL, "delta")));
|
||||||
|
|
||||||
|
BIND_VMETHOD(MethodInfo("_finalize_build"));
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("enter_tree"), &VoxelChunk::enter_tree);
|
ClassDB::bind_method(D_METHOD("enter_tree"), &VoxelChunk::enter_tree);
|
||||||
ClassDB::bind_method(D_METHOD("exit_tree"), &VoxelChunk::exit_tree);
|
ClassDB::bind_method(D_METHOD("exit_tree"), &VoxelChunk::exit_tree);
|
||||||
ClassDB::bind_method(D_METHOD("process", "delta"), &VoxelChunk::process);
|
ClassDB::bind_method(D_METHOD("process", "delta"), &VoxelChunk::process);
|
||||||
@ -1127,6 +1148,8 @@ void VoxelChunk::_bind_methods() {
|
|||||||
ClassDB::bind_method(D_METHOD("generation_process", "delta"), &VoxelChunk::generation_process);
|
ClassDB::bind_method(D_METHOD("generation_process", "delta"), &VoxelChunk::generation_process);
|
||||||
ClassDB::bind_method(D_METHOD("generation_physics_process", "delta"), &VoxelChunk::generation_physics_process);
|
ClassDB::bind_method(D_METHOD("generation_physics_process", "delta"), &VoxelChunk::generation_physics_process);
|
||||||
|
|
||||||
|
ClassDB::bind_method(D_METHOD("finalize_build"), &VoxelChunk::finalize_build);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_process"), &VoxelChunk::get_process);
|
ClassDB::bind_method(D_METHOD("get_process"), &VoxelChunk::get_process);
|
||||||
ClassDB::bind_method(D_METHOD("set_process", "value"), &VoxelChunk::set_process);
|
ClassDB::bind_method(D_METHOD("set_process", "value"), &VoxelChunk::set_process);
|
||||||
|
|
||||||
@ -1317,6 +1340,10 @@ void VoxelChunk::_bind_methods() {
|
|||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("create_meshers"), &VoxelChunk::create_meshers);
|
ClassDB::bind_method(D_METHOD("create_meshers"), &VoxelChunk::create_meshers);
|
||||||
|
|
||||||
|
BIND_VMETHOD(MethodInfo("_build"));
|
||||||
|
ClassDB::bind_method(D_METHOD("build"), &VoxelChunk::build);
|
||||||
|
ClassDB::bind_method(D_METHOD("_build"), &VoxelChunk::_build);
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("get_global_transform"), &VoxelChunk::get_global_transform);
|
ClassDB::bind_method(D_METHOD("get_global_transform"), &VoxelChunk::get_global_transform);
|
||||||
ClassDB::bind_method(D_METHOD("to_local", "global"), &VoxelChunk::to_local);
|
ClassDB::bind_method(D_METHOD("to_local", "global"), &VoxelChunk::to_local);
|
||||||
ClassDB::bind_method(D_METHOD("to_global", "local"), &VoxelChunk::to_global);
|
ClassDB::bind_method(D_METHOD("to_global", "local"), &VoxelChunk::to_global);
|
||||||
|
@ -141,10 +141,10 @@ public:
|
|||||||
void set_voxel_world_bind(Node *world);
|
void set_voxel_world_bind(Node *world);
|
||||||
|
|
||||||
//Jobs
|
//Jobs
|
||||||
Ref<VoxelMesher> get_job(const int index) const;
|
Ref<VoxelJob> get_job(const int index) const;
|
||||||
void set_job(const int index, const Ref<VoxelMesher> &job);
|
void set_job(const int index, const Ref<VoxelJob> &job);
|
||||||
void remove_job(const int index);
|
void remove_job(const int index);
|
||||||
void add_job(const Ref<VoxelMesher> &job);
|
void add_job(const Ref<VoxelJob> &job);
|
||||||
int get_job_count() const;
|
int get_job_count() const;
|
||||||
|
|
||||||
int get_current_job_index();
|
int get_current_job_index();
|
||||||
@ -185,8 +185,11 @@ public:
|
|||||||
|
|
||||||
//Meshing
|
//Meshing
|
||||||
void create_meshers();
|
void create_meshers();
|
||||||
void build(const bool immediate = false);
|
void build();
|
||||||
void clear();
|
void clear();
|
||||||
|
void finalize_build();
|
||||||
|
|
||||||
|
void _build();
|
||||||
|
|
||||||
//light Baking
|
//light Baking
|
||||||
void bake_lights();
|
void bake_lights();
|
||||||
@ -364,6 +367,7 @@ protected:
|
|||||||
Transform _transform;
|
Transform _transform;
|
||||||
|
|
||||||
bool _abort_build;
|
bool _abort_build;
|
||||||
|
bool _queued_generation;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -420,6 +420,8 @@ Ref<VoxelChunk> VoxelWorld::_create_chunk(const int x, const int y, const int z,
|
|||||||
chunk->set_size(_chunk_size_x, _chunk_size_y, _chunk_size_z, _data_margin_start, _data_margin_end);
|
chunk->set_size(_chunk_size_x, _chunk_size_y, _chunk_size_z, _data_margin_start, _data_margin_end);
|
||||||
//chunk->set_translation(Vector3(x * _chunk_size_x * _voxel_scale, y * _chunk_size_y * _voxel_scale, z * _chunk_size_z * _voxel_scale));
|
//chunk->set_translation(Vector3(x * _chunk_size_x * _voxel_scale, y * _chunk_size_y * _voxel_scale, z * _chunk_size_z * _voxel_scale));
|
||||||
|
|
||||||
|
chunk->create_meshers();
|
||||||
|
|
||||||
add_chunk(chunk, x, y, z);
|
add_chunk(chunk, x, y, z);
|
||||||
|
|
||||||
add_to_generation_queue(chunk);
|
add_to_generation_queue(chunk);
|
||||||
|
Loading…
Reference in New Issue
Block a user