Added a map changed signal to the VertexLights2DServer.

This commit is contained in:
Relintai 2024-03-26 12:11:00 +01:00
parent d2ed14cf26
commit 862ab3c5ca
3 changed files with 86 additions and 11 deletions

View File

@ -33,8 +33,8 @@
#include "core/config/engine.h" #include "core/config/engine.h"
#include "vertex_lights_2d_server.h"
#include "vertex_light_2d.h" #include "vertex_light_2d.h"
#include "vertex_lights_2d_server.h"
VertexLights2DServer *vertex_lights_2d_server = NULL; VertexLights2DServer *vertex_lights_2d_server = NULL;
@ -43,19 +43,19 @@ void register_vertex_lights_2d_types(ModuleRegistrationLevel p_level) {
vertex_lights_2d_server = memnew(VertexLights2DServer); vertex_lights_2d_server = memnew(VertexLights2DServer);
ClassDB::register_class<VertexLights2DServer>(); ClassDB::register_class<VertexLights2DServer>();
Engine::get_singleton()->add_singleton(Engine::Singleton("VertexLights2DServer", VertexLights2DServer::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("VertexLights2DServer", VertexLights2DServer::get_singleton()));
} } else if (p_level == MODULE_REGISTRATION_LEVEL_SCENE) {
if (p_level == MODULE_REGISTRATION_LEVEL_SCENE) {
ClassDB::register_class<VertexLight2D>(); ClassDB::register_class<VertexLight2D>();
} else if (p_level == MODULE_REGISTRATION_LEVEL_FINALIZE) {
vertex_lights_2d_server->init();
} }
} }
void unregister_vertex_lights_2d_types(ModuleRegistrationLevel p_level) { void unregister_vertex_lights_2d_types(ModuleRegistrationLevel p_level) {
if (p_level == MODULE_REGISTRATION_LEVEL_SINGLETON) { if (p_level == MODULE_REGISTRATION_LEVEL_SINGLETON) {
if (vertex_lights_2d_server) { if (vertex_lights_2d_server) {
memdelete(vertex_lights_2d_server); memdelete(vertex_lights_2d_server);
} else if (p_level == MODULE_REGISTRATION_LEVEL_FINALIZE) {
vertex_lights_2d_server->finalize();
} }
} }
} }

View File

@ -33,6 +33,8 @@
#include "core/config/project_settings.h" #include "core/config/project_settings.h"
#include "scene/main/scene_tree.h"
// Defaults // Defaults
Vector2i VertexLights2DServer::get_default_quadrant_size() const { Vector2i VertexLights2DServer::get_default_quadrant_size() const {
return _default_quadrant_size; return _default_quadrant_size;
@ -61,6 +63,8 @@ void VertexLights2DServer::map_set_quadrant_size(RID p_map, const Vector2i &p_si
map->quadrant_size = p_size; map->quadrant_size = p_size;
map->recreate_quadrants(); map->recreate_quadrants();
_map_changed(map);
} }
Array VertexLights2DServer::map_get_lights(RID p_map) const { Array VertexLights2DServer::map_get_lights(RID p_map) const {
@ -87,6 +91,8 @@ void VertexLights2DServer::map_clear(RID p_map) {
ERR_FAIL_COND(map == NULL); ERR_FAIL_COND(map == NULL);
map->clear(); map->clear();
_map_changed(map);
} }
// Lights // Lights
@ -114,11 +120,13 @@ void VertexLights2DServer::light_set_map(RID p_light, RID p_map) {
VertexLightMap2D *map = map_owner.getornull(p_map); VertexLightMap2D *map = map_owner.getornull(p_map);
if (light->map) { if (light->map) {
_light_changed(light);
light->map->remove_light(light); light->map->remove_light(light);
} }
if (map) { if (map) {
map->add_light(light); map->add_light(light);
_light_changed(light);
} }
} }
@ -133,6 +141,8 @@ void VertexLights2DServer::light_set_enabled(RID p_light, const bool p_enabled)
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->enabled = p_enabled; light->enabled = p_enabled;
_light_changed(light);
} }
Vector2 VertexLights2DServer::light_get_position(RID p_light) { Vector2 VertexLights2DServer::light_get_position(RID p_light) {
@ -152,6 +162,8 @@ void VertexLights2DServer::light_set_position(RID p_light, const Vector2 &p_posi
} }
light->position = p_position; light->position = p_position;
_light_changed(light);
} }
Vector2i VertexLights2DServer::light_get_range(RID p_light) { Vector2i VertexLights2DServer::light_get_range(RID p_light) {
@ -165,6 +177,8 @@ void VertexLights2DServer::light_set_range(RID p_light, const Vector2i &p_range)
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->range = p_range; light->range = p_range;
_light_changed(light);
} }
real_t VertexLights2DServer::light_get_attenuation(RID p_light) { real_t VertexLights2DServer::light_get_attenuation(RID p_light) {
@ -178,6 +192,8 @@ void VertexLights2DServer::light_set_attenuation(RID p_light, const real_t p_att
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->attenuation = p_attenuation; light->attenuation = p_attenuation;
_light_changed(light);
} }
Color VertexLights2DServer::light_get_color(RID p_light) { Color VertexLights2DServer::light_get_color(RID p_light) {
@ -191,6 +207,8 @@ void VertexLights2DServer::light_set_color(RID p_light, const Color &p_color) {
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->color = p_color; light->color = p_color;
_light_changed(light);
} }
VertexLights2DServer::VertexLight2DMode VertexLights2DServer::light_get_mode(RID p_light) { VertexLights2DServer::VertexLight2DMode VertexLights2DServer::light_get_mode(RID p_light) {
@ -204,6 +222,8 @@ void VertexLights2DServer::light_set_mode(RID p_light, const VertexLights2DServe
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->mode = p_mode; light->mode = p_mode;
_light_changed(light);
} }
Vector2i VertexLights2DServer::light_get_z_range(RID p_light) { Vector2i VertexLights2DServer::light_get_z_range(RID p_light) {
@ -217,6 +237,8 @@ void VertexLights2DServer::light_set_z_range(RID p_light, const Vector2i &p_z_ra
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->z_range = p_z_range; light->z_range = p_z_range;
_light_changed(light);
} }
Vector2i VertexLights2DServer::light_get_layer_range(RID p_light) { Vector2i VertexLights2DServer::light_get_layer_range(RID p_light) {
@ -230,6 +252,8 @@ void VertexLights2DServer::light_set_layer_range(RID p_light, const Vector2i &p_
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->layer_range = p_layer_range; light->layer_range = p_layer_range;
_light_changed(light);
} }
int VertexLights2DServer::light_get_item_cull_mask(RID p_light) { int VertexLights2DServer::light_get_item_cull_mask(RID p_light) {
@ -243,6 +267,8 @@ void VertexLights2DServer::light_set_item_cull_mask(RID p_light, const int p_ite
ERR_FAIL_COND(light == NULL); ERR_FAIL_COND(light == NULL);
light->item_cull_mask = p_item_cull_mask; light->item_cull_mask = p_item_cull_mask;
_light_changed(light);
} }
// Sampling // Sampling
@ -250,7 +276,7 @@ void VertexLights2DServer::light_set_item_cull_mask(RID p_light, const int p_ite
Color VertexLights2DServer::sample_light(RID p_map, const Vector2 &p_position, const int p_item_cull_mask, const int p_layer) { Color VertexLights2DServer::sample_light(RID p_map, const Vector2 &p_position, const int p_item_cull_mask, const int p_layer) {
VertexLightMap2D *map = map_owner.getornull(p_map); VertexLightMap2D *map = map_owner.getornull(p_map);
ERR_FAIL_COND_V(map == NULL, Color()); ERR_FAIL_COND_V(map == NULL, Color());
return map->sample_light(p_position, p_item_cull_mask, p_layer); return map->sample_light(p_position, p_item_cull_mask, p_layer);
} }
@ -274,6 +300,7 @@ void VertexLights2DServer::free(RID p_rid) {
VertexLightData2D *light = light_owner.get(p_rid); VertexLightData2D *light = light_owner.get(p_rid);
if (light->map) { if (light->map) {
_light_changed(light);
light->map->remove_light(light); light->map->remove_light(light);
} }
@ -287,6 +314,23 @@ void VertexLights2DServer::free(RID p_rid) {
} }
} }
void VertexLights2DServer::init() {
if (SceneTree::get_singleton()) {
SceneTree::get_singleton()->add_idle_callback(VertexLights2DServer::_scene_tree_idle_callback);
}
}
void VertexLights2DServer::finalize() {
}
void VertexLights2DServer::flush_notifications() {
for (HashSet<RID>::Iterator iter = _changed_maps.begin(); iter; ++iter) {
emit_signal(_map_changed_name, iter.key());
}
_changed_maps.clear();
}
VertexLights2DServer::VertexLights2DServer() { VertexLights2DServer::VertexLights2DServer() {
ERR_FAIL_COND(_self); ERR_FAIL_COND(_self);
@ -294,6 +338,8 @@ VertexLights2DServer::VertexLights2DServer() {
GLOBAL_DEF("vertex_lights_2d/default_quadrant_size", Vector2i(256, 256)); GLOBAL_DEF("vertex_lights_2d/default_quadrant_size", Vector2i(256, 256));
_default_quadrant_size = GLOBAL_GET("vertex_lights_2d/default_quadrant_size"); _default_quadrant_size = GLOBAL_GET("vertex_lights_2d/default_quadrant_size");
_map_changed_name = "map_changed";
} }
VertexLights2DServer::~VertexLights2DServer() { VertexLights2DServer::~VertexLights2DServer() {
@ -301,6 +347,8 @@ VertexLights2DServer::~VertexLights2DServer() {
} }
void VertexLights2DServer::_bind_methods() { void VertexLights2DServer::_bind_methods() {
ADD_SIGNAL(MethodInfo("map_changed", PropertyInfo(Variant::RID, "map")));
ClassDB::bind_method(D_METHOD("get_default_quadrant_size"), &VertexLights2DServer::get_default_quadrant_size); ClassDB::bind_method(D_METHOD("get_default_quadrant_size"), &VertexLights2DServer::get_default_quadrant_size);
ClassDB::bind_method(D_METHOD("set_default_quadrant_size", "size"), &VertexLights2DServer::set_default_quadrant_size); ClassDB::bind_method(D_METHOD("set_default_quadrant_size", "size"), &VertexLights2DServer::set_default_quadrant_size);
@ -346,15 +394,17 @@ void VertexLights2DServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("light_get_item_cull_mask", "light"), &VertexLights2DServer::light_get_item_cull_mask); ClassDB::bind_method(D_METHOD("light_get_item_cull_mask", "light"), &VertexLights2DServer::light_get_item_cull_mask);
ClassDB::bind_method(D_METHOD("light_set_item_cull_mask", "light", "item_cull_mask"), &VertexLights2DServer::light_set_item_cull_mask); ClassDB::bind_method(D_METHOD("light_set_item_cull_mask", "light", "item_cull_mask"), &VertexLights2DServer::light_set_item_cull_mask);
// Sampling // Sampling
ClassDB::bind_method(D_METHOD("sample_light", "map", "position", "item_cull_mask", "layer"), &VertexLights2DServer::sample_light, DEFVAL(1), DEFVAL(0)); ClassDB::bind_method(D_METHOD("sample_light", "map", "position", "item_cull_mask", "layer"), &VertexLights2DServer::sample_light, DEFVAL(1), DEFVAL(0));
// Rest // Rest
ClassDB::bind_method(D_METHOD("free", "rid"), &VertexLights2DServer::free); ClassDB::bind_method(D_METHOD("free", "rid"), &VertexLights2DServer::free);
ClassDB::bind_method(D_METHOD("flush_notifications"), &VertexLights2DServer::flush_notifications);
BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_ADD); BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_ADD);
BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_SUB); BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_SUB);
BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_MIX); BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_MIX);

View File

@ -35,6 +35,7 @@
#include "core/object/object.h" #include "core/object/object.h"
#include "core/containers/hash_map.h" #include "core/containers/hash_map.h"
#include "core/containers/hash_set.h"
#include "core/containers/list.h" #include "core/containers/list.h"
#include "core/containers/rid.h" #include "core/containers/rid.h"
#include "core/containers/vector.h" #include "core/containers/vector.h"
@ -110,6 +111,10 @@ public:
void free(RID p_rid); void free(RID p_rid);
void init();
void finalize();
void flush_notifications();
_FORCE_INLINE_ static VertexLights2DServer *get_singleton() { _FORCE_INLINE_ static VertexLights2DServer *get_singleton() {
return _self; return _self;
} }
@ -118,6 +123,10 @@ public:
~VertexLights2DServer(); ~VertexLights2DServer();
protected: protected:
static void _scene_tree_idle_callback() {
VertexLights2DServer::get_singleton()->flush_notifications();
}
static void _bind_methods(); static void _bind_methods();
class VertexLightMap2D; class VertexLightMap2D;
@ -163,7 +172,7 @@ protected:
VertexLightMap2D *map; VertexLightMap2D *map;
void get_lights(List<VertexLightData2D *> *p_lights); void get_lights(List<VertexLightData2D *> *p_lights);
Color sample_light(const Color &p_current_color, const Vector2 &p_local_position, const int p_item_cull_mask, const int p_layer); Color sample_light(const Color &p_current_color, const Vector2 &p_local_position, const int p_item_cull_mask, const int p_layer);
VertexLightQuadrant2D() { VertexLightQuadrant2D() {
@ -190,7 +199,7 @@ protected:
void set_light_position(VertexLightData2D *p_light, const Vector2 &p_position); void set_light_position(VertexLightData2D *p_light, const Vector2 &p_position);
void clear(); void clear();
Color sample_light(const Vector2 &p_position, const int p_item_cull_mask = 1, const int p_layer = 0); Color sample_light(const Vector2 &p_position, const int p_item_cull_mask = 1, const int p_layer = 0);
_FORCE_INLINE_ Vector2i to_quadrant_position(const Vector2 &p_position) { _FORCE_INLINE_ Vector2i to_quadrant_position(const Vector2 &p_position) {
@ -202,11 +211,27 @@ protected:
} }
}; };
_FORCE_INLINE_ void _light_changed(const VertexLightData2D *p_light) const {
if (p_light && p_light->map) {
_changed_maps.insert(p_light->map->self);
}
}
_FORCE_INLINE_ void _map_changed(const VertexLightMap2D *p_map) const {
if (p_map) {
_changed_maps.insert(p_map->self);
}
}
mutable RID_Owner<VertexLightMap2D> map_owner; mutable RID_Owner<VertexLightMap2D> map_owner;
mutable RID_Owner<VertexLightData2D> light_owner; mutable RID_Owner<VertexLightData2D> light_owner;
Vector2i _default_quadrant_size; Vector2i _default_quadrant_size;
// Maybe an api could be adde that's per quadrant
mutable HashSet<RID> _changed_maps;
StringName _map_changed_name;
static VertexLights2DServer *_self; static VertexLights2DServer *_self;
}; };