mirror of
https://github.com/Relintai/pandemonium_engine.git
synced 2025-03-28 06:46:21 +01:00
Added a map changed signal to the VertexLights2DServer.
This commit is contained in:
parent
d2ed14cf26
commit
862ab3c5ca
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user