From 48c65ce89e2febb76ca487e68ec3ec82156abc13 Mon Sep 17 00:00:00 2001 From: Relintai Date: Sat, 11 May 2024 21:05:52 +0200 Subject: [PATCH] Added VertexLight2D support to LayeredTileData. --- modules/layered_tile_map/layered_tile_set.cpp | 140 ++++++++++++++++++ modules/layered_tile_map/layered_tile_set.h | 65 ++++++++ 2 files changed, 205 insertions(+) diff --git a/modules/layered_tile_map/layered_tile_set.cpp b/modules/layered_tile_map/layered_tile_set.cpp index 5be7bfef7..2cae0a751 100644 --- a/modules/layered_tile_map/layered_tile_set.cpp +++ b/modules/layered_tile_map/layered_tile_set.cpp @@ -6389,6 +6389,11 @@ LayeredTileData *LayeredTileData::duplicate() { // Custom data output->custom_data = custom_data; + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_3D_ENABLED + output->_vertex_light = _vertex_light; +#endif + return output; } @@ -6840,6 +6845,81 @@ Vector LayeredTileData::get_transformed_avoidance_polygon(int p_layer_i return transformed_polygon; } +// VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED +bool LayeredTileData::get_vertex_light_is_enabled() { + return _vertex_light.enabled; +} +void LayeredTileData::set_vertex_light_enabled(const bool p_enabled) { + _vertex_light.enabled = p_enabled; + emit_signal("changed"); +} + +Vector2i LayeredTileData::get_vertex_light_position() { + return _vertex_light.position; +} +void LayeredTileData::set_vertex_light_position(const Vector2i &p_position) { + _vertex_light.position = p_position; + emit_signal("changed"); +} + +Vector2i LayeredTileData::get_vertex_light_range() { + return _vertex_light.range; +} +void LayeredTileData::set_vertex_light_range(const Vector2i &p_range) { + _vertex_light.range = p_range; + emit_signal("changed"); +} + +real_t LayeredTileData::get_vertex_light_attenuation() { + return _vertex_light.attenuation; +} +void LayeredTileData::set_vertex_light_attenuation(const real_t p_attenuation) { + _vertex_light.attenuation = p_attenuation; + emit_signal("changed"); +} + +Color LayeredTileData::get_vertex_light_color() { + return _vertex_light.color; +} +void LayeredTileData::set_vertex_light_color(const Color &p_color) { + _vertex_light.color = p_color; + emit_signal("changed"); +} + +LayeredTileData::VertexLight2DMode LayeredTileData::get_vertex_light_mode() { + return _vertex_light.mode; +} +void LayeredTileData::set_vertex_light_mode(const LayeredTileData::VertexLight2DMode p_mode) { + _vertex_light.mode = p_mode; + emit_signal("changed"); +} + +Vector2i LayeredTileData::get_vertex_light_z_range() { + return _vertex_light.z_range; +} +void LayeredTileData::set_vertex_light_z_range(const Vector2i &p_z_range) { + _vertex_light.z_range = p_z_range; + emit_signal("changed"); +} + +Vector2i LayeredTileData::get_vertex_light_layer_range() { + return _vertex_light.layer_range; +} +void LayeredTileData::set_vertex_light_layer_range(const Vector2i &p_layer_range) { + _vertex_light.layer_range = p_layer_range; + emit_signal("changed"); +} + +int LayeredTileData::get_vertex_light_item_cull_mask() { + return _vertex_light.item_cull_mask; +} +void LayeredTileData::set_vertex_light_item_cull_mask(const int p_item_cull_mask) { + _vertex_light.item_cull_mask = p_item_cull_mask; + emit_signal("changed"); +} +#endif + // Misc void LayeredTileData::set_probability(float p_probability) { ERR_FAIL_COND(p_probability < 0.0); @@ -7363,4 +7443,64 @@ void LayeredTileData::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::REAL, "probability"), "set_probability", "get_probability"); ADD_SIGNAL(MethodInfo("changed")); + + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED + ADD_GROUP("VertexLight2D", "vertex_light_"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_is_enabled"), &LayeredTileData::get_vertex_light_is_enabled); + ClassDB::bind_method(D_METHOD("set_vertex_light_enabled", "enabled"), &LayeredTileData::set_vertex_light_enabled); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "vertex_light_enabled"), "set_vertex_light_enabled", "get_vertex_light_is_enabled"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_position"), &LayeredTileData::get_vertex_light_position); + ClassDB::bind_method(D_METHOD("set_vertex_light_position", "layer_range"), &LayeredTileData::set_vertex_light_position); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "vertex_light_position", PROPERTY_HINT_RANGE, "-512,512,1"), "set_vertex_light_position", "get_vertex_light_position"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_range"), &LayeredTileData::get_vertex_light_range); + ClassDB::bind_method(D_METHOD("set_vertex_light_range", "range"), &LayeredTileData::set_vertex_light_range); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "vertex_light_range"), "set_vertex_light_range", "get_vertex_light_range"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_attenuation"), &LayeredTileData::get_vertex_light_attenuation); + ClassDB::bind_method(D_METHOD("set_vertex_light_attenuation", "attenuation"), &LayeredTileData::set_vertex_light_attenuation); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "vertex_light_attenuation", PROPERTY_HINT_EXP_EASING, "attenuation"), "set_vertex_light_attenuation", "get_vertex_light_attenuation"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_color"), &LayeredTileData::get_vertex_light_color); + ClassDB::bind_method(D_METHOD("set_vertex_light_color", "color"), &LayeredTileData::set_vertex_light_color); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "vertex_light_color"), "set_vertex_light_color", "get_vertex_light_color"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_mode"), &LayeredTileData::get_vertex_light_mode); + ClassDB::bind_method(D_METHOD("set_vertex_light_mode", "mode"), &LayeredTileData::set_vertex_light_mode); + //,Mask + ADD_PROPERTY(PropertyInfo(Variant::INT, "vertex_light_mode", PROPERTY_HINT_ENUM, "Add,Sub,Mix"), "set_vertex_light_mode", "get_vertex_light_mode"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_z_range"), &LayeredTileData::get_vertex_light_z_range); + ClassDB::bind_method(D_METHOD("set_vertex_light_z_range", "vertex_light_z_range"), &LayeredTileData::set_vertex_light_z_range); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "vertex_light_z_range", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1"), "set_vertex_light_z_range", "get_vertex_light_z_range"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_layer_range"), &LayeredTileData::get_vertex_light_layer_range); + ClassDB::bind_method(D_METHOD("set_vertex_light_layer_range", "layer_range"), &LayeredTileData::set_vertex_light_layer_range); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR2I, "vertex_light_layer_range", PROPERTY_HINT_RANGE, "-512,512,1"), "set_vertex_light_layer_range", "get_vertex_light_layer_range"); + + ClassDB::bind_method(D_METHOD("get_vertex_light_item_cull_mask"), &LayeredTileData::get_vertex_light_item_cull_mask); + ClassDB::bind_method(D_METHOD("set_vertex_light_item_cull_mask", "item_cull_mask"), &LayeredTileData::set_vertex_light_item_cull_mask); + ADD_PROPERTY(PropertyInfo(Variant::INT, "vertex_light_item_cull_mask", PROPERTY_HINT_LAYERS_2D_RENDER), "set_vertex_light_item_cull_mask", "get_vertex_light_item_cull_mask"); + + BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_ADD); + BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_SUB); + BIND_ENUM_CONSTANT(VERTEX_LIGHT_2D_MODE_MIX); +#endif +} + +LayeredTileData::LayeredTileData() { + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED + _vertex_light.enabled = false; + _vertex_light.range = Vector2i(32, 32); + _vertex_light.attenuation = 1; + _vertex_light.color = Color(1, 1, 1, 1); + _vertex_light.item_cull_mask = 1; + _vertex_light.z_range = Vector2i(-1024, 1024); + _vertex_light.layer_range = Vector2i(-512, 512); + _vertex_light.mode = VERTEX_LIGHT_2D_MODE_ADD; +#endif } diff --git a/modules/layered_tile_map/layered_tile_set.h b/modules/layered_tile_map/layered_tile_set.h index 738018216..9efdb31ba 100644 --- a/modules/layered_tile_map/layered_tile_set.h +++ b/modules/layered_tile_map/layered_tile_set.h @@ -51,6 +51,8 @@ #include "scene/resources/shader.h" #endif +#include "modules/modules_enabled.gen.h" + class LayeredTileMap; class LayeredTileSetSource; class LayeredTileSetAtlasSource; @@ -864,6 +866,17 @@ public: class LayeredTileData : public Object { GDCLASS(LayeredTileData, Object); +public: + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED + enum VertexLight2DMode { + VERTEX_LIGHT_2D_MODE_ADD = 0, //VertexLights2DServer::VERTEX_LIGHT_2D_MODE_ADD, + VERTEX_LIGHT_2D_MODE_SUB = 1, //VertexLights2DServer::VERTEX_LIGHT_2D_MODE_SUB, + VERTEX_LIGHT_2D_MODE_MIX = 2, //VertexLights2DServer::VERTEX_LIGHT_2D_MODE_MIX, + //VERTEX_LIGHT_2D_MODE_MASK = VertexLights2DServer::VERTEX_LIGHT_2D_MODE_MASK + }; +#endif + private: const LayeredTileSet *tile_set = nullptr; bool allow_transform = true; @@ -920,6 +933,21 @@ private: }; Vector avoidance; + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED + struct { + bool enabled; + Vector2i position; + Vector2i range; + real_t attenuation; + Color color; + VertexLight2DMode mode; + Vector2i z_range; + Vector2i layer_range; + int item_cull_mask; + } _vertex_light; +#endif + // Misc double probability = 1.0; @@ -1036,6 +1064,36 @@ public: Vector get_transformed_avoidance_polygon(int p_layer_id, bool p_flip_h = false, bool p_flip_v = false, bool p_transpose = false) const; + // VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED + bool get_vertex_light_is_enabled(); + void set_vertex_light_enabled(const bool p_enabled); + + Vector2i get_vertex_light_position(); + void set_vertex_light_position(const Vector2i &p_position); + + Vector2i get_vertex_light_range(); + void set_vertex_light_range(const Vector2i &p_range); + + real_t get_vertex_light_attenuation(); + void set_vertex_light_attenuation(const real_t p_attenuation); + + Color get_vertex_light_color(); + void set_vertex_light_color(const Color &p_color); + + VertexLight2DMode get_vertex_light_mode(); + void set_vertex_light_mode(const VertexLight2DMode p_mode); + + Vector2i get_vertex_light_z_range(); + void set_vertex_light_z_range(const Vector2i &p_z_range); + + Vector2i get_vertex_light_layer_range(); + void set_vertex_light_layer_range(const Vector2i &p_layer_range); + + int get_vertex_light_item_cull_mask(); + void set_vertex_light_item_cull_mask(const int p_item_cull_mask); +#endif + // Misc void set_probability(float p_probability); float get_probability() const; @@ -1048,6 +1106,8 @@ public: // Polygons. static PoolVector2Array get_transformed_vertices(const PoolVector2Array &p_vertices, bool p_flip_h, bool p_flip_v, bool p_transpose); + + LayeredTileData(); }; VARIANT_ENUM_CAST(LayeredTileSet::CellNeighbor); @@ -1058,4 +1118,9 @@ VARIANT_ENUM_CAST(LayeredTileSet::TileOffsetAxis); VARIANT_ENUM_CAST(LayeredTileSetAtlasSource::TileAnimationMode); +// VertexLights2D +#ifdef MODULE_VERTEX_LIGHTS_2D_ENABLED +VARIANT_ENUM_CAST(LayeredTileData::VertexLight2DMode); +#endif + #endif // TILE_SET_H