diff --git a/props/prop_2d_data_entry.cpp b/props/prop_2d_data_entry.cpp index 2ec5849..c603490 100644 --- a/props/prop_2d_data_entry.cpp +++ b/props/prop_2d_data_entry.cpp @@ -26,32 +26,88 @@ SOFTWARE. #include "core/version.h" -#if VERSION_MAJOR < 4 -#include "scene/3d/spatial.h" -#else -#include "scene/3d/node_3d.h" -#define Spatial Node3D -#endif +#include "scene/2d/node_2d.h" #if TEXTURE_PACKER_PRESENT #include "../../texture_packer/texture_packer.h" #endif - #include "../prop_2d_mesher.h" Transform Prop2DDataEntry::get_transform() const { - return _transform; + return Transform(); } void Prop2DDataEntry::set_transform(const Transform &value) { - _transform = value; } Transform2D Prop2DDataEntry::get_transform_2d() const { - return _transform_2d; + return _transform; } void Prop2DDataEntry::set_transform_2d(const Transform2D &value) { - _transform_2d = value; + _transform = value; +} + +int Prop2DDataEntry::get_z_index() const { + return _z_index; +} +void Prop2DDataEntry::set_z_index(const int value) { + _z_index = value; +} + +bool Prop2DDataEntry::get_z_as_relative() const { + return _z_as_relative; +} +void Prop2DDataEntry::set_z_as_relative(const bool value) { + _z_as_relative = value; +} + +bool Prop2DDataEntry::get_visible() const { + return _visible; +} +void Prop2DDataEntry::set_visible(const bool value) { + _visible = value; +} + +Color Prop2DDataEntry::get_modulate() const { + return _modulate; +} +void Prop2DDataEntry::set_modulate(const Color &value) { + _modulate = value; +} + +Color Prop2DDataEntry::get_self_modulate() const { + return _self_modulate; +} +void Prop2DDataEntry::set_self_modulate(const Color &value) { + _self_modulate = value; +} + +bool Prop2DDataEntry::get_show_behind_parent() const { + return _show_behind_parent; +} +void Prop2DDataEntry::set_show_behind_parent(const bool value) { + _show_behind_parent = value; +} + +int Prop2DDataEntry::get_light_mask() const { + return _light_mask; +} +void Prop2DDataEntry::set_light_mask(const int value) { + _light_mask = value; +} + +Ref Prop2DDataEntry::get_material() const { + return _material; +} +void Prop2DDataEntry::set_material(const Ref &value) { + _material = value; +} + +bool Prop2DDataEntry::get_use_parent_material() const { + return _use_parent_material; +} +void Prop2DDataEntry::set_use_parent_material(const bool value) { + _use_parent_material = value; } #if TEXTURE_PACKER_PRESENT @@ -77,16 +133,72 @@ bool Prop2DDataEntry::processor_evaluate_children() { bool Prop2DDataEntry::_processor_handles(Node *node) { return false; } -void Prop2DDataEntry::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataEntry::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { + Node2D *n = Object::cast_to(node); + + ERR_FAIL_COND(!n); + + Ref e; + + if (entry.is_valid()) { + e = entry; + } else { + e.instance(); + } + + e->set_transform_2d(transform * n->get_transform()); + e->set_z_index(n->get_z_index()); + e->set_z_as_relative(n->is_z_relative()); + e->set_visible(n->is_visible()); + e->set_modulate(n->get_modulate()); + e->set_self_modulate(n->get_self_modulate()); + e->set_show_behind_parent(n->is_draw_behind_parent_enabled()); + e->set_light_mask(n->get_light_mask()); + e->set_material(n->get_material()); + e->set_use_parent_material(n->get_use_parent_material()); + + prop_data->add_prop(e); } -Node *Prop2DDataEntry::_processor_get_node_for(const Transform2D &transform) { - return NULL; +Node *Prop2DDataEntry::_processor_get_node_for(const Transform2D &transform, Node *node) { + Node2D *n; + + if (node) { + n = Object::cast_to(node); + } else { + n = memnew(Node2D()); + } + + n->set_transform(transform * get_transform_2d()); + + n->set_z_index(get_z_index()); + n->set_z_as_relative(get_z_as_relative()); + n->set_visible(get_visible()); + n->set_modulate(get_modulate()); + n->set_self_modulate(get_self_modulate()); + n->set_draw_behind_parent(get_show_behind_parent()); + + n->set_light_mask(get_light_mask()); + n->set_material(get_material()); + n->set_use_parent_material(get_use_parent_material()); + + return n; } bool Prop2DDataEntry::_processor_evaluate_children() { return true; } Prop2DDataEntry::Prop2DDataEntry() { + _z_index = 0; + _z_as_relative = true; + + _visible = true; + _modulate = Color(1, 1, 1, 1); + _self_modulate = Color(1, 1, 1, 1); + _show_behind_parent = false; + + _light_mask = 1; + + _use_parent_material = false; } Prop2DDataEntry::~Prop2DDataEntry() { } @@ -100,6 +212,42 @@ void Prop2DDataEntry::_bind_methods() { ClassDB::bind_method(D_METHOD("set_transform_2d", "value"), &Prop2DDataEntry::set_transform_2d); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform_2d"), "set_transform_2d", "get_transform_2d"); + ClassDB::bind_method(D_METHOD("get_z_index"), &Prop2DDataEntry::get_z_index); + ClassDB::bind_method(D_METHOD("set_z_index", "value"), &Prop2DDataEntry::set_z_index); + ADD_PROPERTY(PropertyInfo(Variant::INT, "z_index"), "set_z_index", "get_z_index"); + + ClassDB::bind_method(D_METHOD("get_z_as_relative"), &Prop2DDataEntry::get_z_as_relative); + ClassDB::bind_method(D_METHOD("set_z_as_relative", "value"), &Prop2DDataEntry::set_z_as_relative); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "z_as_relative"), "set_z_as_relative", "get_z_as_relative"); + + ClassDB::bind_method(D_METHOD("get_visible"), &Prop2DDataEntry::get_visible); + ClassDB::bind_method(D_METHOD("set_visible", "value"), &Prop2DDataEntry::set_visible); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "visible"), "set_visible", "get_visible"); + + ClassDB::bind_method(D_METHOD("get_modulate"), &Prop2DDataEntry::get_modulate); + ClassDB::bind_method(D_METHOD("set_modulate", "value"), &Prop2DDataEntry::set_modulate); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "modulate"), "set_modulate", "get_modulate"); + + ClassDB::bind_method(D_METHOD("get_self_modulate"), &Prop2DDataEntry::get_self_modulate); + ClassDB::bind_method(D_METHOD("set_self_modulate", "value"), &Prop2DDataEntry::set_self_modulate); + ADD_PROPERTY(PropertyInfo(Variant::COLOR, "self_modulate"), "set_self_modulate", "get_self_modulate"); + + ClassDB::bind_method(D_METHOD("get_show_behind_parent"), &Prop2DDataEntry::get_show_behind_parent); + ClassDB::bind_method(D_METHOD("set_show_behind_parent", "value"), &Prop2DDataEntry::set_show_behind_parent); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "show_behind_parent"), "set_show_behind_parent", "get_show_behind_parent"); + + ClassDB::bind_method(D_METHOD("get_light_mask"), &Prop2DDataEntry::get_light_mask); + ClassDB::bind_method(D_METHOD("set_light_mask", "value"), &Prop2DDataEntry::set_light_mask); + ADD_PROPERTY(PropertyInfo(Variant::INT, "light_mask"), "set_light_mask", "get_light_mask"); + + ClassDB::bind_method(D_METHOD("get_material"), &Prop2DDataEntry::get_material); + ClassDB::bind_method(D_METHOD("set_material", "value"), &Prop2DDataEntry::set_material); + ADD_PROPERTY(PropertyInfo(Variant::INT, "material"), "set_material", "get_material"); + + ClassDB::bind_method(D_METHOD("get_use_parent_material"), &Prop2DDataEntry::get_use_parent_material); + ClassDB::bind_method(D_METHOD("set_use_parent_material", "value"), &Prop2DDataEntry::set_use_parent_material); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "use_parent_material"), "set_use_parent_material", "get_use_parent_material"); + #if TEXTURE_PACKER_PRESENT BIND_VMETHOD(MethodInfo("_add_textures_into", PropertyInfo(Variant::OBJECT, "texture_packer", PROPERTY_HINT_RESOURCE_TYPE, "TexturePacker"))); diff --git a/props/prop_2d_data_entry.h b/props/prop_2d_data_entry.h index dfabf93..6b80d59 100644 --- a/props/prop_2d_data_entry.h +++ b/props/prop_2d_data_entry.h @@ -38,6 +38,8 @@ SOFTWARE. #include "core/resource.h" #endif +#include "scene/resources/material.h" + class Prop2DData; class Prop2DMesher; class TexturePacker; @@ -52,6 +54,33 @@ public: Transform2D get_transform_2d() const; void set_transform_2d(const Transform2D &value); + int get_z_index() const; + void set_z_index(const int value); + + bool get_z_as_relative() const; + void set_z_as_relative(const bool value); + + bool get_visible() const; + void set_visible(const bool value); + + Color get_modulate() const; + void set_modulate(const Color &value); + + Color get_self_modulate() const; + void set_self_modulate(const Color &value); + + bool get_show_behind_parent() const; + void set_show_behind_parent(const bool value); + + int get_light_mask() const; + void set_light_mask(const int value); + + Ref get_material() const; + void set_material(const Ref &value); + + bool get_use_parent_material() const; + void set_use_parent_material(const bool value); + #if TEXTURE_PACKER_PRESENT void add_textures_into(Ref texture_packer); #endif @@ -62,8 +91,8 @@ public: bool processor_evaluate_children(); virtual bool _processor_handles(Node *node); - virtual void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - virtual Node *_processor_get_node_for(const Transform2D &transform); + virtual void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + virtual Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); virtual bool _processor_evaluate_children(); Prop2DDataEntry(); @@ -73,8 +102,19 @@ protected: static void _bind_methods(); private: - Transform _transform; - Transform2D _transform_2d; + Transform2D _transform; + int _z_index; + bool _z_as_relative; + + bool _visible; + Color _modulate; + Color _self_modulate; + bool _show_behind_parent; + + int _light_mask; + + Ref _material; + bool _use_parent_material; }; #endif diff --git a/props/prop_2d_data_light.cpp b/props/prop_2d_data_light.cpp index d8b7b36..03a0b46 100644 --- a/props/prop_2d_data_light.cpp +++ b/props/prop_2d_data_light.cpp @@ -52,7 +52,7 @@ bool Prop2DDataLight::_processor_handles(Node *node) { return i; } -void Prop2DDataLight::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataLight::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { OmniLight *i = Object::cast_to(node); ERR_FAIL_COND(!i); @@ -65,7 +65,7 @@ void Prop2DDataLight::_processor_process(Ref prop_data, Node *node, prop_data->add_prop(l); } -Node *Prop2DDataLight::_processor_get_node_for(const Transform2D &transform) { +Node *Prop2DDataLight::_processor_get_node_for(const Transform2D &transform, Node *node) { OmniLight *i = memnew(OmniLight); i->set_color(get_light_color()); diff --git a/props/prop_2d_data_light.h b/props/prop_2d_data_light.h index 8f18d21..177ac75 100644 --- a/props/prop_2d_data_light.h +++ b/props/prop_2d_data_light.h @@ -44,8 +44,8 @@ public: void set_light_size(const int value); bool _processor_handles(Node *node); - void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - Node *_processor_get_node_for(const Transform2D &transform); + void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); Prop2DDataLight(); ~Prop2DDataLight(); diff --git a/props/prop_2d_data_portal.cpp b/props/prop_2d_data_portal.cpp index 0b8613e..111e12c 100644 --- a/props/prop_2d_data_portal.cpp +++ b/props/prop_2d_data_portal.cpp @@ -67,7 +67,7 @@ bool Prop2DDataPortal::_processor_handles(Node *node) { return p; } -void Prop2DDataPortal::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataPortal::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { Portal *p = Object::cast_to(node); ERR_FAIL_COND(!p); @@ -84,7 +84,7 @@ void Prop2DDataPortal::_processor_process(Ref prop_data, Node *node, prop_data->add_prop(l); } -Node *Prop2DDataPortal::_processor_get_node_for(const Transform2D &transform) { +Node *Prop2DDataPortal::_processor_get_node_for(const Transform2D &transform, Node *node) { Portal *p = memnew(Portal); p->set_portal_active(get_is_active()); diff --git a/props/prop_2d_data_portal.h b/props/prop_2d_data_portal.h index 2d0a517..afc453e 100644 --- a/props/prop_2d_data_portal.h +++ b/props/prop_2d_data_portal.h @@ -47,8 +47,8 @@ public: void set_points(const PoolVector &p_points); bool _processor_handles(Node *node); - void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - Node *_processor_get_node_for(const Transform2D &transform); + void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); Prop2DDataPortal(); ~Prop2DDataPortal(); diff --git a/props/prop_2d_data_prop.cpp b/props/prop_2d_data_prop.cpp index 509ec54..aa21c13 100644 --- a/props/prop_2d_data_prop.cpp +++ b/props/prop_2d_data_prop.cpp @@ -46,7 +46,7 @@ bool Prop2DDataProp2D::_processor_handles(Node *node) { return i; } -void Prop2DDataProp2D::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataProp2D::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { Prop2DInstance *i = Object::cast_to(node); ERR_FAIL_COND(!i); @@ -58,7 +58,7 @@ void Prop2DDataProp2D::_processor_process(Ref prop_data, Node *node, prop_data->add_prop(l); } -Node *Prop2DDataProp2D::_processor_get_node_for(const Transform2D &transform) { +Node *Prop2DDataProp2D::_processor_get_node_for(const Transform2D &transform, Node *node) { Prop2DInstance *i = memnew(Prop2DInstance); i->set_prop_data(get_prop()); diff --git a/props/prop_2d_data_prop.h b/props/prop_2d_data_prop.h index 8304880..cceb676 100644 --- a/props/prop_2d_data_prop.h +++ b/props/prop_2d_data_prop.h @@ -45,8 +45,8 @@ public: #endif bool _processor_handles(Node *node); - void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - Node *_processor_get_node_for(const Transform2D &transform); + void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); Prop2DDataProp2D(); ~Prop2DDataProp2D(); diff --git a/props/prop_2d_data_scene.cpp b/props/prop_2d_data_scene.cpp index 382dd8b..0293d5d 100644 --- a/props/prop_2d_data_scene.cpp +++ b/props/prop_2d_data_scene.cpp @@ -38,7 +38,7 @@ bool Prop2DDataScene::_processor_handles(Node *node) { return i; } -void Prop2DDataScene::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataScene::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { Prop2DSceneInstance *i = Object::cast_to(node); ERR_FAIL_COND(!i); @@ -50,7 +50,7 @@ void Prop2DDataScene::_processor_process(Ref prop_data, Node *node, prop_data->add_prop(l); } -Node *Prop2DDataScene::_processor_get_node_for(const Transform2D &transform) { +Node *Prop2DDataScene::_processor_get_node_for(const Transform2D &transform, Node *node) { Prop2DSceneInstance *i = memnew(Prop2DSceneInstance); i->set_scene(get_scene()); diff --git a/props/prop_2d_data_scene.h b/props/prop_2d_data_scene.h index ca019df..2d09572 100644 --- a/props/prop_2d_data_scene.h +++ b/props/prop_2d_data_scene.h @@ -36,8 +36,8 @@ public: void set_scene(const Ref &value); bool _processor_handles(Node *node); - void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - Node *_processor_get_node_for(const Transform2D &transform); + void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); Prop2DDataScene(); ~Prop2DDataScene(); diff --git a/props/prop_2d_data_tiled_wall_2d.cpp b/props/prop_2d_data_tiled_wall_2d.cpp index def66d3..439f4ca 100644 --- a/props/prop_2d_data_tiled_wall_2d.cpp +++ b/props/prop_2d_data_tiled_wall_2d.cpp @@ -61,7 +61,7 @@ bool Prop2DDataTiledWall2D::_processor_handles(Node *node) { return t; } -void Prop2DDataTiledWall2D::_processor_process(Ref prop_data, Node *node, const Transform2D &transform) { +void Prop2DDataTiledWall2D::_processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry) { TiledWall2D *t = Object::cast_to(node); ERR_FAIL_COND(!t); @@ -77,7 +77,7 @@ void Prop2DDataTiledWall2D::_processor_process(Ref prop_data, Node * prop_data->add_prop(tw); } -Node *Prop2DDataTiledWall2D::_processor_get_node_for(const Transform2D &transform) { +Node *Prop2DDataTiledWall2D::_processor_get_node_for(const Transform2D &transform, Node *node) { TiledWall2D *t = memnew(TiledWall2D); t->set_width(get_width()); diff --git a/props/prop_2d_data_tiled_wall_2d.h b/props/prop_2d_data_tiled_wall_2d.h index d48a843..4f1daf9 100644 --- a/props/prop_2d_data_tiled_wall_2d.h +++ b/props/prop_2d_data_tiled_wall_2d.h @@ -45,8 +45,8 @@ public: void set_collision(const int value); bool _processor_handles(Node *node); - void _processor_process(Ref prop_data, Node *node, const Transform2D &transform); - Node *_processor_get_node_for(const Transform2D &transform); + void _processor_process(Ref prop_data, Node *node, const Transform2D &transform, Ref entry = Ref()); + Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr); Prop2DDataTiledWall2D(); ~Prop2DDataTiledWall2D();