diff --git a/data/species/species_model_data.cpp b/data/species/species_model_data.cpp index b876860..bf0128a 100644 --- a/data/species/species_model_data.cpp +++ b/data/species/species_model_data.cpp @@ -31,11 +31,11 @@ void SpeciesModelData::set_id(int value) { _id = value; } -Ref SpeciesModelData::get_skeleton() { - return _skeleton; +Ref SpeciesModelData::get_body() { + return _body; } -void SpeciesModelData::set_skeleton(Ref value) { - _skeleton = value; +void SpeciesModelData::set_body(Ref value) { + _body = value; } //Entries @@ -270,7 +270,7 @@ SpeciesModelData::SpeciesModelData() { _id = 0; } SpeciesModelData::~SpeciesModelData() { - _skeleton.unref(); + _body.unref(); for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { _visuals[i].clear(); @@ -289,9 +289,9 @@ void SpeciesModelData::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "text_name"), "set_name", "get_name"); - ClassDB::bind_method(D_METHOD("get_skeleton"), &SpeciesModelData::get_skeleton); - ClassDB::bind_method(D_METHOD("set_skeleton", "value"), &SpeciesModelData::set_skeleton); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "skeleton", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "set_skeleton", "get_skeleton"); + ClassDB::bind_method(D_METHOD("get_body"), &SpeciesModelData::get_body); + ClassDB::bind_method(D_METHOD("set_body", "value"), &SpeciesModelData::set_body); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "body", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "set_body", "get_body"); //Entries ClassDB::bind_method(D_METHOD("get_visual", "bone_index", "index"), &SpeciesModelData::get_visual); diff --git a/data/species/species_model_data.h b/data/species/species_model_data.h index d305dad..1b3955e 100644 --- a/data/species/species_model_data.h +++ b/data/species/species_model_data.h @@ -43,8 +43,8 @@ public: int get_id(); void set_id(int value); - Ref get_skeleton(); - void set_skeleton(Ref value); + Ref get_body(); + void set_body(Ref value); //Entries Ref get_visual(const int bone_index, const int index) const; @@ -110,7 +110,7 @@ protected: private: int _id; - Ref _skeleton; + Ref _body; Vector > _visuals[EntityEnums::SKELETON_POINTS_MAX]; Vector _skin_colors; diff --git a/entities/entity.cpp b/entities/entity.cpp index c97209b..3f081be 100644 --- a/entities/entity.cpp +++ b/entities/entity.cpp @@ -37,6 +37,8 @@ SOFTWARE. #include "./data/character_spec.h" #include "./data/talent_row_data.h" #include "./skills/entity_skill.h" +#include "scene/2d/node_2d.h" +#include "scene/3d/spatial.h" #include "core/script_language.h" @@ -48,7 +50,7 @@ NodePath Entity::get_body_path() { void Entity::set_body_path(NodePath value) { _body_path = value; - _body = get_node_or_null(_body_path); + set_body(get_node_or_null(_body_path)); #if VERSION_MAJOR < 4 if (ObjectDB::instance_validate(_body)) @@ -61,6 +63,17 @@ void Entity::set_body_path(NodePath value) { Node *Entity::get_body() { return _body; } +Spatial *Entity::get_body_3d() { + return _body_3d; +} +Node2D *Entity::get_body_2d() { + return _body_2d; +} +void Entity::set_body(Node *body) { + _body = body; + _body_2d = Object::cast_to(body); + _body_3d = Object::cast_to(body); +} NodePath Entity::get_character_skeleton_path() { return _character_skeleton_path; @@ -73,6 +86,9 @@ void Entity::set_character_skeleton_path(NodePath value) { Node *Entity::get_character_skeleton() { return _character_skeleton; } +void Entity::set_character_skeleton(Node *skeleton) { + _character_skeleton = skeleton; +} //GUID int Entity::gets_guid() { @@ -93,6 +109,45 @@ void Entity::setc_guid(int value) { set_name(String::num(_c_guid)); } +//Transforms +Transform Entity::get_transform_3d(bool only_stored) const { + if (!only_stored && _body_3d) { + ERR_FAIL_COND_V(!ObjectDB::instance_validate(_body_3d), _transform); + + return _body_3d->get_transform(); + } + + return _transform; +} +void Entity::set_transform_3d(const Transform &transform, bool only_stored) { + if (!only_stored && _body_3d) { + ERR_FAIL_COND(!ObjectDB::instance_validate(_body_3d)); + + return _body_3d->set_transform(transform); + } + + _transform = transform; +} + +Transform2D Entity::get_transform_2d(bool only_stored) const { + if (!only_stored && _body_2d) { + ERR_FAIL_COND_V(!ObjectDB::instance_validate(_body_2d), _transform_2d); + + return _body_2d->get_transform(); + } + + return _transform_2d; +} +void Entity::set_transform_2d(const Transform2D &transform, bool only_stored) { + if (!only_stored && _body_2d) { + ERR_FAIL_COND(!ObjectDB::instance_validate(_body_2d)); + + return _body_2d->set_transform(_transform_2d); + } + + _transform_2d = transform; +} + //EntityPlayerType int Entity::gets_entity_player_type() { return _s_entity_player_type; @@ -402,6 +457,16 @@ void Entity::sets_entity_data(Ref value) { //setup(); + if (get_body() == NULL && value.is_valid() && value->get_entity_species_data().is_valid() && + value->get_entity_species_data()->get_model_data().is_valid() && + value->get_entity_species_data()->get_model_data()->get_body().is_valid()) { + + Node *node = value->get_entity_species_data()->get_model_data()->get_body()->instance(); + + add_child(node); + set_body(node); + } + emit_signal("sentity_data_changed", value); VRPC(setc_entity_data_id, _s_class_id); @@ -414,6 +479,16 @@ Ref Entity::getc_entity_data() { void Entity::setc_entity_data(Ref value) { _c_entity_data = value; + if (get_body() == NULL && value.is_valid() && value->get_entity_species_data().is_valid() && + value->get_entity_species_data()->get_model_data().is_valid() && + value->get_entity_species_data()->get_model_data()->get_body().is_valid()) { + + Node *node = value->get_entity_species_data()->get_model_data()->get_body()->instance(); + + add_child(node); + set_body(node); + } + emit_signal("centity_data_changed", value); } @@ -5967,6 +6042,10 @@ Entity::Entity() { _maunal_process = false; _deserialized = false; + _body = NULL; + _body_3d = NULL; + _body_2d = NULL; + _s_guid = 0; _c_guid = 0; @@ -6529,7 +6608,7 @@ void Entity::_slearn_spell(int id) { void Entity::_notification(int p_what) { switch (p_what) { case NOTIFICATION_INSTANCED: { - _body = get_node_or_null(_body_path); + set_body(get_node_or_null(_body_path)); #if VERSION_MAJOR < 4 if (ObjectDB::instance_validate(_body)) @@ -6551,7 +6630,7 @@ void Entity::_notification(int p_what) { set_process(true); if (!_body) { - _body = get_node_or_null(_body_path); + set_body(get_node_or_null(_body_path)); #if VERSION_MAJOR < 4 if (ObjectDB::instance_validate(_body)) @@ -7453,7 +7532,18 @@ void Entity::_bind_methods() { //skeleton ClassDB::bind_method(D_METHOD("get_body"), &Entity::get_body); + ClassDB::bind_method(D_METHOD("get_body_3d"), &Entity::get_body_3d); + ClassDB::bind_method(D_METHOD("get_body_2d"), &Entity::get_body_2d); + ClassDB::bind_method(D_METHOD("set_body", "body"), &Entity::set_body); ClassDB::bind_method(D_METHOD("get_character_skeleton"), &Entity::get_character_skeleton); + ClassDB::bind_method(D_METHOD("set_character_skeleton", "skeleton"), &Entity::set_character_skeleton); + + //Transforms + ClassDB::bind_method(D_METHOD("get_transform_3d", "only_stored"), &Entity::get_transform_3d, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("set_transform_3d", "transform", "only_stored"), &Entity::set_transform_3d, DEFVAL(false)); + + ClassDB::bind_method(D_METHOD("get_transform_2d", "only_stored"), &Entity::get_transform_2d, DEFVAL(false)); + ClassDB::bind_method(D_METHOD("set_transform_2d", "transform", "only_stored"), &Entity::set_transform_2d, DEFVAL(false)); //// Targeting System //// diff --git a/entities/entity.h b/entities/entity.h index 10f0f2c..6910724 100644 --- a/entities/entity.h +++ b/entities/entity.h @@ -34,6 +34,8 @@ SOFTWARE. #include "./data/entity_data.h" #include "core/hash_map.h" #include "core/io/json.h" +#include "core/math/transform.h" +#include "core/math/transform_2d.h" #include "core/object.h" #include "core/ustring.h" #include "core/vector.h" @@ -70,6 +72,8 @@ class TalentRowData; class CharacterSpec; class EntitySkill; class ClassProfile; +class Spatial; +class Node2D; enum SpellCastDataSignals { CastFailed, @@ -197,10 +201,21 @@ public: NodePath get_body_path(); void set_body_path(NodePath value); Node *get_body(); + Spatial *get_body_3d(); + Node2D *get_body_2d(); + void set_body(Node *body); NodePath get_character_skeleton_path(); void set_character_skeleton_path(NodePath value); Node *get_character_skeleton(); + void set_character_skeleton(Node *skeleton); + + //Transforms + Transform get_transform_3d(bool only_stored = false) const; + void set_transform_3d(const Transform &transform, bool only_stored = false); + + Transform2D get_transform_2d(bool only_stored = false) const; + void set_transform_2d(const Transform2D &transform, bool only_stored = false); //GUID int gets_guid(); @@ -1023,10 +1038,17 @@ private: NodePath _body_path; Node *_body; + Spatial *_body_3d; + Node2D *_body_2d; NodePath _character_skeleton_path; Node *_character_skeleton; + //// Transforms //// + + Transform _transform; + Transform2D _transform_2d; + //// PlayerData //// int _s_guid;