浏览代码

[flutter] Working dart-writer plus headless smoke test

Mario Zechner 1 月之前
父节点
当前提交
4a7bf7c12d
共有 100 个文件被更改,包括 3307 次插入2818 次删除
  1. 1 0
      .gitignore
  2. 2 0
      spine-c/src/extensions.h
  3. 3 3
      spine-flutter/README.md
  4. 4 0
      spine-flutter/codegen/package.json
  5. 1442 1267
      spine-flutter/codegen/src/dart-writer.ts
  6. 101 13
      spine-flutter/codegen/src/index.ts
  7. 3 0
      spine-flutter/generate-bindings.sh
  8. 6 2
      spine-flutter/lib/extensions.dart
  9. 10 10
      spine-flutter/lib/generated/alpha_timeline.dart
  10. 36 16
      spine-flutter/lib/generated/animation.dart
  11. 53 27
      spine-flutter/lib/generated/animation_state.dart
  12. 21 15
      spine-flutter/lib/generated/animation_state_data.dart
  13. 286 169
      spine-flutter/lib/generated/arrays.dart
  14. 5 5
      spine-flutter/lib/generated/atlas.dart
  15. 76 12
      spine-flutter/lib/generated/atlas_attachment_loader.dart
  16. 13 8
      spine-flutter/lib/generated/atlas_page.dart
  17. 27 18
      spine-flutter/lib/generated/atlas_region.dart
  18. 14 14
      spine-flutter/lib/generated/attachment.dart
  19. 16 50
      spine-flutter/lib/generated/attachment_loader.dart
  20. 14 12
      spine-flutter/lib/generated/attachment_timeline.dart
  21. 7 7
      spine-flutter/lib/generated/attachment_type.dart
  22. 4 4
      spine-flutter/lib/generated/blend_mode.dart
  23. 22 16
      spine-flutter/lib/generated/bone.dart
  24. 11 25
      spine-flutter/lib/generated/bone_data.dart
  25. 3 7
      spine-flutter/lib/generated/bone_local.dart
  26. 29 20
      spine-flutter/lib/generated/bone_pose.dart
  27. 6 28
      spine-flutter/lib/generated/bone_timeline.dart
  28. 8 9
      spine-flutter/lib/generated/bone_timeline1.dart
  29. 12 8
      spine-flutter/lib/generated/bone_timeline2.dart
  30. 7 10
      spine-flutter/lib/generated/bounding_box_attachment.dart
  31. 12 13
      spine-flutter/lib/generated/clipping_attachment.dart
  32. 10 11
      spine-flutter/lib/generated/color.dart
  33. 15 27
      spine-flutter/lib/generated/constraint.dart
  34. 7 35
      spine-flutter/lib/generated/constraint_data.dart
  35. 6 28
      spine-flutter/lib/generated/constraint_timeline.dart
  36. 11 10
      spine-flutter/lib/generated/constraint_timeline1.dart
  37. 19 11
      spine-flutter/lib/generated/curve_timeline.dart
  38. 25 17
      spine-flutter/lib/generated/curve_timeline1.dart
  39. 0 60
      spine-flutter/lib/generated/curve_timeline2.dart
  40. 25 19
      spine-flutter/lib/generated/deform_timeline.dart
  41. 7 10
      spine-flutter/lib/generated/draw_order_timeline.dart
  42. 6 8
      spine-flutter/lib/generated/event.dart
  43. 8 9
      spine-flutter/lib/generated/event_data.dart
  44. 17 14
      spine-flutter/lib/generated/event_queue_entry.dart
  45. 6 10
      spine-flutter/lib/generated/event_timeline.dart
  46. 6 6
      spine-flutter/lib/generated/event_type.dart
  47. 7 7
      spine-flutter/lib/generated/format.dart
  48. 4 7
      spine-flutter/lib/generated/from_property.dart
  49. 2 7
      spine-flutter/lib/generated/from_rotate.dart
  50. 2 7
      spine-flutter/lib/generated/from_scale_x.dart
  51. 2 7
      spine-flutter/lib/generated/from_scale_y.dart
  52. 2 7
      spine-flutter/lib/generated/from_shear_y.dart
  53. 2 7
      spine-flutter/lib/generated/from_x.dart
  54. 2 7
      spine-flutter/lib/generated/from_y.dart
  55. 72 36
      spine-flutter/lib/generated/ik_constraint.dart
  56. 54 34
      spine-flutter/lib/generated/ik_constraint_data.dart
  57. 16 13
      spine-flutter/lib/generated/ik_constraint_pose.dart
  58. 18 14
      spine-flutter/lib/generated/ik_constraint_timeline.dart
  59. 5 5
      spine-flutter/lib/generated/inherit.dart
  60. 13 12
      spine-flutter/lib/generated/inherit_timeline.dart
  61. 3 26
      spine-flutter/lib/generated/linked_mesh.dart
  62. 37 26
      spine-flutter/lib/generated/mesh_attachment.dart
  63. 4 4
      spine-flutter/lib/generated/mix_blend.dart
  64. 2 2
      spine-flutter/lib/generated/mix_direction.dart
  65. 16 15
      spine-flutter/lib/generated/path_attachment.dart
  66. 36 29
      spine-flutter/lib/generated/path_constraint.dart
  67. 69 42
      spine-flutter/lib/generated/path_constraint_data.dart
  68. 22 15
      spine-flutter/lib/generated/path_constraint_mix_timeline.dart
  69. 16 13
      spine-flutter/lib/generated/path_constraint_pose.dart
  70. 9 10
      spine-flutter/lib/generated/path_constraint_position_timeline.dart
  71. 9 10
      spine-flutter/lib/generated/path_constraint_spacing_timeline.dart
  72. 4 4
      spine-flutter/lib/generated/physics.dart
  73. 44 32
      spine-flutter/lib/generated/physics_constraint.dart
  74. 9 10
      spine-flutter/lib/generated/physics_constraint_damping_timeline.dart
  75. 97 55
      spine-flutter/lib/generated/physics_constraint_data.dart
  76. 9 10
      spine-flutter/lib/generated/physics_constraint_gravity_timeline.dart
  77. 9 10
      spine-flutter/lib/generated/physics_constraint_inertia_timeline.dart
  78. 9 10
      spine-flutter/lib/generated/physics_constraint_mass_timeline.dart
  79. 9 10
      spine-flutter/lib/generated/physics_constraint_mix_timeline.dart
  80. 28 19
      spine-flutter/lib/generated/physics_constraint_pose.dart
  81. 20 14
      spine-flutter/lib/generated/physics_constraint_reset_timeline.dart
  82. 9 10
      spine-flutter/lib/generated/physics_constraint_strength_timeline.dart
  83. 13 11
      spine-flutter/lib/generated/physics_constraint_timeline.dart
  84. 9 10
      spine-flutter/lib/generated/physics_constraint_wind_timeline.dart
  85. 12 12
      spine-flutter/lib/generated/point_attachment.dart
  86. 4 7
      spine-flutter/lib/generated/polygon.dart
  87. 6 27
      spine-flutter/lib/generated/posed.dart
  88. 2 6
      spine-flutter/lib/generated/posed_active.dart
  89. 6 8
      spine-flutter/lib/generated/posed_data.dart
  90. 2 2
      spine-flutter/lib/generated/position_mode.dart
  91. 32 32
      spine-flutter/lib/generated/property.dart
  92. 43 27
      spine-flutter/lib/generated/region_attachment.dart
  93. 42 9
      spine-flutter/lib/generated/render_command.dart
  94. 8 10
      spine-flutter/lib/generated/rgb2_timeline.dart
  95. 6 9
      spine-flutter/lib/generated/rgb_timeline.dart
  96. 8 10
      spine-flutter/lib/generated/rgba2_timeline.dart
  97. 8 10
      spine-flutter/lib/generated/rgba_timeline.dart
  98. 3 3
      spine-flutter/lib/generated/rotate_mode.dart
  99. 4 8
      spine-flutter/lib/generated/rotate_timeline.dart
  100. 6 8
      spine-flutter/lib/generated/rtti.dart

+ 1 - 0
.gitignore

@@ -257,3 +257,4 @@ formatters/eclipse-formatter/format-diff.txt
 spine-cpp/build-debug
 spine-cpp/build-debug
 spine-cpp/build-linux
 spine-cpp/build-linux
 spine-cpp/build-release-debug
 spine-cpp/build-release-debug
+spine-flutter/test/spine_flutter.dylib

+ 2 - 0
spine-c/src/extensions.h

@@ -35,6 +35,8 @@ extern "C" {
 #endif
 #endif
 
 
 #include "base.h"
 #include "base.h"
+#include "generated/atlas.h"
+#include "generated/skeleton_data.h"
 
 
 // Custom types for spine-c-new (not generated)
 // Custom types for spine-c-new (not generated)
 SPINE_OPAQUE_TYPE(spine_skeleton_data_result)
 SPINE_OPAQUE_TYPE(spine_skeleton_data_result)

+ 3 - 3
spine-flutter/README.md

@@ -63,7 +63,7 @@ Otherwise you can run the example like this:
 2. Clone this repository `git clone https://github.com/esotericsoftware/spine-runtimes`
 2. Clone this repository `git clone https://github.com/esotericsoftware/spine-runtimes`
 3. Run `setup.sh` in the `spine-flutter/` folder. On Windows, you can use [Git Bash](https://gitforwindows.org/) included in Git for Window to run the `setup.sh` Bash script.
 3. Run `setup.sh` in the `spine-flutter/` folder. On Windows, you can use [Git Bash](https://gitforwindows.org/) included in Git for Window to run the `setup.sh` Bash script.
 
 
-You can then open `spine-flutter` in an IDE or editor of your choice that supports Flutter, like [IntelliJ IDEA/Android Studio](https://docs.flutter.dev/get-started/editor?tab=androidstudio) or [Visual Studio Code](https://docs.flutter.dev/get-started/editor?tab=vscode) to inspect and run the example. 
+You can then open `spine-flutter` in an IDE or editor of your choice that supports Flutter, like [IntelliJ IDEA/Android Studio](https://docs.flutter.dev/get-started/editor?tab=androidstudio) or [Visual Studio Code](https://docs.flutter.dev/get-started/editor?tab=vscode) to inspect and run the example.
 
 
 Alternatively, you can run the example from the [command line](https://docs.flutter.dev/get-started/test-drive?tab=terminal).
 Alternatively, you can run the example from the [command line](https://docs.flutter.dev/get-started/test-drive?tab=terminal).
 
 
@@ -72,6 +72,6 @@ If all you modify are the Dart sources of the plugin, then the development setup
 
 
 If you need to work on the `dart:ffi` bindings for `spine-cpp`, you will also need to install [Emscripten](https://emscripten.org/docs/getting_started/downloads.html).
 If you need to work on the `dart:ffi` bindings for `spine-cpp`, you will also need to install [Emscripten](https://emscripten.org/docs/getting_started/downloads.html).
 
 
-To generate the bindings based on the `src/spine_flutter.h` header, run `dart run ffigen --config ffigen.yaml`. After the bindings have been generated, you must replace the line `import 'dart:ffi' as ffi;` with `import 'ffi_proxy.dart' as ffi;` in the file `src/spine_flutter_bindings_generated.dart`. Otherwise the bindings will not compile for the web.
+To generate the bindings based on the `src/spine_flutter.h` header, run `dart run ffigen --config ffigen.yaml`. After the bindings have been generated, you must replace the line `import 'dart:ffi' as ffi;` with `import 'ffi_proxy.dart' as ffi;` in the file `src/generated/spine_dart_bindings_generated.dart`. Otherwise the bindings will not compile for the web.
 
 
-If you made changes to `spine-cpp` or the source files in `src/`, you must run `compile-wasm.sh`. This will compile `spine-cpp` and the bindings for the Web and place updated versions of `libspine_flutter.js` and `libspine_flutter.wasm` in the `lib/assets/` folder. For web builds, the `initSpineFlutterFFI()` function in `lib/init_web.dart` will load these files from the package's asset bundle.
+If you made changes to `spine-cpp` or the source files in `src/`, you must run `compile-wasm.sh`. This will compile `spine-cpp` and the bindings for the Web and place updated versions of `libspine_flutter.js` and `libspine_flutter.wasm` in the `lib/assets/` folder. For web builds, the `initSpineDartFFI()` function in `lib/spine_dart_init_web.dart` will load these files from the package's asset bundle.

+ 4 - 0
spine-flutter/codegen/package.json

@@ -1,6 +1,10 @@
 {
 {
   "name": "spine-flutter-codegen",
   "name": "spine-flutter-codegen",
   "type": "module",
   "type": "module",
+  "scripts": {
+    "format": "npx -y typescript-formatter -r **/*.ts",
+    "build": "npx tsx src/index.ts"
+  },
   "dependencies": {
   "dependencies": {
     "spine-c-codegen": "file:../../spine-c/codegen"
     "spine-c-codegen": "file:../../spine-c/codegen"
   },
   },

+ 1442 - 1267
spine-flutter/codegen/src/dart-writer.ts

@@ -6,1272 +6,1447 @@ import { toSnakeCase } from '../../../spine-c/codegen/src/types.js';
 
 
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 const __dirname = path.dirname(fileURLToPath(import.meta.url));
 const LICENSE_HEADER = fs.readFileSync(path.join(__dirname, '../../../spine-cpp/src/spine/Skeleton.cpp'), 'utf8')
 const LICENSE_HEADER = fs.readFileSync(path.join(__dirname, '../../../spine-cpp/src/spine/Skeleton.cpp'), 'utf8')
-    .split('\n')
-    .slice(0, 28)
-    .map((line, index, array) => {
-        // Convert C++ block comment format to Dart line comment format
-        if (index === 0 && line.startsWith('/****')) {
-            // First line: remove asterisks
-            return '//' + line.substring(4).replace(/\*+/g, '');
-        } else if (index === array.length - 1 && (line.startsWith(' ****') || line.trim() === '*/')) {
-            // Last line: remove asterisks, use // not ///
-            return '//' + line.substring(line.indexOf('*') + 1).replace(/\*+/g, '').replace(/\//g, '');
-        } else if (line.startsWith(' ****') || line.trim() === '*/') {
-            return '// ' + line.substring(4);
-        } else if (line.startsWith(' * ')) {
-            return '// ' + line.substring(3);
-        } else if (line.startsWith(' *')) {
-            return '//' + line.substring(2);
-        } else {
-            return line;
-        }
-    })
-    .join('\n');
-
-/** Generates Dart wrapper files from C intermediate representation */
+	.split('\n')
+	.slice(0, 28)
+	.map((line, index, array) => {
+		// Convert C++ block comment format to Dart line comment format
+		if (index === 0 && line.startsWith('/****')) {
+			return `//${line.substring(4).replace(/\*+/g, '')}`;
+		} else if (index === array.length - 1 && (line.startsWith(' ****') || line.trim() === '*/')) {
+			return `//${line.substring(line.indexOf('*') + 1).replace(/\*+/g, '').replace(/\//g, '')}`;
+		} else if (line.startsWith(' ****') || line.trim() === '*/') {
+			return `// ${line.substring(4)}`;
+		} else if (line.startsWith(' * ')) {
+			return `// ${line.substring(3)}`;
+		} else if (line.startsWith(' *')) {
+			return `//${line.substring(2)}`;
+		} else {
+			return line;
+		}
+	})
+	.join('\n');
+
+// Internal data model interfaces (from spec)
+interface DartClass {
+	name: string;                    // Dart class name (e.g., "Animation")
+	type: 'concrete' | 'abstract' | 'interface';
+	inheritance: {
+		extends?: string;              // Single parent class
+		implements: string[];          // Multiple interfaces (replaces mixins)
+	};
+	imports: string[];              // All required imports
+	members: DartMember[];          // All class members
+	hasRtti: boolean;               // Whether this class needs RTTI switching
+	needsPackageFfi: boolean;       // Whether to import package:ffi
+}
+
+interface DartMember {
+	type: 'constructor' | 'method' | 'getter' | 'setter' | 'static_method';
+	name: string;                   // Dart member name
+	dartReturnType: string;         // Dart return type
+	parameters: DartParameter[];    // Parameters (excluding 'self')
+	isOverride: boolean;           // Whether to add @override
+	implementation: string;         // The actual Dart code body
+	cMethodName?: string;          // Original C method name (for reference)
+}
+
+interface DartParameter {
+	name: string;
+	dartType: string;
+	cType: string;                 // Original C type for conversion
+}
+
+interface DartEnum {
+	name: string;
+	values: DartEnumValue[];
+}
+
+interface DartEnumValue {
+	name: string;
+	value: number;
+}
+
+/** New Dart writer with clean architecture - following the specification exactly */
 export class DartWriter {
 export class DartWriter {
-    private enumNames = new Set<string>();
-    private inheritanceMap = new Map<string, string>(); // child -> parent
-    private classMap = new Map<string, CClassOrStruct>(); // name -> class
-
-    constructor(private outputDir: string) {
-        this.cleanOutputDirectory();
-    }
-
-    private cleanOutputDirectory(): void {
-        if (fs.existsSync(this.outputDir)) {
-            console.log(`Cleaning ${this.outputDir}...`);
-            fs.rmSync(this.outputDir, { recursive: true, force: true });
-        }
-        fs.mkdirSync(this.outputDir, { recursive: true });
-    }
-
-    /** Build inheritance relationships and class mapping */
-    private buildInheritanceInfo(cTypes: CClassOrStruct[]): void {
-        // Build class map
-        for (const cType of cTypes) {
-            this.classMap.set(cType.name, cType);
-        }
-
-        // Build inheritance map (child -> immediate parent)
-        for (const cType of cTypes) {
-            if (cType.cppType.superTypes && cType.cppType.superTypes.length > 0) {
-                // Find the immediate parent (most specific supertype)
-                let immediateParent: string | null = null;
-                
-                for (const superType of cType.cppType.superTypes) {
-                    const parentCName = `spine_${toSnakeCase(superType)}`;
-                    // Check if this parent exists in our class list
-                    if (this.classMap.has(parentCName)) {
-                        // Use the first valid supertype as immediate parent
-                        // (In most cases there's only one direct parent)
-                        if (!immediateParent) {
-                            immediateParent = parentCName;
-                        }
-                    }
-                }
-                
-                if (immediateParent) {
-                    this.inheritanceMap.set(cType.name, immediateParent);
-                }
-            }
-        }
-    }
-
-    /** Sort classes by inheritance dependency (base classes first) */
-    private sortByInheritance(cTypes: CClassOrStruct[]): CClassOrStruct[] {
-        const sorted: CClassOrStruct[] = [];
-        const processed = new Set<string>();
-        
-        const processClass = (cType: CClassOrStruct) => {
-            if (processed.has(cType.name)) {
-                return;
-            }
-            
-            // Process parent first
-            const parentName = this.inheritanceMap.get(cType.name);
-            if (parentName) {
-                const parent = this.classMap.get(parentName);
-                if (parent) {
-                    processClass(parent);
-                }
-            }
-            
-            // Then process this class
-            sorted.push(cType);
-            processed.add(cType.name);
-        };
-        
-        // Process all classes
-        for (const cType of cTypes) {
-            processClass(cType);
-        }
-        
-        return sorted;
-    }
-
-    /** Check if a class is abstract */
-    private isAbstract(cType: CClassOrStruct): boolean {
-        return cType.cppType.isAbstract === true;
-    }
-
-    /** Get parent class name for inheritance */
-    private getParentClass(cType: CClassOrStruct): string | null {
-        return this.inheritanceMap.get(cType.name) || null;
-    }
-
-    /** Get root parent class name (for accessing static bindings) */
-    private getRootParent(cType: CClassOrStruct): string {
-        let current = cType.name;
-        while (this.inheritanceMap.has(current)) {
-            current = this.inheritanceMap.get(current)!;
-        }
-        return current;
-    }
-
-    /** Check if a method is inherited from a parent class */
-    private isMethodInherited(method: CMethod, cType: CClassOrStruct): boolean {
-        // Find if this method exists in any parent class
-        const parentName = this.getParentClass(cType);
-        if (!parentName) {
-            return false;
-        }
-        
-        const parent = this.classMap.get(parentName);
-        if (!parent) {
-            return false;
-        }
-        
-        // Check if parent has this method (by looking at the method name pattern)
-        const methodSuffix = this.getMethodSuffix(method.name, cType.name);
-        const parentMethodName = `${parentName}_${methodSuffix}`;
-        
-        const hasInParent = parent.methods.some(m => m.name === parentMethodName);
-        if (hasInParent) {
-            return true;
-        }
-        
-        // Recursively check parent's parents
-        return this.isMethodInherited(method, parent);
-    }
-
-    /** Extract method suffix from full method name */
-    private getMethodSuffix(methodName: string, typeName: string): string {
-        const prefix = `${typeName}_`;
-        if (methodName.startsWith(prefix)) {
-            return methodName.slice(prefix.length);
-        }
-        return methodName;
-    }
-
-    async writeAll(cTypes: CClassOrStruct[], cEnums: CEnum[], cArrayTypes: CClassOrStruct[]): Promise<void> {
-        // Collect enum names first
-        for (const cEnum of cEnums) {
-            this.enumNames.add(cEnum.name);
-        }
-
-        // Build inheritance information
-        this.buildInheritanceInfo(cTypes);
-
-        // Sort classes by inheritance dependency (base classes first)
-        const sortedTypes = this.sortByInheritance(cTypes);
-
-        // Write enums
-        for (const cEnum of cEnums) {
-            await this.writeEnum(cEnum);
-        }
-
-        // Write wrapper classes in dependency order
-        for (const cType of sortedTypes) {
-            await this.writeClass(cType);
-        }
-
-        // Write all array specializations in a single file
-        await this.writeArrays(cArrayTypes);
-
-        // Write main export file
-        await this.writeExportFile(cTypes, cEnums, cArrayTypes);
-
-        // Run dart fix to clean up generated code
-        await this.runDartFix();
-    }
-
-
-    private async writeEnum(cEnum: CEnum): Promise<void> {
-        const lines: string[] = [];
-        const dartName = this.toDartTypeName(cEnum.name);
-
-        lines.push(LICENSE_HEADER);
-        lines.push('');
-        lines.push('// AUTO GENERATED FILE, DO NOT EDIT.');
-        lines.push('');
-        lines.push(`/// ${dartName} enum`);
-        lines.push(`enum ${dartName} {`);
-
-        // Write enum values
-        for (let i = 0; i < cEnum.values.length; i++) {
-            const value = cEnum.values[i];
-            const dartValueName = this.toDartEnumValueName(value.name, cEnum.name);
-            const comma = i < cEnum.values.length - 1 ? ',' : ';';
-
-            if (value.value !== undefined) {
-                lines.push(`  ${dartValueName}(${value.value})${comma}`);
-            } else {
-                lines.push(`  ${dartValueName}(${i})${comma}`);
-            }
-        }
-
-        lines.push('');
-        lines.push(`  const ${dartName}(this.value);`);
-        lines.push('  final int value;');
-        lines.push('');
-        lines.push(`  static ${dartName} fromValue(int value) {`);
-        lines.push('    return values.firstWhere(');
-        lines.push('      (e) => e.value == value,');
-        lines.push(`      orElse: () => throw ArgumentError('Invalid ${dartName} value: \$value'),`);
-        lines.push('    );');
-        lines.push('  }');
-        lines.push('}');
-
-        const fileName = `${toSnakeCase(dartName)}.dart`;
-        const filePath = path.join(this.outputDir, fileName);
-        fs.writeFileSync(filePath, lines.join('\n'));
-    }
-
-    private async writeClass(cType: CClassOrStruct): Promise<void> {
-        const lines: string[] = [];
-        const dartClassName = this.toDartTypeName(cType.name);
-
-        lines.push(LICENSE_HEADER);
-        lines.push('');
-        lines.push('// AUTO GENERATED FILE, DO NOT EDIT.');
-        lines.push('');
-        lines.push("import 'dart:ffi';");
-        
-        // Check if we need package:ffi for string conversions
-        const needsPackageFfi = this.needsStringConversions(cType);
-        if (needsPackageFfi) {
-            lines.push("import 'package:ffi/ffi.dart';");
-        }
-        
-        lines.push("import 'spine_flutter_bindings_generated.dart';");
-        lines.push("import '../spine_bindings.dart';");
-
-        // Check if this class has an rtti method
-        const hasRttiMethod = cType.methods.some(m => m.name === `${cType.name}_rtti` && m.parameters.length === 0);
-        if (hasRttiMethod) {
-            lines.push("import 'rtti.dart';");
-        }
-
-        // Add parent class import if needed
-        const parentName = this.getParentClass(cType);
-        if (parentName) {
-            const parentDartName = this.toDartTypeName(parentName);
-            lines.push(`import '${toSnakeCase(parentDartName)}.dart';`);
-        }
-
-        // Collect all imports needed (arrays, enums, and other types)
-        const allImports = this.collectAllImports(cType);
-        for (const importFile of allImports) {
-            // Skip rtti.dart if we already added it above
-            if (importFile === 'rtti.dart' && hasRttiMethod) {
-                continue;
-            }
-            // Skip parent class import if we already added it above
-            if (parentName) {
-                const parentDartName = this.toDartTypeName(parentName);
-                if (importFile === `${toSnakeCase(parentDartName)}.dart`) {
-                    continue;
-                }
-            }
-            lines.push(`import '${importFile}';`);
-        }
-
-        lines.push('');
-        lines.push(`/// ${dartClassName} wrapper`);
-        
-        // Build class declaration with inheritance
-        let classDeclaration = `class ${dartClassName}`;
-        if (this.isAbstract(cType)) {
-            classDeclaration = `abstract ${classDeclaration}`;
-        }
-        
-        if (parentName) {
-            const parentDartName = this.toDartTypeName(parentName);
-            classDeclaration += ` extends ${parentDartName}`;
-        } else {
-            classDeclaration += ` implements Finalizable`;
-        }
-        
-        lines.push(`${classDeclaration} {`);
-        
-        // Every class has its own typed pointer field
-        lines.push(`  final Pointer<${cType.name}_wrapper> _ptr;`);
-        lines.push('');
-
-        // Constructor from pointer
-        if (parentName) {
-            // Derived class - initialize own pointer and call super constructor with cast
-            lines.push(`  ${dartClassName}.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());`);
-        } else {
-            // Base class - set the pointer directly  
-            lines.push(`  ${dartClassName}.fromPointer(this._ptr);`);
-        }
-        
-        lines.push('');
-        lines.push('  /// Get the native pointer for FFI calls');
-        lines.push(`  Pointer get nativePtr => _ptr;`);
-        lines.push('');
-
-        // Write constructors (only for concrete classes)
-        if (!this.isAbstract(cType)) {
-            for (const constr of cType.constructors) {
-                lines.push(this.writeConstructor(dartClassName, constr, cType));
-                lines.push('');
-            }
-        }
-
-        // Filter out methods with raw pointer parameters and inherited methods
-        const validMethods = cType.methods.filter(method => {
-            if (this.hasRawPointerParameters(method)) {
-                console.log(`  Skipping method ${cType.name}::${method.name}: has raw pointer parameters`);
-                return false;
-            }
-            if (this.isMethodInherited(method, cType)) {
-                console.log(`  Skipping method ${cType.name}::${method.name}: inherited from parent`);
-                return false;
-            }
-            return true;
-        });
-
-        // Renumber methods that need it
-        const renumberedMethods = this.renumberMethods(validMethods, cType.name);
-
-        // Write methods
-        for (const methodInfo of renumberedMethods) {
-            const { method, renamedMethod } = methodInfo;
-            
-            // Special case: SlotPose hasDarkColor should be a getter
-            if (cType.name === 'spine_slot_pose' && method.name === 'spine_slot_pose_has_dark_color') {
-                lines.push(this.writeGetter(cType, method, 'hasDarkColor'));
-            } else if (this.isGetter(method)) {
-                lines.push(this.writeGetter(cType, method, renamedMethod));
-            } else if (this.isSetter(method)) {
-                lines.push(this.writeSetter(cType, method, renamedMethod));
-            } else {
-                lines.push(this.writeMethod(cType, method, renamedMethod));
-            }
-            lines.push('');
-        }
-
-        // Write dispose method if destructor exists
-        if (cType.destructor) {
-            lines.push('  void dispose() {');
-            lines.push(`    SpineBindings.bindings.${cType.destructor.name}(_ptr);`);
-            lines.push('  }');
-        }
-
-        lines.push('}');
-
-        const fileName = `${toSnakeCase(dartClassName)}.dart`;
-        const filePath = path.join(this.outputDir, fileName);
-        fs.writeFileSync(filePath, lines.join('\n'));
-    }
-
-    private async writeArrays(cArrayTypes: CClassOrStruct[]): Promise<void> {
-        const lines: string[] = [];
-        
-        lines.push(LICENSE_HEADER);
-        lines.push('');
-        lines.push('// AUTO GENERATED FILE, DO NOT EDIT.');
-        lines.push('');
-        lines.push("import 'dart:ffi';");
-        lines.push("import 'package:ffi/ffi.dart';");
-        lines.push("import 'spine_flutter_bindings_generated.dart';");
-        lines.push("import '../spine_bindings.dart';");
-        lines.push("import '../native_array.dart';");
-        
-        // Collect all imports needed for all array types
-        const imports = new Set<string>();
-        for (const arrayType of cArrayTypes) {
-            const elementType = this.extractArrayElementType(arrayType.name);
-            if (!this.isPrimitive(elementType) && !['int', 'float', 'bool', 'unsigned_short', 'property_id'].includes(elementType.toLowerCase())) {
-                imports.add(`import '${toSnakeCase(elementType)}.dart';`);
-                
-                // If this element type is abstract, we need to import all its concrete subclasses too
-                const cElementType = `spine_${toSnakeCase(elementType)}`;
-                const cClass = this.classMap.get(cElementType);
-                if (cClass && this.isAbstract(cClass)) {
-                    const concreteSubclasses = this.getConcreteSubclasses(cElementType);
-                    for (const subclass of concreteSubclasses) {
-                        const dartSubclass = this.toDartTypeName(subclass);
-                        imports.add(`import '${toSnakeCase(dartSubclass)}.dart';`);
-                    }
-                }
-            }
-        }
-        
-        // Add sorted imports
-        for (const imp of Array.from(imports).sort()) {
-            lines.push(imp);
-        }
-        
-        // Generate each array class
-        for (const arrayType of cArrayTypes) {
-            lines.push('');
-            lines.push(...this.generateArrayClass(arrayType));
-        }
-        
-        const filePath = path.join(this.outputDir, 'arrays.dart');
-        fs.writeFileSync(filePath, lines.join('\n'));
-    }
-    
-    private generateArrayClass(arrayType: CClassOrStruct): string[] {
-        const lines: string[] = [];
-        const dartClassName = this.toDartTypeName(arrayType.name);
-        const elementType = this.extractArrayElementType(arrayType.name);
-        
-
-        lines.push(`/// Array of ${elementType} elements`);
-        lines.push(`class ${dartClassName} extends NativeArray<${this.toDartElementType(elementType)}> {`);
-        // Generate typed constructor - arrays use the array wrapper type
-        const arrayWrapperType = `${arrayType.name}_wrapper`;
-        lines.push(`  ${dartClassName}.fromPointer(Pointer<${arrayWrapperType}> super.ptr);`);
-        lines.push('');
-
-        // Find size and buffer methods
-        const sizeMethod = arrayType.methods.find(m => m.name.endsWith('_size') && !m.name.endsWith('_set_size'));
-        const bufferMethod = arrayType.methods.find(m => m.name.endsWith('_buffer'));
-        const setMethod = arrayType.methods.find(m => m.name.endsWith('_set') && m.parameters.length === 3); // self, index, value
-
-        if (sizeMethod) {
-            lines.push('  @override');
-            lines.push('  int get length {');
-            lines.push(`    return SpineBindings.bindings.${sizeMethod.name}(nativePtr.cast());`);
-            lines.push('  }');
-            lines.push('');
-        }
-
-        if (bufferMethod) {
-            lines.push('  @override');
-            lines.push(`  ${this.toDartElementType(elementType)} operator [](int index) {`);
-            lines.push('    if (index < 0 || index >= length) {');
-            lines.push('      throw RangeError.index(index, this, \'index\');');
-            lines.push('    }');
-            
-            lines.push(`    final buffer = SpineBindings.bindings.${bufferMethod.name}(nativePtr.cast());`);
-
-            // Handle different element types
-            if (elementType === 'int') {
-                lines.push('    return buffer.cast<Int32>()[index];');
-            } else if (elementType === 'float') {
-                lines.push('    return buffer.cast<Float>()[index];');
-            } else if (elementType === 'bool') {
-                lines.push('    return buffer.cast<Int32>()[index] != 0;');
-            } else if (elementType === 'unsigned_short') {
-                lines.push('    return buffer.cast<Uint16>()[index];');
-            } else if (elementType === 'property_id') {
-                // PropertyId buffer returns int instead of Pointer<Int64> due to C codegen bug
-                // This will cause a compile error, but it's a known issue with the C API
-                lines.push('    // NOTE: This will not compile due to C API bug - buffer() returns int instead of Pointer');
-                lines.push('    return buffer.cast<Int64>()[index];');
-            } else {
-                // For object types, the buffer contains pointers
-                const dartElementType = this.toDartTypeName(`spine_${toSnakeCase(elementType)}`);
-                const cElementType = `spine_${toSnakeCase(elementType)}`;
-                const cClass = this.classMap.get(cElementType);
-                
-                if (cClass && this.isAbstract(cClass)) {
-                    // Use RTTI to determine concrete type for abstract classes
-                    const rttiCode = this.generateRttiBasedInstantiation(dartElementType, 'buffer[index]', cClass);
-                    lines.push(`    ${rttiCode}`);
-                } else {
-                    lines.push(`    return ${dartElementType}.fromPointer(buffer[index]);`);
-                }
-            }
-
-            lines.push('  }');
-            lines.push('');
-        }
-
-        // Override []= if there's a set method
-        if (setMethod) {
-            lines.push('  @override');
-            lines.push(`  void operator []=(int index, ${this.toDartElementType(elementType)} value) {`);
-            lines.push('    if (index < 0 || index >= length) {');
-            lines.push('      throw RangeError.index(index, this, \'index\');');
-            lines.push('    }');
-            
-            // Convert value to C type
-            const param = setMethod.parameters[2]; // The value parameter
-            const convertedValue = this.convertDartToC('value', param);
-            lines.push(`    SpineBindings.bindings.${setMethod.name}(nativePtr.cast(), index, ${convertedValue});`);
-            lines.push('  }');
-        }
-
-        lines.push('}');
-        
-        return lines;
-    }
-
-    private async writeExportFile(cTypes: CClassOrStruct[], cEnums: CEnum[], cArrayTypes: CClassOrStruct[]): Promise<void> {
-        const lines: string[] = [];
-
-        lines.push(LICENSE_HEADER);
-        lines.push('');
-        lines.push('// AUTO GENERATED FILE, DO NOT EDIT.');
-        lines.push('');
-        lines.push('// Export all generated types');
-        lines.push('');
-
-        lines.push(`export 'native_array.dart';`);
-        lines.push('');
-
-        // Export enums
-        if (cEnums.length > 0) {
-            lines.push('// Enums');
-            for (const cEnum of cEnums) {
-                const dartName = this.toDartTypeName(cEnum.name);
-                lines.push(`export 'generated/${toSnakeCase(dartName)}.dart';`);
-            }
-            lines.push('');
-        }
-
-        // Export classes
-        if (cTypes.length > 0) {
-            lines.push('// Classes');
-            for (const cType of cTypes) {
-                const dartName = this.toDartTypeName(cType.name);
-                lines.push(`export 'generated/${toSnakeCase(dartName)}.dart';`);
-            }
-            lines.push('');
-        }
-        
-        // Export arrays
-        if (cArrayTypes.length > 0) {
-            lines.push('// Arrays');
-            lines.push(`export 'generated/arrays.dart';`);
-        }
-
-        const filePath = path.join(path.dirname(path.dirname(this.outputDir)), 'spine_flutter.dart');
-        fs.writeFileSync(filePath, lines.join('\n'));
-    }
-
-    // Helper methods
-
-    private writeConstructor(dartClassName: string, constr: CMethod, cType: CClassOrStruct): string {
-        const lines: string[] = [];
-
-        const params = constr.parameters.map(p => {
-            const dartType = this.toDartParameterType(p);
-            return `${dartType} ${p.name}`;
-        }).join(', ');
-
-        const args = constr.parameters.map(p => {
-            return this.convertDartToC(p.name, p);
-        }).join(', ');
-
-        // Determine constructor name suffix
-        const cTypeName = `spine_${toSnakeCase(dartClassName)}`;
-        let constructorName = constr.name.replace(`${cTypeName}_create`, '');
-
-        // Handle numeric suffixes and special cases
-        if (constructorName) {
-            // If it's just a number, handle it generically
-            if (/^\d+$/.test(constructorName)) {
-                // Special case for Color::create2 specifically
-                if (cType.name === 'spine_color' && constr.name === 'spine_color_create2') {
-                    constructorName = 'fromRGBA';
-                }
-                // For other numbered constructors, look at parameters to generate a name
-                else if (constr.parameters.length > 0) {
-                    // If first param is the same type as what we're constructing, it's likely a copy/from constructor
-                    const firstParamType = constr.parameters[0].cType.replace('*', '').trim();
-                    if (firstParamType === cType.name) {
-                        constructorName = 'from';
-                    } else {
-                        // Otherwise use a generic variant name
-                        constructorName = `variant${constructorName}`;
-                    }
-                } else {
-                    constructorName = `variant${constructorName}`;
-                }
-            } else if (constructorName.startsWith('_')) {
-                // Handle underscored names (e.g., create_with_data -> withData)
-                constructorName = this.toCamelCase(constructorName.slice(1));
-            }
-        }
-
-        const factoryName = constructorName ? `.${constructorName}` : '';
-
-        lines.push(`  factory ${dartClassName}${factoryName}(${params}) {`);
-        lines.push(`    final ptr = SpineBindings.bindings.${constr.name}(${args});`);
-        lines.push(`    return ${dartClassName}.fromPointer(ptr);`);
-        lines.push('  }');
-
-        return lines.join('\n');
-    }
-
-    private writeMethod(cType: CClassOrStruct, method: CMethod, renamedMethod?: string): string {
-        const lines: string[] = [];
-        const dartReturnType = this.toDartReturnType(method.returnType);
-        let methodName = renamedMethod || this.toDartMethodName(method.name, cType.name);
-
-        // Skip if this is handled as getter/setter
-        if (this.isGetter(method) || this.isSetter(method)) {
-            return '';
-        }
-
-        // Check if this is a static method (no self parameter)
-        const isStatic = method.parameters.length === 0 ||
-                        (method.parameters[0].name !== 'self' &&
-                         !method.parameters[0].cType.startsWith(cType.name));
-
-        // Rename static rtti method to avoid conflict with getter
-        if (isStatic && methodName === 'rtti') {
-            methodName = 'rttiStatic';
-        }
-
-        // Parameters (skip 'self' parameter for instance methods)
-        const paramStartIndex = isStatic ? 0 : 1;
-        const params = method.parameters.slice(paramStartIndex).map(p => {
-            const dartType = this.toDartParameterType(p);
-            return `${dartType} ${p.name}`;
-        }).join(', ');
-
-        // Arguments
-        const args = method.parameters.map((p, i) => {
-            if (!isStatic && i === 0) return '_ptr'; // self parameter
-            return this.convertDartToC(p.name, p);
-        }).join(', ');
-
-        // Generate method signature with appropriate modifier
-        const methodSignature = isStatic ? `  static ${dartReturnType} ${methodName}` : `  ${dartReturnType} ${methodName}`;
-
-        lines.push(`${methodSignature}(${params}) {`);
-
-        // Always use the global bindings
-        const bindingsRef = 'SpineBindings.bindings';
-
-        if (method.returnType === 'void') {
-            lines.push(`    ${bindingsRef}.${method.name}(${args});`);
-        } else {
-            lines.push(`    final result = ${bindingsRef}.${method.name}(${args});`);
-            lines.push(`    ${this.generateReturnConversion(method.returnType, 'result')}`);
-        }
-
-        lines.push('  }');
-
-        return lines.join('\n');
-    }
-
-    private writeGetter(cType: CClassOrStruct, method: CMethod, renamedMethod?: string): string {
-        const lines: string[] = [];
-        const propertyName = renamedMethod || this.extractPropertyName(method.name, cType.name);
-        const dartReturnType = this.toDartReturnType(method.returnType);
-        lines.push(`  ${dartReturnType} get ${propertyName} {`);
-        lines.push(`    final result = SpineBindings.bindings.${method.name}(_ptr);`);
-        lines.push(`    ${this.generateReturnConversion(method.returnType, 'result')}`);
-        lines.push('  }');
-
-        return lines.join('\n');
-    }
-
-    private writeSetter(cType: CClassOrStruct, method: CMethod, renamedMethod?: string): string {
-        const lines: string[] = [];
-        let propertyName = renamedMethod || this.extractPropertyName(method.name, cType.name);
-        const param = method.parameters[1]; // First param is self
-        const dartType = this.toDartParameterType(param);
-
-        // Handle numeric suffixes in setter names
-        const match = propertyName.match(/^(\w+)_(\d+)$/);
-        if (match) {
-            // Convert property_2 to property2
-            propertyName = `${match[1]}${match[2]}`;
-        } else if (/^\d+$/.test(propertyName)) {
-            // If property name is just a number, prefix with 'set'
-            propertyName = `set${propertyName}`;
-        }
-
-        lines.push(`  set ${propertyName}(${dartType} value) {`);
-        lines.push(`    SpineBindings.bindings.${method.name}(_ptr, ${this.convertDartToC('value', param)});`);
-        lines.push('  }');
-
-        return lines.join('\n');
-    }
-
-    private isGetter(method: CMethod): boolean {
-        // Traditional getter with _get_ in name
-        if (method.name.includes('_get_') && method.parameters.length === 1) {
-            return true;
-        }
-        
-        // Boolean methods that start with 'has_' or 'is_' and take only self parameter
-        if (method.returnType === 'bool' && method.parameters.length === 1) {
-            if (method.name.includes('_has_') || method.name.includes('_is_')) {
-                return true;
-            }
-        }
-        
-        return false;
-    }
-
-    private isSetter(method: CMethod): boolean {
-        // Must return void and have 2 parameters (self + value)
-        if (method.returnType !== 'void' || method.parameters.length !== 2) {
-            return false;
-        }
-        
-        // Traditional setter with _set_ in name
-        if (method.name.includes('_set_')) {
-            return true;
-        }
-        
-        return false;
-    }
-
-    private extractPropertyName(methodName: string, typeName: string): string {
-        // Remove type prefix and get/set
-        const prefix = `${typeName}_`;
-        let name = methodName.startsWith(prefix) ? methodName.slice(prefix.length) : methodName;
-
-        if (name.startsWith('get_')) {
-            name = name.slice(4);
-        } else if (name.startsWith('set_')) {
-            name = name.slice(4);
-        }
-
-        // Special case: if the property name is "update_cache", rename to "updateCacheList"
-        // to avoid collision with the updateCache() method
-        if (name === 'update_cache') {
-            return 'updateCacheList';
-        }
-
-        // Special case: if property name is a type name, suffix with 'Value'
-        const typeNames = ['int', 'float', 'double', 'bool', 'string'];
-        if (typeNames.includes(name.toLowerCase())) {
-            return `${this.toCamelCase(name)}Value`;
-        }
-
-        return this.toCamelCase(name);
-    }
-
-    private toDartTypeName(cTypeName: string): string {
-        // spine_animation -> Animation
-        if (cTypeName.startsWith('spine_')) {
-            const name = cTypeName.slice(6);
-            return this.toPascalCase(name);
-        }
-        return this.toPascalCase(cTypeName);
-    }
-
-    private toDartMethodName(cMethodName: string, cTypeName: string): string {
-        // spine_animation_apply -> apply
-        const prefix = `${cTypeName}_`;
-        if (cMethodName.startsWith(prefix)) {
-            return this.toCamelCase(cMethodName.slice(prefix.length));
-        }
-        return this.toCamelCase(cMethodName);
-    }
-
-    private toDartEnumValueName(cValueName: string, cEnumName: string): string {
-        // SPINE_BLEND_MODE_NORMAL -> normal
-        const enumNameUpper = cEnumName.toUpperCase();
-
-        // Try different prefix patterns
-        const prefixes = [
-            `SPINE_${enumNameUpper}_`,
-            `${enumNameUpper}_`,
-            'SPINE_'
-        ];
-
-        let name = cValueName;
-        for (const prefix of prefixes) {
-            if (name.startsWith(prefix)) {
-                name = name.slice(prefix.length);
-                break;
-            }
-        }
-
-        const enumValue = this.toCamelCase(name.toLowerCase());
-        
-        // Special case for MixDirection enum - prefix with 'direction'
-        if (cEnumName === 'spine_mix_direction' && ['in', 'out'].includes(enumValue)) {
-            return `direction${this.toPascalCase(enumValue)}`;
-        }
-        
-        return enumValue;
-    }
-
-    private toDartReturnType(cType: string): string {
-        if (cType === 'void') return 'void';
-        // Handle char* with or without spaces
-        if (cType === 'char*' || cType === 'char *' || cType === 'const char*' || cType === 'const char *') return 'String';
-        if (cType === 'float' || cType === 'double') return 'double';
-        if (cType === 'int' || cType === 'size_t' || cType === 'int32_t' || cType === 'uint32_t') return 'int';
-        if (cType === 'bool') return 'bool';
-
-        // Handle enum types
-        if (this.enumNames.has(cType)) {
-            return this.toDartTypeName(cType);
-        }
-
-        // Handle array types
-        if (cType.startsWith('spine_array_')) {
-            return this.toDartTypeName(cType);
-        }
-
-        // Handle other spine types
-        if (cType.startsWith('spine_')) {
-            return this.toDartTypeName(cType);
-        }
-
-        return 'dynamic';
-    }
-
-    private toDartParameterType(param: CParameter): string {
-        // Handle output parameters (non-const references that become pointers)
-        if (param.isOutput) {
-            const baseType = param.cType.replace('*', '').trim();
-            return `Pointer<${this.getPrimitiveFFIType(baseType + '*')}>`;
-        }
-
-        // String parameters should stay as String, not dynamic (handle with or without spaces)
-        if (param.cType === 'char*' || param.cType === 'char *' || param.cType === 'const char*' || param.cType === 'const char *') {
-            return 'String';
-        }
-
-        return this.toDartReturnType(param.cType);
-    }
-
-    private toDartElementType(elementType: string): string {
-        // Handle pointer types
-        if (elementType.endsWith('*')) {
-            const baseType = elementType.slice(0, -1).trim();
-            return this.toDartTypeName(`spine_${toSnakeCase(baseType)}`);
-        }
-
-        // For primitive types, return the Dart type directly
-        if (elementType === 'int' || elementType === 'int32_t' || elementType === 'uint32_t' || elementType === 'size_t') {
-            return 'int';
-        }
-        if (elementType === 'unsigned_short') {
-            return 'int';  // Dart doesn't have unsigned short, use int
-        }
-        if (elementType === 'property_id' || elementType === 'int64_t') {
-            return 'int';  // PropertyId is int64_t which maps to int in Dart
-        }
-        if (elementType === 'float' || elementType === 'double') {
-            return 'double';
-        }
-        if (elementType === 'bool') {
-            return 'bool';
-        }
-
-        // For object types that are already in PascalCase (from extractArrayElementType)
-        // just return them as-is
-        return elementType;
-    }
-
-    private getPrimitiveFFIType(cType: string): string {
-        switch (cType) {
-            case 'float*': return 'Float';
-            case 'double*': return 'Double';
-            case 'int*': return 'Int';
-            case 'bool*': return 'Bool';
-            default: return 'Void';
-        }
-    }
-
-    private convertDartToC(dartValue: string, param: CParameter): string {
-        // Handle char* with or without spaces
-        if (param.cType === 'char*' || param.cType === 'char *' || param.cType === 'const char*' || param.cType === 'const char *') {
-            return `${dartValue}.toNativeUtf8().cast<Char>()`;
-        }
-
-        // Check if it's an enum type
-        if (this.enumNames.has(param.cType)) {
-            return `${dartValue}.value`;
-        }
-
-        // Check if it's an array type - arrays use _nativeArray
-        if (param.cType.startsWith('spine_array_')) {
-            return `${dartValue}.nativePtr.cast()`;
-        }
-
-        // Regular spine types have nativePtr
-        if (param.cType.startsWith('spine_')) {
-            return `${dartValue}.nativePtr.cast()`;
-        }
-
-        return dartValue;
-    }
-
-    private generateReturnConversion(cReturnType: string, resultVar: string): string {
-        // Handle char* with or without spaces
-        if (cReturnType === 'char*' || cReturnType === 'char *' || cReturnType === 'const char*' || cReturnType === 'const char *') {
-            return `return ${resultVar}.cast<Utf8>().toDartString();`;
-        }
-
-        // Handle enum types
-        if (this.enumNames.has(cReturnType)) {
-            const dartType = this.toDartTypeName(cReturnType);
-            return `return ${dartType}.fromValue(${resultVar});`;
-        }
-
-        if (cReturnType.startsWith('spine_array_')) {
-            const dartType = this.toDartTypeName(cReturnType);
-            return `return ${dartType}.fromPointer(${resultVar});`;
-        }
-
-        if (cReturnType.startsWith('spine_')) {
-            const dartType = this.toDartTypeName(cReturnType);
-            const cClass = this.classMap.get(cReturnType);
-            if (cClass && this.isAbstract(cClass)) {
-                // Use RTTI to determine concrete type and instantiate correctly
-                return this.generateRttiBasedInstantiation(dartType, resultVar, cClass);
-            }
-            return `return ${dartType}.fromPointer(${resultVar});`;
-        }
-
-        return `return ${resultVar};`;
-    }
-
-    private generateRttiBasedInstantiation(abstractType: string, resultVar: string, abstractClass: CClassOrStruct): string {
-        const lines: string[] = [];
-        
-        // Get concrete subclasses for this abstract class
-        const concreteSubclasses = this.getConcreteSubclasses(abstractClass.name);
-        
-        if (concreteSubclasses.length === 0) {
-            return `throw UnsupportedError('Cannot instantiate abstract class ${abstractType} from pointer - no concrete subclasses found');`;
-        }
-        
-        lines.push(`final rtti = SpineBindings.bindings.${abstractClass.name}_get_rtti(${resultVar});`);
-        lines.push(`final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();`);
-        lines.push(`switch (className) {`);
-        
-        for (const subclass of concreteSubclasses) {
-            const dartSubclass = this.toDartTypeName(subclass);
-            lines.push(`  case '${subclass}':`);
-            lines.push(`    return ${dartSubclass}.fromPointer(${resultVar}.cast());`);
-        }
-        
-        lines.push(`  default:`);
-        lines.push(`    throw UnsupportedError('Unknown concrete type: \$className for abstract class ${abstractType}');`);
-        lines.push(`}`);
-        
-        return lines.join('\n    ');
-    }
-
-    private getConcreteSubclasses(abstractClassName: string): string[] {
-        const concreteSubclasses: string[] = [];
-        
-        // Find all classes that inherit from this abstract class
-        for (const [childName, parentName] of this.inheritanceMap.entries()) {
-            if (parentName === abstractClassName) {
-                const childClass = this.classMap.get(childName);
-                if (childClass && !this.isAbstract(childClass)) {
-                    concreteSubclasses.push(childName);
-                } else {
-                    // Recursively check for concrete subclasses
-                    concreteSubclasses.push(...this.getConcreteSubclasses(childName));
-                }
-            }
-        }
-        
-        return concreteSubclasses;
-    }
-
-    private collectAllImports(cType: CClassOrStruct): Set<string> {
-        const imports = new Set<string>();
-        const currentTypeName = this.toDartTypeName(cType.name);
-        const currentFileName = `${toSnakeCase(currentTypeName)}.dart`;
-
-        // Collect from methods (return types and parameters)
-        // Only consider methods that will actually be generated (skip raw pointer methods)
-        let hasArrays = false;
-        for (const method of cType.methods) {
-            // Skip methods with raw pointer parameters - they won't be generated
-            if (this.hasRawPointerParameters(method)) {
-                continue;
-            }
-            // Return type
-            if (method.returnType.startsWith('spine_array_')) {
-                hasArrays = true;
-            }
-            // Check for spine types in return types (including pointer types)
-            else if (method.returnType.startsWith('spine_')) {
-                const cleanType = method.returnType.replace('*', '').trim();
-                if (!this.isPrimitive(cleanType)) {
-                    const typeName = this.toDartTypeName(cleanType);
-                    const fileName = `${toSnakeCase(typeName)}.dart`;
-                    // Skip self-imports
-                    if (fileName !== currentFileName) {
-                        imports.add(fileName);
-                    }
-                    
-                    // If this return type is abstract, we need to import all its concrete subclasses too
-                    const returnClass = this.classMap.get(cleanType);
-                    if (returnClass && this.isAbstract(returnClass)) {
-                        const concreteSubclasses = this.getConcreteSubclasses(cleanType);
-                        for (const subclass of concreteSubclasses) {
-                            const dartSubclass = this.toDartTypeName(subclass);
-                            const subclassFileName = `${toSnakeCase(dartSubclass)}.dart`;
-                            if (subclassFileName !== currentFileName) {
-                                imports.add(subclassFileName);
-                            }
-                        }
-                    }
-                }
-            }
-
-            // Parameters
-            for (const param of method.parameters) {
-                // Skip self parameter
-                if (param.name === 'self') continue;
-
-                // Arrays
-                if (param.cType.startsWith('spine_array_')) {
-                    hasArrays = true;
-                }
-                // Enums
-                else if (this.enumNames.has(param.cType)) {
-                    const enumType = this.toDartTypeName(param.cType);
-                    imports.add(`${toSnakeCase(enumType)}.dart`);
-                }
-                // Other spine types (handle both pointer and non-pointer types)
-                else if (param.cType.startsWith('spine_')) {
-                    const cleanType = param.cType.replace('*', '').trim();
-                    if (!this.isPrimitive(cleanType)) {
-                        const typeName = this.toDartTypeName(cleanType);
-                        const fileName = `${toSnakeCase(typeName)}.dart`;
-                        // Skip self-imports
-                        if (fileName !== currentFileName) {
-                            imports.add(fileName);
-                        }
-                    }
-                }
-            }
-        }
-
-        // Collect from constructors
-        for (const constr of cType.constructors) {
-            for (const param of constr.parameters) {
-                // Arrays
-                if (param.cType.startsWith('spine_array_')) {
-                    hasArrays = true;
-                }
-                // Enums
-                else if (this.enumNames.has(param.cType)) {
-                    const enumType = this.toDartTypeName(param.cType);
-                    imports.add(`${toSnakeCase(enumType)}.dart`);
-                }
-                // Other spine types (but not primitives)
-                else if (param.cType.startsWith('spine_') && !param.cType.includes('*')) {
-                    const typeName = this.toDartTypeName(param.cType);
-                    const fileName = `${toSnakeCase(typeName)}.dart`;
-                    // Skip self-imports
-                    if (fileName !== currentFileName) {
-                        imports.add(fileName);
-                    }
-                }
-            }
-        }
-        
-        // Add arrays.dart import if any arrays are used
-        if (hasArrays) {
-            imports.add('arrays.dart');
-        }
-
-        return imports;
-    }
-
-    private extractArrayElementType(arrayTypeName: string): string {
-        // spine_array_animation -> Animation
-        // spine_array_int -> int
-        const match = arrayTypeName.match(/spine_array_(.+)/);
-        if (match) {
-            const rawType = match[1];
-            // For primitive types, return the raw type
-            if (['int', 'float', 'bool', 'unsigned_short', 'property_id'].includes(rawType)) {
-                return rawType;
-            }
-            // For object types, convert to PascalCase
-            return this.toPascalCase(rawType);
-        }
-        return 'dynamic';
-    }
-
-    private isPrimitive(type: string): boolean {
-        return ['float', 'double', 'int', 'bool', 'size_t', 'int32_t', 'uint32_t'].includes(type);
-    }
-
-    private hasRawPointerParameters(method: CMethod): boolean {
-        // Check return type
-        if (this.isRawPointer(method.returnType)) {
-            return true;
-        }
-
-        // Check parameters
-        for (const param of method.parameters) {
-            if (this.isRawPointer(param.cType)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private isRawPointer(cType: string): boolean {
-        // String types are allowed
-        if (cType === 'char*' || cType === 'char *' || cType === 'const char*' || cType === 'const char *') {
-            return false;
-        }
-
-        // Check if it's a pointer type (ends with * or contains *)
-        if (cType.includes('*')) {
-            // If it's not a spine type pointer, it's a raw pointer
-            const cleanType = cType.replace('*', '').trim();
-            if (!cleanType.startsWith('spine_')) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    private renumberMethods(methods: CMethod[], typeName: string): Array<{method: CMethod, renamedMethod?: string}> {
-        const result: Array<{method: CMethod, renamedMethod?: string}> = [];
-        
-        // Group methods by their base name (without numeric suffix)
-        const methodGroups = new Map<string, CMethod[]>();
-        
-        for (const method of methods) {
-            // Extract base name without numeric suffix
-            const match = method.name.match(/^(.+?)_(\d+)$/);
-            if (match) {
-                const baseName = match[1];
-                if (!methodGroups.has(baseName)) {
-                    methodGroups.set(baseName, []);
-                }
-                methodGroups.get(baseName)!.push(method);
-            } else {
-                // Method without numeric suffix
-                result.push({ method });
-            }
-        }
-        
-        // Process grouped methods
-        for (const [baseName, groupedMethods] of methodGroups) {
-            if (groupedMethods.length === 1) {
-                // Only one method left in the group - remove the numeric suffix
-                const method = groupedMethods[0];
-                const dartMethodName = this.toDartMethodName(baseName, typeName);
-                result.push({ method, renamedMethod: dartMethodName });
-            } else {
-                // Multiple methods - renumber them starting from 1 (or keep special names)
-                groupedMethods.sort((a, b) => {
-                    const aNum = parseInt(a.name.match(/_(\d+)$/)![1]);
-                    const bNum = parseInt(b.name.match(/_(\d+)$/)![1]);
-                    return aNum - bNum;
-                });
-                
-                for (let i = 0; i < groupedMethods.length; i++) {
-                    const method = groupedMethods[i];
-                    const newNumber = i + 1;
-                    const currentNumber = parseInt(method.name.match(/_(\d+)$/)![1]);
-                    
-                    if (newNumber !== currentNumber) {
-                        // Need to renumber
-                        const baseDartName = this.toDartMethodName(baseName, typeName);
-                        result.push({ method, renamedMethod: `${baseDartName}${newNumber}` });
-                    } else {
-                        // Number is correct
-                        result.push({ method });
-                    }
-                }
-            }
-        }
-        
-        return result;
-    }
-
-    private toPascalCase(str: string): string {
-        return str.split('_')
-            .map(word => word.charAt(0).toUpperCase() + word.slice(1))
-            .join('');
-    }
-
-    private toCamelCase(str: string): string {
-        const pascal = this.toPascalCase(str);
-        return pascal.charAt(0).toLowerCase() + pascal.slice(1);
-    }
-
-    private needsStringConversions(cType: CClassOrStruct): boolean {
-        // Check if any method has string parameters or return types
-        for (const method of cType.methods) {
-            // Check return type
-            if (method.returnType === 'char*' || method.returnType === 'char *' || 
-                method.returnType === 'const char*' || method.returnType === 'const char *') {
-                return true;
-            }
-            
-            // Check parameters
-            for (const param of method.parameters) {
-                if (param.cType === 'char*' || param.cType === 'char *' || 
-                    param.cType === 'const char*' || param.cType === 'const char *') {
-                    return true;
-                }
-            }
-            
-            // Check if method returns abstract types (which use RTTI and need Utf8)
-            if (method.returnType.startsWith('spine_')) {
-                const cleanType = method.returnType.replace('*', '').trim();
-                const returnClass = this.classMap.get(cleanType);
-                if (returnClass && this.isAbstract(returnClass)) {
-                    return true; // RTTI switch uses Utf8 conversion
-                }
-            }
-        }
-
-        // Check constructors
-        for (const constr of cType.constructors) {
-            for (const param of constr.parameters) {
-                if (param.cType === 'char*' || param.cType === 'char *' || 
-                    param.cType === 'const char*' || param.cType === 'const char *') {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    private async runDartFix(): Promise<void> {
-        const { spawn } = await import('node:child_process');
-        
-        return new Promise((resolve, reject) => {
-            console.log('Running dart fix --apply on generated code...');
-            
-            const dartFix = spawn('dart', ['fix', '--apply', this.outputDir], {
-                stdio: 'inherit'
-            });
-            
-            dartFix.on('close', (code) => {
-                if (code === 0) {
-                    console.log('✓ Dart fix completed successfully');
-                    resolve();
-                } else {
-                    console.warn(`⚠ Dart fix exited with code ${code}`);
-                    resolve(); // Don't fail the build if dart fix fails
-                }
-            });
-            
-            dartFix.on('error', (error) => {
-                console.warn(`⚠ Failed to run dart fix: ${error.message}`);
-                resolve(); // Don't fail the build if dart fix fails
-            });
-        });
-    }
+	private enumNames = new Set<string>();
+	private classMap = new Map<string, CClassOrStruct>(); // name -> class
+	private inheritance: Record<string, { extends?: string, mixins: string[] }> = {};
+	private isInterface: Record<string, boolean> = {};
+	private supertypes: Record<string, string[]> = {}; // for RTTI switching
+
+	constructor (private outputDir: string) {
+		this.cleanOutputDirectory();
+	}
+
+	private cleanOutputDirectory (): void {
+		if (fs.existsSync(this.outputDir)) {
+			console.log(`[NEW] Cleaning ${this.outputDir}...`);
+			fs.rmSync(this.outputDir, { recursive: true, force: true });
+		}
+		fs.mkdirSync(this.outputDir, { recursive: true });
+	}
+
+	// Step 1: Transform C types to clean Dart model (from spec)
+	private transformToDartModel (
+		cTypes: CClassOrStruct[],
+		cEnums: CEnum[],
+		inheritance: Record<string, { extends?: string, mixins: string[] }>,
+		isInterface: Record<string, boolean>,
+		supertypes: Record<string, string[]>
+	): { classes: DartClass[], enums: DartEnum[] } {
+
+		// Store data for reference
+		this.inheritance = inheritance;
+		this.isInterface = isInterface;
+		this.supertypes = supertypes;
+
+		for (const cType of cTypes) {
+			this.classMap.set(cType.name, cType);
+		}
+
+		for (const cEnum of cEnums) {
+			this.enumNames.add(cEnum.name);
+		}
+
+		console.log('[NEW] Transforming to Dart model...');
+
+		const dartClasses: DartClass[] = [];
+		const dartEnums: DartEnum[] = [];
+
+		// Transform enums
+		for (const cEnum of cEnums) {
+			dartEnums.push(this.transformEnum(cEnum));
+		}
+
+		// Transform classes in dependency order
+		const sortedTypes = this.sortByInheritance(cTypes);
+		for (const cType of sortedTypes) {
+			dartClasses.push(this.transformClass(cType));
+		}
+
+		return { classes: dartClasses, enums: dartEnums };
+	}
+
+	// Step 2: Generate Dart code from clean model (from spec)
+	private generateDartCode (dartClass: DartClass): string {
+		const lines: string[] = [];
+
+		// Header (same for all)
+		lines.push(this.generateHeader());
+
+		// Imports (unified logic)
+		lines.push(...this.generateImports(dartClass.imports, dartClass.needsPackageFfi, dartClass.hasRtti));
+
+		// Class declaration (unified)
+		lines.push(this.generateClassDeclaration(dartClass));
+
+		// Class body (same template for all types)
+		if (dartClass.type === 'interface') {
+			lines.push(...this.generateInterfaceBody(dartClass));
+		} else {
+			lines.push(...this.generateClassBody(dartClass));
+		}
+
+		lines.push('}');
+
+		return lines.join('\n');
+	}
+
+	// Step 3: Write files
+	async writeAll (
+		cTypes: CClassOrStruct[],
+		cEnums: CEnum[],
+		cArrayTypes: CClassOrStruct[],
+		inheritance: Record<string, { extends?: string, mixins: string[] }> = {},
+		isInterface: Record<string, boolean> = {},
+		supertypes: Record<string, string[]> = {}
+	): Promise<void> {
+		console.log('[NEW] Starting new Dart writer...');
+
+		// Step 1: Transform to clean model
+		const { classes, enums } = this.transformToDartModel(cTypes, cEnums, inheritance, isInterface, supertypes);
+
+		// Step 2 & 3: Generate and write files
+		console.log('[NEW] Writing enum files...');
+		for (const dartEnum of enums) {
+			const content = this.generateEnumCode(dartEnum);
+			const fileName = `${toSnakeCase(dartEnum.name)}.dart`;
+			const filePath = path.join(this.outputDir, fileName);
+			fs.writeFileSync(filePath, content);
+		}
+
+		console.log('[NEW] Writing class files...');
+		for (const dartClass of classes) {
+			const content = this.generateDartCode(dartClass);
+			const fileName = `${toSnakeCase(dartClass.name)}.dart`;
+			const filePath = path.join(this.outputDir, fileName);
+			fs.writeFileSync(filePath, content);
+		}
+
+		// Generate arrays.dart (crucial - this was missing!)
+		console.log('[NEW] Writing arrays.dart...');
+		await this.writeArraysFile(cArrayTypes);
+
+		// Write main export file
+		await this.writeExportFile(classes, enums);
+
+		console.log('[NEW] New dart writer completed!');
+	}
+
+	// Class type resolution (from spec)
+	private determineClassType (cType: CClassOrStruct): 'concrete' | 'abstract' | 'interface' {
+		if (this.isInterface[cType.name]) return 'interface';
+		if (cType.cppType.isAbstract) return 'abstract';
+		return 'concrete';
+	}
+
+	// Inheritance resolution - Use implements instead of mixins (from spec)
+	private resolveInheritance (cType: CClassOrStruct): { extends?: string, implements: string[] } {
+		const inheritanceInfo = this.inheritance[cType.name];
+		return {
+			extends: inheritanceInfo?.extends ? this.toDartTypeName(inheritanceInfo.extends) : undefined,
+			implements: (inheritanceInfo?.mixins || []).map(mixin => this.toDartTypeName(mixin)) // Convert mixins to implements
+		};
+	}
+
+	private transformEnum (cEnum: CEnum): DartEnum {
+		return {
+			name: this.toDartTypeName(cEnum.name),
+			values: cEnum.values.map((value) => ({
+				name: this.toDartEnumValueName(value.name, cEnum.name),
+				value: Number.parseInt(value.value ?? "0")
+			}))
+		};
+	}
+
+	private transformClass (cType: CClassOrStruct): DartClass {
+		const dartName = this.toDartTypeName(cType.name);
+		const classType = this.determineClassType(cType);
+		const inheritance = this.resolveInheritance(cType);
+
+		return {
+			name: dartName,
+			type: classType,
+			inheritance,
+			imports: this.collectImports(cType),
+			members: this.processMembers(cType, classType),
+			hasRtti: this.hasRttiMethod(cType),
+			needsPackageFfi: this.needsStringConversions(cType)
+		};
+	}
+
+	// Unified Method Processing (from spec)
+	private processMembers (cType: CClassOrStruct, classType: 'concrete' | 'abstract' | 'interface'): DartMember[] {
+		const members: DartMember[] = [];
+
+		// Add constructors for concrete classes only
+		if (classType === 'concrete') {
+			for (const constr of cType.constructors) {
+				members.push(this.createConstructor(constr, cType));
+			}
+		}
+
+		// Process methods with unified logic - Apply SAME logic for ALL class types
+		const validMethods = cType.methods.filter(method => {
+			if (this.hasRawPointerParameters(method)) {
+				return false;
+			}
+			if (this.isMethodInherited(method, cType)) {
+				return false;
+			}
+			return true;
+		});
+
+		const renumberedMethods = this.renumberMethods(validMethods, cType.name);
+
+		// Create a map of overloaded setter methods for isSetter to check
+		const overloadedSetters = this.findOverloadedSetters(renumberedMethods);
+
+		for (const methodInfo of renumberedMethods) {
+			const { method, renamedMethod } = methodInfo;
+			members.push(this.processMethod(method, cType, classType, renamedMethod, overloadedSetters));
+		}
+
+		return members;
+	}
+
+	private processMethod (method: CMethod, cType: CClassOrStruct, classType: 'concrete' | 'abstract' | 'interface', renamedMethod?: string, overloadedSetters?: Set<string>): DartMember {
+		// Apply SAME logic for ALL class types (concrete, abstract, interface) - from spec
+		if (this.isGetter(method)) {
+			return this.createGetter(method, cType, classType, renamedMethod);
+		} else if (this.isSetter(method, overloadedSetters)) {
+			return this.createSetter(method, cType, classType, renamedMethod);
+		} else {
+			return this.createMethod(method, cType, classType, renamedMethod);
+		}
+	}
+
+	// Unified getter detection for ALL classes (from spec)
+	private isGetter (method: CMethod): boolean {
+		return (method.name.includes('_get_') && method.parameters.length === 1) ||
+			(method.returnType === 'bool' && method.parameters.length === 1 &&
+				(method.name.includes('_has_') || method.name.includes('_is_') || method.name.includes('_was_')));
+	}
+
+	private isSetter (method: CMethod, overloadedSetters?: Set<string>): boolean {
+		const isBasicSetter = method.returnType === 'void' &&
+			method.parameters.length === 2 &&
+			method.name.includes('_set_');
+
+		if (!isBasicSetter) return false;
+
+		// If this setter has overloads (multiple methods with same base name),
+		// don't generate it as a setter - generate as regular method instead
+		if (overloadedSetters?.has(method.name)) {
+			return false;
+		}
+
+		return true;
+	}
+
+	private findOverloadedSetters (renumberedMethods: Array<{ method: CMethod, renamedMethod?: string }>): Set<string> {
+		const setterBasenames = new Map<string, string[]>();
+
+		// Group setter methods by their base name
+		for (const methodInfo of renumberedMethods) {
+			const method = methodInfo.method;
+			if (method.returnType === 'void' &&
+				method.parameters.length === 2 &&
+				method.name.includes('_set_')) {
+
+				// Extract base name by removing numbered suffix
+				const match = method.name.match(/^(.+?)_(\d+)$/);
+				const baseName = match ? match[1] : method.name;
+
+				if (!setterBasenames.has(baseName)) {
+					setterBasenames.set(baseName, []);
+				}
+				setterBasenames.get(baseName)?.push(method.name);
+			}
+		}
+
+		// Find setters that have multiple methods with the same base name
+		const overloadedSetters = new Set<string>();
+		for (const [_baseName, methodNames] of setterBasenames) {
+			if (methodNames.length > 1) {
+				// Multiple setters with same base name - mark all as overloaded
+				for (const methodName of methodNames) {
+					overloadedSetters.add(methodName);
+				}
+			}
+		}
+
+		return overloadedSetters;
+	}
+
+	private createConstructor (constr: CMethod, cType: CClassOrStruct): DartMember {
+		const dartClassName = this.toDartTypeName(cType.name);
+		const params = constr.parameters.map(p => ({
+			name: p.name,
+			dartType: this.toDartParameterType(p),
+			cType: p.cType
+		}));
+
+		const args = constr.parameters.map(p => this.convertDartToC(p.name, p)).join(', ');
+		const implementation = `final ptr = SpineBindings.bindings.${constr.name}(${args});
+    return ${dartClassName}.fromPointer(ptr);`;
+
+		return {
+			type: 'constructor',
+			name: this.getConstructorName(constr, cType),
+			dartReturnType: dartClassName,
+			parameters: params,
+			isOverride: false,
+			implementation,
+			cMethodName: constr.name
+		};
+	}
+
+	private createGetter (method: CMethod, cType: CClassOrStruct, classType: 'concrete' | 'abstract' | 'interface', renamedMethod?: string): DartMember {
+		const propertyName = renamedMethod || this.extractPropertyName(method.name, cType.name);
+		const dartReturnType = this.toDartReturnType(method.returnType);
+
+		// Interface methods have no implementation (from spec)
+		let implementation = '';
+		if (classType !== 'interface') {
+			implementation = `final result = SpineBindings.bindings.${method.name}(_ptr);
+    ${this.generateReturnConversion(method.returnType, 'result')}`;
+		}
+
+		// Check if this is an override
+		const isOverride = this.isMethodOverride(method, cType);
+
+		return {
+			type: 'getter',
+			name: propertyName,
+			dartReturnType,
+			parameters: [],
+			isOverride,
+			implementation,
+			cMethodName: method.name
+		};
+	}
+
+	private createSetter (method: CMethod, cType: CClassOrStruct, classType: 'concrete' | 'abstract' | 'interface', renamedMethod?: string): DartMember {
+		let propertyName = renamedMethod || this.extractPropertyName(method.name, cType.name);
+		const param = method.parameters[1]; // First param is self
+		const dartParam = {
+			name: 'value',
+			dartType: this.toDartParameterType(param),
+			cType: param.cType
+		};
+
+		// Handle numeric suffixes in setter names (only when no renamed method provided)
+		if (!renamedMethod) {
+			const match = propertyName.match(/^(\w+)_(\d+)$/);
+			if (match) {
+				propertyName = `${match[1]}${match[2]}`;
+			} else if (/^\d+$/.test(propertyName)) {
+				propertyName = `set${propertyName}`;
+			}
+		}
+
+		// Interface methods have no implementation (from spec)
+		let implementation = '';
+		if (classType !== 'interface') {
+			implementation = `SpineBindings.bindings.${method.name}(_ptr, ${this.convertDartToC('value', param)});`;
+		}
+
+		const isOverride = this.isMethodOverride(method, cType);
+
+		return {
+			type: 'setter',
+			name: propertyName,
+			dartReturnType: 'void',
+			parameters: [dartParam],
+			isOverride,
+			implementation,
+			cMethodName: method.name
+		};
+	}
+
+	private createMethod (method: CMethod, cType: CClassOrStruct, classType: 'concrete' | 'abstract' | 'interface', renamedMethod?: string): DartMember {
+		let methodName = renamedMethod || this.toDartMethodName(method.name, cType.name);
+		const dartReturnType = this.toDartReturnType(method.returnType);
+
+		// Check if this is a static method
+		const isStatic = method.parameters.length === 0 ||
+			(method.parameters[0].name !== 'self' &&
+				!method.parameters[0].cType.startsWith(cType.name));
+
+		// Rename static rtti method to avoid conflict with getter
+		if (isStatic && methodName === 'rtti') {
+			methodName = 'rttiStatic';
+		}
+
+		// Parameters (skip 'self' parameter for instance methods)
+		const paramStartIndex = isStatic ? 0 : 1;
+		const params = method.parameters.slice(paramStartIndex).map(p => ({
+			name: p.name,
+			dartType: this.toDartParameterType(p),
+			cType: p.cType
+		}));
+
+		// Interface methods have no implementation (from spec)
+		// Exception: rttiStatic() needs implementation even in interfaces
+		let implementation = '';
+		if (classType !== 'interface' || methodName === 'rttiStatic') {
+			const args = method.parameters.map((p, i) => {
+				if (!isStatic && i === 0) return '_ptr'; // self parameter
+				return this.convertDartToC(p.name, p);
+			}).join(', ');
+
+			if (method.returnType === 'void') {
+				implementation = `SpineBindings.bindings.${method.name}(${args});`;
+			} else {
+				implementation = `final result = SpineBindings.bindings.${method.name}(${args});
+    ${this.generateReturnConversion(method.returnType, 'result')}`;
+			}
+		}
+
+		const isOverride = this.isMethodOverride(method, cType);
+
+		return {
+			type: isStatic ? 'static_method' : 'method',
+			name: methodName,
+			dartReturnType,
+			parameters: params,
+			isOverride,
+			implementation,
+			cMethodName: method.name
+		};
+	}
+
+	// Code generation methods (from spec)
+
+	private generateHeader (): string {
+		return `${LICENSE_HEADER}
+
+// AUTO GENERATED FILE, DO NOT EDIT.`;
+	}
+
+	private generateImports (imports: string[], needsPackageFfi: boolean, hasRtti: boolean): string[] {
+		const lines: string[] = [];
+
+		lines.push('');
+		lines.push("import 'dart:ffi';");
+
+		if (needsPackageFfi) {
+			lines.push("import 'package:ffi/ffi.dart';");
+		}
+
+		lines.push("import 'spine_dart_bindings_generated.dart';");
+		lines.push("import '../spine_bindings.dart';");
+
+		if (hasRtti) {
+			lines.push("import 'rtti.dart';");
+		}
+
+		// Add other imports
+		for (const importFile of imports.sort()) {
+			if (!['rtti.dart'].includes(importFile)) { // Skip duplicates
+				lines.push(`import '${importFile}';`);
+			}
+		}
+
+		return lines;
+	}
+
+	// Class declaration generation (from spec)
+	private generateClassDeclaration (dartClass: DartClass): string {
+		let declaration = '';
+
+		if (dartClass.type === 'interface') {
+			declaration = `abstract class ${dartClass.name}`;
+		} else {
+			declaration = `class ${dartClass.name}`;
+			if (dartClass.type === 'abstract') {
+				declaration = `abstract ${declaration}`;
+			}
+		}
+
+		// Inheritance
+		if (dartClass.inheritance.extends) {
+			declaration += ` extends ${dartClass.inheritance.extends}`;
+		}
+
+		// Implements clause - combine Finalizable with other interfaces
+		const implementsClasses: string[] = [];
+
+		// Add Finalizable for non-interface classes that don't extend another class
+		if (dartClass.type !== 'interface' && !dartClass.inheritance.extends) {
+			implementsClasses.push('Finalizable');
+		}
+
+		// Add other interfaces
+		implementsClasses.push(...dartClass.inheritance.implements);
+
+		if (implementsClasses.length > 0) {
+			declaration += ` implements ${implementsClasses.join(', ')}`;
+		}
+
+		return `
+/// ${dartClass.name} wrapper
+${declaration} {`;
+	}
+
+	private generateInterfaceBody (dartClass: DartClass): string[] {
+		const lines: string[] = [];
+
+		// Add nativePtr getter for interfaces that can be used as method parameters
+		// This allows the generated code to call .nativePtr.cast() on interface instances
+		lines.push('  Pointer get nativePtr;');
+
+		// Generate abstract method signatures for interfaces
+		for (const member of dartClass.members) {
+			lines.push(this.generateInterfaceMember(member));
+		}
+
+		return lines;
+	}
+
+	// Class body generation (from spec)
+	private generateClassBody (dartClass: DartClass): string[] {
+		const lines: string[] = [];
+
+		// Pointer field (only for concrete/abstract classes)
+		const cTypeName = this.toCTypeName(dartClass.name);
+		lines.push(`  final Pointer<${cTypeName}_wrapper> _ptr;`);
+		lines.push('');
+
+		// Constructor
+		lines.push(this.generatePointerConstructor(dartClass));
+		lines.push('');
+
+		// Native pointer getter
+		lines.push('  /// Get the native pointer for FFI calls');
+		lines.push('  Pointer get nativePtr => _ptr;');
+		lines.push('');
+
+		// Members
+		for (const member of dartClass.members) {
+			lines.push(this.generateMember(member));
+			lines.push('');
+		}
+
+		return lines;
+	}
+
+	private generatePointerConstructor (dartClass: DartClass): string {
+		if (dartClass.inheritance.extends) {
+			return `  ${dartClass.name}.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());`;
+		} else {
+			return `  ${dartClass.name}.fromPointer(this._ptr);`;
+		}
+	}
+
+	private generateInterfaceMember (member: DartMember): string {
+		const params = member.parameters.map(p => `${p.dartType} ${p.name}`).join(', ');
+
+		switch (member.type) {
+			case 'getter':
+				return `  ${member.dartReturnType} get ${member.name};`;
+			case 'setter':
+				return `  set ${member.name}(${params});`;
+			case 'method':
+				return `  ${member.dartReturnType} ${member.name}(${params});`;
+			case 'static_method':
+				// Special case: rttiStatic() needs implementation even in abstract classes
+				if (member.name === 'rttiStatic') {
+					return `  static ${member.dartReturnType} ${member.name}(${params}) {
+    ${member.implementation}
+  }`;
+				} else {
+					return `  static ${member.dartReturnType} ${member.name}(${params});`;
+				}
+			default:
+				return '';
+		}
+	}
+
+	// Member generation (from spec)
+	private generateMember (member: DartMember): string {
+		const override = member.isOverride ? '@override\n  ' : '  ';
+
+		switch (member.type) {
+			case 'constructor':
+				return this.generateConstructorMember(member);
+			case 'getter':
+				return `${override}${member.dartReturnType} get ${member.name} {
+    ${member.implementation}
+  }`;
+			case 'setter': {
+				const param = member.parameters[0];
+				return `${override}set ${member.name}(${param.dartType} ${param.name}) {
+    ${member.implementation}
+  }`;
+			}
+			case 'method':
+			case 'static_method': {
+				const params = member.parameters.map(p => `${p.dartType} ${p.name}`).join(', ');
+				const static_ = member.type === 'static_method' ? 'static ' : '';
+				return `${override}${static_}${member.dartReturnType} ${member.name}(${params}) {
+    ${member.implementation}
+  }`;
+			}
+			default:
+				return '';
+		}
+	}
+
+	private generateConstructorMember (member: DartMember): string {
+		const params = member.parameters.map(p => `${p.dartType} ${p.name}`).join(', ');
+		const factoryName = member.name === member.dartReturnType ? '' : `.${member.name}`;
+
+		return `  factory ${member.dartReturnType}${factoryName}(${params}) {
+    ${member.implementation}
+  }`;
+	}
+
+	private generateEnumCode (dartEnum: DartEnum): string {
+		const lines: string[] = [];
+
+		lines.push(this.generateHeader());
+		lines.push('');
+		lines.push(`/// ${dartEnum.name} enum`);
+		lines.push(`enum ${dartEnum.name} {`);
+
+		// Write enum values
+		for (let i = 0; i < dartEnum.values.length; i++) {
+			const value = dartEnum.values[i];
+			const comma = i < dartEnum.values.length - 1 ? ',' : ';';
+			lines.push(`  ${value.name}(${value.value})${comma}`);
+		}
+
+		lines.push('');
+		lines.push(`  const ${dartEnum.name}(this.value);`);
+		lines.push('  final int value;');
+		lines.push('');
+		lines.push(`  static ${dartEnum.name} fromValue(int value) {`);
+		lines.push('    return values.firstWhere(');
+		lines.push('      (e) => e.value == value,');
+		lines.push(`      orElse: () => throw ArgumentError('Invalid ${dartEnum.name} value: \$value'),`);
+		lines.push('    );');
+		lines.push('  }');
+		lines.push('}');
+
+		return lines.join('\n');
+	}
+
+	// Generate arrays.dart file (this was missing!)
+	private async writeArraysFile (cArrayTypes: CClassOrStruct[]): Promise<void> {
+		const lines: string[] = [];
+
+		lines.push(this.generateHeader());
+		lines.push('');
+		lines.push("import 'dart:ffi';");
+		lines.push("import 'package:ffi/ffi.dart';");
+		lines.push("import 'spine_dart_bindings_generated.dart';");
+		lines.push("import '../spine_bindings.dart';");
+		lines.push("import '../native_array.dart';");
+
+		// Collect all imports needed for all array types
+		const imports = new Set<string>();
+		for (const arrayType of cArrayTypes) {
+			const elementType = this.extractArrayElementType(arrayType.name);
+			if (!this.isPrimitiveArrayType(elementType)) {
+				imports.add(`import '${toSnakeCase(elementType)}.dart';`);
+
+				// If this element type is abstract, we need to import all its concrete subclasses too
+				const cElementType = `spine_${toSnakeCase(elementType)}`;
+				const cClass = this.classMap.get(cElementType);
+				if (cClass && this.isAbstract(cClass)) {
+					const concreteSubclasses = this.getConcreteSubclasses(cElementType);
+					for (const subclass of concreteSubclasses) {
+						const dartSubclass = this.toDartTypeName(subclass);
+						imports.add(`import '${toSnakeCase(dartSubclass)}.dart';`);
+					}
+				}
+			}
+		}
+
+		// Add RTTI import if needed
+		if (Array.from(imports).some(imp => {
+			const arrayType = cArrayTypes.find(at => imp.includes(toSnakeCase(this.extractArrayElementType(at.name))));
+			if (arrayType) {
+				const elementType = this.extractArrayElementType(arrayType.name);
+				const cElementType = `spine_${toSnakeCase(elementType)}`;
+				const cClass = this.classMap.get(cElementType);
+				return cClass && this.isAbstract(cClass);
+			}
+			return false;
+		})) {
+			lines.push("import 'rtti.dart';");
+		}
+
+		// Add sorted imports
+		for (const imp of Array.from(imports).sort()) {
+			lines.push(imp);
+		}
+
+		// Generate all array classes in one file (from spec)
+		for (const arrayType of cArrayTypes) {
+			lines.push('');
+			lines.push(...this.generateArrayClassLines(arrayType));
+		}
+
+		const filePath = path.join(this.outputDir, 'arrays.dart');
+		fs.writeFileSync(filePath, lines.join('\n'));
+	}
+
+	// Array generation (proper implementation from old writer)
+	private generateArrayClassLines (arrayType: CClassOrStruct): string[] {
+		const lines: string[] = [];
+		const dartClassName = this.toDartTypeName(arrayType.name);
+		const elementType = this.extractArrayElementType(arrayType.name);
+
+		lines.push(`/// ${dartClassName} wrapper`);
+		lines.push(`class ${dartClassName} extends NativeArray<${this.toDartElementType(elementType)}> {`);
+
+		// Generate typed constructor - arrays use the array wrapper type
+		const arrayWrapperType = `${arrayType.name}_wrapper`;
+		lines.push(`  ${dartClassName}.fromPointer(Pointer<${arrayWrapperType}> ptr) : super(ptr);`);
+		lines.push('');
+
+		// Find size and buffer methods
+		const sizeMethod = arrayType.methods.find(m => m.name.endsWith('_size') && !m.name.endsWith('_set_size'));
+		const bufferMethod = arrayType.methods.find(m => m.name.endsWith('_buffer'));
+		const setMethod = arrayType.methods.find(m => m.name.endsWith('_set') && m.parameters.length === 3); // self, index, value
+
+		if (sizeMethod) {
+			lines.push('  @override');
+			lines.push('  int get length {');
+			lines.push(`    return SpineBindings.bindings.${sizeMethod.name}(nativePtr.cast());`);
+			lines.push('  }');
+			lines.push('');
+		}
+
+		if (bufferMethod) {
+			lines.push('  @override');
+			lines.push(`  ${this.toDartElementType(elementType)} operator [](int index) {`);
+			lines.push('    if (index < 0 || index >= length) {');
+			lines.push('      throw RangeError.index(index, this, \'index\');');
+			lines.push('    }');
+
+			lines.push(`    final buffer = SpineBindings.bindings.${bufferMethod.name}(nativePtr.cast());`);
+
+			// Handle different element types
+			if (elementType === 'int') {
+				lines.push('    return buffer.cast<Int32>()[index];');
+			} else if (elementType === 'float') {
+				lines.push('    return buffer.cast<Float>()[index];');
+			} else if (elementType === 'bool') {
+				lines.push('    return buffer.cast<Int32>()[index] != 0;');
+			} else if (elementType === 'unsigned_short') {
+				lines.push('    return buffer.cast<Uint16>()[index];');
+			} else if (elementType === 'property_id') {
+				// PropertyId buffer returns int instead of Pointer<Int64> due to C codegen bug
+				lines.push('    // NOTE: This will not compile due to C API bug - buffer() returns int instead of Pointer');
+				lines.push('    return buffer.cast<Int64>()[index];');
+			} else {
+				// For object types, the buffer contains pointers
+				const dartElementType = this.toDartTypeName(`spine_${toSnakeCase(elementType)}`);
+				const cElementType = `spine_${toSnakeCase(elementType)}`;
+				const cClass = this.classMap.get(cElementType);
+
+				if (cClass && this.isAbstract(cClass)) {
+					// Use RTTI to determine concrete type for abstract classes
+					const rttiCode = this.generateRttiBasedInstantiation(dartElementType, 'buffer[index]', cClass);
+					lines.push(`    ${rttiCode}`);
+				} else {
+					lines.push(`    return ${dartElementType}.fromPointer(buffer[index]);`);
+				}
+			}
+
+			lines.push('  }');
+			lines.push('');
+		}
+
+		// Override []= if there's a set method
+		if (setMethod) {
+			lines.push('  @override');
+			lines.push(`  void operator []=(int index, ${this.toDartElementType(elementType)} value) {`);
+			lines.push('    if (index < 0 || index >= length) {');
+			lines.push('      throw RangeError.index(index, this, \'index\');');
+			lines.push('    }');
+
+			// Convert value to C type
+			const param = setMethod.parameters[2]; // The value parameter
+			const convertedValue = this.convertDartToC('value', param);
+			lines.push(`    SpineBindings.bindings.${setMethod.name}(nativePtr.cast(), index, ${convertedValue});`);
+			lines.push('  }');
+		}
+
+		lines.push('}');
+
+		return lines;
+	}
+
+	private extractArrayElementType (arrayTypeName: string): string {
+		// spine_array_animation -> animation
+		// spine_array_int -> int
+		const match = arrayTypeName.match(/spine_array_(.+)/);
+		if (match) {
+			const rawType = match[1];
+			// For primitive types, return the raw type
+			if (['int', 'float', 'bool', 'unsigned_short', 'property_id'].includes(rawType)) {
+				return rawType;
+			}
+			// For object types, return the raw type (will be converted later)
+			return rawType;
+		}
+		return 'dynamic';
+	}
+
+	private toDartElementType (elementType: string): string {
+		// Handle pointer types
+		if (elementType.endsWith('*')) {
+			const baseType = elementType.slice(0, -1).trim();
+			return this.toDartTypeName(`spine_${toSnakeCase(baseType)}`);
+		}
+
+		// For primitive types, return the Dart type directly
+		if (elementType === 'int' || elementType === 'int32_t' || elementType === 'uint32_t' || elementType === 'size_t') {
+			return 'int';
+		}
+		if (elementType === 'unsigned_short') {
+			return 'int';  // Dart doesn't have unsigned short, use int
+		}
+		if (elementType === 'property_id' || elementType === 'int64_t') {
+			return 'int';  // PropertyId is int64_t which maps to int in Dart
+		}
+		if (elementType === 'float' || elementType === 'double') {
+			return 'double';
+		}
+		if (elementType === 'bool') {
+			return 'bool';
+		}
+
+		// For object types, convert to PascalCase
+		return this.toPascalCase(elementType);
+	}
+
+	private isPrimitiveArrayType (elementType: string): boolean {
+		return ['int', 'float', 'bool', 'unsigned_short', 'property_id'].includes(elementType.toLowerCase());
+	}
+
+	// Helper methods
+
+	private sortByInheritance (cTypes: CClassOrStruct[]): CClassOrStruct[] {
+		const sorted: CClassOrStruct[] = [];
+		const processed = new Set<string>();
+
+		const processClass = (cType: CClassOrStruct) => {
+			if (processed.has(cType.name)) {
+				return;
+			}
+
+			// Process concrete parent first (skip interfaces)
+			const inheritanceInfo = this.inheritance[cType.name];
+			if (inheritanceInfo?.extends) {
+				const parent = this.classMap.get(inheritanceInfo.extends);
+				if (parent) {
+					processClass(parent);
+				}
+			}
+
+			// Process interface dependencies
+			for (const interfaceName of inheritanceInfo?.mixins || []) {
+				const interfaceClass = this.classMap.get(interfaceName);
+				if (interfaceClass) {
+					processClass(interfaceClass);
+				}
+			}
+
+			sorted.push(cType);
+			processed.add(cType.name);
+		};
+
+		for (const cType of cTypes) {
+			processClass(cType);
+		}
+
+		return sorted;
+	}
+
+	private hasRttiMethod (cType: CClassOrStruct): boolean {
+		return cType.methods.some(m => m.name === `${cType.name}_rtti` && m.parameters.length === 0);
+	}
+
+	private collectImports (cType: CClassOrStruct): string[] {
+		const imports = new Set<string>();
+		const currentTypeName = this.toDartTypeName(cType.name);
+		const currentFileName = `${toSnakeCase(currentTypeName)}.dart`;
+
+		// Add parent class import if needed
+		const parentName = this.inheritance[cType.name]?.extends;
+		if (parentName) {
+			const parentDartName = this.toDartTypeName(parentName);
+			imports.add(`${toSnakeCase(parentDartName)}.dart`);
+		}
+
+		// Add interface imports
+		for (const interfaceName of this.inheritance[cType.name]?.mixins || []) {
+			const interfaceDartName = this.toDartTypeName(interfaceName);
+			const interfaceFileName = `${toSnakeCase(interfaceDartName)}.dart`;
+			if (interfaceFileName !== currentFileName) {
+				imports.add(interfaceFileName);
+			}
+		}
+
+		// Collect from methods and constructors
+		let hasArrays = false;
+		for (const method of [...cType.methods, ...cType.constructors]) {
+			if (this.hasRawPointerParameters(method)) continue;
+
+			// Return type
+			if (method.returnType.startsWith('spine_array_')) {
+				hasArrays = true;
+			} else if (method.returnType.startsWith('spine_')) {
+				const cleanType = method.returnType.replace('*', '').trim();
+				if (!this.isPrimitive(cleanType)) {
+					const typeName = this.toDartTypeName(cleanType);
+					const fileName = `${toSnakeCase(typeName)}.dart`;
+					if (fileName !== currentFileName) {
+						imports.add(fileName);
+					}
+
+					// If return type is abstract, add imports for all concrete subclasses
+					// that could be referenced in the RTTI-based switch statement
+					const cClass = this.classMap.get(cleanType);
+					if (cClass && this.isAbstract(cClass)) {
+						const concreteSubclasses = this.getConcreteSubclasses(cleanType);
+						for (const subclass of concreteSubclasses) {
+							const dartSubclass = this.toDartTypeName(subclass);
+							const subclassFileName = `${toSnakeCase(dartSubclass)}.dart`;
+							if (subclassFileName !== currentFileName) {
+								imports.add(subclassFileName);
+							}
+						}
+					}
+				}
+			}
+
+			// Parameters
+			for (const param of method.parameters) {
+				if (param.name === 'self') continue;
+
+				if (param.cType.startsWith('spine_array_')) {
+					hasArrays = true;
+				} else if (this.enumNames.has(param.cType)) {
+					const enumType = this.toDartTypeName(param.cType);
+					imports.add(`${toSnakeCase(enumType)}.dart`);
+				} else if (param.cType.startsWith('spine_')) {
+					const cleanType = param.cType.replace('*', '').trim();
+					if (!this.isPrimitive(cleanType)) {
+						const typeName = this.toDartTypeName(cleanType);
+						const fileName = `${toSnakeCase(typeName)}.dart`;
+						if (fileName !== currentFileName) {
+							imports.add(fileName);
+						}
+					}
+				}
+			}
+		}
+
+		if (hasArrays) {
+			imports.add('arrays.dart');
+		}
+
+		return Array.from(imports).sort();
+	}
+
+	private isPrimitive (type: string): boolean {
+		return ['float', 'double', 'int', 'bool', 'size_t', 'int32_t', 'uint32_t'].includes(type);
+	}
+
+	private isMethodOverride (method: CMethod, cType: CClassOrStruct): boolean {
+		// Static methods cannot be overridden in Dart
+		const isStatic = method.parameters.length === 0 ||
+			(method.parameters[0].name !== 'self' &&
+				!method.parameters[0].cType.startsWith(cType.name));
+
+		if (isStatic) {
+			return false;
+		}
+
+		// Check if this method exists in parent classes or interfaces
+		const parentName = this.inheritance[cType.name]?.extends;
+		if (parentName) {
+			const parent = this.classMap.get(parentName);
+			if (parent) {
+				const methodSuffix = this.getMethodSuffix(method.name, cType.name);
+				const parentMethodName = `${parentName}_${methodSuffix}`;
+				if (parent.methods.some(m => m.name === parentMethodName)) {
+					return true;
+				}
+			}
+		}
+
+		// Check interfaces
+		for (const interfaceName of this.inheritance[cType.name]?.mixins || []) {
+			const interfaceClass = this.classMap.get(interfaceName);
+			if (interfaceClass) {
+				const methodSuffix = this.getMethodSuffix(method.name, cType.name);
+				const interfaceMethodName = `${interfaceName}_${methodSuffix}`;
+				if (interfaceClass.methods.some(m => m.name === interfaceMethodName)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	// Utility methods - keeping from previous implementation
+
+	private toDartTypeName (cTypeName: string): string {
+		if (cTypeName.startsWith('spine_')) {
+			const name = cTypeName.slice(6);
+			return this.toPascalCase(name);
+		}
+		return this.toPascalCase(cTypeName);
+	}
+
+	private toCTypeName (dartTypeName: string): string {
+		return `spine_${toSnakeCase(dartTypeName)}`;
+	}
+
+	private toDartMethodName (cMethodName: string, cTypeName: string): string {
+		const prefix = `${cTypeName}_`;
+		if (cMethodName.startsWith(prefix)) {
+			return this.toCamelCase(cMethodName.slice(prefix.length));
+		}
+		return this.toCamelCase(cMethodName);
+	}
+
+	private toDartEnumValueName (cValueName: string, cEnumName: string): string {
+		const enumNameUpper = cEnumName.toUpperCase();
+
+		const prefixes = [
+			`SPINE_${enumNameUpper}_`,
+			`${enumNameUpper}_`,
+			'SPINE_'
+		];
+
+		let name = cValueName;
+		for (const prefix of prefixes) {
+			if (name.startsWith(prefix)) {
+				name = name.slice(prefix.length);
+				break;
+			}
+		}
+
+		const enumValue = this.toCamelCase(name.toLowerCase());
+
+		if (cEnumName === 'spine_mix_direction' && ['in', 'out'].includes(enumValue)) {
+			return `direction${this.toPascalCase(enumValue)}`;
+		}
+
+		return enumValue;
+	}
+
+	private toDartReturnType (cType: string): string {
+		if (cType === 'void') return 'void';
+		if (cType === 'char*' || cType === 'char *' || cType === 'const char*' || cType === 'const char *') return 'String';
+		if (cType === 'float' || cType === 'double') return 'double';
+		if (cType === 'int' || cType === 'size_t' || cType === 'int32_t' || cType === 'uint32_t') return 'int';
+		if (cType === 'bool') return 'bool';
+		// Handle primitive pointer types
+		if (cType === 'void*' || cType === 'void *') return 'Pointer<Void>';
+		if (cType === 'float*' || cType === 'float *') return 'Pointer<Float>';
+		if (cType === 'uint32_t*' || cType === 'uint32_t *') return 'Pointer<Uint32>';
+		if (cType === 'uint16_t*' || cType === 'uint16_t *') return 'Pointer<Uint16>';
+		if (cType === 'int*' || cType === 'int *') return 'Pointer<Int32>';
+		return this.toDartTypeName(cType);
+	}
+
+	private toDartParameterType (param: CParameter): string {
+		if (param.cType === 'char*' || param.cType === 'char *' || param.cType === 'const char*' || param.cType === 'const char *') {
+			return 'String';
+		}
+		// Handle void* parameters as Pointer<Void>
+		if (param.cType === 'void*' || param.cType === 'void *') {
+			return 'Pointer<Void>';
+		}
+		return this.toDartReturnType(param.cType);
+	}
+
+	private convertDartToC (dartValue: string, param: CParameter): string {
+		if (param.cType === 'char*' || param.cType === 'char *' || param.cType === 'const char*' || param.cType === 'const char *') {
+			return `${dartValue}.toNativeUtf8().cast<Char>()`;
+		}
+
+		if (this.enumNames.has(param.cType)) {
+			return `${dartValue}.value`;
+		}
+
+		if (param.cType.startsWith('spine_')) {
+			return `${dartValue}.nativePtr.cast()`;
+		}
+
+		return dartValue;
+	}
+
+	private generateReturnConversion (cReturnType: string, resultVar: string): string {
+		if (cReturnType === 'char*' || cReturnType === 'char *' || cReturnType === 'const char*' || cReturnType === 'const char *') {
+			return `return ${resultVar}.cast<Utf8>().toDartString();`;
+		}
+
+		if (this.enumNames.has(cReturnType)) {
+			const dartType = this.toDartTypeName(cReturnType);
+			return `return ${dartType}.fromValue(${resultVar});`;
+		}
+
+		if (cReturnType.startsWith('spine_array_')) {
+			const dartType = this.toDartTypeName(cReturnType);
+			return `return ${dartType}.fromPointer(${resultVar});`;
+		}
+
+		if (cReturnType.startsWith('spine_')) {
+			const dartType = this.toDartTypeName(cReturnType);
+			const cClass = this.classMap.get(cReturnType);
+			if (cClass && this.isAbstract(cClass)) {
+				return this.generateRttiBasedInstantiation(dartType, resultVar, cClass);
+			}
+			return `return ${dartType}.fromPointer(${resultVar});`;
+		}
+
+		return `return ${resultVar};`;
+	}
+
+	private generateRttiBasedInstantiation (abstractType: string, resultVar: string, abstractClass: CClassOrStruct): string {
+		const lines: string[] = [];
+
+		const concreteSubclasses = this.getConcreteSubclasses(abstractClass.name);
+
+		if (concreteSubclasses.length === 0) {
+			return `throw UnsupportedError('Cannot instantiate abstract class ${abstractType} from pointer - no concrete subclasses found');`;
+		}
+
+		lines.push(`final rtti = SpineBindings.bindings.${abstractClass.name}_get_rtti(${resultVar});`);
+		lines.push(`final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();`);
+		lines.push(`switch (className) {`);
+
+		for (const subclass of concreteSubclasses) {
+			const dartSubclass = this.toDartTypeName(subclass);
+			lines.push(`  case '${subclass}':`);
+			lines.push(`    return ${dartSubclass}.fromPointer(${resultVar}.cast());`);
+		}
+
+		lines.push(`  default:`);
+		lines.push(`    throw UnsupportedError('Unknown concrete type: \$className for abstract class ${abstractType}');`);
+		lines.push(`}`);
+
+		return lines.join('\n    ');
+	}
+
+	private getConcreteSubclasses (abstractClassName: string): string[] {
+		const concreteSubclasses: string[] = [];
+
+		for (const [childName, supertypeList] of Object.entries(this.supertypes || {})) {
+			if (supertypeList.includes(abstractClassName)) {
+				const childClass = this.classMap.get(childName);
+				if (childClass && !this.isAbstract(childClass)) {
+					concreteSubclasses.push(childName);
+				}
+			}
+		}
+
+		return concreteSubclasses;
+	}
+
+	private isAbstract (cType: CClassOrStruct): boolean {
+		return cType.cppType.isAbstract === true;
+	}
+
+	private getConstructorName (constr: CMethod, cType: CClassOrStruct): string {
+		const dartClassName = this.toDartTypeName(cType.name);
+		const cTypeName = this.toCTypeName(dartClassName);
+		let constructorName = constr.name.replace(`${cTypeName}_create`, '');
+
+		if (constructorName) {
+			if (/^\d+$/.test(constructorName)) {
+				if (cType.name === 'spine_color' && constr.name === 'spine_color_create2') {
+					constructorName = 'fromRGBA';
+				} else if (constr.parameters.length > 0) {
+					const firstParamType = constr.parameters[0].cType.replace('*', '').trim();
+					if (firstParamType === cType.name) {
+						constructorName = 'from';
+					} else {
+						constructorName = `variant${constructorName}`;
+					}
+				} else {
+					constructorName = `variant${constructorName}`;
+				}
+			} else if (constructorName.startsWith('_')) {
+				constructorName = this.toCamelCase(constructorName.slice(1));
+			}
+		}
+
+		return constructorName || dartClassName;
+	}
+
+	private extractPropertyName (methodName: string, typeName: string): string {
+		const prefix = `${typeName}_`;
+		let name = methodName.startsWith(prefix) ? methodName.slice(prefix.length) : methodName;
+
+		if (name.startsWith('get_')) {
+			name = name.slice(4);
+		} else if (name.startsWith('set_')) {
+			name = name.slice(4);
+		}
+
+		if (name === 'update_cache') {
+			return 'updateCacheList';
+		}
+
+		const typeNames = ['int', 'float', 'double', 'bool', 'string'];
+		if (typeNames.includes(name.toLowerCase())) {
+			return `${this.toCamelCase(name)}Value`;
+		}
+
+		return this.toCamelCase(name);
+	}
+
+	private hasRawPointerParameters (method: CMethod): boolean {
+		for (const param of method.parameters) {
+			if (this.isRawPointer(param.cType)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private isRawPointer (cType: string): boolean {
+		if (cType === 'char*' || cType === 'char *' || cType === 'const char*' || cType === 'const char *') {
+			return false;
+		}
+
+		if (cType.includes('*')) {
+			const cleanType = cType.replace('*', '').trim();
+			if (!cleanType.startsWith('spine_')) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	private isMethodInherited (method: CMethod, cType: CClassOrStruct): boolean {
+		const parentName = this.inheritance[cType.name]?.extends;
+		if (!parentName) {
+			return false;
+		}
+
+		const parent = this.classMap.get(parentName);
+		if (!parent) {
+			return false;
+		}
+
+		const methodSuffix = this.getMethodSuffix(method.name, cType.name);
+		const parentMethodName = `${parentName}_${methodSuffix}`;
+
+		const hasInParent = parent.methods.some(m => m.name === parentMethodName);
+		if (hasInParent) {
+			return true;
+		}
+
+		return this.isMethodInherited(method, parent);
+	}
+
+	private getMethodSuffix (methodName: string, typeName: string): string {
+		const prefix = `${typeName}_`;
+		if (methodName.startsWith(prefix)) {
+			return methodName.slice(prefix.length);
+		}
+		return methodName;
+	}
+
+	private renumberMethods (methods: CMethod[], typeName: string): Array<{ method: CMethod, renamedMethod?: string }> {
+		const result: Array<{ method: CMethod, renamedMethod?: string }> = [];
+
+		const methodGroups = new Map<string, CMethod[]>();
+
+		for (const method of methods) {
+			const match = method.name.match(/^(.+?)_(\d+)$/);
+			if (match) {
+				const baseName = match[1];
+				if (!methodGroups.has(baseName)) {
+					methodGroups.set(baseName, []);
+				}
+				methodGroups.get(baseName)!.push(method);
+			} else {
+				result.push({ method });
+			}
+		}
+
+		for (const [baseName, groupedMethods] of methodGroups) {
+			if (groupedMethods.length === 1) {
+				const method = groupedMethods[0];
+				const dartMethodName = this.toDartMethodName(baseName, typeName);
+				result.push({ method, renamedMethod: dartMethodName });
+			} else {
+				groupedMethods.sort((a, b) => {
+					const aNum = parseInt(a.name.match(/_(\d+)$/)![1]);
+					const bNum = parseInt(b.name.match(/_(\d+)$/)![1]);
+					return aNum - bNum;
+				});
+
+				for (let i = 0; i < groupedMethods.length; i++) {
+					const method = groupedMethods[i];
+					const newNumber = i + 1;
+					const currentNumber = parseInt(method.name.match(/_(\d+)$/)![1]);
+					const baseDartName = this.toDartMethodName(baseName, typeName);
+
+					if (i === 0) {
+						// First method in the group - remove the number
+						result.push({ method, renamedMethod: baseDartName });
+					} else if (newNumber !== currentNumber) {
+						// Need to renumber
+						result.push({ method, renamedMethod: `${baseDartName}${newNumber}` });
+					} else {
+						// Number is correct, no renamed method needed
+						result.push({ method });
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
+	private needsStringConversions (cType: CClassOrStruct): boolean {
+		for (const method of [...cType.methods, ...cType.constructors]) {
+			if (method.returnType === 'char*' || method.returnType === 'char *' ||
+				method.returnType === 'const char*' || method.returnType === 'const char *') {
+				return true;
+			}
+
+			for (const param of method.parameters) {
+				if (param.cType === 'char*' || param.cType === 'char *' ||
+					param.cType === 'const char*' || param.cType === 'const char *') {
+					return true;
+				}
+			}
+
+			// Check if method returns abstract types (which use RTTI and need Utf8)
+			if (method.returnType.startsWith('spine_')) {
+				const cleanType = method.returnType.replace('*', '').trim();
+				const returnClass = this.classMap.get(cleanType);
+				if (returnClass && this.isAbstract(returnClass)) {
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	private async writeExportFile (classes: DartClass[], enums: DartEnum[]): Promise<void> {
+		const lines: string[] = [];
+
+		lines.push(LICENSE_HEADER);
+		lines.push('');
+		lines.push('// AUTO GENERATED FILE, DO NOT EDIT.');
+		lines.push('');
+		lines.push('// Export all generated types');
+		lines.push('');
+
+		// Export enums
+		if (enums.length > 0) {
+			lines.push('// Enums');
+			for (const dartEnum of enums) {
+				lines.push(`export '${toSnakeCase(dartEnum.name)}.dart';`);
+			}
+			lines.push('');
+		}
+
+		// Export classes
+		if (classes.length > 0) {
+			lines.push('// Classes');
+			for (const dartClass of classes) {
+				lines.push(`export '${toSnakeCase(dartClass.name)}.dart';`);
+			}
+			lines.push('');
+		}
+
+		// Export arrays
+		lines.push('// Arrays');
+		lines.push(`export 'arrays.dart';`);
+
+		const filePath = path.join(path.dirname(path.dirname(this.outputDir)), 'lib/generated/spine_dart.dart');
+		fs.writeFileSync(filePath, lines.join('\n'));
+	}
+
+	private toPascalCase (str: string): string {
+		return str.split('_')
+			.map(word => word.charAt(0).toUpperCase() + word.slice(1))
+			.join('');
+	}
+
+	private toCamelCase (str: string): string {
+		const pascal = this.toPascalCase(str);
+		return pascal.charAt(0).toLowerCase() + pascal.slice(1);
+	}
 }
 }

+ 101 - 13
spine-flutter/codegen/src/index.ts

@@ -21,25 +21,17 @@ async function generateFFIBindings(spineCDir: string): Promise<void> {
     // Generate ffigen.yaml configuration
     // Generate ffigen.yaml configuration
     console.log('Generating ffigen.yaml configuration...');
     console.log('Generating ffigen.yaml configuration...');
     const ffigenConfig = `# Run with \`dart run ffigen --config ffigen.yaml\`.
     const ffigenConfig = `# Run with \`dart run ffigen --config ffigen.yaml\`.
-name: SpineFlutterBindings
+name: SpineDartBindings
 description: |
 description: |
   Bindings for Spine C headers.
   Bindings for Spine C headers.
 
 
   Regenerate bindings with \`dart run ffigen --config ffigen.yaml\`.
   Regenerate bindings with \`dart run ffigen --config ffigen.yaml\`.
-output: 'lib/generated/spine_flutter_bindings_generated.dart'
+output: 'lib/generated/spine_dart_bindings_generated.dart'
 llvm-path:
 llvm-path:
     - '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/'
     - '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/'
 headers:
 headers:
   entry-points:
   entry-points:
     - 'src/spine-c/include/spine-c.h'
     - 'src/spine-c/include/spine-c.h'
-    - 'src/spine-c/src/base.h'
-    - 'src/spine-c/src/extensions.h'
-${headerFiles.map(h => `    - '${h}'`).join('\n')}
-  include-directives:
-    - 'src/spine-c/include/spine-c.h'
-    - 'src/spine-c/src/base.h'
-    - 'src/spine-c/src/extensions.h'
-${headerFiles.map(h => `    - '${h}'`).join('\n')}
 compiler-opts:
 compiler-opts:
   - '-Isrc/spine-c/include'
   - '-Isrc/spine-c/include'
   - '-Isrc/spine-c/src'
   - '-Isrc/spine-c/src'
@@ -83,7 +75,7 @@ comments:
     }
     }
 
 
     // Check if bindings were generated successfully
     // Check if bindings were generated successfully
-    const bindingsPath = path.join(__dirname, '../../lib/generated/spine_flutter_bindings_generated.dart');
+    const bindingsPath = path.join(__dirname, '../../lib/generated/spine_dart_bindings_generated.dart');
     if (!fs.existsSync(bindingsPath)) {
     if (!fs.existsSync(bindingsPath)) {
         throw new Error('Failed to generate bindings');
         throw new Error('Failed to generate bindings');
     }
     }
@@ -101,20 +93,91 @@ comments:
     console.log('✅ FFI bindings generated successfully!');
     console.log('✅ FFI bindings generated successfully!');
 }
 }
 
 
+async function generateFFigenYamlOnly(spineCDir: string): Promise<void> {
+    console.log('Finding all header files...');
+    const generatedDir = path.join(spineCDir, 'src/generated');
+    const headerFiles = fs.readdirSync(generatedDir)
+        .filter(f => f.endsWith('.h'))
+        .map(f => path.join('src/spine-c/src/generated', f))
+        .sort();
+
+    console.log(`Found ${headerFiles.length} header files`);
+
+    // Generate ffigen.yaml configuration
+    console.log('Generating ffigen.yaml configuration...');
+    const ffigenConfig = `# Run with \`dart run ffigen --config ffigen.yaml\`.
+name: SpineDartBindings
+description: |
+  Bindings for Spine C headers.
+
+  Regenerate bindings with \`dart run ffigen --config ffigen.yaml\`.
+output: 'lib/generated/spine_dart_bindings_generated.dart'
+llvm-path:
+    - '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/'
+headers:
+  entry-points:
+    - 'src/spine-c/include/spine-c.h'
+compiler-opts:
+  - '-Isrc/spine-c/include'
+  - '-Isrc/spine-c/src'
+  - '-Isrc/spine-c/src/generated'
+  - '-xc'
+  - '-std=c99'
+functions:
+  include:
+    - 'spine_.*'
+structs:
+  include:
+    - 'spine_.*'
+enums:
+  include:
+    - 'spine_.*'
+typedefs:
+  include:
+    - 'spine_.*'
+preamble: |
+  // ignore_for_file: always_specify_types, constant_identifier_names
+  // ignore_for_file: camel_case_types
+  // ignore_for_file: non_constant_identifier_names
+comments:
+  style: any
+  length: full
+`;
+
+    const ffigenPath = path.join(__dirname, '../../ffigen.yaml');
+    fs.writeFileSync(ffigenPath, ffigenConfig);
+    console.log(`FFigen config written to: ${ffigenPath}`);
+}
+
 async function main() {
 async function main() {
+    const args = process.argv.slice(2);
+    const justGenerateYaml = args.includes('--yaml-only');
+
+    if (justGenerateYaml) {
+        console.log('Generating ffigen.yaml only...\n');
+        
+        // Generate FFI bindings YAML config only
+        const spineCDir = path.join(__dirname, '../../src/spine-c');
+        await generateFFigenYamlOnly(spineCDir);
+        console.log('✅ ffigen.yaml generated successfully!');
+        return;
+    }
+
     console.log('Generating Spine Flutter bindings and wrappers...\n');
     console.log('Generating Spine Flutter bindings and wrappers...\n');
 
 
+    console.log('🔧 Using Dart writer implementation\n');
+
     try {
     try {
         // Step 1: Generate C intermediate representation using spine-c codegen
         // Step 1: Generate C intermediate representation using spine-c codegen
         console.log('Step 1: Generating C intermediate representation...');
         console.log('Step 1: Generating C intermediate representation...');
-        const { cTypes, cEnums, cArrayTypes } = await generate();
+        const { cTypes, cEnums, cArrayTypes, inheritance, supertypes, subtypes, isInterface } = await generate();
         console.log(`Generated ${cTypes.length} C types, ${cEnums.length} enums, and ${cArrayTypes.length} array types\n`);
         console.log(`Generated ${cTypes.length} C types, ${cEnums.length} enums, and ${cArrayTypes.length} array types\n`);
 
 
         // Step 2: Write Dart wrapper classes
         // Step 2: Write Dart wrapper classes
         console.log('Step 2: Writing Dart wrapper classes...');
         console.log('Step 2: Writing Dart wrapper classes...');
         const outputDir = path.join(__dirname, '../../lib/generated');
         const outputDir = path.join(__dirname, '../../lib/generated');
         const dartWriter = new DartWriter(outputDir);
         const dartWriter = new DartWriter(outputDir);
-        await dartWriter.writeAll(cTypes, cEnums, cArrayTypes);
+        await dartWriter.writeAll(cTypes, cEnums, cArrayTypes, inheritance, isInterface, supertypes);
         console.log();
         console.log();
 
 
         // Step 3: Generate FFI bindings using ffigen
         // Step 3: Generate FFI bindings using ffigen
@@ -122,6 +185,31 @@ async function main() {
         const spineCDir = path.join(__dirname, '../../src/spine-c');
         const spineCDir = path.join(__dirname, '../../src/spine-c');
         await generateFFIBindings(spineCDir);
         await generateFFIBindings(spineCDir);
 
 
+        // Step 4: Format and fix generated Dart code
+        console.log('Step 4: Formatting and fixing generated Dart code...');
+        try {
+            const projectRoot = path.join(__dirname, '../..');
+
+            // Run dart fix to remove unused imports and apply other fixes
+            console.log('Running dart fix --apply...');
+            execSync('dart fix --apply lib/generated/', {
+                cwd: projectRoot,
+                stdio: 'inherit'
+            });
+
+            // Run dart format to format the code
+            console.log('Running dart format...');
+            execSync('dart format lib/generated/', {
+                cwd: projectRoot,
+                stdio: 'inherit'
+            });
+
+            console.log('✅ Dart code formatting and fixes applied successfully!');
+        } catch (error) {
+            console.warn('⚠️ Warning: Could not format/fix Dart code:', error);
+            console.warn('You may want to run "dart fix --apply lib/generated/" and "dart format lib/generated/" manually');
+        }
+
         console.log('\n✅ All code generation completed successfully!');
         console.log('\n✅ All code generation completed successfully!');
     } catch (error) {
     } catch (error) {
         console.error('\n❌ Error:', error);
         console.error('\n❌ Error:', error);

+ 3 - 0
spine-flutter/generate-bindings.sh

@@ -14,6 +14,9 @@ if [ ! -d "codegen/node_modules" ]; then
     popd > /dev/null
     popd > /dev/null
 fi
 fi
 
 
+# Copy spine-c and spine-cpp sources
+./setup.sh
+
 # Run the codegen
 # Run the codegen
 npx tsx codegen/src/index.ts
 npx tsx codegen/src/index.ts
 
 

+ 6 - 2
spine-flutter/lib/extensions.dart

@@ -40,8 +40,8 @@ import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
 import 'package:path/path.dart' as path;
 
 
 import 'ffi_proxy.dart';
 import 'ffi_proxy.dart';
-import 'init.dart' if (dart.library.html) 'init_web.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_init.dart' if (dart.library.html) 'spine_flutter_init_web.dart';
+import 'spine_flutter.dart';
 import 'raw_image_provider.dart';
 import 'raw_image_provider.dart';
 
 
 export 'spine_widget.dart';
 export 'spine_widget.dart';
@@ -54,6 +54,10 @@ Future<void> initSpineFlutter({bool useStaticLinkage = false, bool enableMemoryD
   _bindings = SpineFlutterBindings(ffi.dylib);
   _bindings = SpineFlutterBindings(ffi.dylib);
   _allocator = ffi.allocator;
   _allocator = ffi.allocator;
   if (enableMemoryDebugging) _bindings.spine_enable_debug_extension(true);
   if (enableMemoryDebugging) _bindings.spine_enable_debug_extension(true);
+
+  // Initialize the global bindings for generated code
+  initializeSpineFlutter(_bindings);
+
   return;
   return;
 }
 }
 
 

+ 10 - 10
spine-flutter/lib/generated/alpha_timeline.dart

@@ -30,12 +30,13 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'curve_timeline1.dart';
 import 'curve_timeline1.dart';
+import 'slot_timeline.dart';
 
 
 /// AlphaTimeline wrapper
 /// AlphaTimeline wrapper
-class AlphaTimeline extends CurveTimeline1 {
+class AlphaTimeline extends CurveTimeline1 implements SlotTimeline {
   final Pointer<spine_alpha_timeline_wrapper> _ptr;
   final Pointer<spine_alpha_timeline_wrapper> _ptr;
 
 
   AlphaTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   AlphaTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -45,21 +46,20 @@ class AlphaTimeline extends CurveTimeline1 {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AlphaTimeline(int frameCount, int bezierCount, int slotIndex) {
   factory AlphaTimeline(int frameCount, int bezierCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_alpha_timeline_create(frameCount, bezierCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_alpha_timeline_create(frameCount, bezierCount, slotIndex);
     return AlphaTimeline.fromPointer(ptr);
     return AlphaTimeline.fromPointer(ptr);
   }
   }
 
 
+  @override
   int get slotIndex {
   int get slotIndex {
-    final result = SpineBindings.bindings.spine_alpha_timeline_get_slot_index(_ptr);
+    final result =
+        SpineBindings.bindings.spine_alpha_timeline_get_slot_index(_ptr);
     return result;
     return result;
   }
   }
 
 
+  @override
   set slotIndex(int value) {
   set slotIndex(int value) {
     SpineBindings.bindings.spine_alpha_timeline_set_slot_index(_ptr, value);
     SpineBindings.bindings.spine_alpha_timeline_set_slot_index(_ptr, value);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_alpha_timeline_dispose(_ptr);
-  }
-}
+}

+ 36 - 16
spine-flutter/lib/generated/animation.dart

@@ -31,12 +31,12 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'skeleton.dart';
+import 'arrays.dart';
 import 'mix_blend.dart';
 import 'mix_blend.dart';
 import 'mix_direction.dart';
 import 'mix_direction.dart';
-import 'arrays.dart';
+import 'skeleton.dart';
 
 
 /// Animation wrapper
 /// Animation wrapper
 class Animation implements Finalizable {
 class Animation implements Finalizable {
@@ -48,7 +48,8 @@ class Animation implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory Animation(String name, ArrayTimeline timelines, double duration) {
   factory Animation(String name, ArrayTimeline timelines, double duration) {
-    final ptr = SpineBindings.bindings.spine_animation_create(name.toNativeUtf8().cast<Char>(), timelines.nativePtr.cast(), duration);
+    final ptr = SpineBindings.bindings.spine_animation_create(
+        name.toNativeUtf8().cast<Char>(), timelines.nativePtr.cast(), duration);
     return Animation.fromPointer(ptr);
     return Animation.fromPointer(ptr);
   }
   }
 
 
@@ -58,11 +59,13 @@ class Animation implements Finalizable {
   }
   }
 
 
   set timelines(ArrayTimeline value) {
   set timelines(ArrayTimeline value) {
-    SpineBindings.bindings.spine_animation_set_timelines(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_animation_set_timelines(_ptr, value.nativePtr.cast());
   }
   }
 
 
   bool hasTimeline(ArrayPropertyId ids) {
   bool hasTimeline(ArrayPropertyId ids) {
-    final result = SpineBindings.bindings.spine_animation_has_timeline(_ptr, ids.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_animation_has_timeline(_ptr, ids.nativePtr.cast());
     return result;
     return result;
   }
   }
 
 
@@ -75,8 +78,27 @@ class Animation implements Finalizable {
     SpineBindings.bindings.spine_animation_set_duration(_ptr, value);
     SpineBindings.bindings.spine_animation_set_duration(_ptr, value);
   }
   }
 
 
-  void apply(Skeleton skeleton, double lastTime, double time, bool loop, ArrayEvent pEvents, double alpha, MixBlend blend, MixDirection direction, bool appliedPose) {
-    SpineBindings.bindings.spine_animation_apply(_ptr, skeleton.nativePtr.cast(), lastTime, time, loop, pEvents.nativePtr.cast(), alpha, blend.value, direction.value, appliedPose);
+  void apply(
+      Skeleton skeleton,
+      double lastTime,
+      double time,
+      bool loop,
+      ArrayEvent pEvents,
+      double alpha,
+      MixBlend blend,
+      MixDirection direction,
+      bool appliedPose) {
+    SpineBindings.bindings.spine_animation_apply(
+        _ptr,
+        skeleton.nativePtr.cast(),
+        lastTime,
+        time,
+        loop,
+        pEvents.nativePtr.cast(),
+        alpha,
+        blend.value,
+        direction.value,
+        appliedPose);
   }
   }
 
 
   String get name {
   String get name {
@@ -89,17 +111,15 @@ class Animation implements Finalizable {
     return ArrayInt.fromPointer(result);
     return ArrayInt.fromPointer(result);
   }
   }
 
 
-  static int search1(ArrayFloat values, double target) {
-    final result = SpineBindings.bindings.spine_animation_search_1(values.nativePtr.cast(), target);
+  static int search(ArrayFloat values, double target) {
+    final result = SpineBindings.bindings
+        .spine_animation_search_1(values.nativePtr.cast(), target);
     return result;
     return result;
   }
   }
 
 
   static int search2(ArrayFloat values, double target, int step) {
   static int search2(ArrayFloat values, double target, int step) {
-    final result = SpineBindings.bindings.spine_animation_search_2(values.nativePtr.cast(), target, step);
+    final result = SpineBindings.bindings
+        .spine_animation_search_2(values.nativePtr.cast(), target, step);
     return result;
     return result;
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_animation_dispose(_ptr);
-  }
-}
+}

+ 53 - 27
spine-flutter/lib/generated/animation_state.dart

@@ -31,13 +31,13 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'skeleton.dart';
-import 'track_entry.dart';
 import 'animation.dart';
 import 'animation.dart';
 import 'animation_state_data.dart';
 import 'animation_state_data.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'skeleton.dart';
+import 'track_entry.dart';
 
 
 /// AnimationState wrapper
 /// AnimationState wrapper
 class AnimationState implements Finalizable {
 class AnimationState implements Finalizable {
@@ -49,7 +49,8 @@ class AnimationState implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AnimationState(AnimationStateData data) {
   factory AnimationState(AnimationStateData data) {
-    final ptr = SpineBindings.bindings.spine_animation_state_create(data.nativePtr.cast());
+    final ptr = SpineBindings.bindings
+        .spine_animation_state_create(data.nativePtr.cast());
     return AnimationState.fromPointer(ptr);
     return AnimationState.fromPointer(ptr);
   }
   }
 
 
@@ -58,7 +59,8 @@ class AnimationState implements Finalizable {
   }
   }
 
 
   bool apply(Skeleton skeleton) {
   bool apply(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_animation_state_apply(_ptr, skeleton.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_animation_state_apply(_ptr, skeleton.nativePtr.cast());
     return result;
     return result;
   }
   }
 
 
@@ -71,21 +73,28 @@ class AnimationState implements Finalizable {
   }
   }
 
 
   TrackEntry setEmptyAnimation(int trackIndex, double mixDuration) {
   TrackEntry setEmptyAnimation(int trackIndex, double mixDuration) {
-    final result = SpineBindings.bindings.spine_animation_state_set_empty_animation(_ptr, trackIndex, mixDuration);
+    final result = SpineBindings.bindings
+        .spine_animation_state_set_empty_animation(
+            _ptr, trackIndex, mixDuration);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
-  TrackEntry addEmptyAnimation(int trackIndex, double mixDuration, double delay) {
-    final result = SpineBindings.bindings.spine_animation_state_add_empty_animation(_ptr, trackIndex, mixDuration, delay);
+  TrackEntry addEmptyAnimation(
+      int trackIndex, double mixDuration, double delay) {
+    final result = SpineBindings.bindings
+        .spine_animation_state_add_empty_animation(
+            _ptr, trackIndex, mixDuration, delay);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
   set emptyAnimations(double value) {
   set emptyAnimations(double value) {
-    SpineBindings.bindings.spine_animation_state_set_empty_animations(_ptr, value);
+    SpineBindings.bindings
+        .spine_animation_state_set_empty_animations(_ptr, value);
   }
   }
 
 
   TrackEntry getCurrent(int trackIndex) {
   TrackEntry getCurrent(int trackIndex) {
-    final result = SpineBindings.bindings.spine_animation_state_get_current(_ptr, trackIndex);
+    final result = SpineBindings.bindings
+        .spine_animation_state_get_current(_ptr, trackIndex);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
@@ -95,12 +104,14 @@ class AnimationState implements Finalizable {
   }
   }
 
 
   ArrayTrackEntry get tracks {
   ArrayTrackEntry get tracks {
-    final result = SpineBindings.bindings.spine_animation_state_get_tracks(_ptr);
+    final result =
+        SpineBindings.bindings.spine_animation_state_get_tracks(_ptr);
     return ArrayTrackEntry.fromPointer(result);
     return ArrayTrackEntry.fromPointer(result);
   }
   }
 
 
   double get timeScale {
   double get timeScale {
-    final result = SpineBindings.bindings.spine_animation_state_get_time_scale(_ptr);
+    final result =
+        SpineBindings.bindings.spine_animation_state_get_time_scale(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -117,39 +128,54 @@ class AnimationState implements Finalizable {
   }
   }
 
 
   set manualTrackEntryDisposal(bool value) {
   set manualTrackEntryDisposal(bool value) {
-    SpineBindings.bindings.spine_animation_state_set_manual_track_entry_disposal(_ptr, value);
+    SpineBindings.bindings
+        .spine_animation_state_set_manual_track_entry_disposal(_ptr, value);
   }
   }
 
 
   bool get manualTrackEntryDisposal {
   bool get manualTrackEntryDisposal {
-    final result = SpineBindings.bindings.spine_animation_state_get_manual_track_entry_disposal(_ptr);
+    final result = SpineBindings.bindings
+        .spine_animation_state_get_manual_track_entry_disposal(_ptr);
     return result;
     return result;
   }
   }
 
 
   void disposeTrackEntry(TrackEntry entry) {
   void disposeTrackEntry(TrackEntry entry) {
-    SpineBindings.bindings.spine_animation_state_dispose_track_entry(_ptr, entry.nativePtr.cast());
+    SpineBindings.bindings.spine_animation_state_dispose_track_entry(
+        _ptr, entry.nativePtr.cast());
   }
   }
 
 
-  TrackEntry setAnimation1(int trackIndex, String animationName, bool loop) {
-    final result = SpineBindings.bindings.spine_animation_state_set_animation_1(_ptr, trackIndex, animationName.toNativeUtf8().cast<Char>(), loop);
-    return TrackEntry.fromPointer(result);
+  Pointer<Void> get rendererObject {
+    final result =
+        SpineBindings.bindings.spine_animation_state_get_renderer_object(_ptr);
+    return result;
   }
   }
 
 
-  TrackEntry setAnimation2(int trackIndex, Animation animation, bool loop) {
-    final result = SpineBindings.bindings.spine_animation_state_set_animation_2(_ptr, trackIndex, animation.nativePtr.cast(), loop);
+  TrackEntry setAnimation(int trackIndex, String animationName, bool loop) {
+    final result = SpineBindings.bindings.spine_animation_state_set_animation_1(
+        _ptr, trackIndex, animationName.toNativeUtf8().cast<Char>(), loop);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
-  TrackEntry addAnimation1(int trackIndex, String animationName, bool loop, double delay) {
-    final result = SpineBindings.bindings.spine_animation_state_add_animation_1(_ptr, trackIndex, animationName.toNativeUtf8().cast<Char>(), loop, delay);
+  TrackEntry setAnimation2(int trackIndex, Animation animation, bool loop) {
+    final result = SpineBindings.bindings.spine_animation_state_set_animation_2(
+        _ptr, trackIndex, animation.nativePtr.cast(), loop);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
-  TrackEntry addAnimation2(int trackIndex, Animation animation, bool loop, double delay) {
-    final result = SpineBindings.bindings.spine_animation_state_add_animation_2(_ptr, trackIndex, animation.nativePtr.cast(), loop, delay);
+  TrackEntry addAnimation(
+      int trackIndex, String animationName, bool loop, double delay) {
+    final result = SpineBindings.bindings.spine_animation_state_add_animation_1(
+        _ptr,
+        trackIndex,
+        animationName.toNativeUtf8().cast<Char>(),
+        loop,
+        delay);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
-  void dispose() {
-    SpineBindings.bindings.spine_animation_state_dispose(_ptr);
+  TrackEntry addAnimation2(
+      int trackIndex, Animation animation, bool loop, double delay) {
+    final result = SpineBindings.bindings.spine_animation_state_add_animation_2(
+        _ptr, trackIndex, animation.nativePtr.cast(), loop, delay);
+    return TrackEntry.fromPointer(result);
   }
   }
-}
+}

+ 21 - 15
spine-flutter/lib/generated/animation_state_data.dart

@@ -31,10 +31,10 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'skeleton_data.dart';
 import 'animation.dart';
 import 'animation.dart';
+import 'skeleton_data.dart';
 
 
 /// AnimationStateData wrapper
 /// AnimationStateData wrapper
 class AnimationStateData implements Finalizable {
 class AnimationStateData implements Finalizable {
@@ -46,26 +46,31 @@ class AnimationStateData implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AnimationStateData(SkeletonData skeletonData) {
   factory AnimationStateData(SkeletonData skeletonData) {
-    final ptr = SpineBindings.bindings.spine_animation_state_data_create(skeletonData.nativePtr.cast());
+    final ptr = SpineBindings.bindings
+        .spine_animation_state_data_create(skeletonData.nativePtr.cast());
     return AnimationStateData.fromPointer(ptr);
     return AnimationStateData.fromPointer(ptr);
   }
   }
 
 
   SkeletonData get skeletonData {
   SkeletonData get skeletonData {
-    final result = SpineBindings.bindings.spine_animation_state_data_get_skeleton_data(_ptr);
+    final result = SpineBindings.bindings
+        .spine_animation_state_data_get_skeleton_data(_ptr);
     return SkeletonData.fromPointer(result);
     return SkeletonData.fromPointer(result);
   }
   }
 
 
   double get defaultMix {
   double get defaultMix {
-    final result = SpineBindings.bindings.spine_animation_state_data_get_default_mix(_ptr);
+    final result =
+        SpineBindings.bindings.spine_animation_state_data_get_default_mix(_ptr);
     return result;
     return result;
   }
   }
 
 
   set defaultMix(double value) {
   set defaultMix(double value) {
-    SpineBindings.bindings.spine_animation_state_data_set_default_mix(_ptr, value);
+    SpineBindings.bindings
+        .spine_animation_state_data_set_default_mix(_ptr, value);
   }
   }
 
 
   double getMix(Animation from, Animation to) {
   double getMix(Animation from, Animation to) {
-    final result = SpineBindings.bindings.spine_animation_state_data_get_mix(_ptr, from.nativePtr.cast(), to.nativePtr.cast());
+    final result = SpineBindings.bindings.spine_animation_state_data_get_mix(
+        _ptr, from.nativePtr.cast(), to.nativePtr.cast());
     return result;
     return result;
   }
   }
 
 
@@ -73,15 +78,16 @@ class AnimationStateData implements Finalizable {
     SpineBindings.bindings.spine_animation_state_data_clear(_ptr);
     SpineBindings.bindings.spine_animation_state_data_clear(_ptr);
   }
   }
 
 
-  void setMix1(String fromName, String toName, double duration) {
-    SpineBindings.bindings.spine_animation_state_data_set_mix_1(_ptr, fromName.toNativeUtf8().cast<Char>(), toName.toNativeUtf8().cast<Char>(), duration);
+  void setMix(String fromName, String toName, double duration) {
+    SpineBindings.bindings.spine_animation_state_data_set_mix_1(
+        _ptr,
+        fromName.toNativeUtf8().cast<Char>(),
+        toName.toNativeUtf8().cast<Char>(),
+        duration);
   }
   }
 
 
   void setMix2(Animation from, Animation to, double duration) {
   void setMix2(Animation from, Animation to, double duration) {
-    SpineBindings.bindings.spine_animation_state_data_set_mix_2(_ptr, from.nativePtr.cast(), to.nativePtr.cast(), duration);
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_animation_state_data_dispose(_ptr);
+    SpineBindings.bindings.spine_animation_state_data_set_mix_2(
+        _ptr, from.nativePtr.cast(), to.nativePtr.cast(), duration);
   }
   }
-}
+}

+ 286 - 169
spine-flutter/lib/generated/arrays.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import '../native_array.dart';
 import '../native_array.dart';
 import 'alpha_timeline.dart';
 import 'alpha_timeline.dart';
@@ -59,15 +59,20 @@ import 'from_scale_y.dart';
 import 'from_shear_y.dart';
 import 'from_shear_y.dart';
 import 'from_x.dart';
 import 'from_x.dart';
 import 'from_y.dart';
 import 'from_y.dart';
+import 'ik_constraint.dart';
+import 'ik_constraint_data.dart';
 import 'ik_constraint_timeline.dart';
 import 'ik_constraint_timeline.dart';
 import 'inherit_timeline.dart';
 import 'inherit_timeline.dart';
 import 'mesh_attachment.dart';
 import 'mesh_attachment.dart';
 import 'path_attachment.dart';
 import 'path_attachment.dart';
+import 'path_constraint.dart';
+import 'path_constraint_data.dart';
 import 'path_constraint_mix_timeline.dart';
 import 'path_constraint_mix_timeline.dart';
 import 'path_constraint_position_timeline.dart';
 import 'path_constraint_position_timeline.dart';
 import 'path_constraint_spacing_timeline.dart';
 import 'path_constraint_spacing_timeline.dart';
 import 'physics_constraint.dart';
 import 'physics_constraint.dart';
 import 'physics_constraint_damping_timeline.dart';
 import 'physics_constraint_damping_timeline.dart';
+import 'physics_constraint_data.dart';
 import 'physics_constraint_gravity_timeline.dart';
 import 'physics_constraint_gravity_timeline.dart';
 import 'physics_constraint_inertia_timeline.dart';
 import 'physics_constraint_inertia_timeline.dart';
 import 'physics_constraint_mass_timeline.dart';
 import 'physics_constraint_mass_timeline.dart';
@@ -91,6 +96,8 @@ import 'shear_timeline.dart';
 import 'shear_x_timeline.dart';
 import 'shear_x_timeline.dart';
 import 'shear_y_timeline.dart';
 import 'shear_y_timeline.dart';
 import 'skin.dart';
 import 'skin.dart';
+import 'slider.dart';
+import 'slider_data.dart';
 import 'slider_mix_timeline.dart';
 import 'slider_mix_timeline.dart';
 import 'slider_timeline.dart';
 import 'slider_timeline.dart';
 import 'slot.dart';
 import 'slot.dart';
@@ -105,13 +112,15 @@ import 'to_shear_y.dart';
 import 'to_x.dart';
 import 'to_x.dart';
 import 'to_y.dart';
 import 'to_y.dart';
 import 'track_entry.dart';
 import 'track_entry.dart';
+import 'transform_constraint.dart';
+import 'transform_constraint_data.dart';
 import 'transform_constraint_timeline.dart';
 import 'transform_constraint_timeline.dart';
 import 'translate_timeline.dart';
 import 'translate_timeline.dart';
 import 'translate_x_timeline.dart';
 import 'translate_x_timeline.dart';
 import 'translate_y_timeline.dart';
 import 'translate_y_timeline.dart';
 import 'update.dart';
 import 'update.dart';
 
 
-/// Array of float elements
+/// ArrayFloat wrapper
 class ArrayFloat extends NativeArray<double> {
 class ArrayFloat extends NativeArray<double> {
   ArrayFloat.fromPointer(Pointer<spine_array_float_wrapper> super.ptr);
   ArrayFloat.fromPointer(Pointer<spine_array_float_wrapper> super.ptr);
 
 
@@ -125,13 +134,13 @@ class ArrayFloat extends NativeArray<double> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_float_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_float_buffer(nativePtr.cast());
     return buffer.cast<Float>()[index];
     return buffer.cast<Float>()[index];
   }
   }
-
 }
 }
 
 
-/// Array of int elements
+/// ArrayInt wrapper
 class ArrayInt extends NativeArray<int> {
 class ArrayInt extends NativeArray<int> {
   ArrayInt.fromPointer(Pointer<spine_array_int_wrapper> super.ptr);
   ArrayInt.fromPointer(Pointer<spine_array_int_wrapper> super.ptr);
 
 
@@ -145,19 +154,21 @@ class ArrayInt extends NativeArray<int> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_int_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_int_buffer(nativePtr.cast());
     return buffer.cast<Int32>()[index];
     return buffer.cast<Int32>()[index];
   }
   }
-
 }
 }
 
 
-/// Array of unsigned_short elements
+/// ArrayUnsignedShort wrapper
 class ArrayUnsignedShort extends NativeArray<int> {
 class ArrayUnsignedShort extends NativeArray<int> {
-  ArrayUnsignedShort.fromPointer(Pointer<spine_array_unsigned_short_wrapper> super.ptr);
+  ArrayUnsignedShort.fromPointer(
+      Pointer<spine_array_unsigned_short_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_unsigned_short_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_unsigned_short_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -165,19 +176,21 @@ class ArrayUnsignedShort extends NativeArray<int> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_unsigned_short_buffer(nativePtr.cast());
+    final buffer = SpineBindings.bindings
+        .spine_array_unsigned_short_buffer(nativePtr.cast());
     return buffer.cast<Uint16>()[index];
     return buffer.cast<Uint16>()[index];
   }
   }
-
 }
 }
 
 
-/// Array of property_id elements
+/// ArrayPropertyId wrapper
 class ArrayPropertyId extends NativeArray<int> {
 class ArrayPropertyId extends NativeArray<int> {
-  ArrayPropertyId.fromPointer(Pointer<spine_array_property_id_wrapper> super.ptr);
+  ArrayPropertyId.fromPointer(
+      Pointer<spine_array_property_id_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_property_id_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_property_id_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -185,14 +198,14 @@ class ArrayPropertyId extends NativeArray<int> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_property_id_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_property_id_buffer(nativePtr.cast());
     // NOTE: This will not compile due to C API bug - buffer() returns int instead of Pointer
     // NOTE: This will not compile due to C API bug - buffer() returns int instead of Pointer
     return buffer.cast<Int64>()[index];
     return buffer.cast<Int64>()[index];
   }
   }
-
 }
 }
 
 
-/// Array of Animation elements
+/// ArrayAnimation wrapper
 class ArrayAnimation extends NativeArray<Animation> {
 class ArrayAnimation extends NativeArray<Animation> {
   ArrayAnimation.fromPointer(Pointer<spine_array_animation_wrapper> super.ptr);
   ArrayAnimation.fromPointer(Pointer<spine_array_animation_wrapper> super.ptr);
 
 
@@ -206,13 +219,13 @@ class ArrayAnimation extends NativeArray<Animation> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_animation_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_animation_buffer(nativePtr.cast());
     return Animation.fromPointer(buffer[index]);
     return Animation.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of AtlasPage elements
+/// ArrayAtlasPage wrapper
 class ArrayAtlasPage extends NativeArray<AtlasPage> {
 class ArrayAtlasPage extends NativeArray<AtlasPage> {
   ArrayAtlasPage.fromPointer(Pointer<spine_array_atlas_page_wrapper> super.ptr);
   ArrayAtlasPage.fromPointer(Pointer<spine_array_atlas_page_wrapper> super.ptr);
 
 
@@ -226,19 +239,21 @@ class ArrayAtlasPage extends NativeArray<AtlasPage> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_atlas_page_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_atlas_page_buffer(nativePtr.cast());
     return AtlasPage.fromPointer(buffer[index]);
     return AtlasPage.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of AtlasRegion elements
+/// ArrayAtlasRegion wrapper
 class ArrayAtlasRegion extends NativeArray<AtlasRegion> {
 class ArrayAtlasRegion extends NativeArray<AtlasRegion> {
-  ArrayAtlasRegion.fromPointer(Pointer<spine_array_atlas_region_wrapper> super.ptr);
+  ArrayAtlasRegion.fromPointer(
+      Pointer<spine_array_atlas_region_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_atlas_region_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_atlas_region_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -246,15 +261,16 @@ class ArrayAtlasRegion extends NativeArray<AtlasRegion> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_atlas_region_buffer(nativePtr.cast());
+    final buffer = SpineBindings.bindings
+        .spine_array_atlas_region_buffer(nativePtr.cast());
     return AtlasRegion.fromPointer(buffer[index]);
     return AtlasRegion.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Attachment elements
+/// ArrayAttachment wrapper
 class ArrayAttachment extends NativeArray<Attachment> {
 class ArrayAttachment extends NativeArray<Attachment> {
-  ArrayAttachment.fromPointer(Pointer<spine_array_attachment_wrapper> super.ptr);
+  ArrayAttachment.fromPointer(
+      Pointer<spine_array_attachment_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
@@ -266,14 +282,15 @@ class ArrayAttachment extends NativeArray<Attachment> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_attachment_buffer(nativePtr.cast());
-    final rtti = SpineBindings.bindings.spine_attachment_get_rtti(buffer[index]);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final buffer =
+        SpineBindings.bindings.spine_array_attachment_buffer(nativePtr.cast());
+    final rtti =
+        SpineBindings.bindings.spine_attachment_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
-      case 'spine_point_attachment':
-        return PointAttachment.fromPointer(buffer[index].cast());
-      case 'spine_region_attachment':
-        return RegionAttachment.fromPointer(buffer[index].cast());
       case 'spine_bounding_box_attachment':
       case 'spine_bounding_box_attachment':
         return BoundingBoxAttachment.fromPointer(buffer[index].cast());
         return BoundingBoxAttachment.fromPointer(buffer[index].cast());
       case 'spine_clipping_attachment':
       case 'spine_clipping_attachment':
@@ -282,14 +299,18 @@ class ArrayAttachment extends NativeArray<Attachment> {
         return MeshAttachment.fromPointer(buffer[index].cast());
         return MeshAttachment.fromPointer(buffer[index].cast());
       case 'spine_path_attachment':
       case 'spine_path_attachment':
         return PathAttachment.fromPointer(buffer[index].cast());
         return PathAttachment.fromPointer(buffer[index].cast());
+      case 'spine_point_attachment':
+        return PointAttachment.fromPointer(buffer[index].cast());
+      case 'spine_region_attachment':
+        return RegionAttachment.fromPointer(buffer[index].cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class Attachment');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Attachment');
     }
     }
   }
   }
-
 }
 }
 
 
-/// Array of Bone elements
+/// ArrayBone wrapper
 class ArrayBone extends NativeArray<Bone> {
 class ArrayBone extends NativeArray<Bone> {
   ArrayBone.fromPointer(Pointer<spine_array_bone_wrapper> super.ptr);
   ArrayBone.fromPointer(Pointer<spine_array_bone_wrapper> super.ptr);
 
 
@@ -303,13 +324,13 @@ class ArrayBone extends NativeArray<Bone> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_bone_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_bone_buffer(nativePtr.cast());
     return Bone.fromPointer(buffer[index]);
     return Bone.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of BoneData elements
+/// ArrayBoneData wrapper
 class ArrayBoneData extends NativeArray<BoneData> {
 class ArrayBoneData extends NativeArray<BoneData> {
   ArrayBoneData.fromPointer(Pointer<spine_array_bone_data_wrapper> super.ptr);
   ArrayBoneData.fromPointer(Pointer<spine_array_bone_data_wrapper> super.ptr);
 
 
@@ -323,13 +344,13 @@ class ArrayBoneData extends NativeArray<BoneData> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_bone_data_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_bone_data_buffer(nativePtr.cast());
     return BoneData.fromPointer(buffer[index]);
     return BoneData.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of BonePose elements
+/// ArrayBonePose wrapper
 class ArrayBonePose extends NativeArray<BonePose> {
 class ArrayBonePose extends NativeArray<BonePose> {
   ArrayBonePose.fromPointer(Pointer<spine_array_bone_pose_wrapper> super.ptr);
   ArrayBonePose.fromPointer(Pointer<spine_array_bone_pose_wrapper> super.ptr);
 
 
@@ -343,19 +364,21 @@ class ArrayBonePose extends NativeArray<BonePose> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_bone_pose_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_bone_pose_buffer(nativePtr.cast());
     return BonePose.fromPointer(buffer[index]);
     return BonePose.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of BoundingBoxAttachment elements
+/// ArrayBoundingBoxAttachment wrapper
 class ArrayBoundingBoxAttachment extends NativeArray<BoundingBoxAttachment> {
 class ArrayBoundingBoxAttachment extends NativeArray<BoundingBoxAttachment> {
-  ArrayBoundingBoxAttachment.fromPointer(Pointer<spine_array_bounding_box_attachment_wrapper> super.ptr);
+  ArrayBoundingBoxAttachment.fromPointer(
+      Pointer<spine_array_bounding_box_attachment_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_bounding_box_attachment_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_bounding_box_attachment_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -363,15 +386,16 @@ class ArrayBoundingBoxAttachment extends NativeArray<BoundingBoxAttachment> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_bounding_box_attachment_buffer(nativePtr.cast());
+    final buffer = SpineBindings.bindings
+        .spine_array_bounding_box_attachment_buffer(nativePtr.cast());
     return BoundingBoxAttachment.fromPointer(buffer[index]);
     return BoundingBoxAttachment.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Constraint elements
+/// ArrayConstraint wrapper
 class ArrayConstraint extends NativeArray<Constraint> {
 class ArrayConstraint extends NativeArray<Constraint> {
-  ArrayConstraint.fromPointer(Pointer<spine_array_constraint_wrapper> super.ptr);
+  ArrayConstraint.fromPointer(
+      Pointer<spine_array_constraint_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
@@ -383,19 +407,41 @@ class ArrayConstraint extends NativeArray<Constraint> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_constraint_buffer(nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Constraint from pointer - no concrete subclasses found');
+    final buffer =
+        SpineBindings.bindings.spine_array_constraint_buffer(nativePtr.cast());
+    final rtti =
+        SpineBindings.bindings.spine_constraint_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_ik_constraint':
+        return IkConstraint.fromPointer(buffer[index].cast());
+      case 'spine_path_constraint':
+        return PathConstraint.fromPointer(buffer[index].cast());
+      case 'spine_physics_constraint':
+        return PhysicsConstraint.fromPointer(buffer[index].cast());
+      case 'spine_slider':
+        return Slider.fromPointer(buffer[index].cast());
+      case 'spine_transform_constraint':
+        return TransformConstraint.fromPointer(buffer[index].cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Constraint');
+    }
   }
   }
-
 }
 }
 
 
-/// Array of ConstraintData elements
+/// ArrayConstraintData wrapper
 class ArrayConstraintData extends NativeArray<ConstraintData> {
 class ArrayConstraintData extends NativeArray<ConstraintData> {
-  ArrayConstraintData.fromPointer(Pointer<spine_array_constraint_data_wrapper> super.ptr);
+  ArrayConstraintData.fromPointer(
+      Pointer<spine_array_constraint_data_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_constraint_data_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_constraint_data_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -403,13 +449,33 @@ class ArrayConstraintData extends NativeArray<ConstraintData> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_constraint_data_buffer(nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class ConstraintData from pointer - no concrete subclasses found');
+    final buffer = SpineBindings.bindings
+        .spine_array_constraint_data_buffer(nativePtr.cast());
+    final rtti =
+        SpineBindings.bindings.spine_constraint_data_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_ik_constraint_data':
+        return IkConstraintData.fromPointer(buffer[index].cast());
+      case 'spine_path_constraint_data':
+        return PathConstraintData.fromPointer(buffer[index].cast());
+      case 'spine_physics_constraint_data':
+        return PhysicsConstraintData.fromPointer(buffer[index].cast());
+      case 'spine_slider_data':
+        return SliderData.fromPointer(buffer[index].cast());
+      case 'spine_transform_constraint_data':
+        return TransformConstraintData.fromPointer(buffer[index].cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class ConstraintData');
+    }
   }
   }
-
 }
 }
 
 
-/// Array of Event elements
+/// ArrayEvent wrapper
 class ArrayEvent extends NativeArray<Event> {
 class ArrayEvent extends NativeArray<Event> {
   ArrayEvent.fromPointer(Pointer<spine_array_event_wrapper> super.ptr);
   ArrayEvent.fromPointer(Pointer<spine_array_event_wrapper> super.ptr);
 
 
@@ -423,13 +489,13 @@ class ArrayEvent extends NativeArray<Event> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_event_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_event_buffer(nativePtr.cast());
     return Event.fromPointer(buffer[index]);
     return Event.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of EventData elements
+/// ArrayEventData wrapper
 class ArrayEventData extends NativeArray<EventData> {
 class ArrayEventData extends NativeArray<EventData> {
   ArrayEventData.fromPointer(Pointer<spine_array_event_data_wrapper> super.ptr);
   ArrayEventData.fromPointer(Pointer<spine_array_event_data_wrapper> super.ptr);
 
 
@@ -443,19 +509,21 @@ class ArrayEventData extends NativeArray<EventData> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_event_data_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_event_data_buffer(nativePtr.cast());
     return EventData.fromPointer(buffer[index]);
     return EventData.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of FromProperty elements
+/// ArrayFromProperty wrapper
 class ArrayFromProperty extends NativeArray<FromProperty> {
 class ArrayFromProperty extends NativeArray<FromProperty> {
-  ArrayFromProperty.fromPointer(Pointer<spine_array_from_property_wrapper> super.ptr);
+  ArrayFromProperty.fromPointer(
+      Pointer<spine_array_from_property_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_from_property_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_from_property_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -463,9 +531,14 @@ class ArrayFromProperty extends NativeArray<FromProperty> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_from_property_buffer(nativePtr.cast());
-    final rtti = SpineBindings.bindings.spine_from_property_get_rtti(buffer[index]);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final buffer = SpineBindings.bindings
+        .spine_array_from_property_buffer(nativePtr.cast());
+    final rtti =
+        SpineBindings.bindings.spine_from_property_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
       case 'spine_from_rotate':
       case 'spine_from_rotate':
         return FromRotate.fromPointer(buffer[index].cast());
         return FromRotate.fromPointer(buffer[index].cast());
@@ -480,19 +553,21 @@ class ArrayFromProperty extends NativeArray<FromProperty> {
       case 'spine_from_y':
       case 'spine_from_y':
         return FromY.fromPointer(buffer[index].cast());
         return FromY.fromPointer(buffer[index].cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class FromProperty');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class FromProperty');
     }
     }
   }
   }
-
 }
 }
 
 
-/// Array of PhysicsConstraint elements
+/// ArrayPhysicsConstraint wrapper
 class ArrayPhysicsConstraint extends NativeArray<PhysicsConstraint> {
 class ArrayPhysicsConstraint extends NativeArray<PhysicsConstraint> {
-  ArrayPhysicsConstraint.fromPointer(Pointer<spine_array_physics_constraint_wrapper> super.ptr);
+  ArrayPhysicsConstraint.fromPointer(
+      Pointer<spine_array_physics_constraint_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_physics_constraint_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_physics_constraint_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -500,13 +575,13 @@ class ArrayPhysicsConstraint extends NativeArray<PhysicsConstraint> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_physics_constraint_buffer(nativePtr.cast());
+    final buffer = SpineBindings.bindings
+        .spine_array_physics_constraint_buffer(nativePtr.cast());
     return PhysicsConstraint.fromPointer(buffer[index]);
     return PhysicsConstraint.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Polygon elements
+/// ArrayPolygon wrapper
 class ArrayPolygon extends NativeArray<Polygon> {
 class ArrayPolygon extends NativeArray<Polygon> {
   ArrayPolygon.fromPointer(Pointer<spine_array_polygon_wrapper> super.ptr);
   ArrayPolygon.fromPointer(Pointer<spine_array_polygon_wrapper> super.ptr);
 
 
@@ -520,13 +595,13 @@ class ArrayPolygon extends NativeArray<Polygon> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_polygon_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_polygon_buffer(nativePtr.cast());
     return Polygon.fromPointer(buffer[index]);
     return Polygon.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Skin elements
+/// ArraySkin wrapper
 class ArraySkin extends NativeArray<Skin> {
 class ArraySkin extends NativeArray<Skin> {
   ArraySkin.fromPointer(Pointer<spine_array_skin_wrapper> super.ptr);
   ArraySkin.fromPointer(Pointer<spine_array_skin_wrapper> super.ptr);
 
 
@@ -540,13 +615,13 @@ class ArraySkin extends NativeArray<Skin> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_skin_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_skin_buffer(nativePtr.cast());
     return Skin.fromPointer(buffer[index]);
     return Skin.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Slot elements
+/// ArraySlot wrapper
 class ArraySlot extends NativeArray<Slot> {
 class ArraySlot extends NativeArray<Slot> {
   ArraySlot.fromPointer(Pointer<spine_array_slot_wrapper> super.ptr);
   ArraySlot.fromPointer(Pointer<spine_array_slot_wrapper> super.ptr);
 
 
@@ -560,13 +635,13 @@ class ArraySlot extends NativeArray<Slot> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_slot_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_slot_buffer(nativePtr.cast());
     return Slot.fromPointer(buffer[index]);
     return Slot.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of SlotData elements
+/// ArraySlotData wrapper
 class ArraySlotData extends NativeArray<SlotData> {
 class ArraySlotData extends NativeArray<SlotData> {
   ArraySlotData.fromPointer(Pointer<spine_array_slot_data_wrapper> super.ptr);
   ArraySlotData.fromPointer(Pointer<spine_array_slot_data_wrapper> super.ptr);
 
 
@@ -580,19 +655,21 @@ class ArraySlotData extends NativeArray<SlotData> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_slot_data_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_slot_data_buffer(nativePtr.cast());
     return SlotData.fromPointer(buffer[index]);
     return SlotData.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of TextureRegion elements
+/// ArrayTextureRegion wrapper
 class ArrayTextureRegion extends NativeArray<TextureRegion> {
 class ArrayTextureRegion extends NativeArray<TextureRegion> {
-  ArrayTextureRegion.fromPointer(Pointer<spine_array_texture_region_wrapper> super.ptr);
+  ArrayTextureRegion.fromPointer(
+      Pointer<spine_array_texture_region_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_texture_region_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_texture_region_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -600,13 +677,13 @@ class ArrayTextureRegion extends NativeArray<TextureRegion> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_texture_region_buffer(nativePtr.cast());
+    final buffer = SpineBindings.bindings
+        .spine_array_texture_region_buffer(nativePtr.cast());
     return TextureRegion.fromPointer(buffer[index]);
     return TextureRegion.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Timeline elements
+/// ArrayTimeline wrapper
 class ArrayTimeline extends NativeArray<Timeline> {
 class ArrayTimeline extends NativeArray<Timeline> {
   ArrayTimeline.fromPointer(Pointer<spine_array_timeline_wrapper> super.ptr);
   ArrayTimeline.fromPointer(Pointer<spine_array_timeline_wrapper> super.ptr);
 
 
@@ -620,62 +697,54 @@ class ArrayTimeline extends NativeArray<Timeline> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_timeline_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_timeline_buffer(nativePtr.cast());
     final rtti = SpineBindings.bindings.spine_timeline_get_rtti(buffer[index]);
     final rtti = SpineBindings.bindings.spine_timeline_get_rtti(buffer[index]);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
-      case 'spine_attachment_timeline':
-        return AttachmentTimeline.fromPointer(buffer[index].cast());
       case 'spine_alpha_timeline':
       case 'spine_alpha_timeline':
         return AlphaTimeline.fromPointer(buffer[index].cast());
         return AlphaTimeline.fromPointer(buffer[index].cast());
-      case 'spine_rotate_timeline':
-        return RotateTimeline.fromPointer(buffer[index].cast());
-      case 'spine_scale_x_timeline':
-        return ScaleXTimeline.fromPointer(buffer[index].cast());
-      case 'spine_scale_y_timeline':
-        return ScaleYTimeline.fromPointer(buffer[index].cast());
-      case 'spine_shear_x_timeline':
-        return ShearXTimeline.fromPointer(buffer[index].cast());
-      case 'spine_shear_y_timeline':
-        return ShearYTimeline.fromPointer(buffer[index].cast());
-      case 'spine_translate_x_timeline':
-        return TranslateXTimeline.fromPointer(buffer[index].cast());
-      case 'spine_translate_y_timeline':
-        return TranslateYTimeline.fromPointer(buffer[index].cast());
+      case 'spine_attachment_timeline':
+        return AttachmentTimeline.fromPointer(buffer[index].cast());
+      case 'spine_deform_timeline':
+        return DeformTimeline.fromPointer(buffer[index].cast());
+      case 'spine_draw_order_timeline':
+        return DrawOrderTimeline.fromPointer(buffer[index].cast());
+      case 'spine_event_timeline':
+        return EventTimeline.fromPointer(buffer[index].cast());
+      case 'spine_ik_constraint_timeline':
+        return IkConstraintTimeline.fromPointer(buffer[index].cast());
+      case 'spine_inherit_timeline':
+        return InheritTimeline.fromPointer(buffer[index].cast());
+      case 'spine_path_constraint_mix_timeline':
+        return PathConstraintMixTimeline.fromPointer(buffer[index].cast());
       case 'spine_path_constraint_position_timeline':
       case 'spine_path_constraint_position_timeline':
         return PathConstraintPositionTimeline.fromPointer(buffer[index].cast());
         return PathConstraintPositionTimeline.fromPointer(buffer[index].cast());
       case 'spine_path_constraint_spacing_timeline':
       case 'spine_path_constraint_spacing_timeline':
         return PathConstraintSpacingTimeline.fromPointer(buffer[index].cast());
         return PathConstraintSpacingTimeline.fromPointer(buffer[index].cast());
-      case 'spine_slider_mix_timeline':
-        return SliderMixTimeline.fromPointer(buffer[index].cast());
-      case 'spine_slider_timeline':
-        return SliderTimeline.fromPointer(buffer[index].cast());
       case 'spine_physics_constraint_damping_timeline':
       case 'spine_physics_constraint_damping_timeline':
-        return PhysicsConstraintDampingTimeline.fromPointer(buffer[index].cast());
+        return PhysicsConstraintDampingTimeline.fromPointer(
+            buffer[index].cast());
       case 'spine_physics_constraint_gravity_timeline':
       case 'spine_physics_constraint_gravity_timeline':
-        return PhysicsConstraintGravityTimeline.fromPointer(buffer[index].cast());
+        return PhysicsConstraintGravityTimeline.fromPointer(
+            buffer[index].cast());
       case 'spine_physics_constraint_inertia_timeline':
       case 'spine_physics_constraint_inertia_timeline':
-        return PhysicsConstraintInertiaTimeline.fromPointer(buffer[index].cast());
+        return PhysicsConstraintInertiaTimeline.fromPointer(
+            buffer[index].cast());
       case 'spine_physics_constraint_mass_timeline':
       case 'spine_physics_constraint_mass_timeline':
         return PhysicsConstraintMassTimeline.fromPointer(buffer[index].cast());
         return PhysicsConstraintMassTimeline.fromPointer(buffer[index].cast());
       case 'spine_physics_constraint_mix_timeline':
       case 'spine_physics_constraint_mix_timeline':
         return PhysicsConstraintMixTimeline.fromPointer(buffer[index].cast());
         return PhysicsConstraintMixTimeline.fromPointer(buffer[index].cast());
+      case 'spine_physics_constraint_reset_timeline':
+        return PhysicsConstraintResetTimeline.fromPointer(buffer[index].cast());
       case 'spine_physics_constraint_strength_timeline':
       case 'spine_physics_constraint_strength_timeline':
-        return PhysicsConstraintStrengthTimeline.fromPointer(buffer[index].cast());
+        return PhysicsConstraintStrengthTimeline.fromPointer(
+            buffer[index].cast());
       case 'spine_physics_constraint_wind_timeline':
       case 'spine_physics_constraint_wind_timeline':
         return PhysicsConstraintWindTimeline.fromPointer(buffer[index].cast());
         return PhysicsConstraintWindTimeline.fromPointer(buffer[index].cast());
-      case 'spine_scale_timeline':
-        return ScaleTimeline.fromPointer(buffer[index].cast());
-      case 'spine_shear_timeline':
-        return ShearTimeline.fromPointer(buffer[index].cast());
-      case 'spine_translate_timeline':
-        return TranslateTimeline.fromPointer(buffer[index].cast());
-      case 'spine_ik_constraint_timeline':
-        return IkConstraintTimeline.fromPointer(buffer[index].cast());
-      case 'spine_path_constraint_mix_timeline':
-        return PathConstraintMixTimeline.fromPointer(buffer[index].cast());
-      case 'spine_deform_timeline':
-        return DeformTimeline.fromPointer(buffer[index].cast());
       case 'spine_rgb2_timeline':
       case 'spine_rgb2_timeline':
         return Rgb2Timeline.fromPointer(buffer[index].cast());
         return Rgb2Timeline.fromPointer(buffer[index].cast());
       case 'spine_rgba2_timeline':
       case 'spine_rgba2_timeline':
@@ -684,32 +753,50 @@ class ArrayTimeline extends NativeArray<Timeline> {
         return RgbaTimeline.fromPointer(buffer[index].cast());
         return RgbaTimeline.fromPointer(buffer[index].cast());
       case 'spine_rgb_timeline':
       case 'spine_rgb_timeline':
         return RgbTimeline.fromPointer(buffer[index].cast());
         return RgbTimeline.fromPointer(buffer[index].cast());
-      case 'spine_transform_constraint_timeline':
-        return TransformConstraintTimeline.fromPointer(buffer[index].cast());
-      case 'spine_draw_order_timeline':
-        return DrawOrderTimeline.fromPointer(buffer[index].cast());
-      case 'spine_event_timeline':
-        return EventTimeline.fromPointer(buffer[index].cast());
-      case 'spine_inherit_timeline':
-        return InheritTimeline.fromPointer(buffer[index].cast());
-      case 'spine_physics_constraint_reset_timeline':
-        return PhysicsConstraintResetTimeline.fromPointer(buffer[index].cast());
+      case 'spine_rotate_timeline':
+        return RotateTimeline.fromPointer(buffer[index].cast());
+      case 'spine_scale_timeline':
+        return ScaleTimeline.fromPointer(buffer[index].cast());
+      case 'spine_scale_x_timeline':
+        return ScaleXTimeline.fromPointer(buffer[index].cast());
+      case 'spine_scale_y_timeline':
+        return ScaleYTimeline.fromPointer(buffer[index].cast());
       case 'spine_sequence_timeline':
       case 'spine_sequence_timeline':
         return SequenceTimeline.fromPointer(buffer[index].cast());
         return SequenceTimeline.fromPointer(buffer[index].cast());
+      case 'spine_shear_timeline':
+        return ShearTimeline.fromPointer(buffer[index].cast());
+      case 'spine_shear_x_timeline':
+        return ShearXTimeline.fromPointer(buffer[index].cast());
+      case 'spine_shear_y_timeline':
+        return ShearYTimeline.fromPointer(buffer[index].cast());
+      case 'spine_slider_mix_timeline':
+        return SliderMixTimeline.fromPointer(buffer[index].cast());
+      case 'spine_slider_timeline':
+        return SliderTimeline.fromPointer(buffer[index].cast());
+      case 'spine_transform_constraint_timeline':
+        return TransformConstraintTimeline.fromPointer(buffer[index].cast());
+      case 'spine_translate_timeline':
+        return TranslateTimeline.fromPointer(buffer[index].cast());
+      case 'spine_translate_x_timeline':
+        return TranslateXTimeline.fromPointer(buffer[index].cast());
+      case 'spine_translate_y_timeline':
+        return TranslateYTimeline.fromPointer(buffer[index].cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class Timeline');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Timeline');
     }
     }
   }
   }
-
 }
 }
 
 
-/// Array of ToProperty elements
+/// ArrayToProperty wrapper
 class ArrayToProperty extends NativeArray<ToProperty> {
 class ArrayToProperty extends NativeArray<ToProperty> {
-  ArrayToProperty.fromPointer(Pointer<spine_array_to_property_wrapper> super.ptr);
+  ArrayToProperty.fromPointer(
+      Pointer<spine_array_to_property_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_to_property_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_to_property_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -717,9 +804,14 @@ class ArrayToProperty extends NativeArray<ToProperty> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_to_property_buffer(nativePtr.cast());
-    final rtti = SpineBindings.bindings.spine_to_property_get_rtti(buffer[index]);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final buffer =
+        SpineBindings.bindings.spine_array_to_property_buffer(nativePtr.cast());
+    final rtti =
+        SpineBindings.bindings.spine_to_property_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
       case 'spine_to_rotate':
       case 'spine_to_rotate':
         return ToRotate.fromPointer(buffer[index].cast());
         return ToRotate.fromPointer(buffer[index].cast());
@@ -734,19 +826,21 @@ class ArrayToProperty extends NativeArray<ToProperty> {
       case 'spine_to_y':
       case 'spine_to_y':
         return ToY.fromPointer(buffer[index].cast());
         return ToY.fromPointer(buffer[index].cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class ToProperty');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class ToProperty');
     }
     }
   }
   }
-
 }
 }
 
 
-/// Array of TrackEntry elements
+/// ArrayTrackEntry wrapper
 class ArrayTrackEntry extends NativeArray<TrackEntry> {
 class ArrayTrackEntry extends NativeArray<TrackEntry> {
-  ArrayTrackEntry.fromPointer(Pointer<spine_array_track_entry_wrapper> super.ptr);
+  ArrayTrackEntry.fromPointer(
+      Pointer<spine_array_track_entry_wrapper> super.ptr);
 
 
   @override
   @override
   int get length {
   int get length {
-    return SpineBindings.bindings.spine_array_track_entry_size(nativePtr.cast());
+    return SpineBindings.bindings
+        .spine_array_track_entry_size(nativePtr.cast());
   }
   }
 
 
   @override
   @override
@@ -754,13 +848,13 @@ class ArrayTrackEntry extends NativeArray<TrackEntry> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_track_entry_buffer(nativePtr.cast());
+    final buffer =
+        SpineBindings.bindings.spine_array_track_entry_buffer(nativePtr.cast());
     return TrackEntry.fromPointer(buffer[index]);
     return TrackEntry.fromPointer(buffer[index]);
   }
   }
-
 }
 }
 
 
-/// Array of Update elements
+/// ArrayUpdate wrapper
 class ArrayUpdate extends NativeArray<Update> {
 class ArrayUpdate extends NativeArray<Update> {
   ArrayUpdate.fromPointer(Pointer<spine_array_update_wrapper> super.ptr);
   ArrayUpdate.fromPointer(Pointer<spine_array_update_wrapper> super.ptr);
 
 
@@ -774,8 +868,31 @@ class ArrayUpdate extends NativeArray<Update> {
     if (index < 0 || index >= length) {
     if (index < 0 || index >= length) {
       throw RangeError.index(index, this, 'index');
       throw RangeError.index(index, this, 'index');
     }
     }
-    final buffer = SpineBindings.bindings.spine_array_update_buffer(nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Update from pointer - no concrete subclasses found');
+    final buffer =
+        SpineBindings.bindings.spine_array_update_buffer(nativePtr.cast());
+    final rtti = SpineBindings.bindings.spine_update_get_rtti(buffer[index]);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_bone':
+        return Bone.fromPointer(buffer[index].cast());
+      case 'spine_bone_pose':
+        return BonePose.fromPointer(buffer[index].cast());
+      case 'spine_ik_constraint':
+        return IkConstraint.fromPointer(buffer[index].cast());
+      case 'spine_path_constraint':
+        return PathConstraint.fromPointer(buffer[index].cast());
+      case 'spine_physics_constraint':
+        return PhysicsConstraint.fromPointer(buffer[index].cast());
+      case 'spine_slider':
+        return Slider.fromPointer(buffer[index].cast());
+      case 'spine_transform_constraint':
+        return TransformConstraint.fromPointer(buffer[index].cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Update');
+    }
   }
   }
-
-}
+}

+ 5 - 5
spine-flutter/lib/generated/atlas.dart

@@ -31,10 +31,10 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'atlas_region.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'atlas_region.dart';
 
 
 /// Atlas wrapper
 /// Atlas wrapper
 class Atlas implements Finalizable {
 class Atlas implements Finalizable {
@@ -50,7 +50,8 @@ class Atlas implements Finalizable {
   }
   }
 
 
   AtlasRegion findRegion(String name) {
   AtlasRegion findRegion(String name) {
-    final result = SpineBindings.bindings.spine_atlas_find_region(_ptr, name.toNativeUtf8().cast<Char>());
+    final result = SpineBindings.bindings
+        .spine_atlas_find_region(_ptr, name.toNativeUtf8().cast<Char>());
     return AtlasRegion.fromPointer(result);
     return AtlasRegion.fromPointer(result);
   }
   }
 
 
@@ -63,5 +64,4 @@ class Atlas implements Finalizable {
     final result = SpineBindings.bindings.spine_atlas_get_regions(_ptr);
     final result = SpineBindings.bindings.spine_atlas_get_regions(_ptr);
     return ArrayAtlasRegion.fromPointer(result);
     return ArrayAtlasRegion.fromPointer(result);
   }
   }
-
-}
+}

+ 76 - 12
spine-flutter/lib/generated/atlas_attachment_loader.dart

@@ -31,34 +31,98 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'attachment_loader.dart';
-import 'atlas_region.dart';
 import 'atlas.dart';
 import 'atlas.dart';
+import 'atlas_region.dart';
+import 'attachment_loader.dart';
+import 'bounding_box_attachment.dart';
+import 'clipping_attachment.dart';
+import 'mesh_attachment.dart';
+import 'path_attachment.dart';
+import 'point_attachment.dart';
+import 'region_attachment.dart';
+import 'sequence.dart';
+import 'skin.dart';
 
 
 /// AtlasAttachmentLoader wrapper
 /// AtlasAttachmentLoader wrapper
-class AtlasAttachmentLoader extends AttachmentLoader {
+class AtlasAttachmentLoader implements Finalizable, AttachmentLoader {
   final Pointer<spine_atlas_attachment_loader_wrapper> _ptr;
   final Pointer<spine_atlas_attachment_loader_wrapper> _ptr;
 
 
-  AtlasAttachmentLoader.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  AtlasAttachmentLoader.fromPointer(this._ptr);
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AtlasAttachmentLoader(Atlas atlas) {
   factory AtlasAttachmentLoader(Atlas atlas) {
-    final ptr = SpineBindings.bindings.spine_atlas_attachment_loader_create(atlas.nativePtr.cast());
+    final ptr = SpineBindings.bindings
+        .spine_atlas_attachment_loader_create(atlas.nativePtr.cast());
     return AtlasAttachmentLoader.fromPointer(ptr);
     return AtlasAttachmentLoader.fromPointer(ptr);
   }
   }
 
 
-  AtlasRegion findRegion(String name) {
-    final result = SpineBindings.bindings.spine_atlas_attachment_loader_find_region(_ptr, name.toNativeUtf8().cast<Char>());
-    return AtlasRegion.fromPointer(result);
+  @override
+  RegionAttachment newRegionAttachment(
+      Skin skin, String name, String path, Sequence sequence) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_region_attachment(
+            _ptr,
+            skin.nativePtr.cast(),
+            name.toNativeUtf8().cast<Char>(),
+            path.toNativeUtf8().cast<Char>(),
+            sequence.nativePtr.cast());
+    return RegionAttachment.fromPointer(result);
+  }
+
+  @override
+  MeshAttachment newMeshAttachment(
+      Skin skin, String name, String path, Sequence sequence) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_mesh_attachment(
+            _ptr,
+            skin.nativePtr.cast(),
+            name.toNativeUtf8().cast<Char>(),
+            path.toNativeUtf8().cast<Char>(),
+            sequence.nativePtr.cast());
+    return MeshAttachment.fromPointer(result);
   }
   }
 
 
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_atlas_attachment_loader_dispose(_ptr);
+  BoundingBoxAttachment newBoundingBoxAttachment(Skin skin, String name) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_bounding_box_attachment(
+            _ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
+    return BoundingBoxAttachment.fromPointer(result);
+  }
+
+  @override
+  PathAttachment newPathAttachment(Skin skin, String name) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_path_attachment(
+            _ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
+    return PathAttachment.fromPointer(result);
+  }
+
+  @override
+  PointAttachment newPointAttachment(Skin skin, String name) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_point_attachment(
+            _ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
+    return PointAttachment.fromPointer(result);
+  }
+
+  @override
+  ClippingAttachment newClippingAttachment(Skin skin, String name) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_new_clipping_attachment(
+            _ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
+    return ClippingAttachment.fromPointer(result);
+  }
+
+  AtlasRegion findRegion(String name) {
+    final result = SpineBindings.bindings
+        .spine_atlas_attachment_loader_find_region(
+            _ptr, name.toNativeUtf8().cast<Char>());
+    return AtlasRegion.fromPointer(result);
   }
   }
-}
+}

+ 13 - 8
spine-flutter/lib/generated/atlas_page.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'format.dart';
 import 'format.dart';
 import 'texture_filter.dart';
 import 'texture_filter.dart';
@@ -47,7 +47,8 @@ class AtlasPage implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AtlasPage(String inName) {
   factory AtlasPage(String inName) {
-    final ptr = SpineBindings.bindings.spine_atlas_page_create(inName.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_atlas_page_create(inName.toNativeUtf8().cast<Char>());
     return AtlasPage.fromPointer(ptr);
     return AtlasPage.fromPointer(ptr);
   }
   }
 
 
@@ -57,16 +58,19 @@ class AtlasPage implements Finalizable {
   }
   }
 
 
   set name(String value) {
   set name(String value) {
-    SpineBindings.bindings.spine_atlas_page_set_name(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings
+        .spine_atlas_page_set_name(_ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   String get texturePath {
   String get texturePath {
-    final result = SpineBindings.bindings.spine_atlas_page_get_texture_path(_ptr);
+    final result =
+        SpineBindings.bindings.spine_atlas_page_get_texture_path(_ptr);
     return result.cast<Utf8>().toDartString();
     return result.cast<Utf8>().toDartString();
   }
   }
 
 
   set texturePath(String value) {
   set texturePath(String value) {
-    SpineBindings.bindings.spine_atlas_page_set_texture_path(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings.spine_atlas_page_set_texture_path(
+        _ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   Format get format {
   Format get format {
@@ -150,7 +154,8 @@ class AtlasPage implements Finalizable {
     SpineBindings.bindings.spine_atlas_page_set_index(_ptr, value);
     SpineBindings.bindings.spine_atlas_page_set_index(_ptr, value);
   }
   }
 
 
-  void dispose() {
-    SpineBindings.bindings.spine_atlas_page_dispose(_ptr);
+  Pointer<Void> get texture {
+    final result = SpineBindings.bindings.spine_atlas_page_get_texture(_ptr);
+    return result;
   }
   }
-}
+}

+ 27 - 18
spine-flutter/lib/generated/atlas_region.dart

@@ -31,11 +31,11 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'texture_region.dart';
-import 'atlas_page.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'atlas_page.dart';
+import 'texture_region.dart';
 
 
 /// AtlasRegion wrapper
 /// AtlasRegion wrapper
 class AtlasRegion extends TextureRegion {
 class AtlasRegion extends TextureRegion {
@@ -57,6 +57,11 @@ class AtlasRegion extends TextureRegion {
     return AtlasPage.fromPointer(result);
     return AtlasPage.fromPointer(result);
   }
   }
 
 
+  String get name {
+    final result = SpineBindings.bindings.spine_atlas_region_get_name(_ptr);
+    return result.cast<Utf8>().toDartString();
+  }
+
   int get index {
   int get index {
     final result = SpineBindings.bindings.spine_atlas_region_get_index(_ptr);
     final result = SpineBindings.bindings.spine_atlas_region_get_index(_ptr);
     return result;
     return result;
@@ -83,22 +88,26 @@ class AtlasRegion extends TextureRegion {
   }
   }
 
 
   int get packedWidth {
   int get packedWidth {
-    final result = SpineBindings.bindings.spine_atlas_region_get_packed_width(_ptr);
+    final result =
+        SpineBindings.bindings.spine_atlas_region_get_packed_width(_ptr);
     return result;
     return result;
   }
   }
 
 
   int get packedHeight {
   int get packedHeight {
-    final result = SpineBindings.bindings.spine_atlas_region_get_packed_height(_ptr);
+    final result =
+        SpineBindings.bindings.spine_atlas_region_get_packed_height(_ptr);
     return result;
     return result;
   }
   }
 
 
   int get originalWidth {
   int get originalWidth {
-    final result = SpineBindings.bindings.spine_atlas_region_get_original_width(_ptr);
+    final result =
+        SpineBindings.bindings.spine_atlas_region_get_original_width(_ptr);
     return result;
     return result;
   }
   }
 
 
   int get originalHeight {
   int get originalHeight {
-    final result = SpineBindings.bindings.spine_atlas_region_get_original_height(_ptr);
+    final result =
+        SpineBindings.bindings.spine_atlas_region_get_original_height(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -128,11 +137,13 @@ class AtlasRegion extends TextureRegion {
   }
   }
 
 
   set page(AtlasPage value) {
   set page(AtlasPage value) {
-    SpineBindings.bindings.spine_atlas_region_set_page(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_atlas_region_set_page(_ptr, value.nativePtr.cast());
   }
   }
 
 
   set name(String value) {
   set name(String value) {
-    SpineBindings.bindings.spine_atlas_region_set_name(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings
+        .spine_atlas_region_set_name(_ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   set index(int value) {
   set index(int value) {
@@ -180,19 +191,17 @@ class AtlasRegion extends TextureRegion {
   }
   }
 
 
   set splits(ArrayInt value) {
   set splits(ArrayInt value) {
-    SpineBindings.bindings.spine_atlas_region_set_splits(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_atlas_region_set_splits(_ptr, value.nativePtr.cast());
   }
   }
 
 
   set pads(ArrayInt value) {
   set pads(ArrayInt value) {
-    SpineBindings.bindings.spine_atlas_region_set_pads(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_atlas_region_set_pads(_ptr, value.nativePtr.cast());
   }
   }
 
 
   set values(ArrayFloat value) {
   set values(ArrayFloat value) {
-    SpineBindings.bindings.spine_atlas_region_set_values(_ptr, value.nativePtr.cast());
-  }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_atlas_region_dispose(_ptr);
+    SpineBindings.bindings
+        .spine_atlas_region_set_values(_ptr, value.nativePtr.cast());
   }
   }
-}
+}

+ 14 - 14
spine-flutter/lib/generated/attachment.dart

@@ -31,15 +31,15 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'point_attachment.dart';
-import 'region_attachment.dart';
 import 'bounding_box_attachment.dart';
 import 'bounding_box_attachment.dart';
 import 'clipping_attachment.dart';
 import 'clipping_attachment.dart';
 import 'mesh_attachment.dart';
 import 'mesh_attachment.dart';
 import 'path_attachment.dart';
 import 'path_attachment.dart';
+import 'point_attachment.dart';
+import 'region_attachment.dart';
 
 
 /// Attachment wrapper
 /// Attachment wrapper
 abstract class Attachment implements Finalizable {
 abstract class Attachment implements Finalizable {
@@ -63,12 +63,11 @@ abstract class Attachment implements Finalizable {
   Attachment copy() {
   Attachment copy() {
     final result = SpineBindings.bindings.spine_attachment_copy(_ptr);
     final result = SpineBindings.bindings.spine_attachment_copy(_ptr);
     final rtti = SpineBindings.bindings.spine_attachment_get_rtti(result);
     final rtti = SpineBindings.bindings.spine_attachment_get_rtti(result);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
-      case 'spine_point_attachment':
-        return PointAttachment.fromPointer(result.cast());
-      case 'spine_region_attachment':
-        return RegionAttachment.fromPointer(result.cast());
       case 'spine_bounding_box_attachment':
       case 'spine_bounding_box_attachment':
         return BoundingBoxAttachment.fromPointer(result.cast());
         return BoundingBoxAttachment.fromPointer(result.cast());
       case 'spine_clipping_attachment':
       case 'spine_clipping_attachment':
@@ -77,8 +76,13 @@ abstract class Attachment implements Finalizable {
         return MeshAttachment.fromPointer(result.cast());
         return MeshAttachment.fromPointer(result.cast());
       case 'spine_path_attachment':
       case 'spine_path_attachment':
         return PathAttachment.fromPointer(result.cast());
         return PathAttachment.fromPointer(result.cast());
+      case 'spine_point_attachment':
+        return PointAttachment.fromPointer(result.cast());
+      case 'spine_region_attachment':
+        return RegionAttachment.fromPointer(result.cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class Attachment');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Attachment');
     }
     }
   }
   }
 
 
@@ -99,8 +103,4 @@ abstract class Attachment implements Finalizable {
     final result = SpineBindings.bindings.spine_attachment_rtti();
     final result = SpineBindings.bindings.spine_attachment_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_attachment_dispose(_ptr);
-  }
-}
+}

+ 16 - 50
spine-flutter/lib/generated/attachment_loader.dart

@@ -30,58 +30,24 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
-import '../spine_bindings.dart';
-import 'region_attachment.dart';
-import 'skin.dart';
-import 'sequence.dart';
-import 'mesh_attachment.dart';
 import 'bounding_box_attachment.dart';
 import 'bounding_box_attachment.dart';
+import 'clipping_attachment.dart';
+import 'mesh_attachment.dart';
 import 'path_attachment.dart';
 import 'path_attachment.dart';
 import 'point_attachment.dart';
 import 'point_attachment.dart';
-import 'clipping_attachment.dart';
+import 'region_attachment.dart';
+import 'sequence.dart';
+import 'skin.dart';
 
 
 /// AttachmentLoader wrapper
 /// AttachmentLoader wrapper
-abstract class AttachmentLoader implements Finalizable {
-  final Pointer<spine_attachment_loader_wrapper> _ptr;
-
-  AttachmentLoader.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  RegionAttachment newRegionAttachment(Skin skin, String name, String path, Sequence sequence) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_region_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>(), path.toNativeUtf8().cast<Char>(), sequence.nativePtr.cast());
-    return RegionAttachment.fromPointer(result);
-  }
-
-  MeshAttachment newMeshAttachment(Skin skin, String name, String path, Sequence sequence) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_mesh_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>(), path.toNativeUtf8().cast<Char>(), sequence.nativePtr.cast());
-    return MeshAttachment.fromPointer(result);
-  }
-
-  BoundingBoxAttachment newBoundingBoxAttachment(Skin skin, String name) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_bounding_box_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
-    return BoundingBoxAttachment.fromPointer(result);
-  }
-
-  PathAttachment newPathAttachment(Skin skin, String name) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_path_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
-    return PathAttachment.fromPointer(result);
-  }
-
-  PointAttachment newPointAttachment(Skin skin, String name) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_point_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
-    return PointAttachment.fromPointer(result);
-  }
-
-  ClippingAttachment newClippingAttachment(Skin skin, String name) {
-    final result = SpineBindings.bindings.spine_attachment_loader_new_clipping_attachment(_ptr, skin.nativePtr.cast(), name.toNativeUtf8().cast<Char>());
-    return ClippingAttachment.fromPointer(result);
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_attachment_loader_dispose(_ptr);
-  }
-}
+abstract class AttachmentLoader {
+  Pointer get nativePtr;
+  RegionAttachment newRegionAttachment(
+      Skin skin, String name, String path, Sequence sequence);
+  MeshAttachment newMeshAttachment(
+      Skin skin, String name, String path, Sequence sequence);
+  BoundingBoxAttachment newBoundingBoxAttachment(Skin skin, String name);
+  PathAttachment newPathAttachment(Skin skin, String name);
+  PointAttachment newPointAttachment(Skin skin, String name);
+  ClippingAttachment newClippingAttachment(Skin skin, String name);
+}

+ 14 - 12
spine-flutter/lib/generated/attachment_timeline.dart

@@ -31,12 +31,13 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'slot_timeline.dart';
 import 'timeline.dart';
 import 'timeline.dart';
 
 
 /// AttachmentTimeline wrapper
 /// AttachmentTimeline wrapper
-class AttachmentTimeline extends Timeline {
+class AttachmentTimeline extends Timeline implements SlotTimeline {
   final Pointer<spine_attachment_timeline_wrapper> _ptr;
   final Pointer<spine_attachment_timeline_wrapper> _ptr;
 
 
   AttachmentTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   AttachmentTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -46,25 +47,26 @@ class AttachmentTimeline extends Timeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory AttachmentTimeline(int frameCount, int slotIndex) {
   factory AttachmentTimeline(int frameCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_attachment_timeline_create(frameCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_attachment_timeline_create(frameCount, slotIndex);
     return AttachmentTimeline.fromPointer(ptr);
     return AttachmentTimeline.fromPointer(ptr);
   }
   }
 
 
   void setFrame(int frame, double time, String attachmentName) {
   void setFrame(int frame, double time, String attachmentName) {
-    SpineBindings.bindings.spine_attachment_timeline_set_frame(_ptr, frame, time, attachmentName.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings.spine_attachment_timeline_set_frame(
+        _ptr, frame, time, attachmentName.toNativeUtf8().cast<Char>());
   }
   }
 
 
+  @override
   int get slotIndex {
   int get slotIndex {
-    final result = SpineBindings.bindings.spine_attachment_timeline_get_slot_index(_ptr);
+    final result =
+        SpineBindings.bindings.spine_attachment_timeline_get_slot_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set slotIndex(int value) {
-    SpineBindings.bindings.spine_attachment_timeline_set_slot_index(_ptr, value);
-  }
-
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_attachment_timeline_dispose(_ptr);
+  set slotIndex(int value) {
+    SpineBindings.bindings
+        .spine_attachment_timeline_set_slot_index(_ptr, value);
   }
   }
-}
+}

+ 7 - 7
spine-flutter/lib/generated/attachment_type.dart

@@ -32,12 +32,12 @@
 /// AttachmentType enum
 /// AttachmentType enum
 enum AttachmentType {
 enum AttachmentType {
   region(0),
   region(0),
-  boundingbox(1),
-  mesh(2),
-  linkedmesh(3),
-  path(4),
-  point(5),
-  clipping(6);
+  boundingbox(0),
+  mesh(0),
+  linkedmesh(0),
+  path(0),
+  point(0),
+  clipping(0);
 
 
   const AttachmentType(this.value);
   const AttachmentType(this.value);
   final int value;
   final int value;
@@ -48,4 +48,4 @@ enum AttachmentType {
       orElse: () => throw ArgumentError('Invalid AttachmentType value: $value'),
       orElse: () => throw ArgumentError('Invalid AttachmentType value: $value'),
     );
     );
   }
   }
-}
+}

+ 4 - 4
spine-flutter/lib/generated/blend_mode.dart

@@ -32,9 +32,9 @@
 /// BlendMode enum
 /// BlendMode enum
 enum BlendMode {
 enum BlendMode {
   normal(0),
   normal(0),
-  additive(1),
-  multiply(2),
-  screen(3);
+  additive(0),
+  multiply(0),
+  screen(0);
 
 
   const BlendMode(this.value);
   const BlendMode(this.value);
   final int value;
   final int value;
@@ -45,4 +45,4 @@ enum BlendMode {
       orElse: () => throw ArgumentError('Invalid BlendMode value: $value'),
       orElse: () => throw ArgumentError('Invalid BlendMode value: $value'),
     );
     );
   }
   }
-}
+}

+ 22 - 16
spine-flutter/lib/generated/bone.dart

@@ -30,19 +30,21 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'posed_active.dart';
-import 'skeleton.dart';
-import 'physics.dart';
+import 'arrays.dart';
 import 'bone_data.dart';
 import 'bone_data.dart';
 import 'bone_local.dart';
 import 'bone_local.dart';
 import 'bone_pose.dart';
 import 'bone_pose.dart';
-import 'arrays.dart';
+import 'physics.dart';
+import 'posed.dart';
+import 'posed_active.dart';
+import 'skeleton.dart';
+import 'update.dart';
 
 
 /// Bone wrapper
 /// Bone wrapper
-class Bone extends PosedActive {
+class Bone extends PosedActive implements Posed, Update {
   final Pointer<spine_bone_wrapper> _ptr;
   final Pointer<spine_bone_wrapper> _ptr;
 
 
   Bone.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   Bone.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -52,15 +54,18 @@ class Bone extends PosedActive {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory Bone(BoneData data, Bone parent) {
   factory Bone(BoneData data, Bone parent) {
-    final ptr = SpineBindings.bindings.spine_bone_create(data.nativePtr.cast(), parent.nativePtr.cast());
+    final ptr = SpineBindings.bindings
+        .spine_bone_create(data.nativePtr.cast(), parent.nativePtr.cast());
     return Bone.fromPointer(ptr);
     return Bone.fromPointer(ptr);
   }
   }
 
 
   factory Bone.from(Bone bone, Bone parent) {
   factory Bone.from(Bone bone, Bone parent) {
-    final ptr = SpineBindings.bindings.spine_bone_create2(bone.nativePtr.cast(), parent.nativePtr.cast());
+    final ptr = SpineBindings.bindings
+        .spine_bone_create2(bone.nativePtr.cast(), parent.nativePtr.cast());
     return Bone.fromPointer(ptr);
     return Bone.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
     final result = SpineBindings.bindings.spine_bone_get_rtti(_ptr);
     final result = SpineBindings.bindings.spine_bone_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
@@ -85,8 +90,10 @@ class Bone extends PosedActive {
     SpineBindings.bindings.spine_bone_set_y_down(value);
     SpineBindings.bindings.spine_bone_set_y_down(value);
   }
   }
 
 
+  @override
   void update(Skeleton skeleton, Physics physics) {
   void update(Skeleton skeleton, Physics physics) {
-    SpineBindings.bindings.spine_bone_update(_ptr, skeleton.nativePtr.cast(), physics.value);
+    SpineBindings.bindings
+        .spine_bone_update(_ptr, skeleton.nativePtr.cast(), physics.value);
   }
   }
 
 
   BoneData get data {
   BoneData get data {
@@ -104,16 +111,20 @@ class Bone extends PosedActive {
     return BonePose.fromPointer(result);
     return BonePose.fromPointer(result);
   }
   }
 
 
+  @override
   void resetConstrained() {
   void resetConstrained() {
     SpineBindings.bindings.spine_bone_reset_constrained(_ptr);
     SpineBindings.bindings.spine_bone_reset_constrained(_ptr);
   }
   }
 
 
+  @override
   void constrained() {
   void constrained() {
     SpineBindings.bindings.spine_bone_constrained(_ptr);
     SpineBindings.bindings.spine_bone_constrained(_ptr);
   }
   }
 
 
+  @override
   bool get isPoseEqualToApplied {
   bool get isPoseEqualToApplied {
-    final result = SpineBindings.bindings.spine_bone_is_pose_equal_to_applied(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_is_pose_equal_to_applied(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -121,9 +132,4 @@ class Bone extends PosedActive {
     final result = SpineBindings.bindings.spine_bone_rtti();
     final result = SpineBindings.bindings.spine_bone_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_bone_dispose(_ptr);
-  }
-}
+}

+ 11 - 25
spine-flutter/lib/generated/bone_data.dart

@@ -31,22 +31,25 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'color.dart';
 import 'bone_local.dart';
 import 'bone_local.dart';
+import 'color.dart';
+import 'posed_data.dart';
 
 
 /// BoneData wrapper
 /// BoneData wrapper
-class BoneData implements Finalizable {
+class BoneData extends PosedData {
   final Pointer<spine_bone_data_wrapper> _ptr;
   final Pointer<spine_bone_data_wrapper> _ptr;
 
 
-  BoneData.fromPointer(this._ptr);
+  BoneData.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory BoneData(int index, String name, BoneData parent) {
   factory BoneData(int index, String name, BoneData parent) {
-    final ptr = SpineBindings.bindings.spine_bone_data_create(index, name.toNativeUtf8().cast<Char>(), parent.nativePtr.cast());
+    final ptr = SpineBindings.bindings.spine_bone_data_create(
+        index, name.toNativeUtf8().cast<Char>(), parent.nativePtr.cast());
     return BoneData.fromPointer(ptr);
     return BoneData.fromPointer(ptr);
   }
   }
 
 
@@ -80,7 +83,8 @@ class BoneData implements Finalizable {
   }
   }
 
 
   set icon(String value) {
   set icon(String value) {
-    SpineBindings.bindings.spine_bone_data_set_icon(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings
+        .spine_bone_data_set_icon(_ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   bool get visible {
   bool get visible {
@@ -96,22 +100,4 @@ class BoneData implements Finalizable {
     final result = SpineBindings.bindings.spine_bone_data_get_setup_pose(_ptr);
     final result = SpineBindings.bindings.spine_bone_data_get_setup_pose(_ptr);
     return BoneLocal.fromPointer(result);
     return BoneLocal.fromPointer(result);
   }
   }
-
-  String get name {
-    final result = SpineBindings.bindings.spine_bone_data_get_name(_ptr);
-    return result.cast<Utf8>().toDartString();
-  }
-
-  bool get skinRequired {
-    final result = SpineBindings.bindings.spine_bone_data_get_skin_required(_ptr);
-    return result;
-  }
-
-  set skinRequired(bool value) {
-    SpineBindings.bindings.spine_bone_data_set_skin_required(_ptr, value);
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_bone_data_dispose(_ptr);
-  }
-}
+}

+ 3 - 7
spine-flutter/lib/generated/bone_local.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'inherit.dart';
 import 'inherit.dart';
 
 
@@ -128,15 +128,11 @@ class BoneLocal implements Finalizable {
     SpineBindings.bindings.spine_bone_local_set_inherit(_ptr, value.value);
     SpineBindings.bindings.spine_bone_local_set_inherit(_ptr, value.value);
   }
   }
 
 
-  void setScale1(double scaleX, double scaleY) {
+  void setScale(double scaleX, double scaleY) {
     SpineBindings.bindings.spine_bone_local_set_scale_1(_ptr, scaleX, scaleY);
     SpineBindings.bindings.spine_bone_local_set_scale_1(_ptr, scaleX, scaleY);
   }
   }
 
 
   set scale2(double value) {
   set scale2(double value) {
     SpineBindings.bindings.spine_bone_local_set_scale_2(_ptr, value);
     SpineBindings.bindings.spine_bone_local_set_scale_2(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_bone_local_dispose(_ptr);
-  }
-}
+}

+ 29 - 20
spine-flutter/lib/generated/bone_pose.dart

@@ -30,15 +30,16 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
 import 'bone_local.dart';
 import 'bone_local.dart';
-import 'skeleton.dart';
 import 'physics.dart';
 import 'physics.dart';
+import 'skeleton.dart';
+import 'update.dart';
 
 
 /// BonePose wrapper
 /// BonePose wrapper
-class BonePose extends BoneLocal {
+class BonePose extends BoneLocal implements Update {
   final Pointer<spine_bone_pose_wrapper> _ptr;
   final Pointer<spine_bone_pose_wrapper> _ptr;
 
 
   BonePose.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   BonePose.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -52,29 +53,36 @@ class BonePose extends BoneLocal {
     return BonePose.fromPointer(ptr);
     return BonePose.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
     final result = SpineBindings.bindings.spine_bone_pose_get_rtti(_ptr);
     final result = SpineBindings.bindings.spine_bone_pose_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
+  @override
   void update(Skeleton skeleton, Physics physics) {
   void update(Skeleton skeleton, Physics physics) {
-    SpineBindings.bindings.spine_bone_pose_update(_ptr, skeleton.nativePtr.cast(), physics.value);
+    SpineBindings.bindings
+        .spine_bone_pose_update(_ptr, skeleton.nativePtr.cast(), physics.value);
   }
   }
 
 
   void updateWorldTransform(Skeleton skeleton) {
   void updateWorldTransform(Skeleton skeleton) {
-    SpineBindings.bindings.spine_bone_pose_update_world_transform(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings.spine_bone_pose_update_world_transform(
+        _ptr, skeleton.nativePtr.cast());
   }
   }
 
 
   void updateLocalTransform(Skeleton skeleton) {
   void updateLocalTransform(Skeleton skeleton) {
-    SpineBindings.bindings.spine_bone_pose_update_local_transform(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings.spine_bone_pose_update_local_transform(
+        _ptr, skeleton.nativePtr.cast());
   }
   }
 
 
   void validateLocalTransform(Skeleton skeleton) {
   void validateLocalTransform(Skeleton skeleton) {
-    SpineBindings.bindings.spine_bone_pose_validate_local_transform(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings.spine_bone_pose_validate_local_transform(
+        _ptr, skeleton.nativePtr.cast());
   }
   }
 
 
   void modifyLocal(Skeleton skeleton) {
   void modifyLocal(Skeleton skeleton) {
-    SpineBindings.bindings.spine_bone_pose_modify_local(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_bone_pose_modify_local(_ptr, skeleton.nativePtr.cast());
   }
   }
 
 
   void modifyWorld(int update) {
   void modifyWorld(int update) {
@@ -140,32 +148,38 @@ class BonePose extends BoneLocal {
   }
   }
 
 
   double get worldRotationX {
   double get worldRotationX {
-    final result = SpineBindings.bindings.spine_bone_pose_get_world_rotation_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_pose_get_world_rotation_x(_ptr);
     return result;
     return result;
   }
   }
 
 
   double get worldRotationY {
   double get worldRotationY {
-    final result = SpineBindings.bindings.spine_bone_pose_get_world_rotation_y(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_pose_get_world_rotation_y(_ptr);
     return result;
     return result;
   }
   }
 
 
   double get worldScaleX {
   double get worldScaleX {
-    final result = SpineBindings.bindings.spine_bone_pose_get_world_scale_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_pose_get_world_scale_x(_ptr);
     return result;
     return result;
   }
   }
 
 
   double get worldScaleY {
   double get worldScaleY {
-    final result = SpineBindings.bindings.spine_bone_pose_get_world_scale_y(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_pose_get_world_scale_y(_ptr);
     return result;
     return result;
   }
   }
 
 
   double worldToLocalRotation(double worldRotation) {
   double worldToLocalRotation(double worldRotation) {
-    final result = SpineBindings.bindings.spine_bone_pose_world_to_local_rotation(_ptr, worldRotation);
+    final result = SpineBindings.bindings
+        .spine_bone_pose_world_to_local_rotation(_ptr, worldRotation);
     return result;
     return result;
   }
   }
 
 
   double localToWorldRotation(double localRotation) {
   double localToWorldRotation(double localRotation) {
-    final result = SpineBindings.bindings.spine_bone_pose_local_to_world_rotation(_ptr, localRotation);
+    final result = SpineBindings.bindings
+        .spine_bone_pose_local_to_world_rotation(_ptr, localRotation);
     return result;
     return result;
   }
   }
 
 
@@ -177,9 +191,4 @@ class BonePose extends BoneLocal {
     final result = SpineBindings.bindings.spine_bone_pose_rtti();
     final result = SpineBindings.bindings.spine_bone_pose_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_bone_pose_dispose(_ptr);
-  }
-}
+}

+ 6 - 28
spine-flutter/lib/generated/bone_timeline.dart

@@ -30,39 +30,17 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
 
 
 /// BoneTimeline wrapper
 /// BoneTimeline wrapper
-class BoneTimeline implements Finalizable {
-  final Pointer<spine_bone_timeline_wrapper> _ptr;
-
-  BoneTimeline.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  Rtti get rtti {
-    final result = SpineBindings.bindings.spine_bone_timeline_get_rtti(_ptr);
-    return Rtti.fromPointer(result);
-  }
-
-  int get boneIndex {
-    final result = SpineBindings.bindings.spine_bone_timeline_get_bone_index(_ptr);
-    return result;
-  }
-
-  set boneIndex(int value) {
-    SpineBindings.bindings.spine_bone_timeline_set_bone_index(_ptr, value);
-  }
-
+abstract class BoneTimeline {
+  Pointer get nativePtr;
+  Rtti get rtti;
+  int get boneIndex;
+  set boneIndex(int value);
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_bone_timeline_rtti();
     final result = SpineBindings.bindings.spine_bone_timeline_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_bone_timeline_dispose(_ptr);
-  }
-}
+}

+ 8 - 9
spine-flutter/lib/generated/bone_timeline1.dart

@@ -30,12 +30,13 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'bone_timeline.dart';
 import 'curve_timeline1.dart';
 import 'curve_timeline1.dart';
 
 
 /// BoneTimeline1 wrapper
 /// BoneTimeline1 wrapper
-abstract class BoneTimeline1 extends CurveTimeline1 {
+abstract class BoneTimeline1 extends CurveTimeline1 implements BoneTimeline {
   final Pointer<spine_bone_timeline1_wrapper> _ptr;
   final Pointer<spine_bone_timeline1_wrapper> _ptr;
 
 
   BoneTimeline1.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   BoneTimeline1.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -44,17 +45,15 @@ abstract class BoneTimeline1 extends CurveTimeline1 {
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
+  @override
   int get boneIndex {
   int get boneIndex {
-    final result = SpineBindings.bindings.spine_bone_timeline1_get_bone_index(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_timeline1_get_bone_index(_ptr);
     return result;
     return result;
   }
   }
 
 
+  @override
   set boneIndex(int value) {
   set boneIndex(int value) {
     SpineBindings.bindings.spine_bone_timeline1_set_bone_index(_ptr, value);
     SpineBindings.bindings.spine_bone_timeline1_set_bone_index(_ptr, value);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_bone_timeline1_dispose(_ptr);
-  }
-}
+}

+ 12 - 8
spine-flutter/lib/generated/bone_timeline2.dart

@@ -30,12 +30,13 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'curve_timeline2.dart';
+import 'bone_timeline.dart';
+import 'curve_timeline.dart';
 
 
 /// BoneTimeline2 wrapper
 /// BoneTimeline2 wrapper
-abstract class BoneTimeline2 extends CurveTimeline2 {
+abstract class BoneTimeline2 extends CurveTimeline implements BoneTimeline {
   final Pointer<spine_bone_timeline2_wrapper> _ptr;
   final Pointer<spine_bone_timeline2_wrapper> _ptr;
 
 
   BoneTimeline2.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   BoneTimeline2.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -44,17 +45,20 @@ abstract class BoneTimeline2 extends CurveTimeline2 {
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
+  @override
   int get boneIndex {
   int get boneIndex {
-    final result = SpineBindings.bindings.spine_bone_timeline2_get_bone_index(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bone_timeline2_get_bone_index(_ptr);
     return result;
     return result;
   }
   }
 
 
+  @override
   set boneIndex(int value) {
   set boneIndex(int value) {
     SpineBindings.bindings.spine_bone_timeline2_set_bone_index(_ptr, value);
     SpineBindings.bindings.spine_bone_timeline2_set_bone_index(_ptr, value);
   }
   }
 
 
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_bone_timeline2_dispose(_ptr);
+  void setFrame(int frame, double time, double value1, double value2) {
+    SpineBindings.bindings
+        .spine_bone_timeline2_set_frame(_ptr, frame, time, value1, value2);
   }
   }
-}
+}

+ 7 - 10
spine-flutter/lib/generated/bounding_box_attachment.dart

@@ -31,10 +31,10 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'vertex_attachment.dart';
 import 'color.dart';
 import 'color.dart';
+import 'vertex_attachment.dart';
 
 
 /// BoundingBoxAttachment wrapper
 /// BoundingBoxAttachment wrapper
 class BoundingBoxAttachment extends VertexAttachment {
 class BoundingBoxAttachment extends VertexAttachment {
@@ -47,17 +47,14 @@ class BoundingBoxAttachment extends VertexAttachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory BoundingBoxAttachment(String name) {
   factory BoundingBoxAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_bounding_box_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_bounding_box_attachment_create(name.toNativeUtf8().cast<Char>());
     return BoundingBoxAttachment.fromPointer(ptr);
     return BoundingBoxAttachment.fromPointer(ptr);
   }
   }
 
 
   Color get color {
   Color get color {
-    final result = SpineBindings.bindings.spine_bounding_box_attachment_get_color(_ptr);
+    final result =
+        SpineBindings.bindings.spine_bounding_box_attachment_get_color(_ptr);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_bounding_box_attachment_dispose(_ptr);
-  }
-}
+}

+ 12 - 13
spine-flutter/lib/generated/clipping_attachment.dart

@@ -31,11 +31,11 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'vertex_attachment.dart';
-import 'slot_data.dart';
 import 'color.dart';
 import 'color.dart';
+import 'slot_data.dart';
+import 'vertex_attachment.dart';
 
 
 /// ClippingAttachment wrapper
 /// ClippingAttachment wrapper
 class ClippingAttachment extends VertexAttachment {
 class ClippingAttachment extends VertexAttachment {
@@ -48,26 +48,25 @@ class ClippingAttachment extends VertexAttachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory ClippingAttachment(String name) {
   factory ClippingAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_clipping_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_clipping_attachment_create(name.toNativeUtf8().cast<Char>());
     return ClippingAttachment.fromPointer(ptr);
     return ClippingAttachment.fromPointer(ptr);
   }
   }
 
 
   SlotData get endSlot {
   SlotData get endSlot {
-    final result = SpineBindings.bindings.spine_clipping_attachment_get_end_slot(_ptr);
+    final result =
+        SpineBindings.bindings.spine_clipping_attachment_get_end_slot(_ptr);
     return SlotData.fromPointer(result);
     return SlotData.fromPointer(result);
   }
   }
 
 
   set endSlot(SlotData value) {
   set endSlot(SlotData value) {
-    SpineBindings.bindings.spine_clipping_attachment_set_end_slot(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_clipping_attachment_set_end_slot(_ptr, value.nativePtr.cast());
   }
   }
 
 
   Color get color {
   Color get color {
-    final result = SpineBindings.bindings.spine_clipping_attachment_get_color(_ptr);
+    final result =
+        SpineBindings.bindings.spine_clipping_attachment_get_color(_ptr);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_clipping_attachment_dispose(_ptr);
-  }
-}
+}

+ 10 - 11
spine-flutter/lib/generated/color.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// Color wrapper
 /// Color wrapper
@@ -59,7 +59,8 @@ class Color implements Finalizable {
   }
   }
 
 
   static double parseHex(String value, int index) {
   static double parseHex(String value, int index) {
-    final result = SpineBindings.bindings.spine_color_parse_hex(value.toNativeUtf8().cast<Char>(), index);
+    final result = SpineBindings.bindings
+        .spine_color_parse_hex(value.toNativeUtf8().cast<Char>(), index);
     return result;
     return result;
   }
   }
 
 
@@ -107,7 +108,7 @@ class Color implements Finalizable {
     SpineBindings.bindings.spine_color_set_a(_ptr, value);
     SpineBindings.bindings.spine_color_set_a(_ptr, value);
   }
   }
 
 
-  Color set1(double r, double g, double b, double a) {
+  Color set(double r, double g, double b, double a) {
     final result = SpineBindings.bindings.spine_color_set_1(_ptr, r, g, b, a);
     final result = SpineBindings.bindings.spine_color_set_1(_ptr, r, g, b, a);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
@@ -118,11 +119,12 @@ class Color implements Finalizable {
   }
   }
 
 
   Color set3(Color other) {
   Color set3(Color other) {
-    final result = SpineBindings.bindings.spine_color_set_3(_ptr, other.nativePtr.cast());
+    final result =
+        SpineBindings.bindings.spine_color_set_3(_ptr, other.nativePtr.cast());
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
 
 
-  Color add1(double r, double g, double b, double a) {
+  Color add(double r, double g, double b, double a) {
     final result = SpineBindings.bindings.spine_color_add_1(_ptr, r, g, b, a);
     final result = SpineBindings.bindings.spine_color_add_1(_ptr, r, g, b, a);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
@@ -133,11 +135,8 @@ class Color implements Finalizable {
   }
   }
 
 
   Color add3(Color other) {
   Color add3(Color other) {
-    final result = SpineBindings.bindings.spine_color_add_3(_ptr, other.nativePtr.cast());
+    final result =
+        SpineBindings.bindings.spine_color_add_3(_ptr, other.nativePtr.cast());
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_color_dispose(_ptr);
-  }
-}
+}

+ 15 - 27
spine-flutter/lib/generated/constraint.dart

@@ -30,38 +30,26 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'update.dart';
+import 'rtti.dart';
 import 'constraint_data.dart';
 import 'constraint_data.dart';
+import 'physics.dart';
 import 'skeleton.dart';
 import 'skeleton.dart';
+import 'update.dart';
 
 
 /// Constraint wrapper
 /// Constraint wrapper
-abstract class Constraint extends Update {
-  final Pointer<spine_constraint_wrapper> _ptr;
-
-  Constraint.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
-
-  /// Get the native pointer for FFI calls
+abstract class Constraint implements Update {
   @override
   @override
-  Pointer get nativePtr => _ptr;
-
-  ConstraintData get data {
-    final result = SpineBindings.bindings.spine_constraint_get_data(_ptr);
-    throw UnsupportedError('Cannot instantiate abstract class ConstraintData from pointer - no concrete subclasses found');
-  }
-
-  void sort(Skeleton skeleton) {
-    SpineBindings.bindings.spine_constraint_sort(_ptr, skeleton.nativePtr.cast());
-  }
-
-  bool get isSourceActive {
-    final result = SpineBindings.bindings.spine_constraint_is_source_active(_ptr);
-    return result;
-  }
-
+  Pointer get nativePtr;
+  @override
+  Rtti get rtti;
+  ConstraintData get data;
+  void sort(Skeleton skeleton);
+  bool get isSourceActive;
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_constraint_dispose(_ptr);
+  void update(Skeleton skeleton, Physics physics);
+  static Rtti rttiStatic() {
+    final result = SpineBindings.bindings.spine_constraint_rtti();
+    return Rtti.fromPointer(result);
   }
   }
-}
+}

+ 7 - 35
spine-flutter/lib/generated/constraint_data.dart

@@ -30,48 +30,20 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
 import 'constraint.dart';
 import 'constraint.dart';
 import 'skeleton.dart';
 import 'skeleton.dart';
 
 
 /// ConstraintData wrapper
 /// ConstraintData wrapper
-abstract class ConstraintData implements Finalizable {
-  final Pointer<spine_constraint_data_wrapper> _ptr;
-
-  ConstraintData.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  Rtti get rtti {
-    final result = SpineBindings.bindings.spine_constraint_data_get_rtti(_ptr);
-    return Rtti.fromPointer(result);
-  }
-
-  Constraint createMethod(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_constraint_data_create_method(_ptr, skeleton.nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Constraint from pointer - no concrete subclasses found');
-  }
-
-  String get name {
-    final result = SpineBindings.bindings.spine_constraint_data_get_name(_ptr);
-    return result.cast<Utf8>().toDartString();
-  }
-
-  bool get skinRequired {
-    final result = SpineBindings.bindings.spine_constraint_data_get_skin_required(_ptr);
-    return result;
-  }
-
+abstract class ConstraintData {
+  Pointer get nativePtr;
+  Rtti get rtti;
+  Constraint createMethod(Skeleton skeleton);
+  String get name;
+  bool get skinRequired;
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_constraint_data_rtti();
     final result = SpineBindings.bindings.spine_constraint_data_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_constraint_data_dispose(_ptr);
-  }
-}
+}

+ 6 - 28
spine-flutter/lib/generated/constraint_timeline.dart

@@ -30,39 +30,17 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
 
 
 /// ConstraintTimeline wrapper
 /// ConstraintTimeline wrapper
-class ConstraintTimeline implements Finalizable {
-  final Pointer<spine_constraint_timeline_wrapper> _ptr;
-
-  ConstraintTimeline.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  Rtti get rtti {
-    final result = SpineBindings.bindings.spine_constraint_timeline_get_rtti(_ptr);
-    return Rtti.fromPointer(result);
-  }
-
-  int get constraintIndex {
-    final result = SpineBindings.bindings.spine_constraint_timeline_get_constraint_index(_ptr);
-    return result;
-  }
-
-  set constraintIndex(int value) {
-    SpineBindings.bindings.spine_constraint_timeline_set_constraint_index(_ptr, value);
-  }
-
+abstract class ConstraintTimeline {
+  Pointer get nativePtr;
+  Rtti get rtti;
+  int get constraintIndex;
+  set constraintIndex(int value);
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_constraint_timeline_rtti();
     final result = SpineBindings.bindings.spine_constraint_timeline_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_constraint_timeline_dispose(_ptr);
-  }
-}
+}

+ 11 - 10
spine-flutter/lib/generated/constraint_timeline1.dart

@@ -30,12 +30,14 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'constraint_timeline.dart';
 import 'curve_timeline1.dart';
 import 'curve_timeline1.dart';
 
 
 /// ConstraintTimeline1 wrapper
 /// ConstraintTimeline1 wrapper
-abstract class ConstraintTimeline1 extends CurveTimeline1 {
+abstract class ConstraintTimeline1 extends CurveTimeline1
+    implements ConstraintTimeline {
   final Pointer<spine_constraint_timeline1_wrapper> _ptr;
   final Pointer<spine_constraint_timeline1_wrapper> _ptr;
 
 
   ConstraintTimeline1.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   ConstraintTimeline1.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -44,17 +46,16 @@ abstract class ConstraintTimeline1 extends CurveTimeline1 {
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
+  @override
   int get constraintIndex {
   int get constraintIndex {
-    final result = SpineBindings.bindings.spine_constraint_timeline1_get_constraint_index(_ptr);
+    final result = SpineBindings.bindings
+        .spine_constraint_timeline1_get_constraint_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set constraintIndex(int value) {
-    SpineBindings.bindings.spine_constraint_timeline1_set_constraint_index(_ptr, value);
-  }
-
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_constraint_timeline1_dispose(_ptr);
+  set constraintIndex(int value) {
+    SpineBindings.bindings
+        .spine_constraint_timeline1_set_constraint_index(_ptr, value);
   }
   }
-}
+}

+ 19 - 11
spine-flutter/lib/generated/curve_timeline.dart

@@ -30,10 +30,10 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'timeline.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'timeline.dart';
 
 
 /// CurveTimeline wrapper
 /// CurveTimeline wrapper
 abstract class CurveTimeline extends Timeline {
 abstract class CurveTimeline extends Timeline {
@@ -53,12 +53,25 @@ abstract class CurveTimeline extends Timeline {
     SpineBindings.bindings.spine_curve_timeline_set_stepped(_ptr, value);
     SpineBindings.bindings.spine_curve_timeline_set_stepped(_ptr, value);
   }
   }
 
 
-  void setBezier(int bezier, int frame, double value, double time1, double value1, double cx1, double cy1, double cx2, double cy2, double time2, double value2) {
-    SpineBindings.bindings.spine_curve_timeline_set_bezier(_ptr, bezier, frame, value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
+  void setBezier(
+      int bezier,
+      int frame,
+      double value,
+      double time1,
+      double value1,
+      double cx1,
+      double cy1,
+      double cx2,
+      double cy2,
+      double time2,
+      double value2) {
+    SpineBindings.bindings.spine_curve_timeline_set_bezier(_ptr, bezier, frame,
+        value, time1, value1, cx1, cy1, cx2, cy2, time2, value2);
   }
   }
 
 
   double getBezierValue(double time, int frame, int valueOffset, int i) {
   double getBezierValue(double time, int frame, int valueOffset, int i) {
-    final result = SpineBindings.bindings.spine_curve_timeline_get_bezier_value(_ptr, time, frame, valueOffset, i);
+    final result = SpineBindings.bindings.spine_curve_timeline_get_bezier_value(
+        _ptr, time, frame, valueOffset, i);
     return result;
     return result;
   }
   }
 
 
@@ -66,9 +79,4 @@ abstract class CurveTimeline extends Timeline {
     final result = SpineBindings.bindings.spine_curve_timeline_get_curves(_ptr);
     final result = SpineBindings.bindings.spine_curve_timeline_get_curves(_ptr);
     return ArrayFloat.fromPointer(result);
     return ArrayFloat.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_curve_timeline_dispose(_ptr);
-  }
-}
+}

+ 25 - 17
spine-flutter/lib/generated/curve_timeline1.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'curve_timeline.dart';
 import 'curve_timeline.dart';
 import 'mix_blend.dart';
 import 'mix_blend.dart';
@@ -47,36 +47,44 @@ abstract class CurveTimeline1 extends CurveTimeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   void setFrame(int frame, double time, double value) {
   void setFrame(int frame, double time, double value) {
-    SpineBindings.bindings.spine_curve_timeline1_set_frame(_ptr, frame, time, value);
+    SpineBindings.bindings
+        .spine_curve_timeline1_set_frame(_ptr, frame, time, value);
   }
   }
 
 
   double getCurveValue(double time) {
   double getCurveValue(double time) {
-    final result = SpineBindings.bindings.spine_curve_timeline1_get_curve_value(_ptr, time);
+    final result = SpineBindings.bindings
+        .spine_curve_timeline1_get_curve_value(_ptr, time);
     return result;
     return result;
   }
   }
 
 
-  double getRelativeValue(double time, double alpha, MixBlend blend, double current, double setup) {
-    final result = SpineBindings.bindings.spine_curve_timeline1_get_relative_value(_ptr, time, alpha, blend.value, current, setup);
+  double getRelativeValue(
+      double time, double alpha, MixBlend blend, double current, double setup) {
+    final result = SpineBindings.bindings
+        .spine_curve_timeline1_get_relative_value(
+            _ptr, time, alpha, blend.value, current, setup);
     return result;
     return result;
   }
   }
 
 
-  double getScaleValue(double time, double alpha, MixBlend blend, MixDirection direction, double current, double setup) {
-    final result = SpineBindings.bindings.spine_curve_timeline1_get_scale_value(_ptr, time, alpha, blend.value, direction.value, current, setup);
+  double getScaleValue(double time, double alpha, MixBlend blend,
+      MixDirection direction, double current, double setup) {
+    final result = SpineBindings.bindings.spine_curve_timeline1_get_scale_value(
+        _ptr, time, alpha, blend.value, direction.value, current, setup);
     return result;
     return result;
   }
   }
 
 
-  double getAbsoluteValue1(double time, double alpha, MixBlend blend, double current, double setup) {
-    final result = SpineBindings.bindings.spine_curve_timeline1_get_absolute_value_1(_ptr, time, alpha, blend.value, current, setup);
+  double getAbsoluteValue(
+      double time, double alpha, MixBlend blend, double current, double setup) {
+    final result = SpineBindings.bindings
+        .spine_curve_timeline1_get_absolute_value_1(
+            _ptr, time, alpha, blend.value, current, setup);
     return result;
     return result;
   }
   }
 
 
-  double getAbsoluteValue2(double time, double alpha, MixBlend blend, double current, double setup, double value) {
-    final result = SpineBindings.bindings.spine_curve_timeline1_get_absolute_value_2(_ptr, time, alpha, blend.value, current, setup, value);
+  double getAbsoluteValue2(double time, double alpha, MixBlend blend,
+      double current, double setup, double value) {
+    final result = SpineBindings.bindings
+        .spine_curve_timeline1_get_absolute_value_2(
+            _ptr, time, alpha, blend.value, current, setup, value);
     return result;
     return result;
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_curve_timeline1_dispose(_ptr);
-  }
-}
+}

+ 0 - 60
spine-flutter/lib/generated/curve_timeline2.dart

@@ -1,60 +0,0 @@
-//
-// Spine Runtimes License Agreement
-// Last updated April 5, 2025. Replaces all prior versions.
-//
-// Copyright (c) 2013-2025, Esoteric Software LLC
-//
-// Integration of the Spine Runtimes into software or otherwise creating
-// derivative works of the Spine Runtimes is permitted under the terms and
-// conditions of Section 2 of the Spine Editor License Agreement:
-// http://esotericsoftware.com/spine-editor-license
-//
-// Otherwise, it is permitted to integrate the Spine Runtimes into software
-// or otherwise create derivative works of the Spine Runtimes (collectively,
-// "Products"), provided that each user of the Products must obtain their own
-// Spine Editor license and redistribution of the Products in any form must
-// include this license and copyright notice.
-//
-// THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
-// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
-// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
-// BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
-// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-//
-
-// AUTO GENERATED FILE, DO NOT EDIT.
-
-import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
-import '../spine_bindings.dart';
-import 'curve_timeline.dart';
-
-/// CurveTimeline2 wrapper
-abstract class CurveTimeline2 extends CurveTimeline {
-  final Pointer<spine_curve_timeline2_wrapper> _ptr;
-
-  CurveTimeline2.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
-
-  /// Get the native pointer for FFI calls
-  @override
-  Pointer get nativePtr => _ptr;
-
-  void setFrame(int frame, double time, double value1, double value2) {
-    SpineBindings.bindings.spine_curve_timeline2_set_frame(_ptr, frame, time, value1, value2);
-  }
-
-  double getCurveValue(double time) {
-    final result = SpineBindings.bindings.spine_curve_timeline2_get_curve_value(_ptr, time);
-    return result;
-  }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_curve_timeline2_dispose(_ptr);
-  }
-}

+ 25 - 19
spine-flutter/lib/generated/deform_timeline.dart

@@ -31,15 +31,15 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'slot_curve_timeline.dart';
-import 'vertex_attachment.dart';
+import 'arrays.dart';
 import 'bounding_box_attachment.dart';
 import 'bounding_box_attachment.dart';
 import 'clipping_attachment.dart';
 import 'clipping_attachment.dart';
 import 'mesh_attachment.dart';
 import 'mesh_attachment.dart';
 import 'path_attachment.dart';
 import 'path_attachment.dart';
-import 'arrays.dart';
+import 'slot_curve_timeline.dart';
+import 'vertex_attachment.dart';
 
 
 /// DeformTimeline wrapper
 /// DeformTimeline wrapper
 class DeformTimeline extends SlotCurveTimeline {
 class DeformTimeline extends SlotCurveTimeline {
@@ -51,19 +51,27 @@ class DeformTimeline extends SlotCurveTimeline {
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory DeformTimeline(int frameCount, int bezierCount, int slotIndex, VertexAttachment attachment) {
-    final ptr = SpineBindings.bindings.spine_deform_timeline_create(frameCount, bezierCount, slotIndex, attachment.nativePtr.cast());
+  factory DeformTimeline(int frameCount, int bezierCount, int slotIndex,
+      VertexAttachment attachment) {
+    final ptr = SpineBindings.bindings.spine_deform_timeline_create(
+        frameCount, bezierCount, slotIndex, attachment.nativePtr.cast());
     return DeformTimeline.fromPointer(ptr);
     return DeformTimeline.fromPointer(ptr);
   }
   }
 
 
   void setFrame(int frameIndex, double time, ArrayFloat vertices) {
   void setFrame(int frameIndex, double time, ArrayFloat vertices) {
-    SpineBindings.bindings.spine_deform_timeline_set_frame(_ptr, frameIndex, time, vertices.nativePtr.cast());
+    SpineBindings.bindings.spine_deform_timeline_set_frame(
+        _ptr, frameIndex, time, vertices.nativePtr.cast());
   }
   }
 
 
   VertexAttachment get attachment {
   VertexAttachment get attachment {
-    final result = SpineBindings.bindings.spine_deform_timeline_get_attachment(_ptr);
-    final rtti = SpineBindings.bindings.spine_vertex_attachment_get_rtti(result);
-    final className = SpineBindings.bindings.spine_rtti_get_class_name(rtti).cast<Utf8>().toDartString();
+    final result =
+        SpineBindings.bindings.spine_deform_timeline_get_attachment(_ptr);
+    final rtti =
+        SpineBindings.bindings.spine_vertex_attachment_get_rtti(result);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
     switch (className) {
     switch (className) {
       case 'spine_bounding_box_attachment':
       case 'spine_bounding_box_attachment':
         return BoundingBoxAttachment.fromPointer(result.cast());
         return BoundingBoxAttachment.fromPointer(result.cast());
@@ -74,21 +82,19 @@ class DeformTimeline extends SlotCurveTimeline {
       case 'spine_path_attachment':
       case 'spine_path_attachment':
         return PathAttachment.fromPointer(result.cast());
         return PathAttachment.fromPointer(result.cast());
       default:
       default:
-        throw UnsupportedError('Unknown concrete type: $className for abstract class VertexAttachment');
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class VertexAttachment');
     }
     }
   }
   }
 
 
   set attachment(VertexAttachment value) {
   set attachment(VertexAttachment value) {
-    SpineBindings.bindings.spine_deform_timeline_set_attachment(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_deform_timeline_set_attachment(_ptr, value.nativePtr.cast());
   }
   }
 
 
   double getCurvePercent(double time, int frame) {
   double getCurvePercent(double time, int frame) {
-    final result = SpineBindings.bindings.spine_deform_timeline_get_curve_percent(_ptr, time, frame);
+    final result = SpineBindings.bindings
+        .spine_deform_timeline_get_curve_percent(_ptr, time, frame);
     return result;
     return result;
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_deform_timeline_dispose(_ptr);
-  }
-}
+}

+ 7 - 10
spine-flutter/lib/generated/draw_order_timeline.dart

@@ -30,10 +30,10 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'timeline.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'timeline.dart';
 
 
 /// DrawOrderTimeline wrapper
 /// DrawOrderTimeline wrapper
 class DrawOrderTimeline extends Timeline {
 class DrawOrderTimeline extends Timeline {
@@ -46,16 +46,13 @@ class DrawOrderTimeline extends Timeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory DrawOrderTimeline(int frameCount) {
   factory DrawOrderTimeline(int frameCount) {
-    final ptr = SpineBindings.bindings.spine_draw_order_timeline_create(frameCount);
+    final ptr =
+        SpineBindings.bindings.spine_draw_order_timeline_create(frameCount);
     return DrawOrderTimeline.fromPointer(ptr);
     return DrawOrderTimeline.fromPointer(ptr);
   }
   }
 
 
   void setFrame(int frame, double time, ArrayInt drawOrder) {
   void setFrame(int frame, double time, ArrayInt drawOrder) {
-    SpineBindings.bindings.spine_draw_order_timeline_set_frame(_ptr, frame, time, drawOrder.nativePtr.cast());
-  }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_draw_order_timeline_dispose(_ptr);
+    SpineBindings.bindings.spine_draw_order_timeline_set_frame(
+        _ptr, frame, time, drawOrder.nativePtr.cast());
   }
   }
-}
+}

+ 6 - 8
spine-flutter/lib/generated/event.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'event_data.dart';
 import 'event_data.dart';
 
 
@@ -45,7 +45,8 @@ class Event implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory Event(double time, EventData data) {
   factory Event(double time, EventData data) {
-    final ptr = SpineBindings.bindings.spine_event_create(time, data.nativePtr.cast());
+    final ptr =
+        SpineBindings.bindings.spine_event_create(time, data.nativePtr.cast());
     return Event.fromPointer(ptr);
     return Event.fromPointer(ptr);
   }
   }
 
 
@@ -83,7 +84,8 @@ class Event implements Finalizable {
   }
   }
 
 
   set stringValue(String value) {
   set stringValue(String value) {
-    SpineBindings.bindings.spine_event_set_string(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings
+        .spine_event_set_string(_ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   double get volume {
   double get volume {
@@ -103,8 +105,4 @@ class Event implements Finalizable {
   set balance(double value) {
   set balance(double value) {
     SpineBindings.bindings.spine_event_set_balance(_ptr, value);
     SpineBindings.bindings.spine_event_set_balance(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_event_dispose(_ptr);
-  }
-}
+}

+ 8 - 9
spine-flutter/lib/generated/event_data.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// EventData wrapper
 /// EventData wrapper
@@ -44,7 +44,8 @@ class EventData implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory EventData(String name) {
   factory EventData(String name) {
-    final ptr = SpineBindings.bindings.spine_event_data_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_event_data_create(name.toNativeUtf8().cast<Char>());
     return EventData.fromPointer(ptr);
     return EventData.fromPointer(ptr);
   }
   }
 
 
@@ -77,7 +78,8 @@ class EventData implements Finalizable {
   }
   }
 
 
   set stringValue(String value) {
   set stringValue(String value) {
-    SpineBindings.bindings.spine_event_data_set_string(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings
+        .spine_event_data_set_string(_ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   String get audioPath {
   String get audioPath {
@@ -86,7 +88,8 @@ class EventData implements Finalizable {
   }
   }
 
 
   set audioPath(String value) {
   set audioPath(String value) {
-    SpineBindings.bindings.spine_event_data_set_audio_path(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings.spine_event_data_set_audio_path(
+        _ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   double get volume {
   double get volume {
@@ -106,8 +109,4 @@ class EventData implements Finalizable {
   set balance(double value) {
   set balance(double value) {
     SpineBindings.bindings.spine_event_data_set_balance(_ptr, value);
     SpineBindings.bindings.spine_event_data_set_balance(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_event_data_dispose(_ptr);
-  }
-}
+}

+ 17 - 14
spine-flutter/lib/generated/event_queue_entry.dart

@@ -30,11 +30,11 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'event.dart';
 import 'event_type.dart';
 import 'event_type.dart';
 import 'track_entry.dart';
 import 'track_entry.dart';
-import 'event.dart';
 
 
 /// EventQueueEntry wrapper
 /// EventQueueEntry wrapper
 class EventQueueEntry implements Finalizable {
 class EventQueueEntry implements Finalizable {
@@ -45,13 +45,16 @@ class EventQueueEntry implements Finalizable {
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory EventQueueEntry(EventType eventType, TrackEntry trackEntry, Event event) {
-    final ptr = SpineBindings.bindings.spine_event_queue_entry_create(eventType.value, trackEntry.nativePtr.cast(), event.nativePtr.cast());
+  factory EventQueueEntry(
+      EventType eventType, TrackEntry trackEntry, Event event) {
+    final ptr = SpineBindings.bindings.spine_event_queue_entry_create(
+        eventType.value, trackEntry.nativePtr.cast(), event.nativePtr.cast());
     return EventQueueEntry.fromPointer(ptr);
     return EventQueueEntry.fromPointer(ptr);
   }
   }
 
 
   EventType get type {
   EventType get type {
-    final result = SpineBindings.bindings.spine_event_queue_entry_get__type(_ptr);
+    final result =
+        SpineBindings.bindings.spine_event_queue_entry_get__type(_ptr);
     return EventType.fromValue(result);
     return EventType.fromValue(result);
   }
   }
 
 
@@ -60,24 +63,24 @@ class EventQueueEntry implements Finalizable {
   }
   }
 
 
   TrackEntry get entry {
   TrackEntry get entry {
-    final result = SpineBindings.bindings.spine_event_queue_entry_get__entry(_ptr);
+    final result =
+        SpineBindings.bindings.spine_event_queue_entry_get__entry(_ptr);
     return TrackEntry.fromPointer(result);
     return TrackEntry.fromPointer(result);
   }
   }
 
 
   set entry(TrackEntry value) {
   set entry(TrackEntry value) {
-    SpineBindings.bindings.spine_event_queue_entry_set__entry(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_event_queue_entry_set__entry(_ptr, value.nativePtr.cast());
   }
   }
 
 
   Event get event {
   Event get event {
-    final result = SpineBindings.bindings.spine_event_queue_entry_get__event(_ptr);
+    final result =
+        SpineBindings.bindings.spine_event_queue_entry_get__event(_ptr);
     return Event.fromPointer(result);
     return Event.fromPointer(result);
   }
   }
 
 
   set event(Event value) {
   set event(Event value) {
-    SpineBindings.bindings.spine_event_queue_entry_set__event(_ptr, value.nativePtr.cast());
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_event_queue_entry_dispose(_ptr);
+    SpineBindings.bindings
+        .spine_event_queue_entry_set__event(_ptr, value.nativePtr.cast());
   }
   }
-}
+}

+ 6 - 10
spine-flutter/lib/generated/event_timeline.dart

@@ -30,11 +30,11 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'timeline.dart';
-import 'event.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'event.dart';
+import 'timeline.dart';
 
 
 /// EventTimeline wrapper
 /// EventTimeline wrapper
 class EventTimeline extends Timeline {
 class EventTimeline extends Timeline {
@@ -57,11 +57,7 @@ class EventTimeline extends Timeline {
   }
   }
 
 
   void setFrame(int frame, Event event) {
   void setFrame(int frame, Event event) {
-    SpineBindings.bindings.spine_event_timeline_set_frame(_ptr, frame, event.nativePtr.cast());
-  }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_event_timeline_dispose(_ptr);
+    SpineBindings.bindings
+        .spine_event_timeline_set_frame(_ptr, frame, event.nativePtr.cast());
   }
   }
-}
+}

+ 6 - 6
spine-flutter/lib/generated/event_type.dart

@@ -32,11 +32,11 @@
 /// EventType enum
 /// EventType enum
 enum EventType {
 enum EventType {
   start(0),
   start(0),
-  interrupt(1),
-  end(2),
-  dispose(3),
-  complete(4),
-  event(5);
+  interrupt(0),
+  end(0),
+  dispose(0),
+  complete(0),
+  event(0);
 
 
   const EventType(this.value);
   const EventType(this.value);
   final int value;
   final int value;
@@ -47,4 +47,4 @@ enum EventType {
       orElse: () => throw ArgumentError('Invalid EventType value: $value'),
       orElse: () => throw ArgumentError('Invalid EventType value: $value'),
     );
     );
   }
   }
-}
+}

+ 7 - 7
spine-flutter/lib/generated/format.dart

@@ -32,12 +32,12 @@
 /// Format enum
 /// Format enum
 enum Format {
 enum Format {
   alpha(0),
   alpha(0),
-  intensity(1),
-  luminanceAlpha(2),
-  rgb565(3),
-  rgba4444(4),
-  rgb888(5),
-  rgba8888(6);
+  intensity(0),
+  luminanceAlpha(0),
+  rgb565(0),
+  rgba4444(0),
+  rgb888(0),
+  rgba8888(0);
 
 
   const Format(this.value);
   const Format(this.value);
   final int value;
   final int value;
@@ -48,4 +48,4 @@ enum Format {
       orElse: () => throw ArgumentError('Invalid Format value: $value'),
       orElse: () => throw ArgumentError('Invalid Format value: $value'),
     );
     );
   }
   }
-}
+}

+ 4 - 7
spine-flutter/lib/generated/from_property.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
 import 'arrays.dart';
 import 'arrays.dart';
@@ -69,10 +69,7 @@ abstract class FromProperty implements Finalizable {
   }
   }
 
 
   set to(ArrayToProperty value) {
   set to(ArrayToProperty value) {
-    SpineBindings.bindings.spine_from_property_set__to(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_from_property_set__to(_ptr, value.nativePtr.cast());
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_from_property_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_rotate.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromRotate extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_rotate_create();
     final ptr = SpineBindings.bindings.spine_from_rotate_create();
     return FromRotate.fromPointer(ptr);
     return FromRotate.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_rotate_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_scale_x.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromScaleX extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_scale_x_create();
     final ptr = SpineBindings.bindings.spine_from_scale_x_create();
     return FromScaleX.fromPointer(ptr);
     return FromScaleX.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_scale_x_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_scale_y.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromScaleY extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_scale_y_create();
     final ptr = SpineBindings.bindings.spine_from_scale_y_create();
     return FromScaleY.fromPointer(ptr);
     return FromScaleY.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_scale_y_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_shear_y.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromShearY extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_shear_y_create();
     final ptr = SpineBindings.bindings.spine_from_shear_y_create();
     return FromShearY.fromPointer(ptr);
     return FromShearY.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_shear_y_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_x.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromX extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_x_create();
     final ptr = SpineBindings.bindings.spine_from_x_create();
     return FromX.fromPointer(ptr);
     return FromX.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_x_dispose(_ptr);
-  }
-}
+}

+ 2 - 7
spine-flutter/lib/generated/from_y.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'from_property.dart';
 import 'from_property.dart';
 
 
@@ -48,9 +48,4 @@ class FromY extends FromProperty {
     final ptr = SpineBindings.bindings.spine_from_y_create();
     final ptr = SpineBindings.bindings.spine_from_y_create();
     return FromY.fromPointer(ptr);
     return FromY.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_from_y_dispose(_ptr);
-  }
-}
+}

+ 72 - 36
spine-flutter/lib/generated/ik_constraint.dart

@@ -30,54 +30,68 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'skeleton.dart';
-import 'physics.dart';
-import 'ik_constraint_data.dart';
+import 'arrays.dart';
 import 'bone.dart';
 import 'bone.dart';
 import 'bone_pose.dart';
 import 'bone_pose.dart';
+import 'constraint.dart';
+import 'ik_constraint_data.dart';
 import 'ik_constraint_pose.dart';
 import 'ik_constraint_pose.dart';
-import 'arrays.dart';
+import 'physics.dart';
+import 'posed.dart';
+import 'posed_active.dart';
+import 'skeleton.dart';
 
 
 /// IkConstraint wrapper
 /// IkConstraint wrapper
-class IkConstraint implements Finalizable {
+class IkConstraint extends PosedActive implements Posed, Constraint {
   final Pointer<spine_ik_constraint_wrapper> _ptr;
   final Pointer<spine_ik_constraint_wrapper> _ptr;
 
 
-  IkConstraint.fromPointer(this._ptr);
+  IkConstraint.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory IkConstraint(IkConstraintData data, Skeleton skeleton) {
   factory IkConstraint(IkConstraintData data, Skeleton skeleton) {
-    final ptr = SpineBindings.bindings.spine_ik_constraint_create(data.nativePtr.cast(), skeleton.nativePtr.cast());
+    final ptr = SpineBindings.bindings.spine_ik_constraint_create(
+        data.nativePtr.cast(), skeleton.nativePtr.cast());
     return IkConstraint.fromPointer(ptr);
     return IkConstraint.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
     final result = SpineBindings.bindings.spine_ik_constraint_get_rtti(_ptr);
     final result = SpineBindings.bindings.spine_ik_constraint_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
   IkConstraint copy(Skeleton skeleton) {
   IkConstraint copy(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_ik_constraint_copy(_ptr, skeleton.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_ik_constraint_copy(_ptr, skeleton.nativePtr.cast());
     return IkConstraint.fromPointer(result);
     return IkConstraint.fromPointer(result);
   }
   }
 
 
+  @override
   void update(Skeleton skeleton, Physics physics) {
   void update(Skeleton skeleton, Physics physics) {
-    SpineBindings.bindings.spine_ik_constraint_update(_ptr, skeleton.nativePtr.cast(), physics.value);
+    SpineBindings.bindings.spine_ik_constraint_update(
+        _ptr, skeleton.nativePtr.cast(), physics.value);
   }
   }
 
 
+  @override
   void sort(Skeleton skeleton) {
   void sort(Skeleton skeleton) {
-    SpineBindings.bindings.spine_ik_constraint_sort(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_ik_constraint_sort(_ptr, skeleton.nativePtr.cast());
   }
   }
 
 
+  @override
   bool get isSourceActive {
   bool get isSourceActive {
-    final result = SpineBindings.bindings.spine_ik_constraint_is_source_active(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_is_source_active(_ptr);
     return result;
     return result;
   }
   }
 
 
+  @override
   IkConstraintData get data {
   IkConstraintData get data {
     final result = SpineBindings.bindings.spine_ik_constraint_get_data(_ptr);
     final result = SpineBindings.bindings.spine_ik_constraint_get_data(_ptr);
     return IkConstraintData.fromPointer(result);
     return IkConstraintData.fromPointer(result);
@@ -94,7 +108,8 @@ class IkConstraint implements Finalizable {
   }
   }
 
 
   set target(Bone value) {
   set target(Bone value) {
-    SpineBindings.bindings.spine_ik_constraint_set_target(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_ik_constraint_set_target(_ptr, value.nativePtr.cast());
   }
   }
 
 
   IkConstraintPose get pose {
   IkConstraintPose get pose {
@@ -103,46 +118,67 @@ class IkConstraint implements Finalizable {
   }
   }
 
 
   IkConstraintPose get appliedPose {
   IkConstraintPose get appliedPose {
-    final result = SpineBindings.bindings.spine_ik_constraint_get_applied_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_get_applied_pose(_ptr);
     return IkConstraintPose.fromPointer(result);
     return IkConstraintPose.fromPointer(result);
   }
   }
 
 
+  @override
   void resetConstrained() {
   void resetConstrained() {
     SpineBindings.bindings.spine_ik_constraint_reset_constrained(_ptr);
     SpineBindings.bindings.spine_ik_constraint_reset_constrained(_ptr);
   }
   }
 
 
+  @override
   void constrained() {
   void constrained() {
     SpineBindings.bindings.spine_ik_constraint_constrained(_ptr);
     SpineBindings.bindings.spine_ik_constraint_constrained(_ptr);
   }
   }
 
 
+  @override
   bool get isPoseEqualToApplied {
   bool get isPoseEqualToApplied {
-    final result = SpineBindings.bindings.spine_ik_constraint_is_pose_equal_to_applied(_ptr);
-    return result;
-  }
-
-  bool get isActive {
-    final result = SpineBindings.bindings.spine_ik_constraint_is_active(_ptr);
+    final result = SpineBindings.bindings
+        .spine_ik_constraint_is_pose_equal_to_applied(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set active(bool value) {
-    SpineBindings.bindings.spine_ik_constraint_set_active(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_ik_constraint_rtti();
     final result = SpineBindings.bindings.spine_ik_constraint_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
-  static void apply1(Skeleton skeleton, BonePose bone, double targetX, double targetY, bool compress, bool stretch, bool uniform, double mix) {
-    SpineBindings.bindings.spine_ik_constraint_apply_1(skeleton.nativePtr.cast(), bone.nativePtr.cast(), targetX, targetY, compress, stretch, uniform, mix);
-  }
-
-  static void apply2(Skeleton skeleton, BonePose parent, BonePose child, double targetX, double targetY, int bendDirection, bool stretch, bool uniform, double softness, double mix) {
-    SpineBindings.bindings.spine_ik_constraint_apply_2(skeleton.nativePtr.cast(), parent.nativePtr.cast(), child.nativePtr.cast(), targetX, targetY, bendDirection, stretch, uniform, softness, mix);
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_ik_constraint_dispose(_ptr);
-  }
-}
+  static void apply(Skeleton skeleton, BonePose bone, double targetX,
+      double targetY, bool compress, bool stretch, bool uniform, double mix) {
+    SpineBindings.bindings.spine_ik_constraint_apply_1(
+        skeleton.nativePtr.cast(),
+        bone.nativePtr.cast(),
+        targetX,
+        targetY,
+        compress,
+        stretch,
+        uniform,
+        mix);
+  }
+
+  static void apply2(
+      Skeleton skeleton,
+      BonePose parent,
+      BonePose child,
+      double targetX,
+      double targetY,
+      int bendDirection,
+      bool stretch,
+      bool uniform,
+      double softness,
+      double mix) {
+    SpineBindings.bindings.spine_ik_constraint_apply_2(
+        skeleton.nativePtr.cast(),
+        parent.nativePtr.cast(),
+        child.nativePtr.cast(),
+        targetX,
+        targetY,
+        bendDirection,
+        stretch,
+        uniform,
+        softness,
+        mix);
+  }
+}

+ 54 - 34
spine-flutter/lib/generated/ik_constraint_data.dart

@@ -31,55 +31,92 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'constraint.dart';
-import 'skeleton.dart';
+import 'arrays.dart';
 import 'bone_data.dart';
 import 'bone_data.dart';
+import 'constraint.dart';
+import 'constraint_data.dart';
+import 'ik_constraint.dart';
 import 'ik_constraint_pose.dart';
 import 'ik_constraint_pose.dart';
-import 'arrays.dart';
+import 'path_constraint.dart';
+import 'physics_constraint.dart';
+import 'posed_data.dart';
+import 'skeleton.dart';
+import 'slider.dart';
+import 'transform_constraint.dart';
 
 
 /// IkConstraintData wrapper
 /// IkConstraintData wrapper
-class IkConstraintData implements Finalizable {
+class IkConstraintData extends PosedData implements ConstraintData {
   final Pointer<spine_ik_constraint_data_wrapper> _ptr;
   final Pointer<spine_ik_constraint_data_wrapper> _ptr;
 
 
-  IkConstraintData.fromPointer(this._ptr);
+  IkConstraintData.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory IkConstraintData(String name) {
   factory IkConstraintData(String name) {
-    final ptr = SpineBindings.bindings.spine_ik_constraint_data_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_ik_constraint_data_create(name.toNativeUtf8().cast<Char>());
     return IkConstraintData.fromPointer(ptr);
     return IkConstraintData.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_rtti(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_data_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
+  @override
   Constraint createMethod(Skeleton skeleton) {
   Constraint createMethod(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_create_method(_ptr, skeleton.nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Constraint from pointer - no concrete subclasses found');
+    final result = SpineBindings.bindings
+        .spine_ik_constraint_data_create_method(
+            _ptr, skeleton.nativePtr.cast());
+    final rtti = SpineBindings.bindings.spine_constraint_get_rtti(result);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_ik_constraint':
+        return IkConstraint.fromPointer(result.cast());
+      case 'spine_path_constraint':
+        return PathConstraint.fromPointer(result.cast());
+      case 'spine_physics_constraint':
+        return PhysicsConstraint.fromPointer(result.cast());
+      case 'spine_slider':
+        return Slider.fromPointer(result.cast());
+      case 'spine_transform_constraint':
+        return TransformConstraint.fromPointer(result.cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Constraint');
+    }
   }
   }
 
 
   ArrayBoneData get bones {
   ArrayBoneData get bones {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_bones(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_data_get_bones(_ptr);
     return ArrayBoneData.fromPointer(result);
     return ArrayBoneData.fromPointer(result);
   }
   }
 
 
   BoneData get target {
   BoneData get target {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_target(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_data_get_target(_ptr);
     return BoneData.fromPointer(result);
     return BoneData.fromPointer(result);
   }
   }
 
 
   set target(BoneData value) {
   set target(BoneData value) {
-    SpineBindings.bindings.spine_ik_constraint_data_set_target(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_ik_constraint_data_set_target(_ptr, value.nativePtr.cast());
   }
   }
 
 
   bool get uniform {
   bool get uniform {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_uniform(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_data_get_uniform(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -87,31 +124,14 @@ class IkConstraintData implements Finalizable {
     SpineBindings.bindings.spine_ik_constraint_data_set_uniform(_ptr, value);
     SpineBindings.bindings.spine_ik_constraint_data_set_uniform(_ptr, value);
   }
   }
 
 
-  String get name {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_name(_ptr);
-    return result.cast<Utf8>().toDartString();
-  }
-
-  bool get skinRequired {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_skin_required(_ptr);
-    return result;
-  }
-
   IkConstraintPose get setupPose {
   IkConstraintPose get setupPose {
-    final result = SpineBindings.bindings.spine_ik_constraint_data_get_setup_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_data_get_setup_pose(_ptr);
     return IkConstraintPose.fromPointer(result);
     return IkConstraintPose.fromPointer(result);
   }
   }
 
 
-  set skinRequired(bool value) {
-    SpineBindings.bindings.spine_ik_constraint_data_set_skin_required(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_ik_constraint_data_rtti();
     final result = SpineBindings.bindings.spine_ik_constraint_data_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_ik_constraint_data_dispose(_ptr);
-  }
-}
+}

+ 16 - 13
spine-flutter/lib/generated/ik_constraint_pose.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// IkConstraintPose wrapper
 /// IkConstraintPose wrapper
@@ -48,11 +48,13 @@ class IkConstraintPose implements Finalizable {
   }
   }
 
 
   void set(IkConstraintPose pose) {
   void set(IkConstraintPose pose) {
-    SpineBindings.bindings.spine_ik_constraint_pose_set(_ptr, pose.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_ik_constraint_pose_set(_ptr, pose.nativePtr.cast());
   }
   }
 
 
   double get mix {
   double get mix {
-    final result = SpineBindings.bindings.spine_ik_constraint_pose_get_mix(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_pose_get_mix(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -61,7 +63,8 @@ class IkConstraintPose implements Finalizable {
   }
   }
 
 
   double get softness {
   double get softness {
-    final result = SpineBindings.bindings.spine_ik_constraint_pose_get_softness(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_pose_get_softness(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -70,16 +73,19 @@ class IkConstraintPose implements Finalizable {
   }
   }
 
 
   int get bendDirection {
   int get bendDirection {
-    final result = SpineBindings.bindings.spine_ik_constraint_pose_get_bend_direction(_ptr);
+    final result = SpineBindings.bindings
+        .spine_ik_constraint_pose_get_bend_direction(_ptr);
     return result;
     return result;
   }
   }
 
 
   set bendDirection(int value) {
   set bendDirection(int value) {
-    SpineBindings.bindings.spine_ik_constraint_pose_set_bend_direction(_ptr, value);
+    SpineBindings.bindings
+        .spine_ik_constraint_pose_set_bend_direction(_ptr, value);
   }
   }
 
 
   bool get compress {
   bool get compress {
-    final result = SpineBindings.bindings.spine_ik_constraint_pose_get_compress(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_pose_get_compress(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -88,15 +94,12 @@ class IkConstraintPose implements Finalizable {
   }
   }
 
 
   bool get stretch {
   bool get stretch {
-    final result = SpineBindings.bindings.spine_ik_constraint_pose_get_stretch(_ptr);
+    final result =
+        SpineBindings.bindings.spine_ik_constraint_pose_get_stretch(_ptr);
     return result;
     return result;
   }
   }
 
 
   set stretch(bool value) {
   set stretch(bool value) {
     SpineBindings.bindings.spine_ik_constraint_pose_set_stretch(_ptr, value);
     SpineBindings.bindings.spine_ik_constraint_pose_set_stretch(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_ik_constraint_pose_dispose(_ptr);
-  }
-}
+}

+ 18 - 14
spine-flutter/lib/generated/ik_constraint_timeline.dart

@@ -30,12 +30,13 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'constraint_timeline.dart';
 import 'curve_timeline.dart';
 import 'curve_timeline.dart';
 
 
 /// IkConstraintTimeline wrapper
 /// IkConstraintTimeline wrapper
-class IkConstraintTimeline extends CurveTimeline {
+class IkConstraintTimeline extends CurveTimeline implements ConstraintTimeline {
   final Pointer<spine_ik_constraint_timeline_wrapper> _ptr;
   final Pointer<spine_ik_constraint_timeline_wrapper> _ptr;
 
 
   IkConstraintTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   IkConstraintTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -44,26 +45,29 @@ class IkConstraintTimeline extends CurveTimeline {
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory IkConstraintTimeline(int frameCount, int bezierCount, int constraintIndex) {
-    final ptr = SpineBindings.bindings.spine_ik_constraint_timeline_create(frameCount, bezierCount, constraintIndex);
+  factory IkConstraintTimeline(
+      int frameCount, int bezierCount, int constraintIndex) {
+    final ptr = SpineBindings.bindings.spine_ik_constraint_timeline_create(
+        frameCount, bezierCount, constraintIndex);
     return IkConstraintTimeline.fromPointer(ptr);
     return IkConstraintTimeline.fromPointer(ptr);
   }
   }
 
 
-  void setFrame(int frame, double time, double mix, double softness, int bendDirection, bool compress, bool stretch) {
-    SpineBindings.bindings.spine_ik_constraint_timeline_set_frame(_ptr, frame, time, mix, softness, bendDirection, compress, stretch);
+  void setFrame(int frame, double time, double mix, double softness,
+      int bendDirection, bool compress, bool stretch) {
+    SpineBindings.bindings.spine_ik_constraint_timeline_set_frame(
+        _ptr, frame, time, mix, softness, bendDirection, compress, stretch);
   }
   }
 
 
+  @override
   int get constraintIndex {
   int get constraintIndex {
-    final result = SpineBindings.bindings.spine_ik_constraint_timeline_get_constraint_index(_ptr);
+    final result = SpineBindings.bindings
+        .spine_ik_constraint_timeline_get_constraint_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set constraintIndex(int value) {
-    SpineBindings.bindings.spine_ik_constraint_timeline_set_constraint_index(_ptr, value);
-  }
-
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_ik_constraint_timeline_dispose(_ptr);
+  set constraintIndex(int value) {
+    SpineBindings.bindings
+        .spine_ik_constraint_timeline_set_constraint_index(_ptr, value);
   }
   }
-}
+}

+ 5 - 5
spine-flutter/lib/generated/inherit.dart

@@ -32,10 +32,10 @@
 /// Inherit enum
 /// Inherit enum
 enum Inherit {
 enum Inherit {
   normal(0),
   normal(0),
-  onlyTranslation(1),
-  noRotationOrReflection(2),
-  noScale(3),
-  noScaleOrReflection(4);
+  onlyTranslation(0),
+  noRotationOrReflection(0),
+  noScale(0),
+  noScaleOrReflection(0);
 
 
   const Inherit(this.value);
   const Inherit(this.value);
   final int value;
   final int value;
@@ -46,4 +46,4 @@ enum Inherit {
       orElse: () => throw ArgumentError('Invalid Inherit value: $value'),
       orElse: () => throw ArgumentError('Invalid Inherit value: $value'),
     );
     );
   }
   }
-}
+}

+ 13 - 12
spine-flutter/lib/generated/inherit_timeline.dart

@@ -30,13 +30,14 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'timeline.dart';
+import 'bone_timeline.dart';
 import 'inherit.dart';
 import 'inherit.dart';
+import 'timeline.dart';
 
 
 /// InheritTimeline wrapper
 /// InheritTimeline wrapper
-class InheritTimeline extends Timeline {
+class InheritTimeline extends Timeline implements BoneTimeline {
   final Pointer<spine_inherit_timeline_wrapper> _ptr;
   final Pointer<spine_inherit_timeline_wrapper> _ptr;
 
 
   InheritTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
   InheritTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
@@ -46,25 +47,25 @@ class InheritTimeline extends Timeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory InheritTimeline(int frameCount, int boneIndex) {
   factory InheritTimeline(int frameCount, int boneIndex) {
-    final ptr = SpineBindings.bindings.spine_inherit_timeline_create(frameCount, boneIndex);
+    final ptr = SpineBindings.bindings
+        .spine_inherit_timeline_create(frameCount, boneIndex);
     return InheritTimeline.fromPointer(ptr);
     return InheritTimeline.fromPointer(ptr);
   }
   }
 
 
   void setFrame(int frame, double time, Inherit inherit) {
   void setFrame(int frame, double time, Inherit inherit) {
-    SpineBindings.bindings.spine_inherit_timeline_set_frame(_ptr, frame, time, inherit.value);
+    SpineBindings.bindings
+        .spine_inherit_timeline_set_frame(_ptr, frame, time, inherit.value);
   }
   }
 
 
+  @override
   int get boneIndex {
   int get boneIndex {
-    final result = SpineBindings.bindings.spine_inherit_timeline_get_bone_index(_ptr);
+    final result =
+        SpineBindings.bindings.spine_inherit_timeline_get_bone_index(_ptr);
     return result;
     return result;
   }
   }
 
 
+  @override
   set boneIndex(int value) {
   set boneIndex(int value) {
     SpineBindings.bindings.spine_inherit_timeline_set_bone_index(_ptr, value);
     SpineBindings.bindings.spine_inherit_timeline_set_bone_index(_ptr, value);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_inherit_timeline_dispose(_ptr);
-  }
-}
+}

+ 3 - 26
spine-flutter/lib/generated/linked_mesh.dart

@@ -30,31 +30,8 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
-import '../spine_bindings.dart';
-import 'mesh_attachment.dart';
 
 
 /// LinkedMesh wrapper
 /// LinkedMesh wrapper
-class LinkedMesh implements Finalizable {
-  final Pointer<spine_linked_mesh_wrapper> _ptr;
-
-  LinkedMesh.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  factory LinkedMesh(MeshAttachment mesh, dynamic skinIndex, int slotIndex, String parent, bool inheritTimelines) {
-    final ptr = SpineBindings.bindings.spine_linked_mesh_create(mesh.nativePtr.cast(), skinIndex, slotIndex, parent.toNativeUtf8().cast<Char>(), inheritTimelines);
-    return LinkedMesh.fromPointer(ptr);
-  }
-
-  factory LinkedMesh.variant2(MeshAttachment mesh, String skin, int slotIndex, String parent, bool inheritTimelines) {
-    final ptr = SpineBindings.bindings.spine_linked_mesh_create2(mesh.nativePtr.cast(), skin.toNativeUtf8().cast<Char>(), slotIndex, parent.toNativeUtf8().cast<Char>(), inheritTimelines);
-    return LinkedMesh.fromPointer(ptr);
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_linked_mesh_dispose(_ptr);
-  }
-}
+abstract class LinkedMesh {
+  Pointer get nativePtr;
+}

+ 37 - 26
spine-flutter/lib/generated/mesh_attachment.dart

@@ -31,13 +31,13 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'vertex_attachment.dart';
+import 'arrays.dart';
 import 'color.dart';
 import 'color.dart';
-import 'texture_region.dart';
 import 'sequence.dart';
 import 'sequence.dart';
-import 'arrays.dart';
+import 'texture_region.dart';
+import 'vertex_attachment.dart';
 
 
 /// MeshAttachment wrapper
 /// MeshAttachment wrapper
 class MeshAttachment extends VertexAttachment {
 class MeshAttachment extends VertexAttachment {
@@ -50,7 +50,8 @@ class MeshAttachment extends VertexAttachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory MeshAttachment(String name) {
   factory MeshAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_mesh_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_mesh_attachment_create(name.toNativeUtf8().cast<Char>());
     return MeshAttachment.fromPointer(ptr);
     return MeshAttachment.fromPointer(ptr);
   }
   }
 
 
@@ -59,7 +60,8 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   int get hullLength {
   int get hullLength {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_hull_length(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_hull_length(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -68,12 +70,14 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   ArrayFloat get regionUVs {
   ArrayFloat get regionUVs {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_region_u_vs(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_region_u_vs(_ptr);
     return ArrayFloat.fromPointer(result);
     return ArrayFloat.fromPointer(result);
   }
   }
 
 
   set regionUVs(ArrayFloat value) {
   set regionUVs(ArrayFloat value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_region_u_vs(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_region_u_vs(_ptr, value.nativePtr.cast());
   }
   }
 
 
   ArrayFloat get uVs {
   ArrayFloat get uVs {
@@ -82,12 +86,14 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   ArrayUnsignedShort get triangles {
   ArrayUnsignedShort get triangles {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_triangles(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_triangles(_ptr);
     return ArrayUnsignedShort.fromPointer(result);
     return ArrayUnsignedShort.fromPointer(result);
   }
   }
 
 
   set triangles(ArrayUnsignedShort value) {
   set triangles(ArrayUnsignedShort value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_triangles(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_triangles(_ptr, value.nativePtr.cast());
   }
   }
 
 
   Color get color {
   Color get color {
@@ -101,34 +107,41 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   set path(String value) {
   set path(String value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_path(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings.spine_mesh_attachment_set_path(
+        _ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   TextureRegion get region {
   TextureRegion get region {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_region(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_region(_ptr);
     return TextureRegion.fromPointer(result);
     return TextureRegion.fromPointer(result);
   }
   }
 
 
   set region(TextureRegion value) {
   set region(TextureRegion value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_region(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_region(_ptr, value.nativePtr.cast());
   }
   }
 
 
   Sequence get sequence {
   Sequence get sequence {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_sequence(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_sequence(_ptr);
     return Sequence.fromPointer(result);
     return Sequence.fromPointer(result);
   }
   }
 
 
   set sequence(Sequence value) {
   set sequence(Sequence value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_sequence(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_sequence(_ptr, value.nativePtr.cast());
   }
   }
 
 
   MeshAttachment get parentMesh {
   MeshAttachment get parentMesh {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_parent_mesh(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_parent_mesh(_ptr);
     return MeshAttachment.fromPointer(result);
     return MeshAttachment.fromPointer(result);
   }
   }
 
 
   set parentMesh(MeshAttachment value) {
   set parentMesh(MeshAttachment value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_parent_mesh(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_parent_mesh(_ptr, value.nativePtr.cast());
   }
   }
 
 
   ArrayUnsignedShort get edges {
   ArrayUnsignedShort get edges {
@@ -137,7 +150,8 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   set edges(ArrayUnsignedShort value) {
   set edges(ArrayUnsignedShort value) {
-    SpineBindings.bindings.spine_mesh_attachment_set_edges(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_mesh_attachment_set_edges(_ptr, value.nativePtr.cast());
   }
   }
 
 
   double get width {
   double get width {
@@ -150,7 +164,8 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   double get height {
   double get height {
-    final result = SpineBindings.bindings.spine_mesh_attachment_get_height(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_get_height(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -159,12 +174,8 @@ class MeshAttachment extends VertexAttachment {
   }
   }
 
 
   MeshAttachment newLinkedMesh() {
   MeshAttachment newLinkedMesh() {
-    final result = SpineBindings.bindings.spine_mesh_attachment_new_linked_mesh(_ptr);
+    final result =
+        SpineBindings.bindings.spine_mesh_attachment_new_linked_mesh(_ptr);
     return MeshAttachment.fromPointer(result);
     return MeshAttachment.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_mesh_attachment_dispose(_ptr);
-  }
-}
+}

+ 4 - 4
spine-flutter/lib/generated/mix_blend.dart

@@ -32,9 +32,9 @@
 /// MixBlend enum
 /// MixBlend enum
 enum MixBlend {
 enum MixBlend {
   setup(0),
   setup(0),
-  first(1),
-  replace(2),
-  add(3);
+  first(0),
+  replace(0),
+  add(0);
 
 
   const MixBlend(this.value);
   const MixBlend(this.value);
   final int value;
   final int value;
@@ -45,4 +45,4 @@ enum MixBlend {
       orElse: () => throw ArgumentError('Invalid MixBlend value: $value'),
       orElse: () => throw ArgumentError('Invalid MixBlend value: $value'),
     );
     );
   }
   }
-}
+}

+ 2 - 2
spine-flutter/lib/generated/mix_direction.dart

@@ -32,7 +32,7 @@
 /// MixDirection enum
 /// MixDirection enum
 enum MixDirection {
 enum MixDirection {
   directionIn(0),
   directionIn(0),
-  directionOut(1);
+  directionOut(0);
 
 
   const MixDirection(this.value);
   const MixDirection(this.value);
   final int value;
   final int value;
@@ -43,4 +43,4 @@ enum MixDirection {
       orElse: () => throw ArgumentError('Invalid MixDirection value: $value'),
       orElse: () => throw ArgumentError('Invalid MixDirection value: $value'),
     );
     );
   }
   }
-}
+}

+ 16 - 15
spine-flutter/lib/generated/path_attachment.dart

@@ -31,11 +31,11 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
-import 'vertex_attachment.dart';
-import 'color.dart';
 import 'arrays.dart';
 import 'arrays.dart';
+import 'color.dart';
+import 'vertex_attachment.dart';
 
 
 /// PathAttachment wrapper
 /// PathAttachment wrapper
 class PathAttachment extends VertexAttachment {
 class PathAttachment extends VertexAttachment {
@@ -48,21 +48,25 @@ class PathAttachment extends VertexAttachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PathAttachment(String name) {
   factory PathAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_path_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_path_attachment_create(name.toNativeUtf8().cast<Char>());
     return PathAttachment.fromPointer(ptr);
     return PathAttachment.fromPointer(ptr);
   }
   }
 
 
   ArrayFloat get lengths {
   ArrayFloat get lengths {
-    final result = SpineBindings.bindings.spine_path_attachment_get_lengths(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_attachment_get_lengths(_ptr);
     return ArrayFloat.fromPointer(result);
     return ArrayFloat.fromPointer(result);
   }
   }
 
 
   set lengths(ArrayFloat value) {
   set lengths(ArrayFloat value) {
-    SpineBindings.bindings.spine_path_attachment_set_lengths(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_path_attachment_set_lengths(_ptr, value.nativePtr.cast());
   }
   }
 
 
   bool get closed {
   bool get closed {
-    final result = SpineBindings.bindings.spine_path_attachment_get_closed(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_attachment_get_closed(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -71,21 +75,18 @@ class PathAttachment extends VertexAttachment {
   }
   }
 
 
   bool get constantSpeed {
   bool get constantSpeed {
-    final result = SpineBindings.bindings.spine_path_attachment_get_constant_speed(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_attachment_get_constant_speed(_ptr);
     return result;
     return result;
   }
   }
 
 
   set constantSpeed(bool value) {
   set constantSpeed(bool value) {
-    SpineBindings.bindings.spine_path_attachment_set_constant_speed(_ptr, value);
+    SpineBindings.bindings
+        .spine_path_attachment_set_constant_speed(_ptr, value);
   }
   }
 
 
   Color get color {
   Color get color {
     final result = SpineBindings.bindings.spine_path_attachment_get_color(_ptr);
     final result = SpineBindings.bindings.spine_path_attachment_get_color(_ptr);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_path_attachment_dispose(_ptr);
-  }
-}
+}

+ 36 - 29
spine-flutter/lib/generated/path_constraint.dart

@@ -30,50 +30,63 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'skeleton.dart';
-import 'physics.dart';
-import 'slot.dart';
+import 'arrays.dart';
+import 'constraint.dart';
 import 'path_constraint_data.dart';
 import 'path_constraint_data.dart';
 import 'path_constraint_pose.dart';
 import 'path_constraint_pose.dart';
-import 'arrays.dart';
+import 'physics.dart';
+import 'posed.dart';
+import 'posed_active.dart';
+import 'skeleton.dart';
+import 'slot.dart';
 
 
 /// PathConstraint wrapper
 /// PathConstraint wrapper
-class PathConstraint implements Finalizable {
+class PathConstraint extends PosedActive implements Posed, Constraint {
   final Pointer<spine_path_constraint_wrapper> _ptr;
   final Pointer<spine_path_constraint_wrapper> _ptr;
 
 
-  PathConstraint.fromPointer(this._ptr);
+  PathConstraint.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PathConstraint(PathConstraintData data, Skeleton skeleton) {
   factory PathConstraint(PathConstraintData data, Skeleton skeleton) {
-    final ptr = SpineBindings.bindings.spine_path_constraint_create(data.nativePtr.cast(), skeleton.nativePtr.cast());
+    final ptr = SpineBindings.bindings.spine_path_constraint_create(
+        data.nativePtr.cast(), skeleton.nativePtr.cast());
     return PathConstraint.fromPointer(ptr);
     return PathConstraint.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
     final result = SpineBindings.bindings.spine_path_constraint_get_rtti(_ptr);
     final result = SpineBindings.bindings.spine_path_constraint_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
   PathConstraint copy(Skeleton skeleton) {
   PathConstraint copy(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_path_constraint_copy(_ptr, skeleton.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_path_constraint_copy(_ptr, skeleton.nativePtr.cast());
     return PathConstraint.fromPointer(result);
     return PathConstraint.fromPointer(result);
   }
   }
 
 
+  @override
   void update(Skeleton skeleton, Physics physics) {
   void update(Skeleton skeleton, Physics physics) {
-    SpineBindings.bindings.spine_path_constraint_update(_ptr, skeleton.nativePtr.cast(), physics.value);
+    SpineBindings.bindings.spine_path_constraint_update(
+        _ptr, skeleton.nativePtr.cast(), physics.value);
   }
   }
 
 
+  @override
   void sort(Skeleton skeleton) {
   void sort(Skeleton skeleton) {
-    SpineBindings.bindings.spine_path_constraint_sort(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_path_constraint_sort(_ptr, skeleton.nativePtr.cast());
   }
   }
 
 
+  @override
   bool get isSourceActive {
   bool get isSourceActive {
-    final result = SpineBindings.bindings.spine_path_constraint_is_source_active(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_is_source_active(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -88,9 +101,11 @@ class PathConstraint implements Finalizable {
   }
   }
 
 
   set slot(Slot value) {
   set slot(Slot value) {
-    SpineBindings.bindings.spine_path_constraint_set_slot(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_path_constraint_set_slot(_ptr, value.nativePtr.cast());
   }
   }
 
 
+  @override
   PathConstraintData get data {
   PathConstraintData get data {
     final result = SpineBindings.bindings.spine_path_constraint_get_data(_ptr);
     final result = SpineBindings.bindings.spine_path_constraint_get_data(_ptr);
     return PathConstraintData.fromPointer(result);
     return PathConstraintData.fromPointer(result);
@@ -102,38 +117,30 @@ class PathConstraint implements Finalizable {
   }
   }
 
 
   PathConstraintPose get appliedPose {
   PathConstraintPose get appliedPose {
-    final result = SpineBindings.bindings.spine_path_constraint_get_applied_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_get_applied_pose(_ptr);
     return PathConstraintPose.fromPointer(result);
     return PathConstraintPose.fromPointer(result);
   }
   }
 
 
+  @override
   void resetConstrained() {
   void resetConstrained() {
     SpineBindings.bindings.spine_path_constraint_reset_constrained(_ptr);
     SpineBindings.bindings.spine_path_constraint_reset_constrained(_ptr);
   }
   }
 
 
+  @override
   void constrained() {
   void constrained() {
     SpineBindings.bindings.spine_path_constraint_constrained(_ptr);
     SpineBindings.bindings.spine_path_constraint_constrained(_ptr);
   }
   }
 
 
+  @override
   bool get isPoseEqualToApplied {
   bool get isPoseEqualToApplied {
-    final result = SpineBindings.bindings.spine_path_constraint_is_pose_equal_to_applied(_ptr);
+    final result = SpineBindings.bindings
+        .spine_path_constraint_is_pose_equal_to_applied(_ptr);
     return result;
     return result;
   }
   }
 
 
-  bool get isActive {
-    final result = SpineBindings.bindings.spine_path_constraint_is_active(_ptr);
-    return result;
-  }
-
-  set active(bool value) {
-    SpineBindings.bindings.spine_path_constraint_set_active(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_path_constraint_rtti();
     final result = SpineBindings.bindings.spine_path_constraint_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_dispose(_ptr);
-  }
-}
+}

+ 69 - 42
spine-flutter/lib/generated/path_constraint_data.dart

@@ -31,117 +31,144 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
+import 'arrays.dart';
 import 'constraint.dart';
 import 'constraint.dart';
+import 'constraint_data.dart';
+import 'ik_constraint.dart';
+import 'path_constraint.dart';
+import 'path_constraint_pose.dart';
+import 'physics_constraint.dart';
+import 'posed_data.dart';
+import 'position_mode.dart';
+import 'rotate_mode.dart';
 import 'skeleton.dart';
 import 'skeleton.dart';
+import 'slider.dart';
 import 'slot_data.dart';
 import 'slot_data.dart';
-import 'position_mode.dart';
 import 'spacing_mode.dart';
 import 'spacing_mode.dart';
-import 'rotate_mode.dart';
-import 'path_constraint_pose.dart';
-import 'arrays.dart';
+import 'transform_constraint.dart';
 
 
 /// PathConstraintData wrapper
 /// PathConstraintData wrapper
-class PathConstraintData implements Finalizable {
+class PathConstraintData extends PosedData implements ConstraintData {
   final Pointer<spine_path_constraint_data_wrapper> _ptr;
   final Pointer<spine_path_constraint_data_wrapper> _ptr;
 
 
-  PathConstraintData.fromPointer(this._ptr);
+  PathConstraintData.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PathConstraintData(String name) {
   factory PathConstraintData(String name) {
-    final ptr = SpineBindings.bindings.spine_path_constraint_data_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_path_constraint_data_create(name.toNativeUtf8().cast<Char>());
     return PathConstraintData.fromPointer(ptr);
     return PathConstraintData.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_rtti(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_data_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
+  @override
   Constraint createMethod(Skeleton skeleton) {
   Constraint createMethod(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_path_constraint_data_create_method(_ptr, skeleton.nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Constraint from pointer - no concrete subclasses found');
+    final result = SpineBindings.bindings
+        .spine_path_constraint_data_create_method(
+            _ptr, skeleton.nativePtr.cast());
+    final rtti = SpineBindings.bindings.spine_constraint_get_rtti(result);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_ik_constraint':
+        return IkConstraint.fromPointer(result.cast());
+      case 'spine_path_constraint':
+        return PathConstraint.fromPointer(result.cast());
+      case 'spine_physics_constraint':
+        return PhysicsConstraint.fromPointer(result.cast());
+      case 'spine_slider':
+        return Slider.fromPointer(result.cast());
+      case 'spine_transform_constraint':
+        return TransformConstraint.fromPointer(result.cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Constraint');
+    }
   }
   }
 
 
   ArrayBoneData get bones {
   ArrayBoneData get bones {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_bones(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_data_get_bones(_ptr);
     return ArrayBoneData.fromPointer(result);
     return ArrayBoneData.fromPointer(result);
   }
   }
 
 
   SlotData get slot {
   SlotData get slot {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_slot(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_data_get_slot(_ptr);
     return SlotData.fromPointer(result);
     return SlotData.fromPointer(result);
   }
   }
 
 
   set slot(SlotData value) {
   set slot(SlotData value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_slot(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_path_constraint_data_set_slot(_ptr, value.nativePtr.cast());
   }
   }
 
 
   PositionMode get positionMode {
   PositionMode get positionMode {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_position_mode(_ptr);
+    final result = SpineBindings.bindings
+        .spine_path_constraint_data_get_position_mode(_ptr);
     return PositionMode.fromValue(result);
     return PositionMode.fromValue(result);
   }
   }
 
 
   set positionMode(PositionMode value) {
   set positionMode(PositionMode value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_position_mode(_ptr, value.value);
+    SpineBindings.bindings
+        .spine_path_constraint_data_set_position_mode(_ptr, value.value);
   }
   }
 
 
   SpacingMode get spacingMode {
   SpacingMode get spacingMode {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_spacing_mode(_ptr);
+    final result = SpineBindings.bindings
+        .spine_path_constraint_data_get_spacing_mode(_ptr);
     return SpacingMode.fromValue(result);
     return SpacingMode.fromValue(result);
   }
   }
 
 
   set spacingMode(SpacingMode value) {
   set spacingMode(SpacingMode value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_spacing_mode(_ptr, value.value);
+    SpineBindings.bindings
+        .spine_path_constraint_data_set_spacing_mode(_ptr, value.value);
   }
   }
 
 
   RotateMode get rotateMode {
   RotateMode get rotateMode {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_rotate_mode(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_data_get_rotate_mode(_ptr);
     return RotateMode.fromValue(result);
     return RotateMode.fromValue(result);
   }
   }
 
 
   set rotateMode(RotateMode value) {
   set rotateMode(RotateMode value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_rotate_mode(_ptr, value.value);
+    SpineBindings.bindings
+        .spine_path_constraint_data_set_rotate_mode(_ptr, value.value);
   }
   }
 
 
   double get offsetRotation {
   double get offsetRotation {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_offset_rotation(_ptr);
+    final result = SpineBindings.bindings
+        .spine_path_constraint_data_get_offset_rotation(_ptr);
     return result;
     return result;
   }
   }
 
 
   set offsetRotation(double value) {
   set offsetRotation(double value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_offset_rotation(_ptr, value);
-  }
-
-  String get name {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_name(_ptr);
-    return result.cast<Utf8>().toDartString();
-  }
-
-  bool get skinRequired {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_skin_required(_ptr);
-    return result;
+    SpineBindings.bindings
+        .spine_path_constraint_data_set_offset_rotation(_ptr, value);
   }
   }
 
 
   PathConstraintPose get setupPose {
   PathConstraintPose get setupPose {
-    final result = SpineBindings.bindings.spine_path_constraint_data_get_setup_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_data_get_setup_pose(_ptr);
     return PathConstraintPose.fromPointer(result);
     return PathConstraintPose.fromPointer(result);
   }
   }
 
 
-  set skinRequired(bool value) {
-    SpineBindings.bindings.spine_path_constraint_data_set_skin_required(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_path_constraint_data_rtti();
     final result = SpineBindings.bindings.spine_path_constraint_data_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_data_dispose(_ptr);
-  }
-}
+}

+ 22 - 15
spine-flutter/lib/generated/path_constraint_mix_timeline.dart

@@ -30,40 +30,47 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'constraint_timeline.dart';
 import 'curve_timeline.dart';
 import 'curve_timeline.dart';
 
 
 /// PathConstraintMixTimeline wrapper
 /// PathConstraintMixTimeline wrapper
-class PathConstraintMixTimeline extends CurveTimeline {
+class PathConstraintMixTimeline extends CurveTimeline
+    implements ConstraintTimeline {
   final Pointer<spine_path_constraint_mix_timeline_wrapper> _ptr;
   final Pointer<spine_path_constraint_mix_timeline_wrapper> _ptr;
 
 
-  PathConstraintMixTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PathConstraintMixTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PathConstraintMixTimeline(int frameCount, int bezierCount, int constraintIndex) {
-    final ptr = SpineBindings.bindings.spine_path_constraint_mix_timeline_create(frameCount, bezierCount, constraintIndex);
+  factory PathConstraintMixTimeline(
+      int frameCount, int bezierCount, int constraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_path_constraint_mix_timeline_create(
+            frameCount, bezierCount, constraintIndex);
     return PathConstraintMixTimeline.fromPointer(ptr);
     return PathConstraintMixTimeline.fromPointer(ptr);
   }
   }
 
 
-  void setFrame(int frame, double time, double mixRotate, double mixX, double mixY) {
-    SpineBindings.bindings.spine_path_constraint_mix_timeline_set_frame(_ptr, frame, time, mixRotate, mixX, mixY);
+  void setFrame(
+      int frame, double time, double mixRotate, double mixX, double mixY) {
+    SpineBindings.bindings.spine_path_constraint_mix_timeline_set_frame(
+        _ptr, frame, time, mixRotate, mixX, mixY);
   }
   }
 
 
+  @override
   int get constraintIndex {
   int get constraintIndex {
-    final result = SpineBindings.bindings.spine_path_constraint_mix_timeline_get_constraint_index(_ptr);
+    final result = SpineBindings.bindings
+        .spine_path_constraint_mix_timeline_get_constraint_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set constraintIndex(int value) {
-    SpineBindings.bindings.spine_path_constraint_mix_timeline_set_constraint_index(_ptr, value);
-  }
-
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_mix_timeline_dispose(_ptr);
+  set constraintIndex(int value) {
+    SpineBindings.bindings
+        .spine_path_constraint_mix_timeline_set_constraint_index(_ptr, value);
   }
   }
-}
+}

+ 16 - 13
spine-flutter/lib/generated/path_constraint_pose.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// PathConstraintPose wrapper
 /// PathConstraintPose wrapper
@@ -48,11 +48,13 @@ class PathConstraintPose implements Finalizable {
   }
   }
 
 
   void set(PathConstraintPose pose) {
   void set(PathConstraintPose pose) {
-    SpineBindings.bindings.spine_path_constraint_pose_set(_ptr, pose.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_path_constraint_pose_set(_ptr, pose.nativePtr.cast());
   }
   }
 
 
   double get position {
   double get position {
-    final result = SpineBindings.bindings.spine_path_constraint_pose_get_position(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_pose_get_position(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -61,7 +63,8 @@ class PathConstraintPose implements Finalizable {
   }
   }
 
 
   double get spacing {
   double get spacing {
-    final result = SpineBindings.bindings.spine_path_constraint_pose_get_spacing(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_pose_get_spacing(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -70,16 +73,19 @@ class PathConstraintPose implements Finalizable {
   }
   }
 
 
   double get mixRotate {
   double get mixRotate {
-    final result = SpineBindings.bindings.spine_path_constraint_pose_get_mix_rotate(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_pose_get_mix_rotate(_ptr);
     return result;
     return result;
   }
   }
 
 
   set mixRotate(double value) {
   set mixRotate(double value) {
-    SpineBindings.bindings.spine_path_constraint_pose_set_mix_rotate(_ptr, value);
+    SpineBindings.bindings
+        .spine_path_constraint_pose_set_mix_rotate(_ptr, value);
   }
   }
 
 
   double get mixX {
   double get mixX {
-    final result = SpineBindings.bindings.spine_path_constraint_pose_get_mix_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_pose_get_mix_x(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -88,15 +94,12 @@ class PathConstraintPose implements Finalizable {
   }
   }
 
 
   double get mixY {
   double get mixY {
-    final result = SpineBindings.bindings.spine_path_constraint_pose_get_mix_y(_ptr);
+    final result =
+        SpineBindings.bindings.spine_path_constraint_pose_get_mix_y(_ptr);
     return result;
     return result;
   }
   }
 
 
   set mixY(double value) {
   set mixY(double value) {
     SpineBindings.bindings.spine_path_constraint_pose_set_mix_y(_ptr, value);
     SpineBindings.bindings.spine_path_constraint_pose_set_mix_y(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_pose_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/path_constraint_position_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'constraint_timeline1.dart';
 import 'constraint_timeline1.dart';
 
 
@@ -38,19 +38,18 @@ import 'constraint_timeline1.dart';
 class PathConstraintPositionTimeline extends ConstraintTimeline1 {
 class PathConstraintPositionTimeline extends ConstraintTimeline1 {
   final Pointer<spine_path_constraint_position_timeline_wrapper> _ptr;
   final Pointer<spine_path_constraint_position_timeline_wrapper> _ptr;
 
 
-  PathConstraintPositionTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PathConstraintPositionTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PathConstraintPositionTimeline(int frameCount, int bezierCount, int constraintIndex) {
-    final ptr = SpineBindings.bindings.spine_path_constraint_position_timeline_create(frameCount, bezierCount, constraintIndex);
+  factory PathConstraintPositionTimeline(
+      int frameCount, int bezierCount, int constraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_path_constraint_position_timeline_create(
+            frameCount, bezierCount, constraintIndex);
     return PathConstraintPositionTimeline.fromPointer(ptr);
     return PathConstraintPositionTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_position_timeline_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/path_constraint_spacing_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'constraint_timeline1.dart';
 import 'constraint_timeline1.dart';
 
 
@@ -38,19 +38,18 @@ import 'constraint_timeline1.dart';
 class PathConstraintSpacingTimeline extends ConstraintTimeline1 {
 class PathConstraintSpacingTimeline extends ConstraintTimeline1 {
   final Pointer<spine_path_constraint_spacing_timeline_wrapper> _ptr;
   final Pointer<spine_path_constraint_spacing_timeline_wrapper> _ptr;
 
 
-  PathConstraintSpacingTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PathConstraintSpacingTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PathConstraintSpacingTimeline(int frameCount, int bezierCount, int constraintIndex) {
-    final ptr = SpineBindings.bindings.spine_path_constraint_spacing_timeline_create(frameCount, bezierCount, constraintIndex);
+  factory PathConstraintSpacingTimeline(
+      int frameCount, int bezierCount, int constraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_path_constraint_spacing_timeline_create(
+            frameCount, bezierCount, constraintIndex);
     return PathConstraintSpacingTimeline.fromPointer(ptr);
     return PathConstraintSpacingTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_path_constraint_spacing_timeline_dispose(_ptr);
-  }
-}
+}

+ 4 - 4
spine-flutter/lib/generated/physics.dart

@@ -32,9 +32,9 @@
 /// Physics enum
 /// Physics enum
 enum Physics {
 enum Physics {
   none(0),
   none(0),
-  reset(1),
-  update(2),
-  pose(3);
+  reset(0),
+  update(0),
+  pose(0);
 
 
   const Physics(this.value);
   const Physics(this.value);
   final int value;
   final int value;
@@ -45,4 +45,4 @@ enum Physics {
       orElse: () => throw ArgumentError('Invalid Physics value: $value'),
       orElse: () => throw ArgumentError('Invalid Physics value: $value'),
     );
     );
   }
   }
-}
+}

+ 44 - 32
spine-flutter/lib/generated/physics_constraint.dart

@@ -30,54 +30,69 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'skeleton.dart';
-import 'physics.dart';
 import 'bone_pose.dart';
 import 'bone_pose.dart';
+import 'constraint.dart';
+import 'physics.dart';
 import 'physics_constraint_data.dart';
 import 'physics_constraint_data.dart';
 import 'physics_constraint_pose.dart';
 import 'physics_constraint_pose.dart';
+import 'posed.dart';
+import 'posed_active.dart';
+import 'skeleton.dart';
 
 
 /// PhysicsConstraint wrapper
 /// PhysicsConstraint wrapper
-class PhysicsConstraint implements Finalizable {
+class PhysicsConstraint extends PosedActive implements Posed, Constraint {
   final Pointer<spine_physics_constraint_wrapper> _ptr;
   final Pointer<spine_physics_constraint_wrapper> _ptr;
 
 
-  PhysicsConstraint.fromPointer(this._ptr);
+  PhysicsConstraint.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PhysicsConstraint(PhysicsConstraintData data, Skeleton skeleton) {
   factory PhysicsConstraint(PhysicsConstraintData data, Skeleton skeleton) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_create(data.nativePtr.cast(), skeleton.nativePtr.cast());
+    final ptr = SpineBindings.bindings.spine_physics_constraint_create(
+        data.nativePtr.cast(), skeleton.nativePtr.cast());
     return PhysicsConstraint.fromPointer(ptr);
     return PhysicsConstraint.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
-    final result = SpineBindings.bindings.spine_physics_constraint_get_rtti(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
+  @override
   void update(Skeleton skeleton, Physics physics) {
   void update(Skeleton skeleton, Physics physics) {
-    SpineBindings.bindings.spine_physics_constraint_update(_ptr, skeleton.nativePtr.cast(), physics.value);
+    SpineBindings.bindings.spine_physics_constraint_update(
+        _ptr, skeleton.nativePtr.cast(), physics.value);
   }
   }
 
 
+  @override
   void sort(Skeleton skeleton) {
   void sort(Skeleton skeleton) {
-    SpineBindings.bindings.spine_physics_constraint_sort(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_physics_constraint_sort(_ptr, skeleton.nativePtr.cast());
   }
   }
 
 
+  @override
   bool get isSourceActive {
   bool get isSourceActive {
-    final result = SpineBindings.bindings.spine_physics_constraint_is_source_active(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_is_source_active(_ptr);
     return result;
     return result;
   }
   }
 
 
   PhysicsConstraint copy(Skeleton skeleton) {
   PhysicsConstraint copy(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_physics_constraint_copy(_ptr, skeleton.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_copy(_ptr, skeleton.nativePtr.cast());
     return PhysicsConstraint.fromPointer(result);
     return PhysicsConstraint.fromPointer(result);
   }
   }
 
 
   void reset(Skeleton skeleton) {
   void reset(Skeleton skeleton) {
-    SpineBindings.bindings.spine_physics_constraint_reset(_ptr, skeleton.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_physics_constraint_reset(_ptr, skeleton.nativePtr.cast());
   }
   }
 
 
   void translate(double x, double y) {
   void translate(double x, double y) {
@@ -89,57 +104,54 @@ class PhysicsConstraint implements Finalizable {
   }
   }
 
 
   BonePose get bone {
   BonePose get bone {
-    final result = SpineBindings.bindings.spine_physics_constraint_get_bone(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_get_bone(_ptr);
     return BonePose.fromPointer(result);
     return BonePose.fromPointer(result);
   }
   }
 
 
   set bone(BonePose value) {
   set bone(BonePose value) {
-    SpineBindings.bindings.spine_physics_constraint_set_bone(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_physics_constraint_set_bone(_ptr, value.nativePtr.cast());
   }
   }
 
 
+  @override
   PhysicsConstraintData get data {
   PhysicsConstraintData get data {
-    final result = SpineBindings.bindings.spine_physics_constraint_get_data(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_get_data(_ptr);
     return PhysicsConstraintData.fromPointer(result);
     return PhysicsConstraintData.fromPointer(result);
   }
   }
 
 
   PhysicsConstraintPose get pose {
   PhysicsConstraintPose get pose {
-    final result = SpineBindings.bindings.spine_physics_constraint_get_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_get_pose(_ptr);
     return PhysicsConstraintPose.fromPointer(result);
     return PhysicsConstraintPose.fromPointer(result);
   }
   }
 
 
   PhysicsConstraintPose get appliedPose {
   PhysicsConstraintPose get appliedPose {
-    final result = SpineBindings.bindings.spine_physics_constraint_get_applied_pose(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_get_applied_pose(_ptr);
     return PhysicsConstraintPose.fromPointer(result);
     return PhysicsConstraintPose.fromPointer(result);
   }
   }
 
 
+  @override
   void resetConstrained() {
   void resetConstrained() {
     SpineBindings.bindings.spine_physics_constraint_reset_constrained(_ptr);
     SpineBindings.bindings.spine_physics_constraint_reset_constrained(_ptr);
   }
   }
 
 
+  @override
   void constrained() {
   void constrained() {
     SpineBindings.bindings.spine_physics_constraint_constrained(_ptr);
     SpineBindings.bindings.spine_physics_constraint_constrained(_ptr);
   }
   }
 
 
+  @override
   bool get isPoseEqualToApplied {
   bool get isPoseEqualToApplied {
-    final result = SpineBindings.bindings.spine_physics_constraint_is_pose_equal_to_applied(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_is_pose_equal_to_applied(_ptr);
     return result;
     return result;
   }
   }
 
 
-  bool get isActive {
-    final result = SpineBindings.bindings.spine_physics_constraint_is_active(_ptr);
-    return result;
-  }
-
-  set active(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_set_active(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_physics_constraint_rtti();
     final result = SpineBindings.bindings.spine_physics_constraint_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_damping_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintDampingTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintDampingTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_damping_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_damping_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintDampingTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintDampingTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintDampingTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_damping_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintDampingTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_damping_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintDampingTimeline.fromPointer(ptr);
     return PhysicsConstraintDampingTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_damping_timeline_dispose(_ptr);
-  }
-}
+}

+ 97 - 55
spine-flutter/lib/generated/physics_constraint_data.dart

@@ -31,49 +31,85 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'rtti.dart';
 import 'rtti.dart';
-import 'constraint.dart';
-import 'skeleton.dart';
 import 'bone_data.dart';
 import 'bone_data.dart';
+import 'constraint.dart';
+import 'constraint_data.dart';
+import 'ik_constraint.dart';
+import 'path_constraint.dart';
+import 'physics_constraint.dart';
 import 'physics_constraint_pose.dart';
 import 'physics_constraint_pose.dart';
+import 'posed_data.dart';
+import 'skeleton.dart';
+import 'slider.dart';
+import 'transform_constraint.dart';
 
 
 /// PhysicsConstraintData wrapper
 /// PhysicsConstraintData wrapper
-class PhysicsConstraintData implements Finalizable {
+class PhysicsConstraintData extends PosedData implements ConstraintData {
   final Pointer<spine_physics_constraint_data_wrapper> _ptr;
   final Pointer<spine_physics_constraint_data_wrapper> _ptr;
 
 
-  PhysicsConstraintData.fromPointer(this._ptr);
+  PhysicsConstraintData.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
+  @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PhysicsConstraintData(String name) {
   factory PhysicsConstraintData(String name) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_data_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_data_create(name.toNativeUtf8().cast<Char>());
     return PhysicsConstraintData.fromPointer(ptr);
     return PhysicsConstraintData.fromPointer(ptr);
   }
   }
 
 
+  @override
   Rtti get rtti {
   Rtti get rtti {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_rtti(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_rtti(_ptr);
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
 
 
+  @override
   Constraint createMethod(Skeleton skeleton) {
   Constraint createMethod(Skeleton skeleton) {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_create_method(_ptr, skeleton.nativePtr.cast());
-    throw UnsupportedError('Cannot instantiate abstract class Constraint from pointer - no concrete subclasses found');
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_create_method(
+            _ptr, skeleton.nativePtr.cast());
+    final rtti = SpineBindings.bindings.spine_constraint_get_rtti(result);
+    final className = SpineBindings.bindings
+        .spine_rtti_get_class_name(rtti)
+        .cast<Utf8>()
+        .toDartString();
+    switch (className) {
+      case 'spine_ik_constraint':
+        return IkConstraint.fromPointer(result.cast());
+      case 'spine_path_constraint':
+        return PathConstraint.fromPointer(result.cast());
+      case 'spine_physics_constraint':
+        return PhysicsConstraint.fromPointer(result.cast());
+      case 'spine_slider':
+        return Slider.fromPointer(result.cast());
+      case 'spine_transform_constraint':
+        return TransformConstraint.fromPointer(result.cast());
+      default:
+        throw UnsupportedError(
+            'Unknown concrete type: $className for abstract class Constraint');
+    }
   }
   }
 
 
   BoneData get bone {
   BoneData get bone {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_bone(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_bone(_ptr);
     return BoneData.fromPointer(result);
     return BoneData.fromPointer(result);
   }
   }
 
 
   set bone(BoneData value) {
   set bone(BoneData value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_bone(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_bone(_ptr, value.nativePtr.cast());
   }
   }
 
 
   double get step {
   double get step {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_step(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_step(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -82,7 +118,8 @@ class PhysicsConstraintData implements Finalizable {
   }
   }
 
 
   double get x {
   double get x {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_x(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -91,7 +128,8 @@ class PhysicsConstraintData implements Finalizable {
   }
   }
 
 
   double get y {
   double get y {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_y(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_y(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -100,34 +138,41 @@ class PhysicsConstraintData implements Finalizable {
   }
   }
 
 
   double get rotate {
   double get rotate {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_rotate(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_rotate(_ptr);
     return result;
     return result;
   }
   }
 
 
   set rotate(double value) {
   set rotate(double value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_rotate(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_rotate(_ptr, value);
   }
   }
 
 
   double get scaleX {
   double get scaleX {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_scale_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_scale_x(_ptr);
     return result;
     return result;
   }
   }
 
 
   set scaleX(double value) {
   set scaleX(double value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_scale_x(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_scale_x(_ptr, value);
   }
   }
 
 
   double get shearX {
   double get shearX {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_shear_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_shear_x(_ptr);
     return result;
     return result;
   }
   }
 
 
   set shearX(double value) {
   set shearX(double value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_shear_x(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_shear_x(_ptr, value);
   }
   }
 
 
   double get limit {
   double get limit {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_limit(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_data_get_limit(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -136,93 +181,90 @@ class PhysicsConstraintData implements Finalizable {
   }
   }
 
 
   bool get inertiaGlobal {
   bool get inertiaGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_inertia_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_inertia_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set inertiaGlobal(bool value) {
   set inertiaGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_inertia_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_inertia_global(_ptr, value);
   }
   }
 
 
   bool get strengthGlobal {
   bool get strengthGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_strength_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_strength_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set strengthGlobal(bool value) {
   set strengthGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_strength_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_strength_global(_ptr, value);
   }
   }
 
 
   bool get dampingGlobal {
   bool get dampingGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_damping_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_damping_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set dampingGlobal(bool value) {
   set dampingGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_damping_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_damping_global(_ptr, value);
   }
   }
 
 
   bool get massGlobal {
   bool get massGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_mass_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_mass_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set massGlobal(bool value) {
   set massGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_mass_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_mass_global(_ptr, value);
   }
   }
 
 
   bool get windGlobal {
   bool get windGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_wind_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_wind_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set windGlobal(bool value) {
   set windGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_wind_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_wind_global(_ptr, value);
   }
   }
 
 
   bool get gravityGlobal {
   bool get gravityGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_gravity_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_gravity_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set gravityGlobal(bool value) {
   set gravityGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_gravity_global(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_gravity_global(_ptr, value);
   }
   }
 
 
   bool get mixGlobal {
   bool get mixGlobal {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_mix_global(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_mix_global(_ptr);
     return result;
     return result;
   }
   }
 
 
   set mixGlobal(bool value) {
   set mixGlobal(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_mix_global(_ptr, value);
-  }
-
-  String get name {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_name(_ptr);
-    return result.cast<Utf8>().toDartString();
-  }
-
-  bool get skinRequired {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_skin_required(_ptr);
-    return result;
+    SpineBindings.bindings
+        .spine_physics_constraint_data_set_mix_global(_ptr, value);
   }
   }
 
 
   PhysicsConstraintPose get setupPose {
   PhysicsConstraintPose get setupPose {
-    final result = SpineBindings.bindings.spine_physics_constraint_data_get_setup_pose(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_data_get_setup_pose(_ptr);
     return PhysicsConstraintPose.fromPointer(result);
     return PhysicsConstraintPose.fromPointer(result);
   }
   }
 
 
-  set skinRequired(bool value) {
-    SpineBindings.bindings.spine_physics_constraint_data_set_skin_required(_ptr, value);
-  }
-
   static Rtti rttiStatic() {
   static Rtti rttiStatic() {
     final result = SpineBindings.bindings.spine_physics_constraint_data_rtti();
     final result = SpineBindings.bindings.spine_physics_constraint_data_rtti();
     return Rtti.fromPointer(result);
     return Rtti.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_data_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_gravity_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintGravityTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintGravityTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_gravity_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_gravity_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintGravityTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintGravityTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintGravityTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_gravity_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintGravityTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_gravity_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintGravityTimeline.fromPointer(ptr);
     return PhysicsConstraintGravityTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_gravity_timeline_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_inertia_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintInertiaTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintInertiaTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_inertia_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_inertia_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintInertiaTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintInertiaTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintInertiaTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_inertia_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintInertiaTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_inertia_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintInertiaTimeline.fromPointer(ptr);
     return PhysicsConstraintInertiaTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_inertia_timeline_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_mass_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintMassTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintMassTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_mass_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_mass_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintMassTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintMassTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintMassTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_mass_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintMassTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_mass_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintMassTimeline.fromPointer(ptr);
     return PhysicsConstraintMassTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_mass_timeline_dispose(_ptr);
-  }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_mix_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintMixTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintMixTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_mix_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_mix_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintMixTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintMixTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintMixTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_mix_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintMixTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_mix_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintMixTimeline.fromPointer(ptr);
     return PhysicsConstraintMixTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_mix_timeline_dispose(_ptr);
-  }
-}
+}

+ 28 - 19
spine-flutter/lib/generated/physics_constraint_pose.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// PhysicsConstraintPose wrapper
 /// PhysicsConstraintPose wrapper
@@ -48,47 +48,57 @@ class PhysicsConstraintPose implements Finalizable {
   }
   }
 
 
   void set(PhysicsConstraintPose pose) {
   void set(PhysicsConstraintPose pose) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set(_ptr, pose.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set(_ptr, pose.nativePtr.cast());
   }
   }
 
 
   double get inertia {
   double get inertia {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_inertia(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_inertia(_ptr);
     return result;
     return result;
   }
   }
 
 
   set inertia(double value) {
   set inertia(double value) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set_inertia(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set_inertia(_ptr, value);
   }
   }
 
 
   double get strength {
   double get strength {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_strength(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_strength(_ptr);
     return result;
     return result;
   }
   }
 
 
   set strength(double value) {
   set strength(double value) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set_strength(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set_strength(_ptr, value);
   }
   }
 
 
   double get damping {
   double get damping {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_damping(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_damping(_ptr);
     return result;
     return result;
   }
   }
 
 
   set damping(double value) {
   set damping(double value) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set_damping(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set_damping(_ptr, value);
   }
   }
 
 
   double get massInverse {
   double get massInverse {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_mass_inverse(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_pose_get_mass_inverse(_ptr);
     return result;
     return result;
   }
   }
 
 
   set massInverse(double value) {
   set massInverse(double value) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set_mass_inverse(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set_mass_inverse(_ptr, value);
   }
   }
 
 
   double get wind {
   double get wind {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_wind(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_wind(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -97,24 +107,23 @@ class PhysicsConstraintPose implements Finalizable {
   }
   }
 
 
   double get gravity {
   double get gravity {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_gravity(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_gravity(_ptr);
     return result;
     return result;
   }
   }
 
 
   set gravity(double value) {
   set gravity(double value) {
-    SpineBindings.bindings.spine_physics_constraint_pose_set_gravity(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_pose_set_gravity(_ptr, value);
   }
   }
 
 
   double get mix {
   double get mix {
-    final result = SpineBindings.bindings.spine_physics_constraint_pose_get_mix(_ptr);
+    final result =
+        SpineBindings.bindings.spine_physics_constraint_pose_get_mix(_ptr);
     return result;
     return result;
   }
   }
 
 
   set mix(double value) {
   set mix(double value) {
     SpineBindings.bindings.spine_physics_constraint_pose_set_mix(_ptr, value);
     SpineBindings.bindings.spine_physics_constraint_pose_set_mix(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_pose_dispose(_ptr);
-  }
-}
+}

+ 20 - 14
spine-flutter/lib/generated/physics_constraint_reset_timeline.dart

@@ -30,40 +30,46 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'constraint_timeline.dart';
 import 'timeline.dart';
 import 'timeline.dart';
 
 
 /// PhysicsConstraintResetTimeline wrapper
 /// PhysicsConstraintResetTimeline wrapper
-class PhysicsConstraintResetTimeline extends Timeline {
+class PhysicsConstraintResetTimeline extends Timeline
+    implements ConstraintTimeline {
   final Pointer<spine_physics_constraint_reset_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_reset_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintResetTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintResetTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PhysicsConstraintResetTimeline(int frameCount, int constraintIndex) {
   factory PhysicsConstraintResetTimeline(int frameCount, int constraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_reset_timeline_create(frameCount, constraintIndex);
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_reset_timeline_create(
+            frameCount, constraintIndex);
     return PhysicsConstraintResetTimeline.fromPointer(ptr);
     return PhysicsConstraintResetTimeline.fromPointer(ptr);
   }
   }
 
 
+  @override
   int get constraintIndex {
   int get constraintIndex {
-    final result = SpineBindings.bindings.spine_physics_constraint_reset_timeline_get_constraint_index(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_reset_timeline_get_constraint_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  void setFrame(int frame, double time) {
-    SpineBindings.bindings.spine_physics_constraint_reset_timeline_set_frame(_ptr, frame, time);
-  }
-
+  @override
   set constraintIndex(int value) {
   set constraintIndex(int value) {
-    SpineBindings.bindings.spine_physics_constraint_reset_timeline_set_constraint_index(_ptr, value);
+    SpineBindings.bindings
+        .spine_physics_constraint_reset_timeline_set_constraint_index(
+            _ptr, value);
   }
   }
 
 
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_reset_timeline_dispose(_ptr);
+  void setFrame(int frame, double time) {
+    SpineBindings.bindings
+        .spine_physics_constraint_reset_timeline_set_frame(_ptr, frame, time);
   }
   }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_strength_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintStrengthTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintStrengthTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_strength_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_strength_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintStrengthTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintStrengthTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintStrengthTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_strength_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintStrengthTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_strength_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintStrengthTimeline.fromPointer(ptr);
     return PhysicsConstraintStrengthTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_strength_timeline_dispose(_ptr);
-  }
-}
+}

+ 13 - 11
spine-flutter/lib/generated/physics_constraint_timeline.dart

@@ -30,31 +30,33 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'constraint_timeline.dart';
 import 'curve_timeline1.dart';
 import 'curve_timeline1.dart';
 
 
 /// PhysicsConstraintTimeline wrapper
 /// PhysicsConstraintTimeline wrapper
-abstract class PhysicsConstraintTimeline extends CurveTimeline1 {
+abstract class PhysicsConstraintTimeline extends CurveTimeline1
+    implements ConstraintTimeline {
   final Pointer<spine_physics_constraint_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
+  @override
   int get constraintIndex {
   int get constraintIndex {
-    final result = SpineBindings.bindings.spine_physics_constraint_timeline_get_constraint_index(_ptr);
+    final result = SpineBindings.bindings
+        .spine_physics_constraint_timeline_get_constraint_index(_ptr);
     return result;
     return result;
   }
   }
 
 
-  set constraintIndex(int value) {
-    SpineBindings.bindings.spine_physics_constraint_timeline_set_constraint_index(_ptr, value);
-  }
-
   @override
   @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_timeline_dispose(_ptr);
+  set constraintIndex(int value) {
+    SpineBindings.bindings
+        .spine_physics_constraint_timeline_set_constraint_index(_ptr, value);
   }
   }
-}
+}

+ 9 - 10
spine-flutter/lib/generated/physics_constraint_wind_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'physics_constraint_timeline.dart';
 import 'physics_constraint_timeline.dart';
 
 
@@ -38,19 +38,18 @@ import 'physics_constraint_timeline.dart';
 class PhysicsConstraintWindTimeline extends PhysicsConstraintTimeline {
 class PhysicsConstraintWindTimeline extends PhysicsConstraintTimeline {
   final Pointer<spine_physics_constraint_wind_timeline_wrapper> _ptr;
   final Pointer<spine_physics_constraint_wind_timeline_wrapper> _ptr;
 
 
-  PhysicsConstraintWindTimeline.fromPointer(this._ptr) : super.fromPointer(_ptr.cast());
+  PhysicsConstraintWindTimeline.fromPointer(this._ptr)
+      : super.fromPointer(_ptr.cast());
 
 
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   @override
   @override
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
-  factory PhysicsConstraintWindTimeline(int frameCount, int bezierCount, int physicsConstraintIndex) {
-    final ptr = SpineBindings.bindings.spine_physics_constraint_wind_timeline_create(frameCount, bezierCount, physicsConstraintIndex);
+  factory PhysicsConstraintWindTimeline(
+      int frameCount, int bezierCount, int physicsConstraintIndex) {
+    final ptr = SpineBindings.bindings
+        .spine_physics_constraint_wind_timeline_create(
+            frameCount, bezierCount, physicsConstraintIndex);
     return PhysicsConstraintWindTimeline.fromPointer(ptr);
     return PhysicsConstraintWindTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_physics_constraint_wind_timeline_dispose(_ptr);
-  }
-}
+}

+ 12 - 12
spine-flutter/lib/generated/point_attachment.dart

@@ -31,11 +31,11 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'attachment.dart';
 import 'attachment.dart';
-import 'color.dart';
 import 'bone_pose.dart';
 import 'bone_pose.dart';
+import 'color.dart';
 
 
 /// PointAttachment wrapper
 /// PointAttachment wrapper
 class PointAttachment extends Attachment {
 class PointAttachment extends Attachment {
@@ -48,7 +48,8 @@ class PointAttachment extends Attachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PointAttachment(String name) {
   factory PointAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_point_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_point_attachment_create(name.toNativeUtf8().cast<Char>());
     return PointAttachment.fromPointer(ptr);
     return PointAttachment.fromPointer(ptr);
   }
   }
 
 
@@ -71,7 +72,8 @@ class PointAttachment extends Attachment {
   }
   }
 
 
   double get rotation {
   double get rotation {
-    final result = SpineBindings.bindings.spine_point_attachment_get_rotation(_ptr);
+    final result =
+        SpineBindings.bindings.spine_point_attachment_get_rotation(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -80,17 +82,15 @@ class PointAttachment extends Attachment {
   }
   }
 
 
   Color get color {
   Color get color {
-    final result = SpineBindings.bindings.spine_point_attachment_get_color(_ptr);
+    final result =
+        SpineBindings.bindings.spine_point_attachment_get_color(_ptr);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
 
 
   double computeWorldRotation(BonePose bone) {
   double computeWorldRotation(BonePose bone) {
-    final result = SpineBindings.bindings.spine_point_attachment_compute_world_rotation(_ptr, bone.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_point_attachment_compute_world_rotation(
+            _ptr, bone.nativePtr.cast());
     return result;
     return result;
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_point_attachment_dispose(_ptr);
-  }
-}
+}

+ 4 - 7
spine-flutter/lib/generated/polygon.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'arrays.dart';
 import 'arrays.dart';
 
 
@@ -54,7 +54,8 @@ class Polygon implements Finalizable {
   }
   }
 
 
   set vertices(ArrayFloat value) {
   set vertices(ArrayFloat value) {
-    SpineBindings.bindings.spine_polygon_set__vertices(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_polygon_set__vertices(_ptr, value.nativePtr.cast());
   }
   }
 
 
   int get count {
   int get count {
@@ -65,8 +66,4 @@ class Polygon implements Finalizable {
   set count(int value) {
   set count(int value) {
     SpineBindings.bindings.spine_polygon_set__count(_ptr, value);
     SpineBindings.bindings.spine_polygon_set__count(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_polygon_dispose(_ptr);
-  }
-}
+}

+ 6 - 27
spine-flutter/lib/generated/posed.dart

@@ -30,32 +30,11 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
-import '../spine_bindings.dart';
 
 
 /// Posed wrapper
 /// Posed wrapper
-abstract class Posed implements Finalizable {
-  final Pointer<spine_posed_wrapper> _ptr;
-
-  Posed.fromPointer(this._ptr);
-
-  /// Get the native pointer for FFI calls
-  Pointer get nativePtr => _ptr;
-
-  void constrained() {
-    SpineBindings.bindings.spine_posed_constrained(_ptr);
-  }
-
-  void resetConstrained() {
-    SpineBindings.bindings.spine_posed_reset_constrained(_ptr);
-  }
-
-  bool get isPoseEqualToApplied {
-    final result = SpineBindings.bindings.spine_posed_is_pose_equal_to_applied(_ptr);
-    return result;
-  }
-
-  void dispose() {
-    SpineBindings.bindings.spine_posed_dispose(_ptr);
-  }
-}
+abstract class Posed {
+  Pointer get nativePtr;
+  void constrained();
+  void resetConstrained();
+  bool get isPoseEqualToApplied;
+}

+ 2 - 6
spine-flutter/lib/generated/posed_active.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// PosedActive wrapper
 /// PosedActive wrapper
@@ -50,8 +50,4 @@ class PosedActive implements Finalizable {
   set active(bool value) {
   set active(bool value) {
     SpineBindings.bindings.spine_posed_active_set_active(_ptr, value);
     SpineBindings.bindings.spine_posed_active_set_active(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_posed_active_dispose(_ptr);
-  }
-}
+}

+ 6 - 8
spine-flutter/lib/generated/posed_data.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// PosedData wrapper
 /// PosedData wrapper
@@ -44,7 +44,8 @@ class PosedData implements Finalizable {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory PosedData(String name) {
   factory PosedData(String name) {
-    final ptr = SpineBindings.bindings.spine_posed_data_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_posed_data_create(name.toNativeUtf8().cast<Char>());
     return PosedData.fromPointer(ptr);
     return PosedData.fromPointer(ptr);
   }
   }
 
 
@@ -54,15 +55,12 @@ class PosedData implements Finalizable {
   }
   }
 
 
   bool get skinRequired {
   bool get skinRequired {
-    final result = SpineBindings.bindings.spine_posed_data_get_skin_required(_ptr);
+    final result =
+        SpineBindings.bindings.spine_posed_data_get_skin_required(_ptr);
     return result;
     return result;
   }
   }
 
 
   set skinRequired(bool value) {
   set skinRequired(bool value) {
     SpineBindings.bindings.spine_posed_data_set_skin_required(_ptr, value);
     SpineBindings.bindings.spine_posed_data_set_skin_required(_ptr, value);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_posed_data_dispose(_ptr);
-  }
-}
+}

+ 2 - 2
spine-flutter/lib/generated/position_mode.dart

@@ -32,7 +32,7 @@
 /// PositionMode enum
 /// PositionMode enum
 enum PositionMode {
 enum PositionMode {
   fixed(0),
   fixed(0),
-  percent(1);
+  percent(0);
 
 
   const PositionMode(this.value);
   const PositionMode(this.value);
   final int value;
   final int value;
@@ -43,4 +43,4 @@ enum PositionMode {
       orElse: () => throw ArgumentError('Invalid PositionMode value: $value'),
       orElse: () => throw ArgumentError('Invalid PositionMode value: $value'),
     );
     );
   }
   }
-}
+}

+ 32 - 32
spine-flutter/lib/generated/property.dart

@@ -31,37 +31,37 @@
 
 
 /// Property enum
 /// Property enum
 enum Property {
 enum Property {
-  rotate(1 << 0),
-  x(1 << 1),
-  y(1 << 2),
-  scaleX(1 << 3),
-  scaleY(1 << 4),
-  shearX(1 << 5),
-  shearY(1 << 6),
-  inherit(1 << 7),
-  rgb(1 << 8),
-  alpha(1 << 9),
-  rgb2(1 << 10),
-  attachment(1 << 11),
-  deform(1 << 12),
-  event(1 << 13),
-  drawOrder(1 << 14),
-  ikConstraint(1 << 15),
-  transformConstraint(1 << 16),
-  pathConstraintPosition(1 << 17),
-  pathConstraintSpacing(1 << 18),
-  pathConstraintMix(1 << 19),
-  physicsConstraintInertia(1 << 20),
-  physicsConstraintStrength(1 << 21),
-  physicsConstraintDamping(1 << 22),
-  physicsConstraintMass(1 << 23),
-  physicsConstraintWind(1 << 24),
-  physicsConstraintGravity(1 << 25),
-  physicsConstraintMix(1 << 26),
-  physicsConstraintReset(1 << 27),
-  sequence(1 << 28),
-  sliderTime(1 << 29),
-  sliderMix(1 << 30);
+  rotate(1),
+  x(1),
+  y(1),
+  scaleX(1),
+  scaleY(1),
+  shearX(1),
+  shearY(1),
+  inherit(1),
+  rgb(1),
+  alpha(1),
+  rgb2(1),
+  attachment(1),
+  deform(1),
+  event(1),
+  drawOrder(1),
+  ikConstraint(1),
+  transformConstraint(1),
+  pathConstraintPosition(1),
+  pathConstraintSpacing(1),
+  pathConstraintMix(1),
+  physicsConstraintInertia(1),
+  physicsConstraintStrength(1),
+  physicsConstraintDamping(1),
+  physicsConstraintMass(1),
+  physicsConstraintWind(1),
+  physicsConstraintGravity(1),
+  physicsConstraintMix(1),
+  physicsConstraintReset(1),
+  sequence(1),
+  sliderTime(1),
+  sliderMix(1);
 
 
   const Property(this.value);
   const Property(this.value);
   final int value;
   final int value;
@@ -72,4 +72,4 @@ enum Property {
       orElse: () => throw ArgumentError('Invalid Property value: $value'),
       orElse: () => throw ArgumentError('Invalid Property value: $value'),
     );
     );
   }
   }
-}
+}

+ 43 - 27
spine-flutter/lib/generated/region_attachment.dart

@@ -31,14 +31,14 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
+import 'arrays.dart';
 import 'attachment.dart';
 import 'attachment.dart';
-import 'slot.dart';
 import 'color.dart';
 import 'color.dart';
-import 'texture_region.dart';
 import 'sequence.dart';
 import 'sequence.dart';
-import 'arrays.dart';
+import 'slot.dart';
+import 'texture_region.dart';
 
 
 /// RegionAttachment wrapper
 /// RegionAttachment wrapper
 class RegionAttachment extends Attachment {
 class RegionAttachment extends Attachment {
@@ -51,7 +51,8 @@ class RegionAttachment extends Attachment {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory RegionAttachment(String name) {
   factory RegionAttachment(String name) {
-    final ptr = SpineBindings.bindings.spine_region_attachment_create(name.toNativeUtf8().cast<Char>());
+    final ptr = SpineBindings.bindings
+        .spine_region_attachment_create(name.toNativeUtf8().cast<Char>());
     return RegionAttachment.fromPointer(ptr);
     return RegionAttachment.fromPointer(ptr);
   }
   }
 
 
@@ -78,7 +79,8 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   double get rotation {
   double get rotation {
-    final result = SpineBindings.bindings.spine_region_attachment_get_rotation(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_rotation(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -87,7 +89,8 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   double get scaleX {
   double get scaleX {
-    final result = SpineBindings.bindings.spine_region_attachment_get_scale_x(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_scale_x(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -96,7 +99,8 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   double get scaleY {
   double get scaleY {
-    final result = SpineBindings.bindings.spine_region_attachment_get_scale_y(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_scale_y(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -105,7 +109,8 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   double get width {
   double get width {
-    final result = SpineBindings.bindings.spine_region_attachment_get_width(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_width(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -114,7 +119,8 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   double get height {
   double get height {
-    final result = SpineBindings.bindings.spine_region_attachment_get_height(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_height(_ptr);
     return result;
     return result;
   }
   }
 
 
@@ -123,53 +129,63 @@ class RegionAttachment extends Attachment {
   }
   }
 
 
   Color get color {
   Color get color {
-    final result = SpineBindings.bindings.spine_region_attachment_get_color(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_color(_ptr);
     return Color.fromPointer(result);
     return Color.fromPointer(result);
   }
   }
 
 
   String get path {
   String get path {
-    final result = SpineBindings.bindings.spine_region_attachment_get_path(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_path(_ptr);
     return result.cast<Utf8>().toDartString();
     return result.cast<Utf8>().toDartString();
   }
   }
 
 
   set path(String value) {
   set path(String value) {
-    SpineBindings.bindings.spine_region_attachment_set_path(_ptr, value.toNativeUtf8().cast<Char>());
+    SpineBindings.bindings.spine_region_attachment_set_path(
+        _ptr, value.toNativeUtf8().cast<Char>());
   }
   }
 
 
   TextureRegion get region {
   TextureRegion get region {
-    final result = SpineBindings.bindings.spine_region_attachment_get_region(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_region(_ptr);
     return TextureRegion.fromPointer(result);
     return TextureRegion.fromPointer(result);
   }
   }
 
 
   set region(TextureRegion value) {
   set region(TextureRegion value) {
-    SpineBindings.bindings.spine_region_attachment_set_region(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_region_attachment_set_region(_ptr, value.nativePtr.cast());
   }
   }
 
 
   Sequence get sequence {
   Sequence get sequence {
-    final result = SpineBindings.bindings.spine_region_attachment_get_sequence(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_sequence(_ptr);
     return Sequence.fromPointer(result);
     return Sequence.fromPointer(result);
   }
   }
 
 
   set sequence(Sequence value) {
   set sequence(Sequence value) {
-    SpineBindings.bindings.spine_region_attachment_set_sequence(_ptr, value.nativePtr.cast());
+    SpineBindings.bindings
+        .spine_region_attachment_set_sequence(_ptr, value.nativePtr.cast());
   }
   }
 
 
   ArrayFloat get offset {
   ArrayFloat get offset {
-    final result = SpineBindings.bindings.spine_region_attachment_get_offset(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_offset(_ptr);
     return ArrayFloat.fromPointer(result);
     return ArrayFloat.fromPointer(result);
   }
   }
 
 
   ArrayFloat get uVs {
   ArrayFloat get uVs {
-    final result = SpineBindings.bindings.spine_region_attachment_get_u_vs(_ptr);
+    final result =
+        SpineBindings.bindings.spine_region_attachment_get_u_vs(_ptr);
     return ArrayFloat.fromPointer(result);
     return ArrayFloat.fromPointer(result);
   }
   }
 
 
-  void computeWorldVertices(Slot slot, ArrayFloat worldVertices, int offset, int stride) {
-    SpineBindings.bindings.spine_region_attachment_compute_world_vertices_2(_ptr, slot.nativePtr.cast(), worldVertices.nativePtr.cast(), offset, stride);
-  }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_region_attachment_dispose(_ptr);
+  void computeWorldVertices(
+      Slot slot, ArrayFloat worldVertices, int offset, int stride) {
+    SpineBindings.bindings.spine_region_attachment_compute_world_vertices_2(
+        _ptr,
+        slot.nativePtr.cast(),
+        worldVertices.nativePtr.cast(),
+        offset,
+        stride);
   }
   }
-}
+}

+ 42 - 9
spine-flutter/lib/generated/render_command.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'blend_mode.dart';
 import 'blend_mode.dart';
 
 
@@ -43,27 +43,60 @@ class RenderCommand implements Finalizable {
   /// Get the native pointer for FFI calls
   /// Get the native pointer for FFI calls
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
+  Pointer<Float> get positions {
+    final result =
+        SpineBindings.bindings.spine_render_command_get_positions(_ptr);
+    return result;
+  }
+
+  Pointer<Float> get uvs {
+    final result = SpineBindings.bindings.spine_render_command_get_uvs(_ptr);
+    return result;
+  }
+
+  Pointer<Uint32> get colors {
+    final result = SpineBindings.bindings.spine_render_command_get_colors(_ptr);
+    return result;
+  }
+
+  Pointer<Uint32> get darkColors {
+    final result =
+        SpineBindings.bindings.spine_render_command_get_dark_colors(_ptr);
+    return result;
+  }
+
   int get numVertices {
   int get numVertices {
-    final result = SpineBindings.bindings.spine_render_command_get_num_vertices(_ptr);
+    final result =
+        SpineBindings.bindings.spine_render_command_get_num_vertices(_ptr);
+    return result;
+  }
+
+  Pointer<Uint16> get indices {
+    final result =
+        SpineBindings.bindings.spine_render_command_get_indices(_ptr);
     return result;
     return result;
   }
   }
 
 
   int get numIndices {
   int get numIndices {
-    final result = SpineBindings.bindings.spine_render_command_get_num_indices(_ptr);
+    final result =
+        SpineBindings.bindings.spine_render_command_get_num_indices(_ptr);
     return result;
     return result;
   }
   }
 
 
   BlendMode get blendMode {
   BlendMode get blendMode {
-    final result = SpineBindings.bindings.spine_render_command_get_blend_mode(_ptr);
+    final result =
+        SpineBindings.bindings.spine_render_command_get_blend_mode(_ptr);
     return BlendMode.fromValue(result);
     return BlendMode.fromValue(result);
   }
   }
 
 
+  Pointer<Void> get texture {
+    final result =
+        SpineBindings.bindings.spine_render_command_get_texture(_ptr);
+    return result;
+  }
+
   RenderCommand get next {
   RenderCommand get next {
     final result = SpineBindings.bindings.spine_render_command_get_next(_ptr);
     final result = SpineBindings.bindings.spine_render_command_get_next(_ptr);
     return RenderCommand.fromPointer(result);
     return RenderCommand.fromPointer(result);
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_render_command_dispose(_ptr);
-  }
-}
+}

+ 8 - 10
spine-flutter/lib/generated/rgb2_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'slot_curve_timeline.dart';
 import 'slot_curve_timeline.dart';
 
 
@@ -45,16 +45,14 @@ class Rgb2Timeline extends SlotCurveTimeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory Rgb2Timeline(int frameCount, int bezierCount, int slotIndex) {
   factory Rgb2Timeline(int frameCount, int bezierCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_rgb2_timeline_create(frameCount, bezierCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_rgb2_timeline_create(frameCount, bezierCount, slotIndex);
     return Rgb2Timeline.fromPointer(ptr);
     return Rgb2Timeline.fromPointer(ptr);
   }
   }
 
 
-  void setFrame(int frame, double time, double r, double g, double b, double r2, double g2, double b2) {
-    SpineBindings.bindings.spine_rgb2_timeline_set_frame(_ptr, frame, time, r, g, b, r2, g2, b2);
+  void setFrame(int frame, double time, double r, double g, double b, double r2,
+      double g2, double b2) {
+    SpineBindings.bindings
+        .spine_rgb2_timeline_set_frame(_ptr, frame, time, r, g, b, r2, g2, b2);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_rgb2_timeline_dispose(_ptr);
-  }
-}
+}

+ 6 - 9
spine-flutter/lib/generated/rgb_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'slot_curve_timeline.dart';
 import 'slot_curve_timeline.dart';
 
 
@@ -45,16 +45,13 @@ class RgbTimeline extends SlotCurveTimeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory RgbTimeline(int frameCount, int bezierCount, int slotIndex) {
   factory RgbTimeline(int frameCount, int bezierCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_rgb_timeline_create(frameCount, bezierCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_rgb_timeline_create(frameCount, bezierCount, slotIndex);
     return RgbTimeline.fromPointer(ptr);
     return RgbTimeline.fromPointer(ptr);
   }
   }
 
 
   void setFrame(int frame, double time, double r, double g, double b) {
   void setFrame(int frame, double time, double r, double g, double b) {
-    SpineBindings.bindings.spine_rgb_timeline_set_frame(_ptr, frame, time, r, g, b);
+    SpineBindings.bindings
+        .spine_rgb_timeline_set_frame(_ptr, frame, time, r, g, b);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_rgb_timeline_dispose(_ptr);
-  }
-}
+}

+ 8 - 10
spine-flutter/lib/generated/rgba2_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'slot_curve_timeline.dart';
 import 'slot_curve_timeline.dart';
 
 
@@ -45,16 +45,14 @@ class Rgba2Timeline extends SlotCurveTimeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory Rgba2Timeline(int frameCount, int bezierCount, int slotIndex) {
   factory Rgba2Timeline(int frameCount, int bezierCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_rgba2_timeline_create(frameCount, bezierCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_rgba2_timeline_create(frameCount, bezierCount, slotIndex);
     return Rgba2Timeline.fromPointer(ptr);
     return Rgba2Timeline.fromPointer(ptr);
   }
   }
 
 
-  void setFrame(int frame, double time, double r, double g, double b, double a, double r2, double g2, double b2) {
-    SpineBindings.bindings.spine_rgba2_timeline_set_frame(_ptr, frame, time, r, g, b, a, r2, g2, b2);
+  void setFrame(int frame, double time, double r, double g, double b, double a,
+      double r2, double g2, double b2) {
+    SpineBindings.bindings.spine_rgba2_timeline_set_frame(
+        _ptr, frame, time, r, g, b, a, r2, g2, b2);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_rgba2_timeline_dispose(_ptr);
-  }
-}
+}

+ 8 - 10
spine-flutter/lib/generated/rgba_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'slot_curve_timeline.dart';
 import 'slot_curve_timeline.dart';
 
 
@@ -45,16 +45,14 @@ class RgbaTimeline extends SlotCurveTimeline {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory RgbaTimeline(int frameCount, int bezierCount, int slotIndex) {
   factory RgbaTimeline(int frameCount, int bezierCount, int slotIndex) {
-    final ptr = SpineBindings.bindings.spine_rgba_timeline_create(frameCount, bezierCount, slotIndex);
+    final ptr = SpineBindings.bindings
+        .spine_rgba_timeline_create(frameCount, bezierCount, slotIndex);
     return RgbaTimeline.fromPointer(ptr);
     return RgbaTimeline.fromPointer(ptr);
   }
   }
 
 
-  void setFrame(int frame, double time, double r, double g, double b, double a) {
-    SpineBindings.bindings.spine_rgba_timeline_set_frame(_ptr, frame, time, r, g, b, a);
+  void setFrame(
+      int frame, double time, double r, double g, double b, double a) {
+    SpineBindings.bindings
+        .spine_rgba_timeline_set_frame(_ptr, frame, time, r, g, b, a);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_rgba_timeline_dispose(_ptr);
-  }
-}
+}

+ 3 - 3
spine-flutter/lib/generated/rotate_mode.dart

@@ -32,8 +32,8 @@
 /// RotateMode enum
 /// RotateMode enum
 enum RotateMode {
 enum RotateMode {
   tangent(0),
   tangent(0),
-  chain(1),
-  chainScale(2);
+  chain(0),
+  chainScale(0);
 
 
   const RotateMode(this.value);
   const RotateMode(this.value);
   final int value;
   final int value;
@@ -44,4 +44,4 @@ enum RotateMode {
       orElse: () => throw ArgumentError('Invalid RotateMode value: $value'),
       orElse: () => throw ArgumentError('Invalid RotateMode value: $value'),
     );
     );
   }
   }
-}
+}

+ 4 - 8
spine-flutter/lib/generated/rotate_timeline.dart

@@ -30,7 +30,7 @@
 // AUTO GENERATED FILE, DO NOT EDIT.
 // AUTO GENERATED FILE, DO NOT EDIT.
 
 
 import 'dart:ffi';
 import 'dart:ffi';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 import 'bone_timeline1.dart';
 import 'bone_timeline1.dart';
 
 
@@ -45,12 +45,8 @@ class RotateTimeline extends BoneTimeline1 {
   Pointer get nativePtr => _ptr;
   Pointer get nativePtr => _ptr;
 
 
   factory RotateTimeline(int frameCount, int bezierCount, int boneIndex) {
   factory RotateTimeline(int frameCount, int bezierCount, int boneIndex) {
-    final ptr = SpineBindings.bindings.spine_rotate_timeline_create(frameCount, bezierCount, boneIndex);
+    final ptr = SpineBindings.bindings
+        .spine_rotate_timeline_create(frameCount, bezierCount, boneIndex);
     return RotateTimeline.fromPointer(ptr);
     return RotateTimeline.fromPointer(ptr);
   }
   }
-
-  @override
-  void dispose() {
-    SpineBindings.bindings.spine_rotate_timeline_dispose(_ptr);
-  }
-}
+}

+ 6 - 8
spine-flutter/lib/generated/rtti.dart

@@ -31,7 +31,7 @@
 
 
 import 'dart:ffi';
 import 'dart:ffi';
 import 'package:ffi/ffi.dart';
 import 'package:ffi/ffi.dart';
-import 'spine_flutter_bindings_generated.dart';
+import 'spine_dart_bindings_generated.dart';
 import '../spine_bindings.dart';
 import '../spine_bindings.dart';
 
 
 /// Rtti wrapper
 /// Rtti wrapper
@@ -49,16 +49,14 @@ class Rtti implements Finalizable {
   }
   }
 
 
   bool isExactly(Rtti rtti) {
   bool isExactly(Rtti rtti) {
-    final result = SpineBindings.bindings.spine_rtti_is_exactly(_ptr, rtti.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_rtti_is_exactly(_ptr, rtti.nativePtr.cast());
     return result;
     return result;
   }
   }
 
 
   bool instanceOf(Rtti rtti) {
   bool instanceOf(Rtti rtti) {
-    final result = SpineBindings.bindings.spine_rtti_instance_of(_ptr, rtti.nativePtr.cast());
+    final result = SpineBindings.bindings
+        .spine_rtti_instance_of(_ptr, rtti.nativePtr.cast());
     return result;
     return result;
   }
   }
-
-  void dispose() {
-    SpineBindings.bindings.spine_rtti_dispose(_ptr);
-  }
-}
+}

部分文件因为文件数量过多而无法显示