Now the world can be deactivated when needed.

This commit is contained in:
Relintai 2021-08-28 00:05:36 +02:00
parent ecf09d1245
commit 632586f4b3
4 changed files with 80 additions and 17 deletions

View File

@ -62,6 +62,10 @@ void TerraWorldDefault::set_num_lods(const int value) {
} }
void TerraWorldDefault::update_lods() { void TerraWorldDefault::update_lods() {
if (!get_active()) {
return;
}
call("_update_lods"); call("_update_lods");
} }
@ -191,7 +195,7 @@ Ref<TerraChunk> TerraWorldDefault::_create_chunk(int x, int z, Ref<TerraChunk> c
s.instance(); s.instance();
s->set_job_type(TerraMesherJobStep::TYPE_NORMAL); s->set_job_type(TerraMesherJobStep::TYPE_NORMAL);
tj->add_jobs_step(s); tj->add_jobs_step(s);
s.instance(); s.instance();
s->set_job_type(TerraMesherJobStep::TYPE_NORMAL_LOD); s->set_job_type(TerraMesherJobStep::TYPE_NORMAL_LOD);
s->set_lod_index(1); s->set_lod_index(1);
@ -261,6 +265,34 @@ TerraWorldDefault::TerraWorldDefault() {
TerraWorldDefault ::~TerraWorldDefault() { TerraWorldDefault ::~TerraWorldDefault() {
} }
void TerraWorldDefault::_notification(int p_what) {
TerraWorld::_notification(p_what);
switch (p_what) {
case NOTIFICATION_ACTIVE_STATE_CHANGED: {
if (!is_inside_tree()) {
return;
}
bool active = get_active();
for (int i = 0; i < chunk_get_count(); ++i) {
Ref<TerraChunk> chunk = chunk_get_index(i);
if (chunk.is_valid()) {
chunk->set_visible(active);
}
}
if (active) {
update_lods();
}
break;
}
}
}
/* /*
void TerraWorldDefault::_notification(int p_what) { void TerraWorldDefault::_notification(int p_what) {
TerraWorld::_notification(p_what); TerraWorld::_notification(p_what);

View File

@ -52,6 +52,7 @@ public:
~TerraWorldDefault(); ~TerraWorldDefault();
protected: protected:
void _notification(int p_what);
void _update_lods(); void _update_lods();
Ref<TerraChunk> _create_chunk(int x, int z, Ref<TerraChunk> p_chunk); Ref<TerraChunk> _create_chunk(int x, int z, Ref<TerraChunk> p_chunk);
virtual void _chunk_added(Ref<TerraChunk> chunk); virtual void _chunk_added(Ref<TerraChunk> chunk);

View File

@ -43,6 +43,15 @@ SOFTWARE.
const String TerraWorld::BINDING_STRING_CHANNEL_TYPE_INFO = "Type,Isolevel,Liquid,Liquid Level"; const String TerraWorld::BINDING_STRING_CHANNEL_TYPE_INFO = "Type,Isolevel,Liquid,Liquid Level";
bool TerraWorld::get_active() const {
return _active;
}
void TerraWorld::set_active(const bool value) {
_active = value;
notification(NOTIFICATION_ACTIVE_STATE_CHANGED);
}
bool TerraWorld::get_editable() const { bool TerraWorld::get_editable() const {
return _editable; return _editable;
} }
@ -371,6 +380,10 @@ Ref<TerraChunk> TerraWorld::_create_chunk(const int x, const int z, Ref<TerraChu
chunk->set_size(_chunk_size_x, _chunk_size_z, _data_margin_start, _data_margin_end); chunk->set_size(_chunk_size_x, _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));
if (!get_active()) {
chunk->set_visible(false);
}
chunk_add(chunk, x, z); chunk_add(chunk, x, z);
return chunk; return chunk;
@ -792,6 +805,7 @@ int TerraWorld::get_channel_index_info(const TerraWorld::ChannelTypeInfo channel
} }
TerraWorld::TerraWorld() { TerraWorld::TerraWorld() {
_active = true;
_editable = false; _editable = false;
_is_priority_generation = true; _is_priority_generation = true;
@ -871,7 +885,8 @@ void TerraWorld::_notification(int p_what) {
chunk->build(); chunk->build();
} }
} }
} break; break;
}
case NOTIFICATION_INTERNAL_PROCESS: { case NOTIFICATION_INTERNAL_PROCESS: {
_num_frame_chunk_build_steps = 0; _num_frame_chunk_build_steps = 0;
@ -929,7 +944,8 @@ void TerraWorld::_notification(int p_what) {
chunk_generate(chunk); chunk_generate(chunk);
} }
} break; break;
}
case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: { case NOTIFICATION_INTERNAL_PHYSICS_PROCESS: {
for (int i = 0; i < _chunks_vector.size(); ++i) { for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<TerraChunk> chunk = _chunks_vector[i]; Ref<TerraChunk> chunk = _chunks_vector[i];
@ -944,8 +960,8 @@ void TerraWorld::_notification(int p_what) {
chunk->generation_physics_process(get_physics_process_delta_time()); chunk->generation_physics_process(get_physics_process_delta_time());
} }
} }
break;
} break; }
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
for (int i = 0; i < _chunks_vector.size(); ++i) { for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<TerraChunk> chunk = _chunks_vector[i]; Ref<TerraChunk> chunk = _chunks_vector[i];
@ -957,8 +973,8 @@ void TerraWorld::_notification(int p_what) {
} }
} }
} }
break;
} break; }
case NOTIFICATION_TRANSFORM_CHANGED: { case NOTIFICATION_TRANSFORM_CHANGED: {
for (int i = 0; i < _chunks_vector.size(); ++i) { for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<TerraChunk> chunk = _chunks_vector[i]; Ref<TerraChunk> chunk = _chunks_vector[i];
@ -967,14 +983,18 @@ void TerraWorld::_notification(int p_what) {
chunk->world_transform_changed(); chunk->world_transform_changed();
} }
} }
break;
} break; }
} }
} }
void TerraWorld::_bind_methods() { void TerraWorld::_bind_methods() {
ADD_SIGNAL(MethodInfo("chunk_mesh_generation_finished", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerraChunk"))); ADD_SIGNAL(MethodInfo("chunk_mesh_generation_finished", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerraChunk")));
ClassDB::bind_method(D_METHOD("get_active"), &TerraWorld::get_active);
ClassDB::bind_method(D_METHOD("set_active", "value"), &TerraWorld::set_active);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "active"), "set_active", "get_active");
ClassDB::bind_method(D_METHOD("get_editable"), &TerraWorld::get_editable); ClassDB::bind_method(D_METHOD("get_editable"), &TerraWorld::get_editable);
ClassDB::bind_method(D_METHOD("set_editable", "value"), &TerraWorld::set_editable); ClassDB::bind_method(D_METHOD("set_editable", "value"), &TerraWorld::set_editable);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "get_editable"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "editable"), "set_editable", "get_editable");
@ -1131,4 +1151,6 @@ void TerraWorld::_bind_methods() {
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_TYPE); BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_TYPE);
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_ISOLEVEL); BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_ISOLEVEL);
BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_LIQUID_FLOW); BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_LIQUID_FLOW);
BIND_CONSTANT(NOTIFICATION_ACTIVE_STATE_CHANGED);
} }

View File

@ -26,11 +26,11 @@ SOFTWARE.
#include "core/version.h" #include "core/version.h"
#if VERSION_MAJOR > 3 #if VERSION_MAJOR > 3
#include "core/templates/hash_map.h"
#include "core/config/engine.h" #include "core/config/engine.h"
#include "core/templates/hash_map.h"
#else #else
#include "core/hash_map.h"
#include "core/engine.h" #include "core/engine.h"
#include "core/hash_map.h"
#endif #endif
#include "../defines.h" #include "../defines.h"
@ -61,9 +61,16 @@ public:
CHANNEL_TYPE_INFO_LIQUID_FLOW, CHANNEL_TYPE_INFO_LIQUID_FLOW,
}; };
enum {
NOTIFICATION_ACTIVE_STATE_CHANGED = 9000,
};
static const String BINDING_STRING_CHANNEL_TYPE_INFO; static const String BINDING_STRING_CHANNEL_TYPE_INFO;
public: public:
bool get_active() const;
void set_active(const bool value);
bool get_editable() const; bool get_editable() const;
void set_editable(const bool value); void set_editable(const bool value);
@ -228,6 +235,7 @@ public:
}; };
private: private:
bool _active;
bool _editable; bool _editable;
bool _is_priority_generation; bool _is_priority_generation;
@ -245,22 +253,22 @@ private:
int _chunk_spawn_range; int _chunk_spawn_range;
HashMap<IntPos, Ref<TerraChunk>, IntPosHasher> _chunks; HashMap<IntPos, Ref<TerraChunk>, IntPosHasher> _chunks;
Vector<Ref<TerraChunk> > _chunks_vector; Vector<Ref<TerraChunk>> _chunks_vector;
Vector<Ref<TerraWorldArea> > _world_areas; Vector<Ref<TerraWorldArea>> _world_areas;
Vector<Ref<TerraStructure> > _voxel_structures; Vector<Ref<TerraStructure>> _voxel_structures;
NodePath _player_path; NodePath _player_path;
Spatial *_player; Spatial *_player;
int _max_concurrent_generations; int _max_concurrent_generations;
Vector<Ref<TerraChunk> > _generation_queue; Vector<Ref<TerraChunk>> _generation_queue;
Vector<Ref<TerraChunk> > _generating; Vector<Ref<TerraChunk>> _generating;
int _max_frame_chunk_build_steps; int _max_frame_chunk_build_steps;
int _num_frame_chunk_build_steps; int _num_frame_chunk_build_steps;
Vector<Ref<TerraLight> > _lights; Vector<Ref<TerraLight>> _lights;
}; };
_FORCE_INLINE_ bool operator==(const TerraWorld::IntPos &a, const TerraWorld::IntPos &b) { _FORCE_INLINE_ bool operator==(const TerraWorld::IntPos &a, const TerraWorld::IntPos &b) {