Improved the prop serialization api. And added Node2D and CanvasItem serialization to DataEntry.

This commit is contained in:
Relintai 2022-02-24 23:25:39 +01:00
parent ce69529ceb
commit 4b876aad7b
12 changed files with 226 additions and 38 deletions

View File

@ -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<Material> Prop2DDataEntry::get_material() const {
return _material;
}
void Prop2DDataEntry::set_material(const Ref<Material> &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<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataEntry::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
Node2D *n = Object::cast_to<Node2D>(node);
ERR_FAIL_COND(!n);
Ref<Prop2DDataEntry> e;
if (entry.is_valid()) {
e = entry;
} else {
e.instance();
}
Node *Prop2DDataEntry::_processor_get_node_for(const Transform2D &transform) {
return NULL;
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, Node *node) {
Node2D *n;
if (node) {
n = Object::cast_to<Node2D>(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")));

View File

@ -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<Material> get_material() const;
void set_material(const Ref<Material> &value);
bool get_use_parent_material() const;
void set_use_parent_material(const bool value);
#if TEXTURE_PACKER_PRESENT
void add_textures_into(Ref<TexturePacker> texture_packer);
#endif
@ -62,8 +91,8 @@ public:
bool processor_evaluate_children();
virtual bool _processor_handles(Node *node);
virtual void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
virtual Node *_processor_get_node_for(const Transform2D &transform);
virtual void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
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> _material;
bool _use_parent_material;
};
#endif

View File

@ -52,7 +52,7 @@ bool Prop2DDataLight::_processor_handles(Node *node) {
return i;
}
void Prop2DDataLight::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataLight::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
OmniLight *i = Object::cast_to<OmniLight>(node);
ERR_FAIL_COND(!i);
@ -65,7 +65,7 @@ void Prop2DDataLight::_processor_process(Ref<Prop2DData> 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());

View File

@ -44,8 +44,8 @@ public:
void set_light_size(const int value);
bool _processor_handles(Node *node);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
Node *_processor_get_node_for(const Transform2D &transform);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr);
Prop2DDataLight();
~Prop2DDataLight();

View File

@ -67,7 +67,7 @@ bool Prop2DDataPortal::_processor_handles(Node *node) {
return p;
}
void Prop2DDataPortal::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataPortal::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
Portal *p = Object::cast_to<Portal>(node);
ERR_FAIL_COND(!p);
@ -84,7 +84,7 @@ void Prop2DDataPortal::_processor_process(Ref<Prop2DData> 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());

View File

@ -47,8 +47,8 @@ public:
void set_points(const PoolVector<Vector2> &p_points);
bool _processor_handles(Node *node);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
Node *_processor_get_node_for(const Transform2D &transform);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr);
Prop2DDataPortal();
~Prop2DDataPortal();

View File

@ -46,7 +46,7 @@ bool Prop2DDataProp2D::_processor_handles(Node *node) {
return i;
}
void Prop2DDataProp2D::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataProp2D::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
Prop2DInstance *i = Object::cast_to<Prop2DInstance>(node);
ERR_FAIL_COND(!i);
@ -58,7 +58,7 @@ void Prop2DDataProp2D::_processor_process(Ref<Prop2DData> 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());

View File

@ -45,8 +45,8 @@ public:
#endif
bool _processor_handles(Node *node);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
Node *_processor_get_node_for(const Transform2D &transform);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr);
Prop2DDataProp2D();
~Prop2DDataProp2D();

View File

@ -38,7 +38,7 @@ bool Prop2DDataScene::_processor_handles(Node *node) {
return i;
}
void Prop2DDataScene::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataScene::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
Prop2DSceneInstance *i = Object::cast_to<Prop2DSceneInstance>(node);
ERR_FAIL_COND(!i);
@ -50,7 +50,7 @@ void Prop2DDataScene::_processor_process(Ref<Prop2DData> 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());

View File

@ -36,8 +36,8 @@ public:
void set_scene(const Ref<PackedScene> &value);
bool _processor_handles(Node *node);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
Node *_processor_get_node_for(const Transform2D &transform);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr);
Prop2DDataScene();
~Prop2DDataScene();

View File

@ -61,7 +61,7 @@ bool Prop2DDataTiledWall2D::_processor_handles(Node *node) {
return t;
}
void Prop2DDataTiledWall2D::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform) {
void Prop2DDataTiledWall2D::_processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry) {
TiledWall2D *t = Object::cast_to<TiledWall2D>(node);
ERR_FAIL_COND(!t);
@ -77,7 +77,7 @@ void Prop2DDataTiledWall2D::_processor_process(Ref<Prop2DData> 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());

View File

@ -45,8 +45,8 @@ public:
void set_collision(const int value);
bool _processor_handles(Node *node);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform);
Node *_processor_get_node_for(const Transform2D &transform);
void _processor_process(Ref<Prop2DData> prop_data, Node *node, const Transform2D &transform, Ref<Prop2DDataEntry> entry = Ref<Prop2DDataEntry>());
Node *_processor_get_node_for(const Transform2D &transform, Node *node = nullptr);
Prop2DDataTiledWall2D();
~Prop2DDataTiledWall2D();