Added use_vertex_lights_3d property to TerrainWorld.

This commit is contained in:
Relintai 2025-04-04 17:44:42 +02:00
parent 83e68549d5
commit a4ff7e9e66
2 changed files with 79 additions and 2 deletions

View File

@ -54,6 +54,7 @@
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED
#include "../../mesh_data_resource/props/prop_data_mesh_data.h" #include "../../mesh_data_resource/props/prop_data_mesh_data.h"
#include "modules/mesh_data_resource/mesh_data_resource.h"
#endif #endif
#if TOOLS_ENABLED #if TOOLS_ENABLED
@ -61,8 +62,9 @@
#include "scene/3d/camera.h" #include "scene/3d/camera.h"
#endif #endif
#ifdef MODULE_MESH_DATA_RESOURCE_ENABLED #ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
#include "modules/mesh_data_resource/mesh_data_resource.h" #include "modules/vertex_lights_3d/vertex_lights_3d_server.h"
#include "scene/resources/world_3d.h"
#endif #endif
const String TerrainWorld::BINDING_STRING_CHANNEL_TYPE_INFO = "Type,Isolevel,Liquid,Liquid Level"; const String TerrainWorld::BINDING_STRING_CHANNEL_TYPE_INFO = "Type,Isolevel,Liquid,Liquid Level";
@ -173,6 +175,23 @@ void TerrainWorld::set_voxel_scale(const float value) {
} }
} }
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
bool TerrainWorld::get_use_vertex_lights_3d() const {
return _use_vertex_lights_3d;
}
void TerrainWorld::set_use_vertex_lights_3d(const bool value) {
_use_vertex_lights_3d = value;
if (is_inside_tree()) {
if (_use_vertex_lights_3d) {
VertexLights3DServer::get_singleton()->connect("map_changed", this, "_on_vertex_lights_3d_map_changed");
} else {
VertexLights3DServer::get_singleton()->disconnect("map_changed", this, "_on_vertex_lights_3d_map_changed");
}
}
}
#endif
int TerrainWorld::get_chunk_spawn_range() const { int TerrainWorld::get_chunk_spawn_range() const {
return _chunk_spawn_range; return _chunk_spawn_range;
} }
@ -1353,6 +1372,10 @@ TerrainWorld::TerrainWorld() {
_player = NULL; _player = NULL;
_max_frame_chunk_build_steps = 0; _max_frame_chunk_build_steps = 0;
_num_frame_chunk_build_steps = 0; _num_frame_chunk_build_steps = 0;
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
_use_vertex_lights_3d = true;
#endif
} }
TerrainWorld ::~TerrainWorld() { TerrainWorld ::~TerrainWorld() {
@ -1397,6 +1420,12 @@ void TerrainWorld::_generate_chunk(Ref<TerrainChunk> chunk) {
void TerrainWorld::_notification(int p_what) { void TerrainWorld::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
if (_use_vertex_lights_3d) {
VertexLights3DServer::get_singleton()->connect("map_changed", this, "_on_vertex_lights_3d_map_changed");
}
#endif
set_player_bind(get_node_or_null(get_player_path())); set_player_bind(get_node_or_null(get_player_path()));
set_process_internal(true); set_process_internal(true);
@ -1504,6 +1533,12 @@ void TerrainWorld::_notification(int p_what) {
break; break;
} }
case NOTIFICATION_EXIT_TREE: { case NOTIFICATION_EXIT_TREE: {
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
if (_use_vertex_lights_3d) {
VertexLights3DServer::get_singleton()->disconnect("map_changed", this, "_on_vertex_lights_3d_map_changed");
}
#endif
for (int i = 0; i < _chunks_vector.size(); ++i) { for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<TerrainChunk> chunk = _chunks_vector[i]; Ref<TerrainChunk> chunk = _chunks_vector[i];
@ -1534,6 +1569,26 @@ void TerrainWorld::_notification(int p_what) {
} }
} }
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
void TerrainWorld::_on_vertex_lights_3d_map_changed(RID p_map) {
if (!_use_vertex_lights_3d) {
return;
}
if (!is_inside_world()) {
return;
}
if (get_world_3d()->get_vertex_lights_3d_map() == p_map) {
for (int i = 0; i < _chunks_vector.size(); ++i) {
Ref<TerrainChunk> chunk = _chunks_vector[i];
chunk->build();
}
}
}
#endif
void TerrainWorld::_bind_methods() { void TerrainWorld::_bind_methods() {
ADD_SIGNAL(MethodInfo("chunk_mesh_generation_finished", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerrainChunk"))); ADD_SIGNAL(MethodInfo("chunk_mesh_generation_finished", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerrainChunk")));
ADD_SIGNAL(MethodInfo("chunk_added", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerrainChunk"))); ADD_SIGNAL(MethodInfo("chunk_added", PropertyInfo(Variant::OBJECT, "chunk", PROPERTY_HINT_RESOURCE_TYPE, "TerrainChunk")));
@ -1587,6 +1642,12 @@ void TerrainWorld::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_voxel_scale", "value"), &TerrainWorld::set_voxel_scale); ClassDB::bind_method(D_METHOD("set_voxel_scale", "value"), &TerrainWorld::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");
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
ClassDB::bind_method(D_METHOD("get_use_vertex_lights_3d"), &TerrainWorld::get_use_vertex_lights_3d);
ClassDB::bind_method(D_METHOD("set_use_vertex_lights_3d", "value"), &TerrainWorld::set_use_vertex_lights_3d);
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_vertex_lights_3d"), "set_use_vertex_lights_3d", "get_use_vertex_lights_3d");
#endif
ClassDB::bind_method(D_METHOD("get_chunk_spawn_range"), &TerrainWorld::get_chunk_spawn_range); ClassDB::bind_method(D_METHOD("get_chunk_spawn_range"), &TerrainWorld::get_chunk_spawn_range);
ClassDB::bind_method(D_METHOD("set_chunk_spawn_range", "value"), &TerrainWorld::set_chunk_spawn_range); ClassDB::bind_method(D_METHOD("set_chunk_spawn_range", "value"), &TerrainWorld::set_chunk_spawn_range);
ADD_PROPERTY(PropertyInfo(Variant::INT, "chunk_spawn_range"), "set_chunk_spawn_range", "get_chunk_spawn_range"); ADD_PROPERTY(PropertyInfo(Variant::INT, "chunk_spawn_range"), "set_chunk_spawn_range", "get_chunk_spawn_range");
@ -1704,6 +1765,10 @@ void TerrainWorld::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_editor_camera"), &TerrainWorld::get_editor_camera); ClassDB::bind_method(D_METHOD("get_editor_camera"), &TerrainWorld::get_editor_camera);
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
ClassDB::bind_method(D_METHOD("_on_vertex_lights_3d_map_changed"), &TerrainWorld::_on_vertex_lights_3d_map_changed);
#endif
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_TYPE); BIND_ENUM_CONSTANT(CHANNEL_TYPE_INFO_LIQUID_TYPE);

View File

@ -111,6 +111,11 @@ public:
float get_voxel_scale() const; float get_voxel_scale() const;
void set_voxel_scale(const float value); void set_voxel_scale(const float value);
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
bool get_use_vertex_lights_3d() const;
void set_use_vertex_lights_3d(const bool value);
#endif
int get_chunk_spawn_range() const; int get_chunk_spawn_range() const;
void set_chunk_spawn_range(const int value); void set_chunk_spawn_range(const int value);
@ -230,6 +235,10 @@ protected:
virtual void _notification(int p_what); virtual void _notification(int p_what);
static void _bind_methods(); static void _bind_methods();
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
void _on_vertex_lights_3d_map_changed(RID p_map);
#endif
public: public:
struct IntPos { struct IntPos {
int x; int x;
@ -271,6 +280,9 @@ private:
int _data_margin_start; int _data_margin_start;
int _data_margin_end; int _data_margin_end;
float _world_height; float _world_height;
#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED
bool _use_vertex_lights_3d;
#endif
Ref<TerrainLibrary> _library; Ref<TerrainLibrary> _library;
Ref<TerrainLevelGenerator> _level_generator; Ref<TerrainLevelGenerator> _level_generator;