diff --git a/spine-flutter/example/lib/main.dart b/spine-flutter/example/lib/main.dart index bd61c399c..00205f80d 100644 --- a/spine-flutter/example/lib/main.dart +++ b/spine-flutter/example/lib/main.dart @@ -80,9 +80,10 @@ class AnimationStateEvents extends StatelessWidget { }); controller.animationState?.setListener((event) { if (event.type == EventType.Event) { - print("User event: { intValue: ${event.event?.getIntValue()}, floatValue: intValue: ${event.event?.getFloatValue()}, stringValue: ${event.event?.getStringValue()} }"); + print("User event: { name: ${event.event?.getData().getName()}, intValue: ${event.event?.getIntValue()}, floatValue: intValue: ${event.event?.getFloatValue()}, stringValue: ${event.event?.getStringValue()} }"); } }); + print("Current: ${controller.animationState?.getCurrent(0)?.getAnimation().getName()}"); }); return Scaffold( diff --git a/spine-flutter/lib/spine_flutter.dart b/spine-flutter/lib/spine_flutter.dart index 6870d2e0d..6043f6b0c 100644 --- a/spine-flutter/lib/spine_flutter.dart +++ b/spine-flutter/lib/spine_flutter.dart @@ -430,6 +430,15 @@ class Animation { final spine_animation _animation; Animation(this._animation); + + String getName() { + final Pointer value = _bindings.spine_animation_get_name(_animation).cast(); + return value.toDartString(); + } + + double getDuration() { + return _bindings.spine_animation_get_duration(_animation); + } } enum MixBlend { @@ -727,6 +736,37 @@ class EventData { final spine_event_data _data; EventData(this._data); + + String getName() { + final Pointer value = _bindings.spine_event_data_get_name(_data).cast(); + return value.toDartString(); + } + + int getIntValue() { + return _bindings.spine_event_data_get_int_value(_data); + } + + double getFloatValue() { + return _bindings.spine_event_data_get_float_value(_data); + } + + String getStringValue() { + final Pointer value = _bindings.spine_event_data_get_string_value(_data).cast(); + return value.toDartString(); + } + + String getAudioPath() { + final Pointer value = _bindings.spine_event_data_get_audio_path(_data).cast(); + return value.toDartString(); + } + + double getVolume() { + return _bindings.spine_event_data_get_volume(_data); + } + + double getBalance() { + return _bindings.spine_event_data_get_balance(_data); + } } class Event { diff --git a/spine-flutter/lib/spine_flutter_bindings_generated.dart b/spine-flutter/lib/spine_flutter_bindings_generated.dart index f54614df8..d8fd9dd99 100644 --- a/spine-flutter/lib/spine_flutter_bindings_generated.dart +++ b/spine-flutter/lib/spine_flutter_bindings_generated.dart @@ -188,6 +188,34 @@ class SpineFlutterBindings { _spine_skeleton_drawable_disposePtr .asFunction)>(); + ffi.Pointer spine_animation_get_name( + spine_animation animation, + ) { + return _spine_animation_get_name( + animation, + ); + } + + late final _spine_animation_get_namePtr = _lookup< + ffi.NativeFunction Function(spine_animation)>>( + 'spine_animation_get_name'); + late final _spine_animation_get_name = _spine_animation_get_namePtr + .asFunction Function(spine_animation)>(); + + double spine_animation_get_duration( + spine_animation animation, + ) { + return _spine_animation_get_duration( + animation, + ); + } + + late final _spine_animation_get_durationPtr = + _lookup>( + 'spine_animation_get_duration'); + late final _spine_animation_get_duration = _spine_animation_get_durationPtr + .asFunction(); + void spine_animation_state_update( spine_animation_state state, double delta, @@ -1935,6 +1963,108 @@ class SpineFlutterBindings { late final _spine_skeleton_set_scale_y = _spine_skeleton_set_scale_yPtr .asFunction(); + ffi.Pointer spine_event_data_get_name( + spine_event event, + ) { + return _spine_event_data_get_name( + event, + ); + } + + late final _spine_event_data_get_namePtr = + _lookup Function(spine_event)>>( + 'spine_event_data_get_name'); + late final _spine_event_data_get_name = _spine_event_data_get_namePtr + .asFunction Function(spine_event)>(); + + int spine_event_data_get_int_value( + spine_event event, + ) { + return _spine_event_data_get_int_value( + event, + ); + } + + late final _spine_event_data_get_int_valuePtr = + _lookup>( + 'spine_event_data_get_int_value'); + late final _spine_event_data_get_int_value = + _spine_event_data_get_int_valuePtr + .asFunction(); + + double spine_event_data_get_float_value( + spine_event event, + ) { + return _spine_event_data_get_float_value( + event, + ); + } + + late final _spine_event_data_get_float_valuePtr = + _lookup>( + 'spine_event_data_get_float_value'); + late final _spine_event_data_get_float_value = + _spine_event_data_get_float_valuePtr + .asFunction(); + + ffi.Pointer spine_event_data_get_string_value( + spine_event event, + ) { + return _spine_event_data_get_string_value( + event, + ); + } + + late final _spine_event_data_get_string_valuePtr = + _lookup Function(spine_event)>>( + 'spine_event_data_get_string_value'); + late final _spine_event_data_get_string_value = + _spine_event_data_get_string_valuePtr + .asFunction Function(spine_event)>(); + + ffi.Pointer spine_event_data_get_audio_path( + spine_event event, + ) { + return _spine_event_data_get_audio_path( + event, + ); + } + + late final _spine_event_data_get_audio_pathPtr = + _lookup Function(spine_event)>>( + 'spine_event_data_get_audio_path'); + late final _spine_event_data_get_audio_path = + _spine_event_data_get_audio_pathPtr + .asFunction Function(spine_event)>(); + + double spine_event_data_get_volume( + spine_event event, + ) { + return _spine_event_data_get_volume( + event, + ); + } + + late final _spine_event_data_get_volumePtr = + _lookup>( + 'spine_event_data_get_volume'); + late final _spine_event_data_get_volume = _spine_event_data_get_volumePtr + .asFunction(); + + double spine_event_data_get_balance( + spine_event event, + ) { + return _spine_event_data_get_balance( + event, + ); + } + + late final _spine_event_data_get_balancePtr = + _lookup>( + 'spine_event_data_get_balance'); + late final _spine_event_data_get_balance = _spine_event_data_get_balancePtr + .asFunction(); + spine_event_data spine_event_get_data( spine_event event, ) { @@ -2143,9 +2273,9 @@ class spine_skeleton_drawable extends ffi.Struct { typedef spine_skeleton = ffi.Pointer; typedef spine_animation_state = ffi.Pointer; typedef spine_animation_state_events = ffi.Pointer; +typedef spine_animation = ffi.Pointer; typedef spine_track_entry = ffi.Pointer; typedef spine_event = ffi.Pointer; -typedef spine_animation = ffi.Pointer; typedef spine_bone = ffi.Pointer; typedef spine_slot = ffi.Pointer; typedef spine_skin = ffi.Pointer; diff --git a/spine-flutter/src/spine_flutter.cpp b/spine-flutter/src/spine_flutter.cpp index fd270434c..8af327d72 100644 --- a/spine-flutter/src/spine_flutter.cpp +++ b/spine-flutter/src/spine_flutter.cpp @@ -32,6 +32,8 @@ FFI_PLUGIN_EXPORT int spine_minor_version() { return SPINE_MINOR_VERSION; } +// Atlas + FFI_PLUGIN_EXPORT spine_atlas* spine_atlas_load(const char *atlasData) { if (!atlasData) return nullptr; int length = (int)strlen(atlasData); @@ -61,6 +63,8 @@ FFI_PLUGIN_EXPORT void spine_atlas_dispose(spine_atlas *atlas) { SpineExtension::free(atlas, __FILE__, __LINE__); } +// SkeletonData + FFI_PLUGIN_EXPORT spine_skeleton_data_result spine_skeleton_data_load_json(spine_atlas *atlas, const char *skeletonData) { spine_skeleton_data_result result = { nullptr, nullptr }; Bone::setYDown(true); @@ -97,6 +101,8 @@ FFI_PLUGIN_EXPORT void spine_skeleton_data_dispose(spine_skeleton_data skeletonD delete (SkeletonData*)skeletonData; } +// RenderCommand + spine_render_command *spine_render_command_create(int numVertices, int numIndices, spine_blend_mode blendMode, int pageIndex) { spine_render_command *cmd = SpineExtension::alloc(1, __FILE__, __LINE__); cmd->positions = SpineExtension::alloc(numVertices << 1, __FILE__, __LINE__); @@ -120,6 +126,8 @@ void spine_render_command_dispose(spine_render_command *cmd) { SpineExtension::free(cmd, __FILE__, __LINE__); } +// SkeletonDrawable + FFI_PLUGIN_EXPORT spine_skeleton_drawable *spine_skeleton_drawable_create(spine_skeleton_data skeletonData) { spine_skeleton_drawable *drawable = SpineExtension::calloc(1, __FILE__, __LINE__); drawable->skeleton = new Skeleton((SkeletonData*)skeletonData); @@ -185,12 +193,12 @@ FFI_PLUGIN_EXPORT spine_render_command *spine_skeleton_drawable_render(spine_ske } Vector *vertices = &worldVertices; - int verticesCount = 0; - Vector *uvs = NULL; + int verticesCount; + Vector *uvs; Vector *indices; - int indicesCount = 0; + int indicesCount; Color *attachmentColor; - int pageIndex = -1; + int pageIndex; if (attachment->getRTTI().isExactly(RegionAttachment::rtti)) { RegionAttachment *regionAttachment = (RegionAttachment *) attachment; @@ -271,6 +279,22 @@ FFI_PLUGIN_EXPORT spine_render_command *spine_skeleton_drawable_render(spine_ske return drawable->renderCommand; } +// Animation + +FFI_PLUGIN_EXPORT const char* spine_animation_get_name(spine_animation animation) { + if (animation == nullptr) return nullptr; + Animation *_animation = (Animation*)animation; + return _animation->getName().buffer(); +} + +FFI_PLUGIN_EXPORT float spine_animation_get_duration(spine_animation animation) { + if (animation == nullptr) return 0; + Animation *_animation = (Animation*)animation; + return _animation->getDuration(); +} + +// AnimationState + FFI_PLUGIN_EXPORT void spine_animation_state_update(spine_animation_state state, float delta) { if (state == nullptr) return; AnimationState *_state = (AnimationState*)state; @@ -384,6 +408,8 @@ FFI_PLUGIN_EXPORT void spine_animation_state_events_reset(spine_animation_state_ _events->events.clear(); } +// TrackEntry + FFI_PLUGIN_EXPORT int spine_track_entry_get_track_index(spine_track_entry entry) { if (entry == nullptr) return 0; TrackEntry *_entry = (TrackEntry*)entry; @@ -660,6 +686,8 @@ FFI_PLUGIN_EXPORT float spine_track_entry_get_track_complete(spine_track_entry e return _entry->getTrackComplete(); } +// Skeleton + FFI_PLUGIN_EXPORT void spine_skeleton_update_cache(spine_skeleton skeleton) { if (skeleton == nullptr) return; Skeleton *_skeleton = (Skeleton*)skeleton; @@ -927,6 +955,52 @@ FFI_PLUGIN_EXPORT void spine_skeleton_set_scale_y(spine_skeleton skeleton, float _skeleton->setScaleY(scaleY); } +// EventData + +FFI_PLUGIN_EXPORT const char* spine_event_data_get_name(spine_event_data event) { + if (event == nullptr) return nullptr; + EventData *_event = (EventData*)event; + return _event->getName().buffer(); +} + +FFI_PLUGIN_EXPORT int spine_event_data_get_int_value(spine_event_data event) { + if (event == nullptr) return 0; + EventData *_event = (EventData*)event; + return _event->getIntValue(); +} + +FFI_PLUGIN_EXPORT float spine_event_data_get_float_value(spine_event_data event) { + if (event == nullptr) return 0; + EventData *_event = (EventData*)event; + return _event->getFloatValue(); +} + +FFI_PLUGIN_EXPORT const char* spine_event_data_get_string_value(spine_event_data event) { + if (event == nullptr) return nullptr; + EventData *_event = (EventData*)event; + return _event->getStringValue().buffer(); +} + +FFI_PLUGIN_EXPORT const char* spine_event_data_get_audio_path(spine_event_data event) { + if (event == nullptr) return nullptr; + EventData *_event = (EventData*)event; + return _event->getAudioPath().buffer(); +} + +FFI_PLUGIN_EXPORT float spine_event_data_get_volume(spine_event_data event) { + if (event == nullptr) return 0; + EventData *_event = (EventData*)event; + return _event->getVolume(); +} + +FFI_PLUGIN_EXPORT float spine_event_data_get_balance(spine_event_data event) { + if (event == nullptr) return 0; + EventData *_event = (EventData*)event; + return _event->getBalance(); +} + +// Event + FFI_PLUGIN_EXPORT spine_event_data spine_event_get_data(spine_event event) { if (event == nullptr) return nullptr; Event *_event = (Event*)event; diff --git a/spine-flutter/src/spine_flutter.h b/spine-flutter/src/spine_flutter.h index b637efb04..767d235e3 100644 --- a/spine-flutter/src/spine_flutter.h +++ b/spine-flutter/src/spine_flutter.h @@ -122,6 +122,9 @@ FFI_PLUGIN_EXPORT spine_skeleton_drawable *spine_skeleton_drawable_create(spine_ FFI_PLUGIN_EXPORT spine_render_command *spine_skeleton_drawable_render(spine_skeleton_drawable *drawable); FFI_PLUGIN_EXPORT void spine_skeleton_drawable_dispose(spine_skeleton_drawable *drawable); +FFI_PLUGIN_EXPORT const char* spine_animation_get_name(spine_animation animation); +FFI_PLUGIN_EXPORT float spine_animation_get_duration(spine_animation animation); + FFI_PLUGIN_EXPORT void spine_animation_state_update(spine_animation_state state, float delta); FFI_PLUGIN_EXPORT void spine_animation_state_dispose_track_entry(spine_animation_state state, spine_track_entry entry); FFI_PLUGIN_EXPORT void spine_animation_state_apply(spine_animation_state state, spine_skeleton skeleton); @@ -233,6 +236,14 @@ FFI_PLUGIN_EXPORT void spine_skeleton_set_scale_x(spine_skeleton skeleton, float FFI_PLUGIN_EXPORT float spine_skeleton_get_scale_y(spine_skeleton skeleton); FFI_PLUGIN_EXPORT void spine_skeleton_set_scale_y(spine_skeleton skeleton, float scaleY); +FFI_PLUGIN_EXPORT const char* spine_event_data_get_name(spine_event event); +FFI_PLUGIN_EXPORT int spine_event_data_get_int_value(spine_event event); +FFI_PLUGIN_EXPORT float spine_event_data_get_float_value(spine_event event); +FFI_PLUGIN_EXPORT const char* spine_event_data_get_string_value(spine_event event); +FFI_PLUGIN_EXPORT const char* spine_event_data_get_audio_path(spine_event event); +FFI_PLUGIN_EXPORT float spine_event_data_get_volume(spine_event event); +FFI_PLUGIN_EXPORT float spine_event_data_get_balance(spine_event event); + FFI_PLUGIN_EXPORT spine_event_data spine_event_get_data(spine_event event); FFI_PLUGIN_EXPORT float spine_event_get_time(spine_event event); FFI_PLUGIN_EXPORT int spine_event_get_int_value(spine_event event);