mirror of
https://github.com/Relintai/voxelman.git
synced 2024-11-22 10:57:30 +01:00
started reworking how chunk handles threaded builds.
This commit is contained in:
parent
8f71179c5e
commit
90cbfe02cc
@ -24,6 +24,8 @@ SOFTWARE.
|
||||
|
||||
#include "voxel_world.h"
|
||||
|
||||
const String VoxelChunk::BINDING_STRING_ACTIVE_BUILD_PHASE_TYPE = "Normal,Process,Physics Process";
|
||||
|
||||
_FORCE_INLINE_ bool VoxelChunk::get_is_generating() const {
|
||||
return _is_generating;
|
||||
}
|
||||
@ -38,6 +40,13 @@ _FORCE_INLINE_ void VoxelChunk::set_is_build_threaded(bool value) {
|
||||
_is_build_threaded = value;
|
||||
}
|
||||
|
||||
_FORCE_INLINE_ VoxelChunk::ActiveBuildPhaseType VoxelChunk::get_active_build_phase_type() const {
|
||||
return _active_build_phase_type;
|
||||
}
|
||||
_FORCE_INLINE_ void VoxelChunk::set_active_build_phase_type(const VoxelChunk::ActiveBuildPhaseType value) {
|
||||
_active_build_phase_type = value;
|
||||
}
|
||||
|
||||
bool VoxelChunk::get_build_phase_done() const {
|
||||
_build_phase_done_mutex->lock();
|
||||
bool v = _build_phase_done;
|
||||
@ -747,10 +756,10 @@ void VoxelChunk::_build_phase(int phase) {
|
||||
temp_arr_collider.append_array(mesher->build_collider());
|
||||
}
|
||||
|
||||
//if (_is_build_threaded) {
|
||||
// set_physics_process_internal(true);
|
||||
// return;
|
||||
//}
|
||||
if (_is_build_threaded) {
|
||||
set_physics_process_internal(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (temp_arr_collider.size() == 0) {
|
||||
next_phase();
|
||||
@ -898,10 +907,10 @@ void VoxelChunk::_build_phase(int phase) {
|
||||
return;
|
||||
}
|
||||
|
||||
//if (_is_build_threaded) {
|
||||
// set_physics_process_internal(true);
|
||||
// return;
|
||||
//}
|
||||
if (_is_build_threaded) {
|
||||
set_physics_process_internal(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (_prop_body_rid == RID()) {
|
||||
allocate_prop_colliders();
|
||||
@ -1433,6 +1442,8 @@ VoxelChunk::VoxelChunk() {
|
||||
_build_phase_done = false;
|
||||
_build_thread = NULL;
|
||||
_thread_finished = true;
|
||||
|
||||
_active_build_phase_type = BUILD_PHASE_TYPE_NORMAL;
|
||||
}
|
||||
|
||||
VoxelChunk::~VoxelChunk() {
|
||||
@ -1475,7 +1486,22 @@ void VoxelChunk::_notification(int p_what) {
|
||||
}
|
||||
}
|
||||
case NOTIFICATION_INTERNAL_PROCESS: {
|
||||
if (_thread_finished && get_is_generating() && has_next_phase() && get_build_phase_done()) {
|
||||
if (!get_is_generating() || !has_next_phase()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_active_build_phase_type == BUILD_PHASE_TYPE_PROCESS) {
|
||||
|
||||
if (!_voxel_world->can_chunk_do_build_step())
|
||||
return;
|
||||
|
||||
build_step();
|
||||
|
||||
} else if (_active_build_phase_type == BUILD_PHASE_TYPE_NORMAL) {
|
||||
|
||||
if (_is_build_threaded) {
|
||||
|
||||
if (_thread_finished && get_build_phase_done()) {
|
||||
if (!_voxel_world->can_chunk_do_build_step())
|
||||
return;
|
||||
|
||||
@ -1483,10 +1509,30 @@ void VoxelChunk::_notification(int p_what) {
|
||||
|
||||
build_step();
|
||||
}
|
||||
} else {
|
||||
|
||||
if (!_voxel_world->can_chunk_do_build_step())
|
||||
return;
|
||||
|
||||
build_step();
|
||||
}
|
||||
}
|
||||
}
|
||||
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
|
||||
if (get_is_generating()) {
|
||||
if (_thread_finished && get_current_build_phase() == BUILD_PHASE_TERRARIN_MESH_COLLIDER) {
|
||||
if (!get_is_generating() || !has_next_phase()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_active_build_phase_type == BUILD_PHASE_TYPE_PHYSICS_PROCESS) {
|
||||
|
||||
if (!_voxel_world->can_chunk_do_build_step())
|
||||
return;
|
||||
|
||||
build_step();
|
||||
}
|
||||
/*
|
||||
if (get_is_generating() && _thread_finished && !get_build_phase_done()) {
|
||||
if (get_current_build_phase() == BUILD_PHASE_TERRARIN_MESH_COLLIDER) {
|
||||
|
||||
if (_body_rid == RID()) {
|
||||
create_colliders();
|
||||
@ -1495,8 +1541,9 @@ void VoxelChunk::_notification(int p_what) {
|
||||
PhysicsServer::get_singleton()->shape_set_data(_shape_rid, temp_arr_collider);
|
||||
temp_arr_collider.resize(0);
|
||||
next_phase();
|
||||
set_physics_process_internal(false);
|
||||
|
||||
} else if (_thread_finished && get_current_build_phase() == BUILD_PHASE_PROP_COLLIDER) {
|
||||
} else if (get_current_build_phase() == BUILD_PHASE_PROP_COLLIDER) {
|
||||
|
||||
if (_prop_body_rid == RID()) {
|
||||
allocate_prop_colliders();
|
||||
@ -1505,8 +1552,9 @@ void VoxelChunk::_notification(int p_what) {
|
||||
PhysicsServer::get_singleton()->shape_set_data(_prop_shape_rid, temp_arr_collider);
|
||||
temp_arr_collider.resize(0);
|
||||
next_phase();
|
||||
set_physics_process_internal(false);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1578,6 +1626,10 @@ void VoxelChunk::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_is_build_threaded", "value"), &VoxelChunk::set_is_build_threaded);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "is_build_threaded"), "set_is_build_threaded", "get_is_build_threaded");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_active_build_phase_type"), &VoxelChunk::get_active_build_phase_type);
|
||||
ClassDB::bind_method(D_METHOD("set_active_build_phase_type", "value"), &VoxelChunk::set_active_build_phase_type);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "active_build_phase_type", PROPERTY_HINT_ENUM, BINDING_STRING_ACTIVE_BUILD_PHASE_TYPE), "set_active_build_phase_type", "get_active_build_phase_type");
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_dirty"), &VoxelChunk::get_dirty);
|
||||
ClassDB::bind_method(D_METHOD("set_dirty", "value"), &VoxelChunk::set_dirty);
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "dirty"), "set_dirty", "get_dirty");
|
||||
@ -1819,4 +1871,8 @@ void VoxelChunk::_bind_methods() {
|
||||
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_LIQUID_FILL);
|
||||
BIND_ENUM_CONSTANT(DEFAULT_CHANNEL_LIQUID_FLOW);
|
||||
BIND_ENUM_CONSTANT(MAX_DEFAULT_CHANNELS);
|
||||
|
||||
BIND_ENUM_CONSTANT(BUILD_PHASE_TYPE_NORMAL);
|
||||
BIND_ENUM_CONSTANT(BUILD_PHASE_TYPE_PROCESS);
|
||||
BIND_ENUM_CONSTANT(BUILD_PHASE_TYPE_PHYSICS_PROCESS);
|
||||
}
|
||||
|
@ -66,6 +66,8 @@ class VoxelChunk : public Spatial {
|
||||
_THREAD_SAFE_CLASS_
|
||||
|
||||
public:
|
||||
static const String BINDING_STRING_ACTIVE_BUILD_PHASE_TYPE;
|
||||
|
||||
enum {
|
||||
VOXEL_CHUNK_STATE_OK = 0,
|
||||
VOXEL_CHUNK_STATE_GENERATION_QUEUED,
|
||||
@ -104,6 +106,12 @@ public:
|
||||
MAX_DEFAULT_CHANNELS
|
||||
};
|
||||
|
||||
enum ActiveBuildPhaseType {
|
||||
BUILD_PHASE_TYPE_NORMAL = 0,
|
||||
BUILD_PHASE_TYPE_PROCESS,
|
||||
BUILD_PHASE_TYPE_PHYSICS_PROCESS,
|
||||
};
|
||||
|
||||
public:
|
||||
bool get_is_generating() const;
|
||||
void set_is_generating(bool value);
|
||||
@ -111,6 +119,9 @@ public:
|
||||
bool get_is_build_threaded() const;
|
||||
void set_is_build_threaded(bool value);
|
||||
|
||||
ActiveBuildPhaseType get_active_build_phase_type() const;
|
||||
void set_active_build_phase_type(const ActiveBuildPhaseType value);
|
||||
|
||||
bool get_build_phase_done() const;
|
||||
void set_build_phase_done(bool value);
|
||||
|
||||
@ -238,9 +249,17 @@ public:
|
||||
void build_prioritized();
|
||||
static void _build_step_threaded(void *_userdata);
|
||||
|
||||
void build_phase();
|
||||
void build_step();
|
||||
|
||||
void build_phase();
|
||||
void _build_phase(int phase);
|
||||
|
||||
void build_phase_process();
|
||||
void _build_phase_process(int phase);
|
||||
|
||||
void build_phase_physics_process();
|
||||
void _build_phase_physics_process(int phase);
|
||||
|
||||
bool has_next_phase();
|
||||
void next_phase();
|
||||
|
||||
@ -396,8 +415,11 @@ protected:
|
||||
|
||||
Array temp_array;
|
||||
PoolVector<Vector3> temp_arr_collider;
|
||||
|
||||
ActiveBuildPhaseType _active_build_phase_type;
|
||||
};
|
||||
|
||||
VARIANT_ENUM_CAST(VoxelChunk::DefaultChannels);
|
||||
VARIANT_ENUM_CAST(VoxelChunk::ActiveBuildPhaseType);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user