From ac0c30ffd6975a64c48da0703821b9cef89951c5 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 31 Aug 2022 20:25:18 +0200 Subject: [PATCH] [flutter] Wrap BoneData. --- spine-flutter/example/lib/main.dart | 1 + spine-flutter/lib/spine_flutter.dart | 77 ++++++ .../lib/spine_flutter_bindings_generated.dart | 260 ++++++++++++++++-- spine-flutter/src/spine_flutter.cpp | 90 +++++- spine-flutter/src/spine_flutter.h | 39 ++- 5 files changed, 431 insertions(+), 36 deletions(-) diff --git a/spine-flutter/example/lib/main.dart b/spine-flutter/example/lib/main.dart index fb90a8b6c..31000a4b0 100644 --- a/spine-flutter/example/lib/main.dart +++ b/spine-flutter/example/lib/main.dart @@ -55,6 +55,7 @@ class SimpleAnimation extends StatelessWidget { print("Skeleton name: ${controller.skeletonData?.getName()}"); print("Skeleton version: ${controller.skeletonData?.getVersion()}"); print("Skeleton hash: ${controller.skeletonData?.getHash()}"); + print("Bones: ${controller.skeletonData!.getBones()}"); }); return Scaffold( diff --git a/spine-flutter/lib/spine_flutter.dart b/spine-flutter/lib/spine_flutter.dart index 1c388a817..082822409 100644 --- a/spine-flutter/lib/spine_flutter.dart +++ b/spine-flutter/lib/spine_flutter.dart @@ -391,11 +391,88 @@ enum BlendMode { const BlendMode(this.value); } +enum TransformMode { + Normal(0), + OnlyTranslation(1), + NoRotationOrReflection(2), + NoScale(3), + NoScaleOrReflection(4); + + final int value; + const TransformMode(this.value); +} + // FIXME class BoneData { final spine_bone_data _data; BoneData(this._data); + + int getIndex() { + return _bindings.spine_bone_data_get_index(_data); + } + + String getName() { + Pointer name = _bindings.spine_bone_data_get_name(_data).cast(); + return name.toDartString(); + } + + BoneData? getParent() { + final parent = _bindings.spine_bone_data_get_parent(_data); + if (parent.address == nullptr.address) return null; + return BoneData(parent); + } + + double getLength() { + return _bindings.spine_bone_data_get_length(_data); + } + + double getX() { + return _bindings.spine_bone_data_get_x(_data); + } + + double getY() { + return _bindings.spine_bone_data_get_y(_data); + } + + double getRotation() { + return _bindings.spine_bone_data_get_rotation(_data); + } + + double getScaleX() { + return _bindings.spine_bone_data_get_scale_x(_data); + } + + double getScaleY() { + return _bindings.spine_bone_data_get_scale_y(_data); + } + + double getShearX() { + return _bindings.spine_bone_data_get_shear_x(_data); + } + + double getShearY() { + return _bindings.spine_bone_data_get_shear_y(_data); + } + + TransformMode getTransformMode() { + final nativeMode = _bindings.spine_bone_data_get_transform_mode(_data); + return TransformMode.values[nativeMode]; + } + + bool isSkinRequired() { + return _bindings.spine_bone_data_is_skin_required(_data) == -1; + } + + Color getColor() { + final color = _bindings.spine_bone_data_get_color(_data); + return Color(color.r, color.g, color.b, color.a); + } + + @override + String toString() { + return getName(); + } } // FIXME diff --git a/spine-flutter/lib/spine_flutter_bindings_generated.dart b/spine-flutter/lib/spine_flutter_bindings_generated.dart index 8beaae8ae..a59015d02 100644 --- a/spine-flutter/lib/spine_flutter_bindings_generated.dart +++ b/spine-flutter/lib/spine_flutter_bindings_generated.dart @@ -2552,21 +2552,21 @@ class SpineFlutterBindings { .asFunction(); ffi.Pointer spine_event_data_get_name( - spine_event event, + spine_event_data 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_namePtr = _lookup< + ffi.NativeFunction Function(spine_event_data)>>( + 'spine_event_data_get_name'); late final _spine_event_data_get_name = _spine_event_data_get_namePtr - .asFunction Function(spine_event)>(); + .asFunction Function(spine_event_data)>(); int spine_event_data_get_int_value( - spine_event event, + spine_event_data event, ) { return _spine_event_data_get_int_value( event, @@ -2574,14 +2574,14 @@ class SpineFlutterBindings { } late final _spine_event_data_get_int_valuePtr = - _lookup>( + _lookup>( 'spine_event_data_get_int_value'); late final _spine_event_data_get_int_value = _spine_event_data_get_int_valuePtr - .asFunction(); + .asFunction(); double spine_event_data_get_float_value( - spine_event event, + spine_event_data event, ) { return _spine_event_data_get_float_value( event, @@ -2589,44 +2589,44 @@ class SpineFlutterBindings { } late final _spine_event_data_get_float_valuePtr = - _lookup>( + _lookup>( 'spine_event_data_get_float_value'); late final _spine_event_data_get_float_value = _spine_event_data_get_float_valuePtr - .asFunction(); + .asFunction(); ffi.Pointer spine_event_data_get_string_value( - spine_event event, + spine_event_data 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_valuePtr = _lookup< + ffi.NativeFunction Function(spine_event_data)>>( + 'spine_event_data_get_string_value'); late final _spine_event_data_get_string_value = _spine_event_data_get_string_valuePtr - .asFunction Function(spine_event)>(); + .asFunction Function(spine_event_data)>(); ffi.Pointer spine_event_data_get_audio_path( - spine_event event, + spine_event_data 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_pathPtr = _lookup< + ffi.NativeFunction Function(spine_event_data)>>( + 'spine_event_data_get_audio_path'); late final _spine_event_data_get_audio_path = _spine_event_data_get_audio_pathPtr - .asFunction Function(spine_event)>(); + .asFunction Function(spine_event_data)>(); double spine_event_data_get_volume( - spine_event event, + spine_event_data event, ) { return _spine_event_data_get_volume( event, @@ -2634,13 +2634,13 @@ class SpineFlutterBindings { } late final _spine_event_data_get_volumePtr = - _lookup>( + _lookup>( 'spine_event_data_get_volume'); late final _spine_event_data_get_volume = _spine_event_data_get_volumePtr - .asFunction(); + .asFunction(); double spine_event_data_get_balance( - spine_event event, + spine_event_data event, ) { return _spine_event_data_get_balance( event, @@ -2648,10 +2648,10 @@ class SpineFlutterBindings { } late final _spine_event_data_get_balancePtr = - _lookup>( + _lookup>( 'spine_event_data_get_balance'); late final _spine_event_data_get_balance = _spine_event_data_get_balancePtr - .asFunction(); + .asFunction(); spine_event_data spine_event_get_data( spine_event event, @@ -3040,6 +3040,204 @@ class SpineFlutterBindings { 'spine_slot_set_attachment'); late final _spine_slot_set_attachment = _spine_slot_set_attachmentPtr .asFunction(); + + int spine_bone_data_get_index( + spine_bone_data data, + ) { + return _spine_bone_data_get_index( + data, + ); + } + + late final _spine_bone_data_get_indexPtr = + _lookup>( + 'spine_bone_data_get_index'); + late final _spine_bone_data_get_index = + _spine_bone_data_get_indexPtr.asFunction(); + + ffi.Pointer spine_bone_data_get_name( + spine_bone_data data, + ) { + return _spine_bone_data_get_name( + data, + ); + } + + late final _spine_bone_data_get_namePtr = _lookup< + ffi.NativeFunction Function(spine_bone_data)>>( + 'spine_bone_data_get_name'); + late final _spine_bone_data_get_name = _spine_bone_data_get_namePtr + .asFunction Function(spine_bone_data)>(); + + spine_bone_data spine_bone_data_get_parent( + spine_bone_data data, + ) { + return _spine_bone_data_get_parent( + data, + ); + } + + late final _spine_bone_data_get_parentPtr = + _lookup>( + 'spine_bone_data_get_parent'); + late final _spine_bone_data_get_parent = _spine_bone_data_get_parentPtr + .asFunction(); + + double spine_bone_data_get_length( + spine_bone_data data, + ) { + return _spine_bone_data_get_length( + data, + ); + } + + late final _spine_bone_data_get_lengthPtr = + _lookup>( + 'spine_bone_data_get_length'); + late final _spine_bone_data_get_length = _spine_bone_data_get_lengthPtr + .asFunction(); + + double spine_bone_data_get_x( + spine_bone_data data, + ) { + return _spine_bone_data_get_x( + data, + ); + } + + late final _spine_bone_data_get_xPtr = + _lookup>( + 'spine_bone_data_get_x'); + late final _spine_bone_data_get_x = + _spine_bone_data_get_xPtr.asFunction(); + + double spine_bone_data_get_y( + spine_bone_data data, + ) { + return _spine_bone_data_get_y( + data, + ); + } + + late final _spine_bone_data_get_yPtr = + _lookup>( + 'spine_bone_data_get_y'); + late final _spine_bone_data_get_y = + _spine_bone_data_get_yPtr.asFunction(); + + double spine_bone_data_get_rotation( + spine_bone_data data, + ) { + return _spine_bone_data_get_rotation( + data, + ); + } + + late final _spine_bone_data_get_rotationPtr = + _lookup>( + 'spine_bone_data_get_rotation'); + late final _spine_bone_data_get_rotation = _spine_bone_data_get_rotationPtr + .asFunction(); + + double spine_bone_data_get_scale_x( + spine_bone_data data, + ) { + return _spine_bone_data_get_scale_x( + data, + ); + } + + late final _spine_bone_data_get_scale_xPtr = + _lookup>( + 'spine_bone_data_get_scale_x'); + late final _spine_bone_data_get_scale_x = _spine_bone_data_get_scale_xPtr + .asFunction(); + + double spine_bone_data_get_scale_y( + spine_bone_data data, + ) { + return _spine_bone_data_get_scale_y( + data, + ); + } + + late final _spine_bone_data_get_scale_yPtr = + _lookup>( + 'spine_bone_data_get_scale_y'); + late final _spine_bone_data_get_scale_y = _spine_bone_data_get_scale_yPtr + .asFunction(); + + double spine_bone_data_get_shear_x( + spine_bone_data data, + ) { + return _spine_bone_data_get_shear_x( + data, + ); + } + + late final _spine_bone_data_get_shear_xPtr = + _lookup>( + 'spine_bone_data_get_shear_x'); + late final _spine_bone_data_get_shear_x = _spine_bone_data_get_shear_xPtr + .asFunction(); + + double spine_bone_data_get_shear_y( + spine_bone_data data, + ) { + return _spine_bone_data_get_shear_y( + data, + ); + } + + late final _spine_bone_data_get_shear_yPtr = + _lookup>( + 'spine_bone_data_get_shear_y'); + late final _spine_bone_data_get_shear_y = _spine_bone_data_get_shear_yPtr + .asFunction(); + + int spine_bone_data_get_transform_mode( + spine_bone_data data, + ) { + return _spine_bone_data_get_transform_mode( + data, + ); + } + + late final _spine_bone_data_get_transform_modePtr = + _lookup>( + 'spine_bone_data_get_transform_mode'); + late final _spine_bone_data_get_transform_mode = + _spine_bone_data_get_transform_modePtr + .asFunction(); + + int spine_bone_data_is_skin_required( + spine_bone_data data, + ) { + return _spine_bone_data_is_skin_required( + data, + ); + } + + late final _spine_bone_data_is_skin_requiredPtr = + _lookup>( + 'spine_bone_data_is_skin_required'); + late final _spine_bone_data_is_skin_required = + _spine_bone_data_is_skin_requiredPtr + .asFunction(); + + spine_color spine_bone_data_get_color( + spine_bone_data data, + ) { + return _spine_bone_data_get_color( + data, + ); + } + + late final _spine_bone_data_get_colorPtr = + _lookup>( + 'spine_bone_data_get_color'); + late final _spine_bone_data_get_color = _spine_bone_data_get_colorPtr + .asFunction(); } class spine_atlas extends ffi.Struct { @@ -3084,6 +3282,14 @@ abstract class spine_event_type { static const int SPINE_EVENT_TYPE_EVENT = 5; } +abstract class spine_transform_mode { + static const int SPINE_TRANSFORM_MODE_NORMAL = 0; + static const int SPINE_TRANSFORM_ONLY_TRANSLATION = 1; + static const int SPINE_TRANSFORM_NO_ROTATION_OR_REFLECTION = 2; + static const int SPINE_TRANSFORM_NO_SCALE = 3; + static const int SPINE_TRANSFORM_NO_SCALE_OR_REFLECTION = 4; +} + class spine_render_command extends ffi.Struct { external ffi.Pointer positions; diff --git a/spine-flutter/src/spine_flutter.cpp b/spine-flutter/src/spine_flutter.cpp index 8c64f4cb9..ca25c7761 100644 --- a/spine-flutter/src/spine_flutter.cpp +++ b/spine-flutter/src/spine_flutter.cpp @@ -1380,4 +1380,92 @@ FFI_PLUGIN_EXPORT void spine_slot_set_attachment(spine_slot slot, spine_attachme if (slot == nullptr) return; Slot *_slot = (Slot*)slot; _slot->setAttachment((Attachment*)attachment); -} \ No newline at end of file +} + +// BoneData +FFI_PLUGIN_EXPORT int spine_bone_data_get_index(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getIndex(); +} + +FFI_PLUGIN_EXPORT const char* spine_bone_data_get_name(spine_bone_data data) { + if (data == nullptr) return nullptr; + BoneData *_data = (BoneData*)data; + return _data->getName().buffer(); +} + +FFI_PLUGIN_EXPORT spine_bone_data spine_bone_data_get_parent(spine_bone_data data) { + if (data == nullptr) return nullptr; + BoneData *_data = (BoneData*)data; + return _data->getParent(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_length(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getLength(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_x(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getX(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_y(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getY(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_rotation(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getRotation(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_scale_x(spine_bone_data data) +{ + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getScaleX(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_scale_y(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getScaleY(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_shear_x(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getShearX(); +} + +FFI_PLUGIN_EXPORT float spine_bone_data_get_shear_y(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->getShearY(); +} + +FFI_PLUGIN_EXPORT spine_transform_mode spine_bone_data_get_transform_mode(spine_bone_data data) { + if (data == nullptr) return SPINE_TRANSFORM_MODE_NORMAL; + BoneData *_data = (BoneData*)data; + return (spine_transform_mode)_data->getTransformMode(); +} + +FFI_PLUGIN_EXPORT int spine_bone_data_is_skin_required(spine_bone_data data) { + if (data == nullptr) return 0; + BoneData *_data = (BoneData*)data; + return _data->isSkinRequired() ? -1 : 0; +} + +FFI_PLUGIN_EXPORT spine_color spine_bone_data_get_color(spine_bone_data data) { + spine_color color = { 0, 0, 0 , 0}; + if (data == nullptr) return color; + BoneData *_data = (BoneData*)data; + color = { _data->getColor().r, _data->getColor().g, _data->getColor().b, _data->getColor().a }; + return color; +} diff --git a/spine-flutter/src/spine_flutter.h b/spine-flutter/src/spine_flutter.h index 42c8ed3d0..58696b41a 100644 --- a/spine-flutter/src/spine_flutter.h +++ b/spine-flutter/src/spine_flutter.h @@ -79,6 +79,14 @@ typedef enum spine_event_type { SPINE_EVENT_TYPE_EVENT } spine_event_type; +typedef enum spine_transform_mode { + SPINE_TRANSFORM_MODE_NORMAL = 0, + SPINE_TRANSFORM_ONLY_TRANSLATION, + SPINE_TRANSFORM_NO_ROTATION_OR_REFLECTION, + SPINE_TRANSFORM_NO_SCALE, + SPINE_TRANSFORM_NO_SCALE_OR_REFLECTION +} spine_transform_mode; + typedef struct spine_render_command { float *positions; float *uvs; @@ -272,13 +280,13 @@ 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 const char* spine_event_data_get_name(spine_event_data event); +FFI_PLUGIN_EXPORT int spine_event_data_get_int_value(spine_event_data event); +FFI_PLUGIN_EXPORT float spine_event_data_get_float_value(spine_event_data event); +FFI_PLUGIN_EXPORT const char* spine_event_data_get_string_value(spine_event_data event); +FFI_PLUGIN_EXPORT const char* spine_event_data_get_audio_path(spine_event_data event); +FFI_PLUGIN_EXPORT float spine_event_data_get_volume(spine_event_data event); +FFI_PLUGIN_EXPORT float spine_event_data_get_balance(spine_event_data 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); @@ -307,4 +315,19 @@ FFI_PLUGIN_EXPORT spine_color spine_slot_get_dark_color(spine_slot slot); FFI_PLUGIN_EXPORT void spine_slot_set_dark_color(spine_slot slot, float r, float g, float b, float a); FFI_PLUGIN_EXPORT int spine_slot_has_dark_color(spine_slot slot); FFI_PLUGIN_EXPORT spine_attachment spine_slot_get_attachment(spine_slot slot); -FFI_PLUGIN_EXPORT void spine_slot_set_attachment(spine_slot slot, spine_attachment attachment); \ No newline at end of file +FFI_PLUGIN_EXPORT void spine_slot_set_attachment(spine_slot slot, spine_attachment attachment); + +FFI_PLUGIN_EXPORT int spine_bone_data_get_index(spine_bone_data data); +FFI_PLUGIN_EXPORT const char* spine_bone_data_get_name(spine_bone_data data); +FFI_PLUGIN_EXPORT spine_bone_data spine_bone_data_get_parent(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_length(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_x(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_y(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_rotation(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_scale_x(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_scale_y(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_shear_x(spine_bone_data data); +FFI_PLUGIN_EXPORT float spine_bone_data_get_shear_y(spine_bone_data data); +FFI_PLUGIN_EXPORT spine_transform_mode spine_bone_data_get_transform_mode(spine_bone_data data); +FFI_PLUGIN_EXPORT int spine_bone_data_is_skin_required(spine_bone_data data); +FFI_PLUGIN_EXPORT spine_color spine_bone_data_get_color(spine_bone_data data); \ No newline at end of file