[godot] Fix owners not being set correctly, more sanity checks.

This commit is contained in:
badlogic 2022-04-26 20:56:57 +02:00
parent 6ad83c94a8
commit 7866fff884
19 changed files with 97 additions and 123 deletions

View File

@ -2,7 +2,7 @@ extends SpineSprite
func _ready():
var data = get_skeleton().get_data()
var custom_skin = SpineSkin.new().init("custom-skin")
var custom_skin = new_skin("custom-skin")
var skin_base = data.find_skin("skin-base")
custom_skin.add_skin(skin_base)
custom_skin.add_skin(data.find_skin("nose/short"))

View File

@ -68,7 +68,7 @@ void SpineAnimation::apply(Ref<SpineSkeleton> skeleton, float last_time, float t
spine_object->apply(*(skeleton->get_spine_object()), last_time, time, loop, &spineEvents, alpha, (spine::MixBlend) blend, (spine::MixDirection) direction);
for (int i = 0; i < (int)spineEvents.size(); ++i) {
auto event_ref = memnew(SpineEvent);
event_ref->set_spine_object(spineEvents[i]);
event_ref->set_spine_object(skeleton->get_spine_owner(), spineEvents[i]);
events.append(event_ref);
}
}
@ -81,7 +81,7 @@ Array SpineAnimation::get_timelines() {
for (int i = 0; i < (int)result.size(); ++i) {
auto timeline_ref = Ref<SpineTimeline>(memnew(SpineTimeline));
timeline_ref->set_spine_object(timelines[i]);
timeline_ref->set_spine_object(get_spine_owner(), timelines[i]);
result.set(i, timeline_ref);
}
return result;

View File

@ -29,6 +29,7 @@
#include "SpineEvent.h"
#include "SpineCommon.h"
#include "SpineSprite.h"
void SpineEvent::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_data"), &SpineEvent::get_data);
@ -45,67 +46,64 @@ void SpineEvent::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_balance", "v"), &SpineEvent::set_balance);
}
SpineEvent::SpineEvent() : event(nullptr) {
}
Ref<SpineEventData> SpineEvent::get_data() {
SPINE_CHECK(event, nullptr)
SPINE_CHECK(spine_object, nullptr)
Ref<SpineEventData> event_data(memnew(SpineEventData));
event_data->set_spine_object((spine::EventData*)&(event->getData()));
event_data->set_spine_object(*get_spine_owner()->get_skeleton_data_res(), (spine::EventData*)&spine_object->getData());
return event_data;
}
float SpineEvent::get_time() {
SPINE_CHECK(event, 0)
return event->getTime();
SPINE_CHECK(spine_object, 0)
return spine_object->getTime();
}
int SpineEvent::get_int_value() {
SPINE_CHECK(event, 0)
return event->getIntValue();
SPINE_CHECK(spine_object, 0)
return spine_object->getIntValue();
}
void SpineEvent::set_int_value(int v) {
SPINE_CHECK(event,)
event->setIntValue(v);
SPINE_CHECK(spine_object,)
spine_object->setIntValue(v);
}
float SpineEvent::get_float_value() {
SPINE_CHECK(event, 0)
return event->getFloatValue();
SPINE_CHECK(spine_object, 0)
return spine_object->getFloatValue();
}
void SpineEvent::set_float_value(float v) {
SPINE_CHECK(event,)
event->setFloatValue(v);
SPINE_CHECK(spine_object,)
spine_object->setFloatValue(v);
}
String SpineEvent::get_string_value() {
SPINE_CHECK(event, "")
return event->getStringValue().buffer();
SPINE_CHECK(spine_object, "")
return spine_object->getStringValue().buffer();
}
void SpineEvent::set_string_value(const String &v) {
SPINE_CHECK(event,)
event->setStringValue(spine::String(v.utf8()));
SPINE_CHECK(spine_object,)
spine_object->setStringValue(spine::String(v.utf8()));
}
float SpineEvent::get_volume() {
SPINE_CHECK(event, 0)
return event->getVolume();
SPINE_CHECK(spine_object, 0)
return spine_object->getVolume();
}
void SpineEvent::set_volume(float v) {
SPINE_CHECK(event,)
event->setVolume(v);
SPINE_CHECK(spine_object,)
spine_object->setVolume(v);
}
float SpineEvent::get_balance() {
SPINE_CHECK(event, 0)
return event->getBalance();
SPINE_CHECK(spine_object, 0)
return spine_object->getBalance();
}
void SpineEvent::set_balance(float v) {
SPINE_CHECK(event,)
event->setBalance(v);
SPINE_CHECK(spine_object,)
spine_object->setBalance(v);
}

View File

@ -34,22 +34,15 @@
#include "SpineEventData.h"
#include <spine/Event.h>
class SpineEvent : public REFCOUNTED {
GDCLASS(SpineEvent, REFCOUNTED)
class SpineSprite;
class SpineEvent : public SpineObjectWrapper<SpineSprite, spine::Event> {
GDCLASS(SpineEvent, SpineObjectWrapper)
protected:
static void _bind_methods();
private:
spine::Event *event;
public:
SpineEvent();
void set_spine_object(spine::Event *_event) { event = _event; }
spine::Event *get_spine_object() const { return event; }
Ref<SpineEventData> get_data();
float get_time();

View File

@ -44,60 +44,57 @@ void SpineEventData::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_balance", "v"), &SpineEventData::set_balance);
}
SpineEventData::SpineEventData() : event_data(nullptr) {
}
String SpineEventData::get_event_name() {
SPINE_CHECK(event_data, "")
return event_data->getName().buffer();
SPINE_CHECK(spine_object, "")
return spine_object->getName().buffer();
}
int SpineEventData::get_int_value() {
SPINE_CHECK(event_data, 0)
return event_data->getIntValue();
SPINE_CHECK(spine_object, 0)
return spine_object->getIntValue();
}
void SpineEventData::set_int_value(int v) {
SPINE_CHECK(event_data,)
event_data->setIntValue(v);
SPINE_CHECK(spine_object,)
spine_object->setIntValue(v);
}
float SpineEventData::get_float_value() {
SPINE_CHECK(event_data, 0)
return event_data->getFloatValue();
SPINE_CHECK(spine_object, 0)
return spine_object->getFloatValue();
}
void SpineEventData::set_float_value(float v) {
SPINE_CHECK(event_data,)
event_data->setFloatValue(v);
SPINE_CHECK(spine_object,)
spine_object->setFloatValue(v);
}
String SpineEventData::get_string_value() {
SPINE_CHECK(event_data, "")
return event_data->getStringValue().buffer();
SPINE_CHECK(spine_object, "")
return spine_object->getStringValue().buffer();
}
void SpineEventData::set_string_value(const String &v) {
SPINE_CHECK(event_data,)
event_data->setStringValue(spine::String(v.utf8()));
SPINE_CHECK(spine_object,)
spine_object->setStringValue(spine::String(v.utf8()));
}
float SpineEventData::get_volume() {
SPINE_CHECK(event_data, 0)
return event_data->getVolume();
SPINE_CHECK(spine_object, 0)
return spine_object->getVolume();
}
void SpineEventData::set_volume(float v) {
SPINE_CHECK(event_data,)
event_data->setVolume(v);
SPINE_CHECK(spine_object,)
spine_object->setVolume(v);
}
float SpineEventData::get_balance() {
SPINE_CHECK(event_data, 0)
return event_data->getBalance();
SPINE_CHECK(spine_object, 0)
return spine_object->getBalance();
}
void SpineEventData::set_balance(float v) {
SPINE_CHECK(event_data,)
event_data->setBalance(v);
SPINE_CHECK(spine_object,)
spine_object->setBalance(v);
}

View File

@ -33,22 +33,15 @@
#include "SpineCommon.h"
#include <spine/EventData.h>
class SpineEventData : public REFCOUNTED {
class SpineSkeletonDataResource;
class SpineEventData : public SpineObjectWrapper<SpineSkeletonDataResource, spine::EventData> {
GDCLASS(SpineEventData, REFCOUNTED);
protected:
static void _bind_methods();
private:
spine::EventData *event_data;
public:
SpineEventData();
void set_spine_object(spine::EventData *_event_data) { event_data = _event_data; }
spine::EventData *get_spine_object() const { return event_data; }
String get_event_name();
int get_int_value();

View File

@ -96,7 +96,7 @@ Ref<SpineBone> SpineIkConstraint::get_target() {
void SpineIkConstraint::set_target(Ref<SpineBone> v) {
SPINE_CHECK(spine_object,)
spine_object->setTarget(v.is_valid() ? v->get_spine_object() : nullptr);
spine_object->setTarget(v.is_valid() && v->get_spine_object() ? v->get_spine_object() : nullptr);
}
int SpineIkConstraint::get_bend_direction() {

View File

@ -72,7 +72,7 @@ Ref<SpineBoneData> SpineIkConstraintData::get_target() {
void SpineIkConstraintData::set_target(Ref<SpineBoneData> v) {
SPINE_CHECK(spine_object,)
get_spine_constraint_data()->setTarget(v.is_valid() ? v->get_spine_object() : nullptr);
get_spine_constraint_data()->setTarget(v.is_valid() && v->get_spine_object() ? v->get_spine_object() : nullptr);
}
int SpineIkConstraintData::get_bend_direction() {

View File

@ -138,7 +138,7 @@ Ref<SpineSlot> SpinePathConstraint::get_target() {
void SpinePathConstraint::set_target(Ref<SpineSlot> v) {
SPINE_CHECK(spine_object,)
spine_object->setTarget(v.is_valid() ? v->get_spine_object() : nullptr);
spine_object->setTarget(v.is_valid() && v->get_spine_object() ? v->get_spine_object() : nullptr);
}
Ref<SpinePathConstraintData> SpinePathConstraint::get_data() {

View File

@ -79,7 +79,7 @@ Ref<SpineSlotData> SpinePathConstraintData::get_target() {
void SpinePathConstraintData::set_target(Ref<SpineSlotData> v) {
SPINE_CHECK(get_spine_constraint_data(),)
get_spine_constraint_data()->setTarget(v.is_valid() ? v->get_spine_object() : nullptr);
get_spine_constraint_data()->setTarget(v.is_valid() && v->get_spine_object()? v->get_spine_object() : nullptr);
}
SpineConstant::PositionMode SpinePathConstraintData::get_position_mode() {

View File

@ -76,16 +76,17 @@ SpineSkeleton::~SpineSkeleton() {
delete skeleton;
}
void SpineSkeleton::set_spine_sprite(SpineSprite *sprite) {
void SpineSkeleton::set_spine_sprite(SpineSprite *_sprite) {
delete skeleton;
skeleton = nullptr;
sprite = _sprite;
if (!sprite || !sprite->get_skeleton_data_res().is_valid() || !sprite->get_skeleton_data_res()->is_skeleton_data_loaded()) return;
skeleton = new spine::Skeleton(sprite->get_skeleton_data_res()->get_skeleton_data());
}
Ref<SpineSkeletonDataResource> SpineSkeleton::get_skeleton_data_res() const {
if (!sprite) return nullptr;
return sprite->get_skeleton();
return sprite->get_skeleton_data_res();
}
void SpineSkeleton::update_world_transform() {
@ -135,7 +136,7 @@ void SpineSkeleton::set_skin_by_name(const String &skin_name) {
void SpineSkeleton::set_skin(Ref<SpineSkin> new_skin) {
SPINE_CHECK(skeleton,)
skeleton->setSkin(new_skin.is_valid() ? new_skin->get_spine_object() : nullptr);
skeleton->setSkin(new_skin.is_valid() && new_skin->get_spine_object() ? new_skin->get_spine_object() : nullptr);
}
Ref<SpineAttachment> SpineSkeleton::get_attachment_by_slot_name(const String &slot_name, const String &attachment_name) {

View File

@ -55,8 +55,9 @@ class SpineSkeleton : public REFCOUNTED {
protected:
static void _bind_methods();
void set_spine_sprite(SpineSprite *sprite);
void set_spine_sprite(SpineSprite *_sprite);
spine::Skeleton *get_spine_object() { return skeleton; }
SpineSprite *get_spine_owner() { return sprite; }
Ref<SpineSkeletonDataResource> get_skeleton_data_res() const;
private:

View File

@ -325,7 +325,7 @@ Ref<SpineEventData> SpineSkeletonDataResource::find_event(const String &event_da
auto event = skeleton_data->findEvent(SPINE_STRING(event_data_name));
if (!event) return nullptr;
Ref<SpineEventData> event_ref(memnew(SpineEventData));
event_ref->set_spine_object(event);
event_ref->set_spine_object(this, event);
return event_ref;
}
@ -413,7 +413,7 @@ Ref<SpineSkin> SpineSkeletonDataResource::get_default_skin() const {
void SpineSkeletonDataResource::set_default_skin(Ref<SpineSkin> skin) {
SPINE_CHECK(skeleton_data,)
skeleton_data->setDefaultSkin(skin.is_valid() ? skin->get_spine_object() : nullptr);
skeleton_data->setDefaultSkin(skin.is_valid() && skin->get_spine_object() ? skin->get_spine_object() : nullptr);
}
Array SpineSkeletonDataResource::get_events() const {
@ -423,7 +423,7 @@ Array SpineSkeletonDataResource::get_events() const {
result.resize((int)events.size());
for (int i = 0; i < events.size(); ++i) {
Ref<SpineEventData> event_ref(memnew(SpineEventData));
event_ref->set_spine_object(events[i]);
event_ref->set_spine_object(this, events[i]);
result[i] = event_ref;
}
return result;

View File

@ -65,6 +65,7 @@ Ref<SpineSkin> SpineSkin::init(const String &name, SpineSprite *sprite) {
}
if (!sprite->get_skeleton_data_res().is_valid() || !sprite->get_skeleton_data_res()->is_skeleton_data_loaded()) {
ERR_PRINT("SpineSkeletonDataResource on SpineSprite must be valid and loaded.");
return this;
}
owns_skin = true;
set_spine_object(*sprite->get_skeleton_data_res(), new spine::Skin(SPINE_STRING(name)));
@ -73,7 +74,7 @@ Ref<SpineSkin> SpineSkin::init(const String &name, SpineSprite *sprite) {
void SpineSkin::set_attachment(int slot_index, const String &name, Ref<SpineAttachment> attachment) {
SPINE_CHECK(spine_object,)
spine_object->setAttachment(slot_index, SPINE_STRING(name), attachment.is_valid() ? attachment->get_spine_object() : nullptr);
spine_object->setAttachment(slot_index, SPINE_STRING(name), attachment.is_valid() && attachment->get_spine_object()? attachment->get_spine_object() : nullptr);
}
Ref<SpineAttachment> SpineSkin::get_attachment(int slot_index, const String &name) {

View File

@ -113,7 +113,7 @@ Ref<SpineAttachment> SpineSlot::get_attachment() {
void SpineSlot::set_attachment(Ref<SpineAttachment> v) {
SPINE_CHECK(spine_object,)
spine_object->setAttachment(v.is_valid() ? v->get_spine_object() : nullptr);
spine_object->setAttachment(v.is_valid() && v->get_spine_object() ? v->get_spine_object() : nullptr);
}
int SpineSlot::get_attachment_state() {

View File

@ -51,6 +51,7 @@ void SpineSprite::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_update_mode"), &SpineSprite::get_update_mode);
ClassDB::bind_method(D_METHOD("update_skeleton", "delta"), &SpineSprite::update_skeleton);
ClassDB::bind_method(D_METHOD("new_skin", "name"), &SpineSprite::new_skin);
ADD_SIGNAL(MethodInfo("animation_started", PropertyInfo(Variant::OBJECT, "spine_sprite", PROPERTY_HINT_TYPE_STRING, "SpineSprite"), PropertyInfo(Variant::OBJECT, "animation_state", PROPERTY_HINT_TYPE_STRING, "SpineAnimationState"), PropertyInfo(Variant::OBJECT, "track_entry", PROPERTY_HINT_TYPE_STRING, "SpineTrackEntry")));
ADD_SIGNAL(MethodInfo("animation_interrupted", PropertyInfo(Variant::OBJECT, "spine_sprite", PROPERTY_HINT_TYPE_STRING, "SpineSprite"), PropertyInfo(Variant::OBJECT, "animation_state", PROPERTY_HINT_TYPE_STRING, "SpineAnimationState"), PropertyInfo(Variant::OBJECT, "track_entry", PROPERTY_HINT_TYPE_STRING, "SpineTrackEntry")));
@ -456,7 +457,7 @@ void SpineSprite::callback(spine::AnimationState *state, spine::EventType type,
Ref<SpineEvent> event_ref(nullptr);
if (event) {
event_ref = Ref<SpineEvent>(memnew(SpineEvent));
event_ref->set_spine_object(event);
event_ref->set_spine_object(this, event);
}
switch (type) {
@ -473,7 +474,7 @@ void SpineSprite::callback(spine::AnimationState *state, spine::EventType type,
emit_signal("animation_completed", this, animation_state, entry_ref);
break;
case spine::EventType_Dispose:
emit_signal("animation_disposed", this, animation_state, entry_ref, event_ref);
emit_signal("animation_disposed", this, animation_state, entry_ref);
break;
case spine::EventType_Event:
emit_signal("animation_event", this, animation_state, entry_ref, event_ref);
@ -494,9 +495,7 @@ Transform2D SpineSprite::get_global_bone_transform(const String &bone_name) {
void SpineSprite::set_global_bone_transform(const String &bone_name, Transform2D transform) {
if (!animation_state.is_valid() && !skeleton.is_valid()) return;
auto bone = skeleton->find_bone(bone_name);
if (!bone.is_valid()) {
return;
}
if (!bone.is_valid()) return;
bone->set_global_transform(transform);
}
@ -511,7 +510,7 @@ void SpineSprite::set_update_mode(SpineSprite::UpdateMode v) {
}
Ref<SpineSkin> SpineSprite::new_skin(const String& name) {
auto skin = memnew(SpineSkin);
Ref<SpineSkin> skin = memnew(SpineSkin);
skin->init(name, this);
return skin;
}

View File

@ -44,35 +44,32 @@ void SpineTimeline::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_type"), &SpineTimeline::get_type);
}
SpineTimeline::SpineTimeline() : timeline(nullptr) {
}
void SpineTimeline::apply(Ref<SpineSkeleton> skeleton, float last_time, float time, Array events, float alpha,
SpineConstant::MixBlend blend, SpineConstant::MixDirection direction) {
SPINE_CHECK(timeline,)
SPINE_CHECK(spine_object,)
if (!skeleton->get_spine_object()) return;
spine::Vector<spine::Event *> spine_events;
spine_events.setSize((int)events.size(), nullptr);
for (int i = 0; i < events.size(); ++i) {
events[i] = ((Ref<SpineEvent>) spine_events[i])->get_spine_object();
}
timeline->apply(*(skeleton->get_spine_object()), last_time, time, &spine_events, alpha, (spine::MixBlend) blend, (spine::MixDirection) direction);
spine_object->apply(*(skeleton->get_spine_object()), last_time, time, &spine_events, alpha, (spine::MixBlend) blend, (spine::MixDirection) direction);
}
int SpineTimeline::get_frame_entries() {
SPINE_CHECK(timeline, 0)
return (int)timeline->getFrameEntries();
SPINE_CHECK(spine_object, 0)
return (int)spine_object->getFrameEntries();
}
int SpineTimeline::get_frame_count() {
SPINE_CHECK(timeline, 0)
return (int)timeline->getFrameCount();
SPINE_CHECK(spine_object, 0)
return (int)spine_object->getFrameCount();
}
Array SpineTimeline::get_frames() {
Array result;
SPINE_CHECK(timeline, result)
auto &frames = timeline->getFrames();
SPINE_CHECK(spine_object, result)
auto &frames = spine_object->getFrames();
result.resize((int)frames.size());
for (int i = 0; i < result.size(); ++i) {
result[i] = frames[i];
@ -81,14 +78,14 @@ Array SpineTimeline::get_frames() {
}
float SpineTimeline::get_duration() {
SPINE_CHECK(timeline, 0)
return timeline->getDuration();
SPINE_CHECK(spine_object, 0)
return spine_object->getDuration();
}
Array SpineTimeline::get_property_ids() {
Array result;
SPINE_CHECK(timeline, result)
auto &ids = timeline->getPropertyIds();
SPINE_CHECK(spine_object, result)
auto &ids = spine_object->getPropertyIds();
result.resize((int)ids.size());
for (int i = 0; i < result.size(); ++i) {
result[i] = (spine::PropertyId) ids[i];
@ -97,6 +94,6 @@ Array SpineTimeline::get_property_ids() {
}
String SpineTimeline::get_type() {
SPINE_CHECK(timeline, "")
return timeline->getRTTI().getClassName();
SPINE_CHECK(spine_object, "")
return spine_object->getRTTI().getClassName();
}

View File

@ -34,24 +34,18 @@
#include "SpineConstant.h"
#include <spine/Timeline.h>
#include "SpineSkeletonDataResource.h"
class SpineSkeleton;
class SpineEvent;
class SpineTimeline : public REFCOUNTED {
GDCLASS(SpineTimeline, REFCOUNTED);
class SpineTimeline : public SpineObjectWrapper<SpineSkeletonDataResource, spine::Timeline> {
GDCLASS(SpineTimeline, SpineObjectWrapper)
protected:
static void _bind_methods();
private:
spine::Timeline *timeline;
public:
SpineTimeline();
void set_spine_object(spine::Timeline *_timeline) { this->timeline = _timeline; }
spine::Timeline *get_spine_object() { return timeline; }
void apply(Ref<SpineSkeleton> skeleton, float last_time, float time, Array events, float alpha, SpineConstant::MixBlend blend, SpineConstant::MixDirection direction);
int get_frame_entries();

View File

@ -96,7 +96,7 @@ Ref<SpineBone> SpineTransformConstraint::get_target() {
void SpineTransformConstraint::set_target(Ref<SpineBone> v) {
SPINE_CHECK(spine_object,)
spine_object->setTarget(v.is_valid() ? v->get_spine_object() : nullptr);
spine_object->setTarget(v.is_valid() && v->get_spine_object() ? v->get_spine_object() : nullptr);
}
float SpineTransformConstraint::get_mix_rotate() {