[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(): func _ready():
var data = get_skeleton().get_data() 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") var skin_base = data.find_skin("skin-base")
custom_skin.add_skin(skin_base) custom_skin.add_skin(skin_base)
custom_skin.add_skin(data.find_skin("nose/short")) 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); 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) { for (int i = 0; i < (int)spineEvents.size(); ++i) {
auto event_ref = memnew(SpineEvent); 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); events.append(event_ref);
} }
} }
@ -81,7 +81,7 @@ Array SpineAnimation::get_timelines() {
for (int i = 0; i < (int)result.size(); ++i) { for (int i = 0; i < (int)result.size(); ++i) {
auto timeline_ref = Ref<SpineTimeline>(memnew(SpineTimeline)); 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); result.set(i, timeline_ref);
} }
return result; return result;

View File

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

View File

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

View File

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

View File

@ -33,22 +33,15 @@
#include "SpineCommon.h" #include "SpineCommon.h"
#include <spine/EventData.h> #include <spine/EventData.h>
class SpineEventData : public REFCOUNTED { class SpineSkeletonDataResource;
class SpineEventData : public SpineObjectWrapper<SpineSkeletonDataResource, spine::EventData> {
GDCLASS(SpineEventData, REFCOUNTED); GDCLASS(SpineEventData, REFCOUNTED);
protected: protected:
static void _bind_methods(); static void _bind_methods();
private:
spine::EventData *event_data;
public: 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(); String get_event_name();
int get_int_value(); int get_int_value();

View File

@ -96,7 +96,7 @@ Ref<SpineBone> SpineIkConstraint::get_target() {
void SpineIkConstraint::set_target(Ref<SpineBone> v) { void SpineIkConstraint::set_target(Ref<SpineBone> v) {
SPINE_CHECK(spine_object,) 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() { int SpineIkConstraint::get_bend_direction() {

View File

@ -72,7 +72,7 @@ Ref<SpineBoneData> SpineIkConstraintData::get_target() {
void SpineIkConstraintData::set_target(Ref<SpineBoneData> v) { void SpineIkConstraintData::set_target(Ref<SpineBoneData> v) {
SPINE_CHECK(spine_object,) 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() { int SpineIkConstraintData::get_bend_direction() {

View File

@ -138,7 +138,7 @@ Ref<SpineSlot> SpinePathConstraint::get_target() {
void SpinePathConstraint::set_target(Ref<SpineSlot> v) { void SpinePathConstraint::set_target(Ref<SpineSlot> v) {
SPINE_CHECK(spine_object,) 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() { Ref<SpinePathConstraintData> SpinePathConstraint::get_data() {

View File

@ -79,7 +79,7 @@ Ref<SpineSlotData> SpinePathConstraintData::get_target() {
void SpinePathConstraintData::set_target(Ref<SpineSlotData> v) { void SpinePathConstraintData::set_target(Ref<SpineSlotData> v) {
SPINE_CHECK(get_spine_constraint_data(),) 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() { SpineConstant::PositionMode SpinePathConstraintData::get_position_mode() {

View File

@ -76,16 +76,17 @@ SpineSkeleton::~SpineSkeleton() {
delete skeleton; delete skeleton;
} }
void SpineSkeleton::set_spine_sprite(SpineSprite *sprite) { void SpineSkeleton::set_spine_sprite(SpineSprite *_sprite) {
delete skeleton; delete skeleton;
skeleton = nullptr; skeleton = nullptr;
sprite = _sprite;
if (!sprite || !sprite->get_skeleton_data_res().is_valid() || !sprite->get_skeleton_data_res()->is_skeleton_data_loaded()) return; 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()); skeleton = new spine::Skeleton(sprite->get_skeleton_data_res()->get_skeleton_data());
} }
Ref<SpineSkeletonDataResource> SpineSkeleton::get_skeleton_data_res() const { Ref<SpineSkeletonDataResource> SpineSkeleton::get_skeleton_data_res() const {
if (!sprite) return nullptr; if (!sprite) return nullptr;
return sprite->get_skeleton(); return sprite->get_skeleton_data_res();
} }
void SpineSkeleton::update_world_transform() { 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) { void SpineSkeleton::set_skin(Ref<SpineSkin> new_skin) {
SPINE_CHECK(skeleton,) 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) { 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: protected:
static void _bind_methods(); static void _bind_methods();
void set_spine_sprite(SpineSprite *sprite); void set_spine_sprite(SpineSprite *_sprite);
spine::Skeleton *get_spine_object() { return skeleton; } spine::Skeleton *get_spine_object() { return skeleton; }
SpineSprite *get_spine_owner() { return sprite; }
Ref<SpineSkeletonDataResource> get_skeleton_data_res() const; Ref<SpineSkeletonDataResource> get_skeleton_data_res() const;
private: 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)); auto event = skeleton_data->findEvent(SPINE_STRING(event_data_name));
if (!event) return nullptr; if (!event) return nullptr;
Ref<SpineEventData> event_ref(memnew(SpineEventData)); Ref<SpineEventData> event_ref(memnew(SpineEventData));
event_ref->set_spine_object(event); event_ref->set_spine_object(this, event);
return event_ref; return event_ref;
} }
@ -413,7 +413,7 @@ Ref<SpineSkin> SpineSkeletonDataResource::get_default_skin() const {
void SpineSkeletonDataResource::set_default_skin(Ref<SpineSkin> skin) { void SpineSkeletonDataResource::set_default_skin(Ref<SpineSkin> skin) {
SPINE_CHECK(skeleton_data,) 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 { Array SpineSkeletonDataResource::get_events() const {
@ -423,7 +423,7 @@ Array SpineSkeletonDataResource::get_events() const {
result.resize((int)events.size()); result.resize((int)events.size());
for (int i = 0; i < events.size(); ++i) { for (int i = 0; i < events.size(); ++i) {
Ref<SpineEventData> event_ref(memnew(SpineEventData)); 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; result[i] = event_ref;
} }
return result; 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()) { 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."); ERR_PRINT("SpineSkeletonDataResource on SpineSprite must be valid and loaded.");
return this;
} }
owns_skin = true; owns_skin = true;
set_spine_object(*sprite->get_skeleton_data_res(), new spine::Skin(SPINE_STRING(name))); 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) { void SpineSkin::set_attachment(int slot_index, const String &name, Ref<SpineAttachment> attachment) {
SPINE_CHECK(spine_object,) 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) { 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) { void SpineSlot::set_attachment(Ref<SpineAttachment> v) {
SPINE_CHECK(spine_object,) 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() { 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("get_update_mode"), &SpineSprite::get_update_mode);
ClassDB::bind_method(D_METHOD("update_skeleton", "delta"), &SpineSprite::update_skeleton); 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_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"))); 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); Ref<SpineEvent> event_ref(nullptr);
if (event) { if (event) {
event_ref = Ref<SpineEvent>(memnew(SpineEvent)); event_ref = Ref<SpineEvent>(memnew(SpineEvent));
event_ref->set_spine_object(event); event_ref->set_spine_object(this, event);
} }
switch (type) { switch (type) {
@ -473,7 +474,7 @@ void SpineSprite::callback(spine::AnimationState *state, spine::EventType type,
emit_signal("animation_completed", this, animation_state, entry_ref); emit_signal("animation_completed", this, animation_state, entry_ref);
break; break;
case spine::EventType_Dispose: 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; break;
case spine::EventType_Event: case spine::EventType_Event:
emit_signal("animation_event", this, animation_state, entry_ref, event_ref); 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) { void SpineSprite::set_global_bone_transform(const String &bone_name, Transform2D transform) {
if (!animation_state.is_valid() && !skeleton.is_valid()) return; if (!animation_state.is_valid() && !skeleton.is_valid()) return;
auto bone = skeleton->find_bone(bone_name); auto bone = skeleton->find_bone(bone_name);
if (!bone.is_valid()) { if (!bone.is_valid()) return;
return;
}
bone->set_global_transform(transform); 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) { Ref<SpineSkin> SpineSprite::new_skin(const String& name) {
auto skin = memnew(SpineSkin); Ref<SpineSkin> skin = memnew(SpineSkin);
skin->init(name, this); skin->init(name, this);
return skin; return skin;
} }

View File

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

View File

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

View File

@ -96,7 +96,7 @@ Ref<SpineBone> SpineTransformConstraint::get_target() {
void SpineTransformConstraint::set_target(Ref<SpineBone> v) { void SpineTransformConstraint::set_target(Ref<SpineBone> v) {
SPINE_CHECK(spine_object,) 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() { float SpineTransformConstraint::get_mix_rotate() {