From 558646027d7dd6619be436868a83956cf125ceff Mon Sep 17 00:00:00 2001 From: soywiz Date: Mon, 14 Aug 2017 19:30:34 +0200 Subject: [PATCH 1/2] Added DragonBonesJS reference to be able to replace and get diffs to update later --- reference/.gitignore | 20 + reference/@base.url | 2 + reference/DragonBones/README.md | 7 + reference/DragonBones/out/dragonBones.d.ts | 4384 +++++ reference/DragonBones/out/dragonBones.js | 10537 ++++++++++++ reference/DragonBones/out/dragonBones.min.js | 1 + reference/DragonBones/package.json | 17 + .../src/dragonBones/animation/Animation.ts | 745 + .../dragonBones/animation/AnimationState.ts | 953 ++ .../animation/BaseTimelineState.ts | 340 + .../src/dragonBones/animation/IAnimatable.ts | 25 + .../dragonBones/animation/TimelineState.ts | 714 + .../src/dragonBones/animation/WorldClock.ts | 175 + .../src/dragonBones/armature/Armature.ts | 841 + .../src/dragonBones/armature/Bone.ts | 503 + .../src/dragonBones/armature/Constraint.ts | 150 + .../dragonBones/armature/IArmatureProxy.ts | 41 + .../src/dragonBones/armature/Slot.ts | 1005 ++ .../dragonBones/armature/TransformObject.ts | 129 + .../src/dragonBones/core/BaseObject.ts | 133 + .../src/dragonBones/core/DragonBones.ts | 259 + .../src/dragonBones/event/EventObject.ts | 129 + .../src/dragonBones/event/IEventDispatcher.ts | 43 + .../src/dragonBones/factory/BaseFactory.ts | 813 + .../src/dragonBones/geom/ColorTransform.ts | 28 + .../src/dragonBones/geom/Matrix.ts | 161 + .../DragonBones/src/dragonBones/geom/Point.ts | 15 + .../src/dragonBones/geom/Rectangle.ts | 21 + .../src/dragonBones/geom/Transform.ts | 207 + .../src/dragonBones/model/AnimationConfig.ts | 285 + .../src/dragonBones/model/AnimationData.ts | 246 + .../src/dragonBones/model/ArmatureData.ts | 630 + .../src/dragonBones/model/BoundingBoxData.ts | 705 + .../src/dragonBones/model/ConstraintData.ts | 38 + .../src/dragonBones/model/DisplayData.ts | 127 + .../src/dragonBones/model/DragonBonesData.ts | 154 + .../src/dragonBones/model/TextureAtlasData.ts | 149 + .../src/dragonBones/model/UserData.ts | 91 + .../DragonBones/src/dragonBones/modules.ts | 1 + .../dragonBones/parser/BinaryDataParser.ts | 435 + .../src/dragonBones/parser/DataParser.ts | 302 + .../dragonBones/parser/ObjectDataParser.ts | 1795 +++ reference/DragonBones/tsconfig.json | 71 + reference/DragonBones/tslint.json | 15 + reference/Egret/4.x/README.md | 8 + reference/Egret/4.x/out/dragonBones.d.ts | 5313 +++++++ reference/Egret/4.x/out/dragonBones.js | 13179 ++++++++++++++++ reference/Egret/4.x/out/dragonBones.min.js | 1 + reference/Egret/4.x/package.json | 12 + .../dragonBones/egret/EgretArmatureDisplay.ts | 492 + .../4.x/src/dragonBones/egret/EgretFactory.ts | 232 + .../4.x/src/dragonBones/egret/EgretSlot.ts | 436 + .../egret/EgretTextureAtlasData.ts | 128 + .../Egret/4.x/src/dragonBones/egret/Movie.ts | 1474 ++ reference/Egret/4.x/tsconfig.json | 78 + reference/Egret/4.x/tslint.json | 15 + reference/Egret/5.x/README.md | 8 + reference/Egret/5.x/out/dragonBones.d.ts | 4942 ++++++ reference/Egret/5.x/out/dragonBones.js | 11720 ++++++++++++++ reference/Egret/5.x/out/dragonBones.min.js | 1 + reference/Egret/5.x/package.json | 12 + .../dragonBones/egret/EgretArmatureDisplay.ts | 455 + .../5.x/src/dragonBones/egret/EgretFactory.ts | 232 + .../5.x/src/dragonBones/egret/EgretSlot.ts | 317 + .../egret/EgretTextureAtlasData.ts | 130 + reference/Egret/5.x/tsconfig.json | 76 + reference/Egret/5.x/tslint.json | 15 + reference/Egret/Demos/.wing/launch.json | 30 + reference/Egret/Demos/.wing/settings.json | 3 + reference/Egret/Demos/.wing/tasks.json | 33 + reference/Egret/Demos/README.md | 4 + reference/Egret/Demos/egretProperties.json | 27 + reference/Egret/Demos/index.html | 88 + .../assets/animation_base_test_ske.json | 1 + .../assets/animation_base_test_tex.json | 1 + .../assets/animation_base_test_tex.png | Bin 0 -> 6700 bytes .../assets/core_element/mecha_1502b_ske.json | 7232 +++++++++ .../assets/core_element/mecha_1502b_tex.json | 1 + .../assets/core_element/mecha_1502b_tex.png | Bin 0 -> 190205 bytes .../assets/core_element/skin_1502b_ske.json | 1 + .../assets/core_element/skin_1502b_tex.json | 1 + .../assets/core_element/skin_1502b_tex.png | Bin 0 -> 257183 bytes .../assets/core_element/weapon_1000_ske.json | 1 + .../assets/core_element/weapon_1000_tex.json | 1 + .../assets/core_element/weapon_1000_tex.png | Bin 0 -> 283265 bytes .../resource/assets/dragon_boy_ske.dbbin | Bin 0 -> 17764 bytes .../Demos/resource/assets/dragon_boy_ske.json | 1 + .../Demos/resource/assets/dragon_boy_tex.json | 1 + .../Demos/resource/assets/dragon_boy_tex.png | Bin 0 -> 31667 bytes .../assets/replace_slot_display/main_ske.json | 1 + .../assets/replace_slot_display/main_tex.json | 1 + .../assets/replace_slot_display/main_tex.png | Bin 0 -> 26260 bytes .../replace_slot_display/replace_ske.json | 1 + .../replace_slot_display/replace_tex.json | 1 + .../replace_slot_display/replace_tex.png | Bin 0 -> 60291 bytes reference/Egret/Demos/src/Main.ts | 12 + .../Egret/Demos/src/demo/AnimationBaseTest.ts | 103 + reference/Egret/Demos/src/demo/BaseTest.ts | 41 + reference/Egret/Demos/src/demo/CoreElement.ts | 562 + .../Egret/Demos/src/demo/HelloDragonBones.ts | 43 + .../Egret/Demos/src/demo/PerformanceTest.ts | 141 + .../Demos/src/demo/ReplaceSlotDisplay.ts | 127 + .../Egret/Demos/template/debug/index.html | 88 + .../Demos/template/runtime/native_loader.js | 8 + .../Demos/template/runtime/native_require.js | 51 + .../Demos/template/runtime/runtime_loader.js | 8 + reference/Egret/Demos/template/web/index.html | 88 + reference/Egret/Demos/tsconfig.json | 25 + reference/Egret/Demos/wingProperties.json | 11 + reference/Egret/README.md | 5 + reference/Egret/wasm/README.md | 8 + .../Egret/wasm/out/dragonBones-wasm.d.ts | 4698 ++++++ reference/Egret/wasm/out/dragonBones-wasm.js | 11750 ++++++++++++++ .../Egret/wasm/out/dragonBones-wasm.min.js | 1 + reference/Egret/wasm/package.json | 12 + .../dragonBones/egret/EgretArmatureDisplay.ts | 811 + .../src/dragonBones/egret/EgretFactory.ts | 434 + reference/Egret/wasm/tsconfig.json | 74 + reference/LICENSE | 20 + reference/Pixi/4.x/README.md | 21 + reference/Pixi/4.x/out/dragonBones.d.ts | 4623 ++++++ reference/Pixi/4.x/out/dragonBones.js | 11273 +++++++++++++ reference/Pixi/4.x/out/dragonBones.min.js | 1 + reference/Pixi/4.x/package.json | 12 + .../dragonBones/pixi/PixiArmatureDisplay.ts | 199 + .../4.x/src/dragonBones/pixi/PixiFactory.ts | 136 + .../Pixi/4.x/src/dragonBones/pixi/PixiSlot.ts | 348 + .../dragonBones/pixi/PixiTextureAtlasData.ts | 91 + reference/Pixi/4.x/tsconfig.json | 77 + reference/Pixi/4.x/tslint.json | 15 + reference/Pixi/Demos/README.md | 28 + reference/Pixi/Demos/index.html | 29 + reference/Pixi/Demos/out/AnimationBaseTest.js | 107 + reference/Pixi/Demos/out/BaseTest.js | 36 + reference/Pixi/Demos/out/CoreElement.js | 458 + reference/Pixi/Demos/out/HelloDragonBones.js | 55 + reference/Pixi/Demos/out/PerformanceTest.js | 133 + .../Pixi/Demos/out/ReplaceSlotDisplay.js | 87 + reference/Pixi/Demos/package.json | 16 + .../assets/animation_base_test_ske.json | 1 + .../assets/animation_base_test_tex.json | 1 + .../assets/animation_base_test_tex.png | Bin 0 -> 6700 bytes .../assets/core_element/mecha_1502b_ske.json | 7232 +++++++++ .../assets/core_element/mecha_1502b_tex.json | 1 + .../assets/core_element/mecha_1502b_tex.png | Bin 0 -> 190205 bytes .../assets/core_element/skin_1502b_ske.json | 1 + .../assets/core_element/skin_1502b_tex.json | 1 + .../assets/core_element/skin_1502b_tex.png | Bin 0 -> 257183 bytes .../assets/core_element/weapon_1000_ske.json | 1 + .../assets/core_element/weapon_1000_tex.json | 1 + .../assets/core_element/weapon_1000_tex.png | Bin 0 -> 283265 bytes .../resource/assets/dragon_boy_ske.dbbin | Bin 0 -> 17764 bytes .../Demos/resource/assets/dragon_boy_ske.json | 1 + .../Demos/resource/assets/dragon_boy_tex.json | 1 + .../Demos/resource/assets/dragon_boy_tex.png | Bin 0 -> 31667 bytes .../assets/replace_slot_display/main_ske.json | 1 + .../assets/replace_slot_display/main_tex.json | 1 + .../assets/replace_slot_display/main_tex.png | Bin 0 -> 26260 bytes .../replace_slot_display/replace_ske.json | 1 + .../replace_slot_display/replace_tex.json | 1 + .../replace_slot_display/replace_tex.png | Bin 0 -> 60291 bytes reference/Pixi/Demos/src/AnimationBaseTest.ts | 111 + reference/Pixi/Demos/src/BaseTest.ts | 35 + reference/Pixi/Demos/src/CoreElement.ts | 570 + reference/Pixi/Demos/src/HelloDragonBones.ts | 44 + reference/Pixi/Demos/src/PerformanceTest.ts | 141 + .../Pixi/Demos/src/ReplaceSlotDisplay.ts | 129 + reference/Pixi/Demos/tsconfig.json | 22 + reference/Pixi/Demos/tslint.json | 15 + reference/Pixi/README.md | 5 + reference/README.md | 21 + .../docs/DragonBones_4.5_data_format_zh.md | 421 + .../docs/DragonBones_4.7_release_notes_zh.md | 44 + .../docs/DragonBones_5.0_data_format_zh.md | 450 + 174 files changed, 120267 insertions(+) create mode 100644 reference/.gitignore create mode 100644 reference/@base.url create mode 100644 reference/DragonBones/README.md create mode 100644 reference/DragonBones/out/dragonBones.d.ts create mode 100644 reference/DragonBones/out/dragonBones.js create mode 100644 reference/DragonBones/out/dragonBones.min.js create mode 100644 reference/DragonBones/package.json create mode 100644 reference/DragonBones/src/dragonBones/animation/Animation.ts create mode 100644 reference/DragonBones/src/dragonBones/animation/AnimationState.ts create mode 100644 reference/DragonBones/src/dragonBones/animation/BaseTimelineState.ts create mode 100644 reference/DragonBones/src/dragonBones/animation/IAnimatable.ts create mode 100644 reference/DragonBones/src/dragonBones/animation/TimelineState.ts create mode 100644 reference/DragonBones/src/dragonBones/animation/WorldClock.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/Armature.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/Bone.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/Constraint.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/IArmatureProxy.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/Slot.ts create mode 100644 reference/DragonBones/src/dragonBones/armature/TransformObject.ts create mode 100644 reference/DragonBones/src/dragonBones/core/BaseObject.ts create mode 100644 reference/DragonBones/src/dragonBones/core/DragonBones.ts create mode 100644 reference/DragonBones/src/dragonBones/event/EventObject.ts create mode 100644 reference/DragonBones/src/dragonBones/event/IEventDispatcher.ts create mode 100644 reference/DragonBones/src/dragonBones/factory/BaseFactory.ts create mode 100644 reference/DragonBones/src/dragonBones/geom/ColorTransform.ts create mode 100644 reference/DragonBones/src/dragonBones/geom/Matrix.ts create mode 100644 reference/DragonBones/src/dragonBones/geom/Point.ts create mode 100644 reference/DragonBones/src/dragonBones/geom/Rectangle.ts create mode 100644 reference/DragonBones/src/dragonBones/geom/Transform.ts create mode 100644 reference/DragonBones/src/dragonBones/model/AnimationConfig.ts create mode 100644 reference/DragonBones/src/dragonBones/model/AnimationData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/ArmatureData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/BoundingBoxData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/ConstraintData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/DisplayData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/DragonBonesData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/TextureAtlasData.ts create mode 100644 reference/DragonBones/src/dragonBones/model/UserData.ts create mode 100644 reference/DragonBones/src/dragonBones/modules.ts create mode 100644 reference/DragonBones/src/dragonBones/parser/BinaryDataParser.ts create mode 100644 reference/DragonBones/src/dragonBones/parser/DataParser.ts create mode 100644 reference/DragonBones/src/dragonBones/parser/ObjectDataParser.ts create mode 100644 reference/DragonBones/tsconfig.json create mode 100644 reference/DragonBones/tslint.json create mode 100644 reference/Egret/4.x/README.md create mode 100644 reference/Egret/4.x/out/dragonBones.d.ts create mode 100644 reference/Egret/4.x/out/dragonBones.js create mode 100644 reference/Egret/4.x/out/dragonBones.min.js create mode 100644 reference/Egret/4.x/package.json create mode 100644 reference/Egret/4.x/src/dragonBones/egret/EgretArmatureDisplay.ts create mode 100644 reference/Egret/4.x/src/dragonBones/egret/EgretFactory.ts create mode 100644 reference/Egret/4.x/src/dragonBones/egret/EgretSlot.ts create mode 100644 reference/Egret/4.x/src/dragonBones/egret/EgretTextureAtlasData.ts create mode 100644 reference/Egret/4.x/src/dragonBones/egret/Movie.ts create mode 100644 reference/Egret/4.x/tsconfig.json create mode 100644 reference/Egret/4.x/tslint.json create mode 100644 reference/Egret/5.x/README.md create mode 100644 reference/Egret/5.x/out/dragonBones.d.ts create mode 100644 reference/Egret/5.x/out/dragonBones.js create mode 100644 reference/Egret/5.x/out/dragonBones.min.js create mode 100644 reference/Egret/5.x/package.json create mode 100644 reference/Egret/5.x/src/dragonBones/egret/EgretArmatureDisplay.ts create mode 100644 reference/Egret/5.x/src/dragonBones/egret/EgretFactory.ts create mode 100644 reference/Egret/5.x/src/dragonBones/egret/EgretSlot.ts create mode 100644 reference/Egret/5.x/src/dragonBones/egret/EgretTextureAtlasData.ts create mode 100644 reference/Egret/5.x/tsconfig.json create mode 100644 reference/Egret/5.x/tslint.json create mode 100644 reference/Egret/Demos/.wing/launch.json create mode 100644 reference/Egret/Demos/.wing/settings.json create mode 100644 reference/Egret/Demos/.wing/tasks.json create mode 100644 reference/Egret/Demos/README.md create mode 100644 reference/Egret/Demos/egretProperties.json create mode 100644 reference/Egret/Demos/index.html create mode 100644 reference/Egret/Demos/resource/assets/animation_base_test_ske.json create mode 100644 reference/Egret/Demos/resource/assets/animation_base_test_tex.json create mode 100644 reference/Egret/Demos/resource/assets/animation_base_test_tex.png create mode 100644 reference/Egret/Demos/resource/assets/core_element/mecha_1502b_ske.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.png create mode 100644 reference/Egret/Demos/resource/assets/core_element/skin_1502b_ske.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.png create mode 100644 reference/Egret/Demos/resource/assets/core_element/weapon_1000_ske.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/weapon_1000_tex.json create mode 100644 reference/Egret/Demos/resource/assets/core_element/weapon_1000_tex.png create mode 100644 reference/Egret/Demos/resource/assets/dragon_boy_ske.dbbin create mode 100644 reference/Egret/Demos/resource/assets/dragon_boy_ske.json create mode 100644 reference/Egret/Demos/resource/assets/dragon_boy_tex.json create mode 100644 reference/Egret/Demos/resource/assets/dragon_boy_tex.png create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/main_ske.json create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.json create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.png create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/replace_ske.json create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.json create mode 100644 reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.png create mode 100644 reference/Egret/Demos/src/Main.ts create mode 100644 reference/Egret/Demos/src/demo/AnimationBaseTest.ts create mode 100644 reference/Egret/Demos/src/demo/BaseTest.ts create mode 100644 reference/Egret/Demos/src/demo/CoreElement.ts create mode 100644 reference/Egret/Demos/src/demo/HelloDragonBones.ts create mode 100644 reference/Egret/Demos/src/demo/PerformanceTest.ts create mode 100644 reference/Egret/Demos/src/demo/ReplaceSlotDisplay.ts create mode 100644 reference/Egret/Demos/template/debug/index.html create mode 100644 reference/Egret/Demos/template/runtime/native_loader.js create mode 100644 reference/Egret/Demos/template/runtime/native_require.js create mode 100644 reference/Egret/Demos/template/runtime/runtime_loader.js create mode 100644 reference/Egret/Demos/template/web/index.html create mode 100644 reference/Egret/Demos/tsconfig.json create mode 100644 reference/Egret/Demos/wingProperties.json create mode 100644 reference/Egret/README.md create mode 100644 reference/Egret/wasm/README.md create mode 100644 reference/Egret/wasm/out/dragonBones-wasm.d.ts create mode 100644 reference/Egret/wasm/out/dragonBones-wasm.js create mode 100644 reference/Egret/wasm/out/dragonBones-wasm.min.js create mode 100644 reference/Egret/wasm/package.json create mode 100644 reference/Egret/wasm/src/dragonBones/egret/EgretArmatureDisplay.ts create mode 100644 reference/Egret/wasm/src/dragonBones/egret/EgretFactory.ts create mode 100644 reference/Egret/wasm/tsconfig.json create mode 100644 reference/LICENSE create mode 100644 reference/Pixi/4.x/README.md create mode 100644 reference/Pixi/4.x/out/dragonBones.d.ts create mode 100644 reference/Pixi/4.x/out/dragonBones.js create mode 100644 reference/Pixi/4.x/out/dragonBones.min.js create mode 100644 reference/Pixi/4.x/package.json create mode 100644 reference/Pixi/4.x/src/dragonBones/pixi/PixiArmatureDisplay.ts create mode 100644 reference/Pixi/4.x/src/dragonBones/pixi/PixiFactory.ts create mode 100644 reference/Pixi/4.x/src/dragonBones/pixi/PixiSlot.ts create mode 100644 reference/Pixi/4.x/src/dragonBones/pixi/PixiTextureAtlasData.ts create mode 100644 reference/Pixi/4.x/tsconfig.json create mode 100644 reference/Pixi/4.x/tslint.json create mode 100644 reference/Pixi/Demos/README.md create mode 100644 reference/Pixi/Demos/index.html create mode 100644 reference/Pixi/Demos/out/AnimationBaseTest.js create mode 100644 reference/Pixi/Demos/out/BaseTest.js create mode 100644 reference/Pixi/Demos/out/CoreElement.js create mode 100644 reference/Pixi/Demos/out/HelloDragonBones.js create mode 100644 reference/Pixi/Demos/out/PerformanceTest.js create mode 100644 reference/Pixi/Demos/out/ReplaceSlotDisplay.js create mode 100644 reference/Pixi/Demos/package.json create mode 100644 reference/Pixi/Demos/resource/assets/animation_base_test_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/animation_base_test_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/animation_base_test_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/core_element/skin_1502b_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/core_element/weapon_1000_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/weapon_1000_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/core_element/weapon_1000_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/dragon_boy_ske.dbbin create mode 100644 reference/Pixi/Demos/resource/assets/dragon_boy_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/dragon_boy_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/dragon_boy_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/main_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.png create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/replace_ske.json create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.json create mode 100644 reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.png create mode 100644 reference/Pixi/Demos/src/AnimationBaseTest.ts create mode 100644 reference/Pixi/Demos/src/BaseTest.ts create mode 100644 reference/Pixi/Demos/src/CoreElement.ts create mode 100644 reference/Pixi/Demos/src/HelloDragonBones.ts create mode 100644 reference/Pixi/Demos/src/PerformanceTest.ts create mode 100644 reference/Pixi/Demos/src/ReplaceSlotDisplay.ts create mode 100644 reference/Pixi/Demos/tsconfig.json create mode 100644 reference/Pixi/Demos/tslint.json create mode 100644 reference/Pixi/README.md create mode 100644 reference/README.md create mode 100644 reference/docs/DragonBones_4.5_data_format_zh.md create mode 100644 reference/docs/DragonBones_4.7_release_notes_zh.md create mode 100644 reference/docs/DragonBones_5.0_data_format_zh.md diff --git a/reference/.gitignore b/reference/.gitignore new file mode 100644 index 0000000..f879a6d --- /dev/null +++ b/reference/.gitignore @@ -0,0 +1,20 @@ +# Build and Release Folders +bin-debug/ +bin-release/ +bin/ +libs/ +node_modules/ +modules/ + +pids +logs +results + +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz \ No newline at end of file diff --git a/reference/@base.url b/reference/@base.url new file mode 100644 index 0000000..09eb622 --- /dev/null +++ b/reference/@base.url @@ -0,0 +1,2 @@ +[InternetShortcut] +URL=https://github.com/DragonBones/DragonBonesJS/commit/1fe868947b6a9f652d474e6ac5b94333cea97e72 diff --git a/reference/DragonBones/README.md b/reference/DragonBones/README.md new file mode 100644 index 0000000..569a556 --- /dev/null +++ b/reference/DragonBones/README.md @@ -0,0 +1,7 @@ +# DragonBones common library + +## How to build +``` +$npm install +$npm run build +``` \ No newline at end of file diff --git a/reference/DragonBones/out/dragonBones.d.ts b/reference/DragonBones/out/dragonBones.d.ts new file mode 100644 index 0000000..1c52caa --- /dev/null +++ b/reference/DragonBones/out/dragonBones.d.ts @@ -0,0 +1,4384 @@ +declare const Module: any; +declare namespace dragonBones { + /** + * @private + */ + const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4, + } + /** + * @private + */ + const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2, + } + /** + * @private + */ + const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3, + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2, + } + /** + * @private + */ + const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11, + } + /** + * @private + */ + const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13, + } + /** + * @private + */ + const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5, + } + /** + * @private + */ + const enum TimelineType { + Action = 0, + ZOrder = 1, + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + AnimationTime = 40, + AnimationWeight = 41, + } + /** + * @private + */ + const enum OffsetMode { + None = 0, + Additive = 1, + Override = 2, + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5, + } + /** + * @private + */ + interface Map { + [key: string]: T; + } + /** + * @private + */ + class DragonBones { + static yDown: boolean; + static debug: boolean; + static debugDraw: boolean; + static webAssembly: boolean; + static readonly VERSION: string; + private readonly _clock; + private readonly _events; + private readonly _objects; + private _eventManager; + constructor(eventManager: IEventDispatcher); + advanceTime(passedTime: number): void; + bufferEvent(value: EventObject): void; + bufferObject(object: BaseObject): void; + readonly clock: WorldClock; + readonly eventManager: IEventDispatcher; + } +} +declare namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class BaseObject { + private static _hashCode; + private static _defaultMaxCount; + private static readonly _maxCountMap; + private static readonly _poolsMap; + private static _returnObject(object); + /** + * @private + */ + static toString(): string; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static clearPool(objectConstructor?: (typeof BaseObject) | null): void; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static borrowObject(objectConstructor: { + new (): T; + }): T; + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly hashCode: number; + private _isInPool; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + returnToPool(): void; + } +} +declare namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Matrix { + a: number; + b: number; + c: number; + d: number; + tx: number; + ty: number; + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Matrix): Matrix; + /** + * @private + */ + copyFromArray(value: Array, offset?: number): Matrix; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + identity(): Matrix; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + concat(value: Matrix): Matrix; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + invert(): Matrix; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + transformPoint(x: number, y: number, result: { + x: number; + y: number; + }, delta?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Transform { + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x: number; + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y: number; + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew: number; + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation: number; + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX: number; + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY: number; + /** + * @private + */ + static readonly PI_D: number; + /** + * @private + */ + static readonly PI_H: number; + /** + * @private + */ + static readonly PI_Q: number; + /** + * @private + */ + static readonly RAD_DEG: number; + /** + * @private + */ + static readonly DEG_RAD: number; + /** + * @private + */ + static normalizeRadian(value: number): number; + constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x?: number, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y?: number, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew?: number, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation?: number, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX?: number, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Transform): Transform; + /** + * @private + */ + identity(): Transform; + /** + * @private + */ + add(value: Transform): Transform; + /** + * @private + */ + minus(value: Transform): Transform; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fromMatrix(matrix: Matrix): Transform; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + toMatrix(matrix: Matrix): Transform; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ColorTransform { + alphaMultiplier: number; + redMultiplier: number; + greenMultiplier: number; + blueMultiplier: number; + alphaOffset: number; + redOffset: number; + greenOffset: number; + blueOffset: number; + constructor(alphaMultiplier?: number, redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaOffset?: number, redOffset?: number, greenOffset?: number, blueOffset?: number); + copyFrom(value: ColorTransform): void; + identity(): void; + } +} +declare namespace dragonBones { + class Point { + x: number; + y: number; + constructor(x?: number, y?: number); + copyFrom(value: Point): void; + clear(): void; + } +} +declare namespace dragonBones { + class Rectangle { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + copyFrom(value: Rectangle): void; + clear(): void; + } +} +declare namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + class UserData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly ints: Array; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly floats: Array; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly strings: Array; + /** + * @private + */ + protected _onClear(): void; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getInt(index?: number): number; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getFloat(index?: number): number; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getString(index?: number): string; + } + /** + * @private + */ + class ActionData extends BaseObject { + static toString(): string; + type: ActionType; + name: string; + bone: BoneData | null; + slot: SlotData | null; + data: UserData | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + class DragonBonesData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly frameIndices: Array; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatureNames: Array; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatures: Map; + /** + * @private + */ + intArray: Array | Int16Array; + /** + * @private + */ + floatArray: Array | Float32Array; + /** + * @private + */ + frameIntArray: Array | Int16Array; + /** + * @private + */ + frameFloatArray: Array | Float32Array; + /** + * @private + */ + frameArray: Array | Int16Array; + /** + * @private + */ + timelineArray: Array | Uint16Array; + /** + * @private + */ + userData: UserData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addArmature(value: ArmatureData): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + getArmature(name: string): ArmatureData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + dispose(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + class CanvasData extends BaseObject { + /** + * @private + */ + static toString(): string; + hasBackground: boolean; + color: number; + x: number; + y: number; + width: number; + height: number; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class ArmatureData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * @private + */ + scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly aabb: Rectangle; + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * @private + */ + readonly sortedBones: Array; + /** + * @private + */ + readonly sortedSlots: Array; + /** + * @private + */ + readonly defaultActions: Array; + /** + * @private + */ + readonly actions: Array; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly bones: Map; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly slots: Map; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly skins: Map; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animations: Map; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultAnimation: AnimationData | null; + /** + * @private + */ + canvas: CanvasData | null; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + sortBones(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number; + /** + * @private + */ + getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void; + /** + * @private + */ + addBone(value: BoneData): void; + /** + * @private + */ + addSlot(value: SlotData): void; + /** + * @private + */ + addSkin(value: SkinData): void; + /** + * @private + */ + addAnimation(value: AnimationData): void; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + getBone(name: string): BoneData | null; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + getSlot(name: string): SlotData | null; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + getSkin(name: string): SkinData | null; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + getAnimation(name: string): AnimationData | null; + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class BoneData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + inheritTranslation: boolean; + /** + * @private + */ + inheritRotation: boolean; + /** + * @private + */ + inheritScale: boolean; + /** + * @private + */ + inheritReflection: boolean; + /** + * @private + */ + length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly transform: Transform; + /** + * @private + */ + readonly constraints: Array; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class SlotData extends BaseObject { + /** + * @private + */ + static readonly DEFAULT_COLOR: ColorTransform; + /** + * @private + */ + static createColor(): ColorTransform; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + blendMode: BlendMode; + /** + * @private + */ + displayIndex: number; + /** + * @private + */ + zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + color: ColorTransform; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + class SkinData extends BaseObject { + static toString(): string; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly displays: Map>; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addDisplay(slotName: string, value: DisplayData | null): void; + /** + * @private + */ + getDisplay(slotName: string, displayName: string): DisplayData | null; + /** + * @private + */ + getDisplays(slotName: string): Array | null; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class ConstraintData extends BaseObject { + order: number; + target: BoneData; + bone: BoneData; + root: BoneData | null; + protected _onClear(): void; + } + /** + * @private + */ + class IKConstraintData extends ConstraintData { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DisplayData extends BaseObject { + type: DisplayType; + name: string; + path: string; + readonly transform: Transform; + parent: ArmatureData; + protected _onClear(): void; + } + /** + * @private + */ + class ImageDisplayData extends DisplayData { + static toString(): string; + readonly pivot: Point; + texture: TextureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class ArmatureDisplayData extends DisplayData { + static toString(): string; + inheritAnimation: boolean; + readonly actions: Array; + armature: ArmatureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class MeshDisplayData extends ImageDisplayData { + static toString(): string; + inheritAnimation: boolean; + offset: number; + weight: WeightData | null; + protected _onClear(): void; + } + /** + * @private + */ + class BoundingBoxDisplayData extends DisplayData { + static toString(): string; + boundingBox: BoundingBoxData | null; + protected _onClear(): void; + } + /** + * @private + */ + class WeightData extends BaseObject { + static toString(): string; + count: number; + offset: number; + readonly bones: Array; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + height: number; + /** + * @private + */ + protected _onClear(): void; + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA: { + x: number; + y: number; + } | null, intersectionPointB: { + x: number; + y: number; + } | null, normalRadians: { + x: number; + y: number; + } | null): number; + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x, y, xMin, yMin, xMax, yMax); + /** + * @private + */ + static rectangleIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xMin: number, yMin: number, xMax: number, yMax: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static ellipseIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xC: number, yC: number, widthH: number, heightH: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static polygonIntersectsSegment(xA: number, yA: number, xB: number, yB: number, vertices: Array | Float32Array, offset: number, count: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + count: number; + /** + * @private + */ + offset: number; + /** + * @private + */ + x: number; + /** + * @private + */ + y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + vertices: Array | Float32Array; + /** + * @private + */ + weight: WeightData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } +} +declare namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + frameIntOffset: number; + /** + * @private + */ + frameFloatOffset: number; + /** + * @private + */ + frameOffset: number; + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + duration: number; + /** + * @private + */ + scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * @private + */ + readonly boneTimelines: Map>; + /** + * @private + */ + readonly slotTimelines: Map>; + /** + * @private + */ + readonly boneCachedFrameIndices: Map>; + /** + * @private + */ + readonly slotCachedFrameIndices: Map>; + /** + * @private + */ + actionTimeline: TimelineData | null; + /** + * @private + */ + zOrderTimeline: TimelineData | null; + /** + * @private + */ + parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + addBoneTimeline(bone: BoneData, timeline: TimelineData): void; + /** + * @private + */ + addSlotTimeline(slot: SlotData, timeline: TimelineData): void; + /** + * @private + */ + getBoneTimelines(name: string): Array | null; + /** + * @private + */ + getSlotTimeline(name: string): Array | null; + /** + * @private + */ + getBoneCachedFrameIndices(name: string): Array | null; + /** + * @private + */ + getSlotCachedFrameIndices(name: string): Array | null; + } + /** + * @private + */ + class TimelineData extends BaseObject { + static toString(): string; + type: TimelineType; + offset: number; + frameIndicesOffset: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + class AnimationConfig extends BaseObject { + static toString(): string; + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTime: number; + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly boneMask: Array; + /** + * @private + */ + protected _onClear(): void; + clear(): void; + copyFrom(value: AnimationConfig): void; + containsBoneMask(name: string): boolean; + addBoneMask(armature: Armature, name: string, recursive?: boolean): void; + removeBoneMask(armature: Armature, name: string, recursive?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + width: number; + /** + * @private + */ + height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + imagePath: string; + /** + * @private + */ + readonly textures: Map; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + copyFrom(value: TextureAtlasData): void; + /** + * @private + */ + abstract createTexture(): TextureData; + /** + * @private + */ + addTexture(value: TextureData): void; + /** + * @private + */ + getTexture(name: string): TextureData | null; + } + /** + * @private + */ + abstract class TextureData extends BaseObject { + static createRectangle(): Rectangle; + rotated: boolean; + name: string; + readonly region: Rectangle; + parent: TextureAtlasData; + frame: Rectangle | null; + protected _onClear(): void; + copyFrom(value: TextureData): void; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} +declare namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + class Armature extends BaseObject implements IAnimatable { + static toString(): string; + private static _onSortSlots(a, b); + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + inheritAnimation: boolean; + /** + * @private + */ + debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + private _debugDraw; + private _lockUpdate; + private _bonesDirty; + private _slotsDirty; + private _zOrderDirty; + private _flipX; + private _flipY; + /** + * @internal + * @private + */ + _cacheFrameIndex: number; + private readonly _bones; + private readonly _slots; + private readonly _actions; + private _animation; + private _proxy; + private _display; + /** + * @private + */ + _replaceTextureAtlasData: TextureAtlasData | null; + private _replacedTexture; + /** + * @internal + * @private + */ + _dragonBones: DragonBones; + private _clock; + /** + * @internal + * @private + */ + _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void; + private _sortBones(); + private _sortSlots(); + /** + * @internal + * @private + */ + _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void; + /** + * @internal + * @private + */ + _addBoneToBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _removeBoneFromBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _addSlotToSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _removeSlotFromSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _bufferAction(action: ActionData, append: boolean): void; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @private + */ + init(armatureData: ArmatureData, proxy: IArmatureProxy, display: any, dragonBones: DragonBones): void; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(boneName?: string | null, updateSlotDisplay?: boolean): void; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): Slot | null; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): Slot | null; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBone(name: string): Bone | null; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBoneByDisplay(display: any): Bone | null; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlot(name: string): Slot | null; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlotByDisplay(display: any): Slot | null; + /** + * @deprecated + */ + addBone(value: Bone, parentName?: string | null): void; + /** + * @deprecated + */ + removeBone(value: Bone): void; + /** + * @deprecated + */ + addSlot(value: Slot, parentName: string): void; + /** + * @deprecated + */ + removeSlot(value: Slot): void; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + flipX: boolean; + flipY: boolean; + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + cacheFrameRate: number; + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly name: string; + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animation: Animation; + /** + * @pivate + */ + readonly proxy: IArmatureProxy; + /** + * @pivate + */ + readonly eventDispatcher: IEventDispatcher; + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly display: any; + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + replacedTexture: any; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly parent: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + replaceTexture(texture: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + hasEventListener(type: EventStringType): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + addEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + removeEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + enableAnimationCache(frameRate: number): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + } +} +declare namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix; + /** + * @private + */ + protected static readonly _helpTransform: Transform; + /** + * @private + */ + protected static readonly _helpPoint: Point; + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly globalTransformMatrix: Matrix; + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly global: Transform; + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly offset: Transform; + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + _armature: Armature; + /** + * @private + */ + _parent: Bone; + /** + * @private + */ + protected _onClear(): void; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setParent(value: Bone | null): void; + /** + * @private + */ + updateGlobalTransform(): void; + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armature: Armature; + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly parent: Bone; + } +} +declare namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class Bone extends TransformObject { + static toString(): string; + /** + * @private + */ + offsetMode: OffsetMode; + /** + * @internal + * @private + */ + readonly animationPose: Transform; + /** + * @internal + * @private + */ + readonly constraints: Array; + /** + * @readonly + */ + boneData: BoneData; + /** + * @internal + * @private + */ + _transformDirty: boolean; + /** + * @internal + * @private + */ + _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + _blendDirty: boolean; + private _localDirty; + private _visible; + private _cachedFrameIndex; + /** + * @internal + * @private + */ + _blendLayer: number; + /** + * @internal + * @private + */ + _blendLeftWeight: number; + /** + * @internal + * @private + */ + _blendLayerWeight: number; + private readonly _bones; + private readonly _slots; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache); + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + init(boneData: BoneData): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @internal + * @private + */ + updateByConstraint(): void; + /** + * @internal + * @private + */ + addConstraint(constraint: Constraint): void; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(child: TransformObject): boolean; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + visible: boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + readonly length: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + readonly slot: Slot | null; + } +} +declare namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + displayController: string | null; + /** + * @readonly + */ + slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + _colorDirty: boolean; + /** + * @private + */ + _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + _pivotX: number; + /** + * @private + */ + _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix; + /** + * @private + */ + readonly _colorTransform: ColorTransform; + /** + * @private + */ + readonly _ffdVertices: Array; + /** + * @private + */ + readonly _displayDatas: Array; + /** + * @private + */ + protected readonly _displayList: Array; + /** + * @private + */ + protected readonly _meshBones: Array; + /** + * @internal + * @private + */ + _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any; + /** + * @private + */ + protected _meshDisplay: any; + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void; + /** + * @private + */ + protected _updateDisplay(): void; + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void; + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setDisplayIndex(value: number, isAnimation?: boolean): boolean; + /** + * @internal + * @private + */ + _setZorder(value: number): boolean; + /** + * @internal + * @private + */ + _setColor(value: ColorTransform): boolean; + /** + * @private + */ + _setDisplayList(value: Array | null): boolean; + /** + * @private + */ + init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @private + */ + updateTransformAndMatrix(): void; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): boolean; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + displayIndex: number; + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + displayList: Array; + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + readonly boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + readonly rawDisplay: any; + /** + * @private + */ + readonly meshDisplay: any; + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + display: any; + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + childArmature: Armature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + setDisplay(value: any): void; + } +} +declare namespace dragonBones { + /** + * @private + * @internal + */ + abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix; + protected static readonly _helpTransform: Transform; + protected static readonly _helpPoint: Point; + target: Bone; + bone: Bone; + root: Bone | null; + protected _onClear(): void; + abstract update(): void; + } + /** + * @private + * @internal + */ + class IKConstraint extends Constraint { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + private _computeA(); + private _computeB(); + update(): void; + } +} +declare namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + time: number; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private readonly _animatebles; + private _clock; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(time?: number); + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(value: IAnimatable): boolean; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + add(value: IAnimatable): void; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + remove(value: IAnimatable): void; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + clear(): void; + /** + * @inheritDoc + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + class Animation extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private _animationDirty; + /** + * @internal + * @private + */ + _timelineDirty: boolean; + private readonly _animationNames; + private readonly _animationStates; + private readonly _animations; + private _armature; + private _animationConfig; + private _lastAnimationState; + /** + * @private + */ + protected _onClear(): void; + private _fadeOut(animationConfig); + /** + * @internal + * @private + */ + init(armature: Armature): void; + /** + * @internal + * @private + */ + advanceTime(passedTime: number): void; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + reset(): void; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(animationName?: string | null): void; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + playConfig(animationConfig: AnimationConfig): AnimationState | null; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + play(animationName?: string | null, playTimes?: number): AnimationState | null; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + fadeIn(animationName: string, fadeInTime?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode): AnimationState | null; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByTime(animationName: string, time?: number, playTimes?: number): AnimationState | null; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByFrame(animationName: string, frame?: number, playTimes?: number): AnimationState | null; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByProgress(animationName: string, progress?: number, playTimes?: number): AnimationState | null; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByTime(animationName: string, time?: number): AnimationState | null; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByFrame(animationName: string, frame?: number): AnimationState | null; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByProgress(animationName: string, progress?: number): AnimationState | null; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + getState(animationName: string): AnimationState | null; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + hasAnimation(animationName: string): boolean; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + getStates(): Array; + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationName: string; + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + animations: Map; + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly animationConfig: AnimationConfig; + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + gotoAndPlay(animationName: string, fadeInTime?: number, duration?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode, pauseFadeOut?: boolean, pauseFadeIn?: boolean): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + gotoAndStop(animationName: string, time?: number): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationList: Array; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationDataList: Array; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class BonePose extends BaseObject { + static toString(): string; + readonly current: Transform; + readonly delta: Transform; + readonly result: Transform; + protected _onClear(): void; + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationState extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * @private + */ + fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + animationData: AnimationData; + private _timelineDirty; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + _subFadeState: number; + /** + * @internal + * @private + */ + _position: number; + /** + * @internal + * @private + */ + _duration: number; + private _fadeTime; + private _time; + /** + * @internal + * @private + */ + _fadeProgress: number; + private _weightResult; + private readonly _boneMask; + private readonly _boneTimelines; + private readonly _slotTimelines; + private readonly _bonePoses; + private _armature; + /** + * @internal + * @private + */ + _actionTimeline: ActionTimelineState; + private _zOrderTimeline; + /** + * @private + */ + protected _onClear(): void; + private _isDisabled(slot); + private _advanceFadeTime(passedTime); + private _blendBoneTimline(timeline); + /** + * @private + * @internal + */ + init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void; + /** + * @private + * @internal + */ + updateTimelines(): void; + /** + * @private + * @internal + */ + advanceTime(passedTime: number, cacheFrameRate: number): void; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + play(): void; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(): void; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeOut(fadeOutTime: number, pausePlayhead?: boolean): void; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + containsBoneMask(name: string): boolean; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + addBoneMask(name: string, recursive?: boolean): void; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeBoneMask(name: string, recursive?: boolean): void; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeAllBoneMask(): void; + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeIn: boolean; + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeOut: boolean; + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeComplete: boolean; + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + currentTime: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + readonly clip: AnimationData; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + const enum TweenState { + None = 0, + Once = 1, + Always = 2, + } + /** + * @internal + * @private + */ + abstract class TimelineState extends BaseObject { + playState: number; + currentPlayTimes: number; + currentTime: number; + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + protected _onClear(): void; + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + protected _setCurrentTime(passedTime: number): boolean; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType, progress, easing); + private static _getEasingCurveValue(progress, samples, count, offset); + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + abstract class BoneTimelineState extends TweenTimelineState { + bone: Bone; + bonePose: BonePose; + protected _onClear(): void; + } + /** + * @internal + * @private + */ + abstract class SlotTimelineState extends TweenTimelineState { + slot: Slot; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class ActionTimelineState extends TimelineState { + static toString(): string; + private _onCrossFrame(frameIndex); + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + update(passedTime: number): void; + setCurrentTime(value: number): void; + } + /** + * @internal + * @private + */ + class ZOrderTimelineState extends TimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + class BoneAllTimelineState extends BoneTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + } + /** + * @internal + * @private + */ + class SlotDislayIndexTimelineState extends SlotTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + } + /** + * @internal + * @private + */ + class SlotColorTimelineState extends SlotTimelineState { + static toString(): string; + private _dirty; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + class SlotFFDTimelineState extends SlotTimelineState { + static toString(): string; + meshOffset: number; + private _dirty; + private _frameFloatOffset; + private _valueCount; + private _ffdCount; + private _valueOffset; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } +} +declare namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly START: string; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly LOOP_COMPLETE: string; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly COMPLETE: string; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN: string; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN_COMPLETE: string; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT: string; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT_COMPLETE: string; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FRAME_EVENT: string; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly SOUND_EVENT: string; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + data: UserData | null; + /** + * @private + */ + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + type EventStringType = string | "start" | "loopComplete" | "complete" | "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string; + protected static readonly DATA_VERSION_3_0: string; + protected static readonly DATA_VERSION_4_0: string; + protected static readonly DATA_VERSION_4_5: string; + protected static readonly DATA_VERSION_5_0: string; + protected static readonly DATA_VERSION: string; + protected static readonly DATA_VERSIONS: Array; + protected static readonly TEXTURE_ATLAS: string; + protected static readonly SUB_TEXTURE: string; + protected static readonly FORMAT: string; + protected static readonly IMAGE_PATH: string; + protected static readonly WIDTH: string; + protected static readonly HEIGHT: string; + protected static readonly ROTATED: string; + protected static readonly FRAME_X: string; + protected static readonly FRAME_Y: string; + protected static readonly FRAME_WIDTH: string; + protected static readonly FRAME_HEIGHT: string; + protected static readonly DRADON_BONES: string; + protected static readonly USER_DATA: string; + protected static readonly ARMATURE: string; + protected static readonly BONE: string; + protected static readonly IK: string; + protected static readonly SLOT: string; + protected static readonly SKIN: string; + protected static readonly DISPLAY: string; + protected static readonly ANIMATION: string; + protected static readonly Z_ORDER: string; + protected static readonly FFD: string; + protected static readonly FRAME: string; + protected static readonly TRANSLATE_FRAME: string; + protected static readonly ROTATE_FRAME: string; + protected static readonly SCALE_FRAME: string; + protected static readonly VISIBLE_FRAME: string; + protected static readonly DISPLAY_FRAME: string; + protected static readonly COLOR_FRAME: string; + protected static readonly DEFAULT_ACTIONS: string; + protected static readonly ACTIONS: string; + protected static readonly EVENTS: string; + protected static readonly INTS: string; + protected static readonly FLOATS: string; + protected static readonly STRINGS: string; + protected static readonly CANVAS: string; + protected static readonly TRANSFORM: string; + protected static readonly PIVOT: string; + protected static readonly AABB: string; + protected static readonly COLOR: string; + protected static readonly VERSION: string; + protected static readonly COMPATIBLE_VERSION: string; + protected static readonly FRAME_RATE: string; + protected static readonly TYPE: string; + protected static readonly SUB_TYPE: string; + protected static readonly NAME: string; + protected static readonly PARENT: string; + protected static readonly TARGET: string; + protected static readonly SHARE: string; + protected static readonly PATH: string; + protected static readonly LENGTH: string; + protected static readonly DISPLAY_INDEX: string; + protected static readonly BLEND_MODE: string; + protected static readonly INHERIT_TRANSLATION: string; + protected static readonly INHERIT_ROTATION: string; + protected static readonly INHERIT_SCALE: string; + protected static readonly INHERIT_REFLECTION: string; + protected static readonly INHERIT_ANIMATION: string; + protected static readonly INHERIT_FFD: string; + protected static readonly BEND_POSITIVE: string; + protected static readonly CHAIN: string; + protected static readonly WEIGHT: string; + protected static readonly FADE_IN_TIME: string; + protected static readonly PLAY_TIMES: string; + protected static readonly SCALE: string; + protected static readonly OFFSET: string; + protected static readonly POSITION: string; + protected static readonly DURATION: string; + protected static readonly TWEEN_TYPE: string; + protected static readonly TWEEN_EASING: string; + protected static readonly TWEEN_ROTATE: string; + protected static readonly TWEEN_SCALE: string; + protected static readonly CURVE: string; + protected static readonly SOUND: string; + protected static readonly EVENT: string; + protected static readonly ACTION: string; + protected static readonly X: string; + protected static readonly Y: string; + protected static readonly SKEW_X: string; + protected static readonly SKEW_Y: string; + protected static readonly SCALE_X: string; + protected static readonly SCALE_Y: string; + protected static readonly VALUE: string; + protected static readonly ROTATE: string; + protected static readonly SKEW: string; + protected static readonly ALPHA_OFFSET: string; + protected static readonly RED_OFFSET: string; + protected static readonly GREEN_OFFSET: string; + protected static readonly BLUE_OFFSET: string; + protected static readonly ALPHA_MULTIPLIER: string; + protected static readonly RED_MULTIPLIER: string; + protected static readonly GREEN_MULTIPLIER: string; + protected static readonly BLUE_MULTIPLIER: string; + protected static readonly UVS: string; + protected static readonly VERTICES: string; + protected static readonly TRIANGLES: string; + protected static readonly WEIGHTS: string; + protected static readonly SLOT_POSE: string; + protected static readonly BONE_POSE: string; + protected static readonly GOTO_AND_PLAY: string; + protected static readonly DEFAULT_NAME: string; + protected static _getArmatureType(value: string): ArmatureType; + protected static _getDisplayType(value: string): DisplayType; + protected static _getBoundingBoxType(value: string): BoundingBoxType; + protected static _getActionType(value: string): ActionType; + protected static _getBlendMode(value: string): BlendMode; + /** + * @private + */ + abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static parseDragonBonesData(rawData: any): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + static parseTextureAtlasData(rawData: any, scale?: number): any; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ObjectDataParser extends DataParser { + /** + * @private + */ + private _intArrayJson; + private _floatArrayJson; + private _frameIntArrayJson; + private _frameFloatArrayJson; + private _frameArrayJson; + private _timelineArrayJson; + private _intArrayBuffer; + private _floatArrayBuffer; + private _frameIntArrayBuffer; + private _frameFloatArrayBuffer; + private _frameArrayBuffer; + private _timelineArrayBuffer; + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean; + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number; + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string; + protected _rawTextureAtlasIndex: number; + protected readonly _rawBones: Array; + protected _data: DragonBonesData; + protected _armature: ArmatureData; + protected _bone: BoneData; + protected _slot: SlotData; + protected _skin: SkinData; + protected _mesh: MeshDisplayData; + protected _animation: AnimationData; + protected _timeline: TimelineData; + protected _rawTextureAtlases: Array | null; + private _defalultColorOffset; + private _prevTweenRotate; + private _prevRotation; + private readonly _helpMatrixA; + private readonly _helpMatrixB; + private readonly _helpTransform; + private readonly _helpColorTransform; + private readonly _helpPoint; + private readonly _helpArray; + private readonly _actionFrames; + private readonly _weightSlotPose; + private readonly _weightBonePoses; + private readonly _weightBoneIndices; + private readonly _cacheBones; + private readonly _meshs; + private readonly _slotChildActions; + /** + * @private + */ + private _getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, t, result); + /** + * @private + */ + private _samplingEasingCurve(curve, samples); + private _sortActionFrame(a, b); + private _parseActionDataInFrame(rawData, frameStart, bone, slot); + private _mergeActionFrame(rawData, frameStart, type, bone, slot); + private _parseCacheActionFrame(frame); + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData; + /** + * @private + */ + protected _parseBone(rawData: any): BoneData; + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void; + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData; + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData; + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null; + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void; + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseTimeline(rawData: any, type: TimelineType, addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, frameParser: (rawData: any, frameStart: number, frameCount: number) => number): TimelineData | null; + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void; + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void; + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number; + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void; + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @private + */ + protected _parseWASMArray(): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @inheritDoc + */ + parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale?: number): boolean; + /** + * @private + */ + private static _objectDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): ObjectDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BinaryDataParser extends ObjectDataParser { + private _binary; + private _binaryOffset; + private _intArray; + private _floatArray; + private _frameIntArray; + private _frameFloatArray; + private _frameArray; + private _timelineArray; + private _inRange(a, min, max); + private _decodeUTF8(data); + private _getUTF16Key(value); + private _parseBinaryTimeline(type, offset, timelineData?); + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @private + */ + private static _binaryDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): BinaryDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BuildArmaturePackage { + dataName: string; + textureAtlasName: string; + data: DragonBonesData; + armature: ArmatureData; + skin: SkinData | null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map>; + /** + * @private + */ + protected _dragonBones: DragonBones; + /** + * @private + */ + protected _dataParser: DataParser; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null; + /** + * @private + */ + protected _fillBuildArmaturePackage(dataPackage: BuildArmaturePackage, dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string): boolean; + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseDragonBonesData(rawData: any, name?: string | null, scale?: number): DragonBonesData | null; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + updateTextureAtlasData(name: string, textureAtlases: Array): void; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + getDragonBonesData(name: string): DragonBonesData | null; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + addDragonBonesData(data: DragonBonesData, name?: string | null): void; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeDragonBonesData(name: string, disposeData?: boolean): void; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureAtlasData(name: string): Array | null; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + addTextureAtlasData(data: TextureAtlasData, name?: string | null): void; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeTextureAtlasData(name: string, disposeData?: boolean): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + getArmatureData(name: string, dragonBonesName?: string): ArmatureData | null; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + clear(disposeData?: boolean): void; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + buildArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): Armature | null; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplayList(dragonBonesName: string | null, armatureName: string, slotName: string, slot: Slot): void; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + copyAnimationsToArmature(toArmature: Armature, fromArmatreName: string, fromSkinName?: string | null, fromDragonBonesDataName?: string | null, replaceOriginalAnimation?: boolean): boolean; + /** + * @private + */ + getAllDragonBonesData(): Map; + /** + * @private + */ + getAllTextureAtlasData(): Map>; + } +} diff --git a/reference/DragonBones/out/dragonBones.js b/reference/DragonBones/out/dragonBones.js new file mode 100644 index 0000000..6794493 --- /dev/null +++ b/reference/DragonBones/out/dragonBones.js @@ -0,0 +1,10537 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DragonBones = (function () { + function DragonBones(eventManager) { + this._clock = new dragonBones.WorldClock(); + this._events = []; + this._objects = []; + this._eventManager = null; + this._eventManager = eventManager; + } + DragonBones.prototype.advanceTime = function (passedTime) { + if (this._objects.length > 0) { + for (var _i = 0, _a = this._objects; _i < _a.length; _i++) { + var object = _a[_i]; + object.returnToPool(); + } + this._objects.length = 0; + } + this._clock.advanceTime(passedTime); + if (this._events.length > 0) { + for (var i = 0; i < this._events.length; ++i) { + var eventObject = this._events[i]; + var armature = eventObject.armature; + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + this.bufferObject(eventObject); + } + this._events.length = 0; + } + }; + DragonBones.prototype.bufferEvent = function (value) { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + }; + DragonBones.prototype.bufferObject = function (object) { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + }; + Object.defineProperty(DragonBones.prototype, "clock", { + get: function () { + return this._clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DragonBones.prototype, "eventManager", { + get: function () { + return this._eventManager; + }, + enumerable: true, + configurable: true + }); + DragonBones.yDown = true; + DragonBones.debug = false; + DragonBones.debugDraw = false; + DragonBones.webAssembly = false; + DragonBones.VERSION = "5.1.0"; + return DragonBones; + }()); + dragonBones.DragonBones = DragonBones; + if (!console.warn) { + console.warn = function () { }; + } + if (!console.assert) { + console.assert = function () { }; + } +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var BaseObject = (function () { + function BaseObject() { + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + this.hashCode = BaseObject._hashCode++; + this._isInPool = false; + } + BaseObject._returnObject = function (object) { + var classType = String(object.constructor); + var maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + }; + /** + * @private + */ + BaseObject.toString = function () { + throw new Error(); + }; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.setMaxCount = function (objectConstructor, maxCount) { + if (maxCount < 0 || maxCount !== maxCount) { + maxCount = 0; + } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (var classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + var pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + } + }; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.clearPool = function (objectConstructor) { + if (objectConstructor === void 0) { objectConstructor = null; } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (var k in BaseObject._poolsMap) { + var pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + }; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.borrowObject = function (objectConstructor) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + var object_1 = pool.pop(); + object_1._isInPool = false; + return object_1; + } + var object = new objectConstructor(); + object._onClear(); + return object; + }; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.prototype.returnToPool = function () { + this._onClear(); + BaseObject._returnObject(this); + }; + BaseObject._hashCode = 0; + BaseObject._defaultMaxCount = 1000; + BaseObject._maxCountMap = {}; + BaseObject._poolsMap = {}; + return BaseObject; + }()); + dragonBones.BaseObject = BaseObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Matrix = (function () { + function Matrix(a, b, c, d, tx, ty) { + if (a === void 0) { a = 1.0; } + if (b === void 0) { b = 0.0; } + if (c === void 0) { c = 0.0; } + if (d === void 0) { d = 1.0; } + if (tx === void 0) { tx = 0.0; } + if (ty === void 0) { ty = 0.0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * @private + */ + Matrix.prototype.toString = function () { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + }; + /** + * @private + */ + Matrix.prototype.copyFrom = function (value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + return this; + }; + /** + * @private + */ + Matrix.prototype.copyFromArray = function (value, offset) { + if (offset === void 0) { offset = 0; } + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + return this; + }; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.identity = function () { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + }; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.concat = function (value) { + var aA = this.a * value.a; + var bA = 0.0; + var cA = 0.0; + var dA = this.d * value.d; + var txA = this.tx * value.a + value.tx; + var tyA = this.ty * value.d + value.ty; + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + return this; + }; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.invert = function () { + var aA = this.a; + var bA = this.b; + var cA = this.c; + var dA = this.d; + var txA = this.tx; + var tyA = this.ty; + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + return this; + } + var determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + } + determinant = 1.0 / determinant; + var k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + return this; + }; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.transformPoint = function (x, y, result, delta) { + if (delta === void 0) { delta = false; } + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + }; + return Matrix; + }()); + dragonBones.Matrix = Matrix; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Transform = (function () { + function Transform( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (skew === void 0) { skew = 0.0; } + if (rotation === void 0) { rotation = 0.0; } + if (scaleX === void 0) { scaleX = 1.0; } + if (scaleY === void 0) { scaleY = 1.0; } + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + /** + * @private + */ + Transform.normalizeRadian = function (value) { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + return value; + }; + /** + * @private + */ + Transform.prototype.toString = function () { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + }; + /** + * @private + */ + Transform.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.identity = function () { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + return this; + }; + /** + * @private + */ + Transform.prototype.add = function (value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.minus = function (value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + return this; + }; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.fromMatrix = function (matrix) { + var backupScaleX = this.scaleX, backupScaleY = this.scaleY; + var PI_Q = Transform.PI_Q; + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + var skewX = Math.atan(-matrix.c / matrix.d); + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + this.skew = skewX - this.rotation; + return this; + }; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.toMatrix = function (matrix) { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + matrix.tx = this.x; + matrix.ty = this.y; + return this; + }; + /** + * @private + */ + Transform.PI_D = Math.PI * 2.0; + /** + * @private + */ + Transform.PI_H = Math.PI / 2.0; + /** + * @private + */ + Transform.PI_Q = Math.PI / 4.0; + /** + * @private + */ + Transform.RAD_DEG = 180.0 / Math.PI; + /** + * @private + */ + Transform.DEG_RAD = Math.PI / 180.0; + return Transform; + }()); + dragonBones.Transform = Transform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ColorTransform = (function () { + function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) { + if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; } + if (redMultiplier === void 0) { redMultiplier = 1.0; } + if (greenMultiplier === void 0) { greenMultiplier = 1.0; } + if (blueMultiplier === void 0) { blueMultiplier = 1.0; } + if (alphaOffset === void 0) { alphaOffset = 0; } + if (redOffset === void 0) { redOffset = 0; } + if (greenOffset === void 0) { greenOffset = 0; } + if (blueOffset === void 0) { blueOffset = 0; } + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + ColorTransform.prototype.copyFrom = function (value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + }; + ColorTransform.prototype.identity = function () { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + }; + return ColorTransform; + }()); + dragonBones.ColorTransform = ColorTransform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Point = (function () { + function Point(x, y) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + this.x = x; + this.y = y; + } + Point.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + }; + Point.prototype.clear = function () { + this.x = this.y = 0.0; + }; + return Point; + }()); + dragonBones.Point = Point; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Rectangle = (function () { + function Rectangle(x, y, width, height) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (width === void 0) { width = 0.0; } + if (height === void 0) { height = 0.0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Rectangle.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + }; + Rectangle.prototype.clear = function () { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + }; + return Rectangle; + }()); + dragonBones.Rectangle = Rectangle; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + var UserData = (function (_super) { + __extends(UserData, _super); + function UserData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.ints = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.floats = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.strings = []; + return _this; + } + /** + * @private + */ + UserData.toString = function () { + return "[class dragonBones.UserData]"; + }; + /** + * @private + */ + UserData.prototype._onClear = function () { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + }; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getInt = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + }; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getFloat = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + }; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getString = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + }; + return UserData; + }(dragonBones.BaseObject)); + dragonBones.UserData = UserData; + /** + * @private + */ + var ActionData = (function (_super) { + __extends(ActionData, _super); + function ActionData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.data = null; // + return _this; + } + ActionData.toString = function () { + return "[class dragonBones.ActionData]"; + }; + ActionData.prototype._onClear = function () { + if (this.data !== null) { + this.data.returnToPool(); + } + this.type = 0 /* Play */; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + }; + return ActionData; + }(dragonBones.BaseObject)); + dragonBones.ActionData = ActionData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + var DragonBonesData = (function (_super) { + __extends(DragonBonesData, _super); + function DragonBonesData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.frameIndices = []; + /** + * @private + */ + _this.cachedFrames = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatureNames = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatures = {}; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + DragonBonesData.toString = function () { + return "[class dragonBones.DragonBonesData]"; + }; + /** + * @private + */ + DragonBonesData.prototype._onClear = function () { + for (var k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + }; + /** + * @private + */ + DragonBonesData.prototype.addArmature = function (value) { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + DragonBonesData.prototype.getArmature = function (name) { + return name in this.armatures ? this.armatures[name] : null; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + DragonBonesData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + return DragonBonesData; + }(dragonBones.BaseObject)); + dragonBones.DragonBonesData = DragonBonesData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var CanvasData = (function (_super) { + __extends(CanvasData, _super); + function CanvasData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + CanvasData.toString = function () { + return "[class dragonBones.CanvasData]"; + }; + /** + * @private + */ + CanvasData.prototype._onClear = function () { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + return CanvasData; + }(dragonBones.BaseObject)); + dragonBones.CanvasData = CanvasData; + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var ArmatureData = (function (_super) { + __extends(ArmatureData, _super); + function ArmatureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.aabb = new dragonBones.Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animationNames = []; + /** + * @private + */ + _this.sortedBones = []; + /** + * @private + */ + _this.sortedSlots = []; + /** + * @private + */ + _this.defaultActions = []; + /** + * @private + */ + _this.actions = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.bones = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.slots = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.skins = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animations = {}; + /** + * @private + */ + _this.canvas = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + ArmatureData.toString = function () { + return "[class dragonBones.ArmatureData]"; + }; + /** + * @private + */ + ArmatureData.prototype._onClear = function () { + for (var _i = 0, _a = this.defaultActions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + for (var _b = 0, _c = this.actions; _b < _c.length; _b++) { + var action = _c[_b]; + action.returnToPool(); + } + for (var k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + for (var k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + for (var k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + for (var k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.type = 0 /* Armature */; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + ArmatureData.prototype.sortBones = function () { + var total = this.sortedBones.length; + if (total <= 0) { + return; + } + var sortHelper = this.sortedBones.concat(); + var index = 0; + var count = 0; + this.sortedBones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { + continue; + } + this.sortedBones.push(bone); + count++; + } + }; + /** + * @private + */ + ArmatureData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0) { + return; + } + this.cacheFrameRate = frameRate; + for (var k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + }; + /** + * @private + */ + ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform) { + var dataArray = this.parent.cachedFrames; + var arrayOffset = dataArray.length; + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + return arrayOffset; + }; + /** + * @private + */ + ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) { + var dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + }; + /** + * @private + */ + ArmatureData.prototype.addBone = function (value) { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + this.bones[value.name] = value; + this.sortedBones.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSlot = function (value) { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + this.slots[value.name] = value; + this.sortedSlots.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSkin = function (value) { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + }; + /** + * @private + */ + ArmatureData.prototype.addAnimation = function (value) { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + }; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + ArmatureData.prototype.getBone = function (name) { + return name in this.bones ? this.bones[name] : null; + }; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + ArmatureData.prototype.getSlot = function (name) { + return name in this.slots ? this.slots[name] : null; + }; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + ArmatureData.prototype.getSkin = function (name) { + return name in this.skins ? this.skins[name] : null; + }; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + ArmatureData.prototype.getAnimation = function (name) { + return name in this.animations ? this.animations[name] : null; + }; + return ArmatureData; + }(dragonBones.BaseObject)); + dragonBones.ArmatureData = ArmatureData; + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var BoneData = (function (_super) { + __extends(BoneData, _super); + function BoneData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.transform = new dragonBones.Transform(); + /** + * @private + */ + _this.constraints = []; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + BoneData.toString = function () { + return "[class dragonBones.BoneData]"; + }; + /** + * @private + */ + BoneData.prototype._onClear = function () { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + }; + return BoneData; + }(dragonBones.BaseObject)); + dragonBones.BoneData = BoneData; + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var SlotData = (function (_super) { + __extends(SlotData, _super); + function SlotData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.color = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + SlotData.createColor = function () { + return new dragonBones.ColorTransform(); + }; + /** + * @private + */ + SlotData.toString = function () { + return "[class dragonBones.SlotData]"; + }; + /** + * @private + */ + SlotData.prototype._onClear = function () { + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.blendMode = 0 /* Normal */; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform(); + return SlotData; + }(dragonBones.BaseObject)); + dragonBones.SlotData = SlotData; + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + var SkinData = (function (_super) { + __extends(SkinData, _super); + function SkinData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.displays = {}; + return _this; + } + SkinData.toString = function () { + return "[class dragonBones.SkinData]"; + }; + /** + * @private + */ + SkinData.prototype._onClear = function () { + for (var k in this.displays) { + var slotDisplays = this.displays[k]; + for (var _i = 0, slotDisplays_1 = slotDisplays; _i < slotDisplays_1.length; _i++) { + var display = slotDisplays_1[_i]; + if (display !== null) { + display.returnToPool(); + } + } + delete this.displays[k]; + } + this.name = ""; + // this.displays.clear(); + }; + /** + * @private + */ + SkinData.prototype.addDisplay = function (slotName, value) { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + var slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + }; + /** + * @private + */ + SkinData.prototype.getDisplay = function (slotName, displayName) { + var slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (var _i = 0, slotDisplays_2 = slotDisplays; _i < slotDisplays_2.length; _i++) { + var display = slotDisplays_2[_i]; + if (display !== null && display.name === displayName) { + return display; + } + } + } + return null; + }; + /** + * @private + */ + SkinData.prototype.getDisplays = function (slotName) { + if (!(slotName in this.displays)) { + return null; + } + return this.displays[slotName]; + }; + return SkinData; + }(dragonBones.BaseObject)); + dragonBones.SkinData = SkinData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ConstraintData = (function (_super) { + __extends(ConstraintData, _super); + function ConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstraintData.prototype._onClear = function () { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + }; + return ConstraintData; + }(dragonBones.BaseObject)); + dragonBones.ConstraintData = ConstraintData; + /** + * @private + */ + var IKConstraintData = (function (_super) { + __extends(IKConstraintData, _super); + function IKConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraintData.toString = function () { + return "[class dragonBones.IKConstraintData]"; + }; + IKConstraintData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + return IKConstraintData; + }(ConstraintData)); + dragonBones.IKConstraintData = IKConstraintData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DisplayData = (function (_super) { + __extends(DisplayData, _super); + function DisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.transform = new dragonBones.Transform(); + return _this; + } + DisplayData.prototype._onClear = function () { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + }; + return DisplayData; + }(dragonBones.BaseObject)); + dragonBones.DisplayData = DisplayData; + /** + * @private + */ + var ImageDisplayData = (function (_super) { + __extends(ImageDisplayData, _super); + function ImageDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pivot = new dragonBones.Point(); + return _this; + } + ImageDisplayData.toString = function () { + return "[class dragonBones.ImageDisplayData]"; + }; + ImageDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Image */; + this.pivot.clear(); + this.texture = null; + }; + return ImageDisplayData; + }(DisplayData)); + dragonBones.ImageDisplayData = ImageDisplayData; + /** + * @private + */ + var ArmatureDisplayData = (function (_super) { + __extends(ArmatureDisplayData, _super); + function ArmatureDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.actions = []; + return _this; + } + ArmatureDisplayData.toString = function () { + return "[class dragonBones.ArmatureDisplayData]"; + }; + ArmatureDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.actions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + this.type = 1 /* Armature */; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + }; + return ArmatureDisplayData; + }(DisplayData)); + dragonBones.ArmatureDisplayData = ArmatureDisplayData; + /** + * @private + */ + var MeshDisplayData = (function (_super) { + __extends(MeshDisplayData, _super); + function MeshDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.weight = null; // Initial value. + return _this; + } + MeshDisplayData.toString = function () { + return "[class dragonBones.MeshDisplayData]"; + }; + MeshDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Mesh */; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + }; + return MeshDisplayData; + }(ImageDisplayData)); + dragonBones.MeshDisplayData = MeshDisplayData; + /** + * @private + */ + var BoundingBoxDisplayData = (function (_super) { + __extends(BoundingBoxDisplayData, _super); + function BoundingBoxDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.boundingBox = null; // Initial value. + return _this; + } + BoundingBoxDisplayData.toString = function () { + return "[class dragonBones.BoundingBoxDisplayData]"; + }; + BoundingBoxDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + this.type = 3 /* BoundingBox */; + this.boundingBox = null; + }; + return BoundingBoxDisplayData; + }(DisplayData)); + dragonBones.BoundingBoxDisplayData = BoundingBoxDisplayData; + /** + * @private + */ + var WeightData = (function (_super) { + __extends(WeightData, _super); + function WeightData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.bones = []; + return _this; + } + WeightData.toString = function () { + return "[class dragonBones.WeightData]"; + }; + WeightData.prototype._onClear = function () { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + }; + return WeightData; + }(dragonBones.BaseObject)); + dragonBones.WeightData = WeightData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + var BoundingBoxData = (function (_super) { + __extends(BoundingBoxData, _super); + function BoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + BoundingBoxData.prototype._onClear = function () { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + }; + return BoundingBoxData; + }(dragonBones.BaseObject)); + dragonBones.BoundingBoxData = BoundingBoxData; + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var RectangleBoundingBoxData = (function (_super) { + __extends(RectangleBoundingBoxData, _super); + function RectangleBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + RectangleBoundingBoxData.toString = function () { + return "[class dragonBones.RectangleBoundingBoxData]"; + }; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + RectangleBoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) { + var code = 0 /* InSide */; // initialised as being inside of [[clip window]] + if (x < xMin) { + code |= 1 /* Left */; + } + else if (x > xMax) { + code |= 2 /* Right */; + } + if (y < yMin) { + code |= 4 /* Top */; + } + else if (y > yMax) { + code |= 8 /* Bottom */; + } + return code; + }; + /** + * @private + */ + RectangleBoundingBoxData.rectangleIntersectsSegment = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + if (inSideA && inSideB) { + return -1; + } + var intersectionCount = 0; + var outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + var outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + while (true) { + if ((outcode0 | outcode1) === 0) { + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { + break; + } + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + var x = 0.0; + var y = 0.0; + var normalRadian = 0.0; + // At least one endpoint is outside the clip rectangle; pick it. + var outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + // Now find the intersection point; + if ((outcodeOut & 4 /* Top */) !== 0) { + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & 8 /* Bottom */) !== 0) { + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & 2 /* Right */) !== 0) { + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & 1 /* Left */) !== 0) { + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + return intersectionCount; + }; + /** + * @private + */ + RectangleBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Rectangle */; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + return false; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var widthH = this.width * 0.5; + var heightH = this.height * 0.5; + var intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return RectangleBoundingBoxData; + }(BoundingBoxData)); + dragonBones.RectangleBoundingBoxData = RectangleBoundingBoxData; + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var EllipseBoundingBoxData = (function (_super) { + __extends(EllipseBoundingBoxData, _super); + function EllipseBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EllipseBoundingBoxData.toString = function () { + return "[class dragonBones.EllipseData]"; + }; + /** + * @private + */ + EllipseBoundingBoxData.ellipseIntersectsSegment = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var d = widthH / heightH; + var dd = d * d; + yA *= d; + yB *= d; + var dX = xB - xA; + var dY = yB - yA; + var lAB = Math.sqrt(dX * dX + dY * dY); + var xD = dX / lAB; + var yD = dY / lAB; + var a = (xC - xA) * xD + (yC - yA) * yD; + var aa = a * a; + var ee = xA * xA + yA * yA; + var rr = widthH * widthH; + var dR = rr - ee + aa; + var intersectionCount = 0; + if (dR >= 0.0) { + var dT = Math.sqrt(dR); + var sA = a - dT; + var sB = a + dT; + var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + var sideAB = inSideA * inSideB; + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + return intersectionCount; + }; + /** + * @private + */ + EllipseBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 1 /* Ellipse */; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + return false; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return EllipseBoundingBoxData; + }(BoundingBoxData)); + dragonBones.EllipseBoundingBoxData = EllipseBoundingBoxData; + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var PolygonBoundingBoxData = (function (_super) { + __extends(PolygonBoundingBoxData, _super); + function PolygonBoundingBoxData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.weight = null; // Initial value. + return _this; + } + /** + * @private + */ + PolygonBoundingBoxData.toString = function () { + return "[class dragonBones.PolygonBoundingBoxData]"; + }; + /** + * @private + */ + PolygonBoundingBoxData.polygonIntersectsSegment = function (xA, yA, xB, yB, vertices, offset, count, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (xA === xB) { + xA = xB + 0.000001; + } + if (yA === yB) { + yA = yB + 0.000001; + } + var dXAB = xA - xB; + var dYAB = yA - yB; + var llAB = xA * yB - yA * xB; + var intersectionCount = 0; + var xC = vertices[offset + count - 2]; + var yC = vertices[offset + count - 1]; + var dMin = 0.0; + var dMax = 0.0; + var xMin = 0.0; + var yMin = 0.0; + var xMax = 0.0; + var yMax = 0.0; + for (var i = 0; i < count; i += 2) { + var xD = vertices[offset + i]; + var yD = vertices[offset + i + 1]; + if (xC === xD) { + xC = xD + 0.0001; + } + if (yC === yD) { + yC = yD + 0.0001; + } + var dXCD = xC - xD; + var dYCD = yC - yD; + var llCD = xC * yD - yC * xD; + var ll = dXAB * dYCD - dYAB * dXCD; + var x = (llAB * dXCD - dXAB * llCD) / ll; + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + var y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + var d = x - xA; + if (d < 0.0) { + d = -d; + } + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + xC = xD; + yC = yD; + } + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + return intersectionCount; + }; + /** + * @private + */ + PolygonBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Polygon */; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null; // + this.weight = null; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (var i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + var yA = this.vertices[this.offset + iP + 1]; + var yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + var xA = this.vertices[this.offset + iP]; + var xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + iP = i; + } + } + return isInSide; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment(xA, yA, xB, yB, this.vertices, this.offset, this.count, intersectionPointA, intersectionPointB, normalRadians); + } + return intersectionCount; + }; + return PolygonBoundingBoxData; + }(BoundingBoxData)); + dragonBones.PolygonBoundingBoxData = PolygonBoundingBoxData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationData = (function (_super) { + __extends(AnimationData, _super); + function AnimationData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.cachedFrames = []; + /** + * @private + */ + _this.boneTimelines = {}; + /** + * @private + */ + _this.slotTimelines = {}; + /** + * @private + */ + _this.boneCachedFrameIndices = {}; + /** + * @private + */ + _this.slotCachedFrameIndices = {}; + /** + * @private + */ + _this.actionTimeline = null; // Initial value. + /** + * @private + */ + _this.zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationData.toString = function () { + return "[class dragonBones.AnimationData]"; + }; + /** + * @private + */ + AnimationData.prototype._onClear = function () { + for (var k in this.boneTimelines) { + for (var kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + delete this.boneTimelines[k]; + } + for (var k in this.slotTimelines) { + for (var kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + delete this.slotTimelines[k]; + } + for (var k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + for (var k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + }; + /** + * @private + */ + AnimationData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0.0) { + return; + } + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + this.cachedFrames.length = cacheFrameCount; + for (var i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + for (var _i = 0, _a = this.parent.sortedBones; _i < _a.length; _i++) { + var bone = _a[_i]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.boneCachedFrameIndices[bone.name] = indices; + } + for (var _b = 0, _c = this.parent.sortedSlots; _b < _c.length; _b++) { + var slot = _c[_b]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.slotCachedFrameIndices[slot.name] = indices; + } + }; + /** + * @private + */ + AnimationData.prototype.addBoneTimeline = function (bone, timeline) { + var timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.addSlotTimeline = function (slot, timeline) { + var timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.getBoneTimelines = function (name) { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotTimeline = function (name) { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getBoneCachedFrameIndices = function (name) { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotCachedFrameIndices = function (name) { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + }; + return AnimationData; + }(dragonBones.BaseObject)); + dragonBones.AnimationData = AnimationData; + /** + * @private + */ + var TimelineData = (function (_super) { + __extends(TimelineData, _super); + function TimelineData() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineData.toString = function () { + return "[class dragonBones.TimelineData]"; + }; + TimelineData.prototype._onClear = function () { + this.type = 10 /* BoneAll */; + this.offset = 0; + this.frameIndicesOffset = -1; + }; + return TimelineData; + }(dragonBones.BaseObject)); + dragonBones.TimelineData = TimelineData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + var AnimationConfig = (function (_super) { + __extends(AnimationConfig, _super); + function AnimationConfig() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.boneMask = []; + return _this; + } + AnimationConfig.toString = function () { + return "[class dragonBones.AnimationConfig]"; + }; + /** + * @private + */ + AnimationConfig.prototype._onClear = function () { + this.pauseFadeOut = true; + this.fadeOutMode = 4 /* All */; + this.fadeOutTweenType = 1 /* Line */; + this.fadeOutTime = -1.0; + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = 1 /* Line */; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + }; + AnimationConfig.prototype.clear = function () { + this._onClear(); + }; + AnimationConfig.prototype.copyFrom = function (value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + this.boneMask.length = value.boneMask.length; + for (var i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + }; + AnimationConfig.prototype.containsBoneMask = function (name) { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + }; + AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + if (this.boneMask.indexOf(name) < 0) { + this.boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + }; + AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this.boneMask.indexOf(name); + if (index >= 0) { + this.boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var index_1 = this.boneMask.indexOf(bone.name); + if (index_1 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index_1, 1); + } + } + } + else { + for (var _b = 0, _c = armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + }; + return AnimationConfig; + }(dragonBones.BaseObject)); + dragonBones.AnimationConfig = AnimationConfig; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var TextureAtlasData = (function (_super) { + __extends(TextureAtlasData, _super); + function TextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.textures = {}; + return _this; + } + /** + * @private + */ + TextureAtlasData.prototype._onClear = function () { + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + }; + /** + * @private + */ + TextureAtlasData.prototype.copyFrom = function (value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + // this.textures.clear(); + for (var k in value.textures) { + var texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + }; + /** + * @private + */ + TextureAtlasData.prototype.addTexture = function (value) { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + value.parent = this; + this.textures[value.name] = value; + }; + /** + * @private + */ + TextureAtlasData.prototype.getTexture = function (name) { + return name in this.textures ? this.textures[name] : null; + }; + return TextureAtlasData; + }(dragonBones.BaseObject)); + dragonBones.TextureAtlasData = TextureAtlasData; + /** + * @private + */ + var TextureData = (function (_super) { + __extends(TextureData, _super); + function TextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = new dragonBones.Rectangle(); + _this.frame = null; // Initial value. + return _this; + } + TextureData.createRectangle = function () { + return new dragonBones.Rectangle(); + }; + TextureData.prototype._onClear = function () { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + }; + TextureData.prototype.copyFrom = function (value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + }; + return TextureData; + }(dragonBones.BaseObject)); + dragonBones.TextureData = TextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones_1) { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + var Armature = (function (_super) { + __extends(Armature, _super); + function Armature() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._bones = []; + _this._slots = []; + _this._actions = []; + _this._animation = null; // Initial value. + _this._proxy = null; // Initial value. + /** + * @private + */ + _this._replaceTextureAtlasData = null; // Initial value. + _this._clock = null; // Initial value. + return _this; + } + Armature.toString = function () { + return "[class dragonBones.Armature]"; + }; + Armature._onSortSlots = function (a, b) { + return a._zOrder > b._zOrder ? 1 : -1; + }; + /** + * @private + */ + Armature.prototype._onClear = function () { + if (this._clock !== null) { + this._clock.remove(this); + } + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + bone.returnToPool(); + } + for (var _b = 0, _c = this._slots; _b < _c.length; _b++) { + var slot = _c[_b]; + slot.returnToPool(); + } + for (var _d = 0, _e = this._actions; _d < _e.length; _d++) { + var action = _e[_d]; + action.returnToPool(); + } + if (this._animation !== null) { + this._animation.returnToPool(); + } + if (this._proxy !== null) { + this._proxy.clear(); + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + }; + Armature.prototype._sortBones = function () { + var total = this._bones.length; + if (total <= 0) { + return; + } + var sortHelper = this._bones.concat(); + var index = 0; + var count = 0; + this._bones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this._bones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { + continue; + } + this._bones.push(bone); + count++; + } + }; + Armature.prototype._sortSlots = function () { + this._slots.sort(Armature._onSortSlots); + }; + /** + * @internal + * @private + */ + Armature.prototype._sortZOrder = function (slotIndices, offset) { + var slotDatas = this.armatureData.sortedSlots; + var isOriginal = slotIndices === null; + if (this._zOrderDirty || !isOriginal) { + for (var i = 0, l = slotDatas.length; i < l; ++i) { + var slotIndex = isOriginal ? i : slotIndices[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + var slotData = slotDatas[slotIndex]; + var slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addBoneToBoneList = function (value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeBoneFromBoneList = function (value) { + var index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addSlotToSlotList = function (value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeSlotFromSlotList = function (value) { + var index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._bufferAction = function (action, append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + }; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.dispose = function () { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + }; + /** + * @private + */ + Armature.prototype.init = function (armatureData, proxy, display, dragonBones) { + if (this.armatureData !== null) { + return; + } + this.armatureData = armatureData; + this._animation = dragonBones_1.BaseObject.borrowObject(dragonBones_1.Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + }; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.advanceTime = function (passedTime) { + if (this._lockUpdate) { + return; + } + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + var prevCacheFrameIndex = this._cacheFrameIndex; + // Update nimation. + this._animation.advanceTime(passedTime); + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + var i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + if (this._actions.length > 0) { + this._lockUpdate = true; + for (var _i = 0, _a = this._actions; _i < _a.length; _i++) { + var action = _a[_i]; + if (action.type === 0 /* Play */) { + this._animation.fadeIn(action.name); + } + } + this._actions.length = 0; + this._lockUpdate = false; + } + // + var drawed = this.debugDraw || dragonBones_1.DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + }; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName !== null && boneName.length > 0) { + var bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + if (updateSlotDisplay) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (var _b = 0, _c = this._bones; _b < _c.length; _b++) { + var bone = _c[_b]; + bone.invalidUpdate(); + } + if (updateSlotDisplay) { + for (var _d = 0, _e = this._slots; _d < _e.length; _d++) { + var slot = _e[_d]; + slot.invalidUpdate(); + } + } + } + }; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.containsPoint = function (x, y) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.containsPoint(x, y)) { + return slot; + } + } + return null; + }; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var isV = xA === xB; + var dMin = 0.0; + var dMax = 0.0; + var intXA = 0.0; + var intYA = 0.0; + var intXB = 0.0; + var intYB = 0.0; + var intAN = 0.0; + var intBN = 0.0; + var intSlotA = null; + var intSlotB = null; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + if (intersectionPointB !== null) { + var d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + return intSlotA; + }; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBone = function (name) { + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.name === name) { + return bone; + } + } + return null; + }; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBoneByDisplay = function (display) { + var slot = this.getSlotByDisplay(display); + return slot !== null ? slot.parent : null; + }; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlot = function (name) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.name === name) { + return slot; + } + } + return null; + }; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlotByDisplay = function (display) { + if (display !== null) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.display === display) { + return slot; + } + } + } + return null; + }; + /** + * @deprecated + */ + Armature.prototype.addBone = function (value, parentName) { + if (parentName === void 0) { parentName = null; } + console.assert(value !== null); + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + }; + /** + * @deprecated + */ + Armature.prototype.removeBone = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * @deprecated + */ + Armature.prototype.addSlot = function (value, parentName) { + var bone = this.getBone(parentName); + console.assert(value !== null && bone !== null); + value._setArmature(this); + value._setParent(bone); + }; + /** + * @deprecated + */ + Armature.prototype.removeSlot = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBones = function () { + return this._bones; + }; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlots = function () { + return this._slots; + }; + Object.defineProperty(Armature.prototype, "flipX", { + get: function () { + return this._flipX; + }, + set: function (value) { + if (this._flipX === value) { + return; + } + this._flipX = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "flipY", { + get: function () { + return this._flipY; + }, + set: function (value) { + if (this._flipY === value) { + return; + } + this._flipY = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "cacheFrameRate", { + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.armatureData.cacheFrameRate; + }, + set: function (value) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + // Set child armature frameRate. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "name", { + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this.armatureData.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "animation", { + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._animation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "proxy", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "eventDispatcher", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "display", { + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "replacedTexture", { + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + get: function () { + return this._replacedTexture; + }, + set: function (value) { + if (this._replacedTexture === value) { + return; + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + this._replacedTexture = value; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + slot.invalidUpdate(); + slot.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + // Update childArmature clock. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "parent", { + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + Armature.prototype.replaceTexture = function (texture) { + this.replacedTexture = texture; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.hasEventListener = function (type) { + return this._proxy.hasEvent(type); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.addEventListener = function (type, listener, target) { + this._proxy.addEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.removeEventListener = function (type, listener, target) { + this._proxy.removeEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + Armature.prototype.enableAnimationCache = function (frameRate) { + this.cacheFrameRate = frameRate; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Armature.prototype.getDisplay = function () { + return this._display; + }; + return Armature; + }(dragonBones_1.BaseObject)); + dragonBones_1.Armature = Armature; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var TransformObject = (function (_super) { + __extends(TransformObject, _super); + function TransformObject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.globalTransformMatrix = new dragonBones.Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.global = new dragonBones.Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.offset = new dragonBones.Transform(); + return _this; + } + /** + * @private + */ + TransformObject.prototype._onClear = function () { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setArmature = function (value) { + this._armature = value; + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setParent = function (value) { + this._parent = value; + }; + /** + * @private + */ + TransformObject.prototype.updateGlobalTransform = function () { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + }; + Object.defineProperty(TransformObject.prototype, "armature", { + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TransformObject.prototype, "parent", { + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + TransformObject._helpMatrix = new dragonBones.Matrix(); + /** + * @private + */ + TransformObject._helpTransform = new dragonBones.Transform(); + /** + * @private + */ + TransformObject._helpPoint = new dragonBones.Point(); + return TransformObject; + }(dragonBones.BaseObject)); + dragonBones.TransformObject = TransformObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var Bone = (function (_super) { + __extends(Bone, _super); + function Bone() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this.animationPose = new dragonBones.Transform(); + /** + * @internal + * @private + */ + _this.constraints = []; + _this._bones = []; + _this._slots = []; + return _this; + } + Bone.toString = function () { + return "[class dragonBones.Bone]"; + }; + /** + * @private + */ + Bone.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + this.offsetMode = 1 /* Additive */; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null; // + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Bone.prototype._updateGlobalTransformMatrix = function (isCache) { + var flipX = this._armature.flipX; + var flipY = this._armature.flipY === dragonBones.DragonBones.yDown; + var global = this.global; + var globalTransformMatrix = this.globalTransformMatrix; + var inherit = this._parent !== null; + var dR = 0.0; + if (this.offsetMode === 1 /* Additive */) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === 0 /* None */) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + if (inherit) { + var parentMatrix = this._parent.globalTransformMatrix; + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + var x = global.x; + var y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + } + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + }; + /** + * @internal + * @private + */ + Bone.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + var oldSlots = null; + var oldBones = null; + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + this._armature = value; // + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + if (oldSlots !== null) { + for (var _i = 0, oldSlots_1 = oldSlots; _i < oldSlots_1.length; _i++) { + var slot = oldSlots_1[_i]; + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + if (oldBones !== null) { + for (var _a = 0, oldBones_1 = oldBones; _a < oldBones_1.length; _a++) { + var bone = oldBones_1[_a]; + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + }; + /** + * @internal + * @private + */ + Bone.prototype.init = function (boneData) { + if (this.boneData !== null) { + return; + } + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + }; + /** + * @internal + * @private + */ + Bone.prototype.update = function (cacheFrameIndex) { + this._blendDirty = false; + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.update(); + } + } + if (this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty)) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { + for (var _b = 0, _c = this.constraints; _b < _c.length; _b++) { + var constraint = _c[_b]; + constraint.update(); + } + } + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + this._localDirty = true; + }; + /** + * @internal + * @private + */ + Bone.prototype.updateByConstraint = function () { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + this._transformDirty = true; + } + }; + /** + * @internal + * @private + */ + Bone.prototype.addConstraint = function (constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + }; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.invalidUpdate = function () { + this._transformDirty = true; + }; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.contains = function (child) { + if (child === this) { + return false; + } + var ancestor = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + return ancestor === this; + }; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getBones = function () { + this._bones.length = 0; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.parent === this) { + this._bones.push(bone); + } + } + return this._bones; + }; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getSlots = function () { + this._slots.length = 0; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + this._slots.push(slot); + } + } + return this._slots; + }; + Object.defineProperty(Bone.prototype, "visible", { + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._visible; + }, + set: function (value) { + if (this._visible === value) { + return; + } + this._visible = value; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot._parent === this) { + slot._updateVisible(); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "length", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + get: function () { + return this.boneData.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + get: function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + return slot; + } + } + return null; + }, + enumerable: true, + configurable: true + }); + return Bone; + }(dragonBones.TransformObject)); + dragonBones.Bone = Bone; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + var Slot = (function (_super) { + __extends(Slot, _super); + function Slot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this._localMatrix = new dragonBones.Matrix(); + /** + * @private + */ + _this._colorTransform = new dragonBones.ColorTransform(); + /** + * @private + */ + _this._ffdVertices = []; + /** + * @private + */ + _this._displayDatas = []; + /** + * @private + */ + _this._displayList = []; + /** + * @private + */ + _this._meshBones = []; + /** + * @private + */ + _this._rawDisplay = null; // Initial value. + /** + * @private + */ + _this._meshDisplay = null; // Initial value. + return _this; + } + /** + * @private + */ + Slot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + var disposeDisplayList = []; + for (var _i = 0, _a = this._displayList; _i < _a.length; _i++) { + var eachDisplay = _a[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _b = 0, disposeDisplayList_1 = disposeDisplayList; _b < disposeDisplayList_1.length; _b++) { + var eachDisplay = disposeDisplayList_1[_b]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { + this._disposeDisplay(this._meshDisplay); + } + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + this.displayController = null; + this.slotData = null; // + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = 0 /* Normal */; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Slot.prototype._updateDisplayData = function () { + var prevDisplayData = this._displayData; + var prevTextureData = this._textureData; + var prevMeshData = this._meshData; + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === 0 /* Image */ || this._displayData.type === 2 /* Mesh */) { + this._textureData = this._displayData.texture; + if (this._displayData.type === 2 /* Mesh */) { + this._meshData = this._displayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */) { + this._meshData = rawDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = this._displayData.boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = rawDisplayData.boundingBox; + } + else { + this._boundingBoxData = null; + } + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + var imageDisplayData = this._displayData; + var scale = this._armature.armatureData.scale; + var frame = this._textureData.frame; + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + var rect = frame !== null ? frame : this._textureData.region; + var width = rect.width * scale; + var height = rect.height * scale; + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + this._pivotX *= width; + this._pivotY *= height; + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + for (var i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + var vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + 0 /* MeshVertexCount */]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + for (var i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { + this._meshDirty = true; + } + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + this._displayDirty = true; + this._transformDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._updateDisplay = function () { + var prevDisplay = this._display !== null ? this._display : this._rawDisplay; + var prevChildArmature = this._childArmature; + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof dragonBones.Armature) { + this._childArmature = this._display; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + // Update display. + var currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { + if (this._childArmature.cacheFrameRate === 0) { + var cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + // Child armature action. + var actions = null; + if (this._displayData !== null && this._displayData.type === 1 /* Armature */) { + actions = this._displayData.actions; + } + else { + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === 1 /* Armature */) { + actions = rawDisplayData.actions; + } + } + if (actions !== null && actions.length > 0) { + for (var _i = 0, actions_1 = actions; _i < actions_1.length; _i++) { + var action = actions_1[_i]; + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + }; + /** + * @private + */ + Slot.prototype._updateGlobalTransformMatrix = function (isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._isMeshBonesUpdate = function () { + for (var _i = 0, _a = this._meshBones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + return false; + }; + /** + * @internal + * @private + */ + Slot.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + this._armature = value; // + this._onUpdateDisplay(); + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + }; + /** + * @internal + * @private + */ + Slot.prototype._setDisplayIndex = function (value, isAnimation) { + if (isAnimation === void 0) { isAnimation = false; } + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + this._animationDisplayIndex = value; + } + if (this._displayIndex === value) { + return false; + } + this._displayIndex = value; + this._displayDirty = true; + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setZorder = function (value) { + if (this._zOrder === value) { + //return false; + } + this._zOrder = value; + this._zOrderDirty = true; + return this._zOrderDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setColor = function (value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + return this._colorDirty; + }; + /** + * @private + */ + Slot.prototype._setDisplayList = function (value) { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + for (var i = 0, l = value.length; i < l; ++i) { + var eachDisplay = value[i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) { + this._initDisplay(eachDisplay); + } + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @private + */ + Slot.prototype.init = function (slotData, displayDatas, rawDisplay, meshDisplay) { + if (this.slotData !== null) { + return; + } + this.slotData = slotData; + this.name = this.slotData.name; + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._displayDatas.length = this._rawDisplayDatas.length; + for (var i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + }; + /** + * @internal + * @private + */ + Slot.prototype.update = function (cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + if (this._transformDirty) { + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + if (this._display === null) { + return; + } + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + if (this._meshData !== null && this._display === this._meshDisplay) { + var isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + return; + } + } + if (this._transformDirty) { + this._transformDirty = false; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + this._updateTransform(false); + } + }; + /** + * @private + */ + Slot.prototype.updateTransformAndMatrix = function () { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + }; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.containsPoint = function (x, y) { + if (this._boundingBoxData === null) { + return false; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + }; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (this._boundingBoxData === null) { + return 0; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + return intersectionCount; + }; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + Slot.prototype.invalidUpdate = function () { + this._displayDirty = true; + this._transformDirty = true; + }; + Object.defineProperty(Slot.prototype, "displayIndex", { + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._displayIndex; + }, + set: function (value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "displayList", { + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._displayList.concat(); + }, + set: function (value) { + var backupDisplayList = this._displayList.concat(); // Copy. + var disposeDisplayList = new Array(); + if (this._setDisplayList(value)) { + this.update(-1); + } + // Release replaced displays. + for (var _i = 0, backupDisplayList_1 = backupDisplayList; _i < backupDisplayList_1.length; _i++) { + var eachDisplay = backupDisplayList_1[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _a = 0, disposeDisplayList_2 = disposeDisplayList; _a < disposeDisplayList_2.length; _a++) { + var eachDisplay = disposeDisplayList_2[_a]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "boundingBoxData", { + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + get: function () { + return this._boundingBoxData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "rawDisplay", { + /** + * @private + */ + get: function () { + return this._rawDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "meshDisplay", { + /** + * @private + */ + get: function () { + return this._meshDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "display", { + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + set: function (value) { + if (this._display === value) { + return; + } + var displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { + this._displayIndex = 0; + } + if (this._displayIndex < 0) { + return; + } + else { + var replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "childArmature", { + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._childArmature; + }, + set: function (value) { + if (this._childArmature === value) { + return; + } + this.display = value; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.getDisplay = function () { + return this._display; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.setDisplay = function (value) { + this.display = value; + }; + return Slot; + }(dragonBones.TransformObject)); + dragonBones.Slot = Slot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + * @internal + */ + var Constraint = (function (_super) { + __extends(Constraint, _super); + function Constraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + Constraint.prototype._onClear = function () { + this.target = null; // + this.bone = null; // + this.root = null; // + }; + Constraint._helpMatrix = new dragonBones.Matrix(); + Constraint._helpTransform = new dragonBones.Transform(); + Constraint._helpPoint = new dragonBones.Point(); + return Constraint; + }(dragonBones.BaseObject)); + dragonBones.Constraint = Constraint; + /** + * @private + * @internal + */ + var IKConstraint = (function (_super) { + __extends(IKConstraint, _super); + function IKConstraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraint.toString = function () { + return "[class dragonBones.IKConstraint]"; + }; + IKConstraint.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + IKConstraint.prototype._computeA = function () { + var ikGlobal = this.target.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + var ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype._computeB = function () { + var boneLength = this.bone.boneData.length; + var parent = this.root; + var ikGlobal = this.target.global; + var parentGlobal = parent.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + var x = globalTransformMatrix.a * boneLength; + var y = globalTransformMatrix.b * boneLength; + var lLL = x * x + y * y; + var lL = Math.sqrt(lLL); + var dX = global.x - parentGlobal.x; + var dY = global.y - parentGlobal.y; + var lPP = dX * dX + dY * dY; + var lP = Math.sqrt(lPP); + var rawRadianA = Math.atan2(dY, dX); + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + var lTT = dX * dX + dY * dY; + var lT = Math.sqrt(lTT); + var ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + var h = (lPP - lLL + lTT) / (2.0 * lTT); + var r = Math.sqrt(lPP - h * h * lTT) / lT; + var hX = parentGlobal.x + (dX * h); + var hY = parentGlobal.y + (dY * h); + var rX = -dY * r; + var rY = dX * r; + var isPPR = false; + if (parent._parent !== null) { + var parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + var dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + var parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + var ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype.update = function () { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + }; + return IKConstraint; + }(Constraint)); + dragonBones.IKConstraint = IKConstraint; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var WorldClock = (function () { + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + function WorldClock(time) { + if (time === void 0) { time = -1.0; } + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + this.time = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + this.timeScale = 1.0; + this._animatebles = []; + this._clock = null; + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.advanceTime = function (passedTime) { + if (passedTime !== passedTime) { + passedTime = 0.0; + } + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + if (passedTime === 0.0) { + return; + } + var i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + var animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + var animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + this._animatebles.length -= r; + } + }; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.contains = function (value) { + return this._animatebles.indexOf(value) >= 0; + }; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.add = function (value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + }; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.remove = function (value) { + var index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + }; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.clear = function () { + for (var _i = 0, _a = this._animatebles; _i < _a.length; _i++) { + var animatable = _a[_i]; + if (animatable !== null) { + animatable.clock = null; + } + } + }; + Object.defineProperty(WorldClock.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock !== null) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.clock = new WorldClock(); + return WorldClock; + }()); + dragonBones.WorldClock = WorldClock; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._animationNames = []; + _this._animationStates = []; + _this._animations = {}; + _this._animationConfig = null; // Initial value. + return _this; + } + /** + * @private + */ + Animation.toString = function () { + return "[class dragonBones.Animation]"; + }; + /** + * @private + */ + Animation.prototype._onClear = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + for (var k in this._animations) { + delete this._animations[k]; + } + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + this.timeScale = 1.0; + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + }; + Animation.prototype._fadeOut = function (animationConfig) { + switch (animationConfig.fadeOutMode) { + case 1 /* SameLayer */: + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 2 /* SameGroup */: + for (var _b = 0, _c = this._animationStates; _b < _c.length; _b++) { + var animationState = _c[_b]; + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 3 /* SameLayerAndGroup */: + for (var _d = 0, _e = this._animationStates; _d < _e.length; _d++) { + var animationState = _e[_d]; + if (animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 4 /* All */: + for (var _f = 0, _g = this._animationStates; _f < _g.length; _f++) { + var animationState = _g[_f]; + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + case 0 /* None */: + case 5 /* Single */: + default: + break; + } + }; + /** + * @internal + * @private + */ + Animation.prototype.init = function (armature) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig); + }; + /** + * @internal + * @private + */ + Animation.prototype.advanceTime = function (passedTime) { + if (passedTime < 0.0) { + passedTime = -passedTime; + } + if (this._armature.inheritAnimation && this._armature._parent !== null) { + passedTime *= this._armature._parent._armature.animation.timeScale; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + var animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + var animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + var animationData = animationState.animationData; + var cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { + this._animationDirty = false; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (var i = 0, r = 0; i < animationStateCount; ++i) { + var animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, 0.0); + } + if (i === animationStateCount - 1 && r > 0) { + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + this._timelineDirty = false; + }; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.reset = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + }; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.stop = function (animationName) { + if (animationName === void 0) { animationName = null; } + if (animationName !== null) { + var animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.stop(); + } + } + }; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + Animation.prototype.playConfig = function (animationConfig) { + var animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName); + return null; + } + var animationData = this._animations[animationName]; + if (animationConfig.fadeOutMode === 5 /* Single */) { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState_1 = _a[_i]; + if (animationState_1.animationData === animationData) { + return animationState_1; + } + } + } + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + this._fadeOut(animationConfig); + var animationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + if (this._animationStates.length > 0) { + var added = false; + for (var i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + // Child armature play same name animation. + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var childArmature = slot.childArmature; + if (childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null) { + childArmature.animation.fadeIn(animationName); // + } + } + if (animationConfig.fadeInTime <= 0.0) { + this._armature.advanceTime(0.0); + } + this._lastAnimationState = animationState; + return animationState; + }; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + var defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + return this._lastAnimationState; + }; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) { + if (time === void 0) { time = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) { + if (frame === void 0) { frame = 0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + return this.playConfig(this._animationConfig); + }; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) { + if (progress === void 0) { progress = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + return this.playConfig(this._animationConfig); + }; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByTime = function (animationName, time) { + if (time === void 0) { time = 0.0; } + var animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByFrame = function (animationName, frame) { + if (frame === void 0) { frame = 0; } + var animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByProgress = function (animationName, progress) { + if (progress === void 0) { progress = 0.0; } + var animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.getState = function (animationName) { + var i = this._animationStates.length; + while (i--) { + var animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + return null; + }; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.hasAnimation = function (animationName) { + return animationName in this._animations; + }; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + Animation.prototype.getStates = function () { + return this._animationStates; + }; + Object.defineProperty(Animation.prototype, "isPlaying", { + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.isPlaying) { + return true; + } + } + return false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "isCompleted", { + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (!animationState.isCompleted) { + return false; + } + } + return this._animationStates.length > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationName", { + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationNames", { + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animations", { + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animations; + }, + set: function (value) { + if (this._animations === value) { + return; + } + this._animationNames.length = 0; + for (var k in this._animations) { + delete this._animations[k]; + } + for (var k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationConfig", { + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + this._animationConfig.clear(); + return this._animationConfig; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationState", { + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) { + if (fadeInTime === void 0) { fadeInTime = -1; } + if (duration === void 0) { duration = -1; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (pauseFadeOut === void 0) { pauseFadeOut = true; } + if (pauseFadeIn === void 0) { pauseFadeIn = true; } + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + var animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + return this.playConfig(this._animationConfig); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + Animation.prototype.gotoAndStop = function (animationName, time) { + if (time === void 0) { time = 0; } + return this.gotoAndStopByTime(animationName, time); + }; + Object.defineProperty(Animation.prototype, "animationList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationDataList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + var list = []; + for (var i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + return list; + }, + enumerable: true, + configurable: true + }); + return Animation; + }(dragonBones.BaseObject)); + dragonBones.Animation = Animation; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var BonePose = (function (_super) { + __extends(BonePose, _super); + function BonePose() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.current = new dragonBones.Transform(); + _this.delta = new dragonBones.Transform(); + _this.result = new dragonBones.Transform(); + return _this; + } + BonePose.toString = function () { + return "[class dragonBones.BonePose]"; + }; + BonePose.prototype._onClear = function () { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + }; + return BonePose; + }(dragonBones.BaseObject)); + dragonBones.BonePose = BonePose; + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationState = (function (_super) { + __extends(AnimationState, _super); + function AnimationState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._boneMask = []; + _this._boneTimelines = []; + _this._slotTimelines = []; + _this._bonePoses = {}; + /** + * @internal + * @private + */ + _this._actionTimeline = null; // Initial value. + _this._zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationState.toString = function () { + return "[class dragonBones.AnimationState]"; + }; + /** + * @private + */ + AnimationState.prototype._onClear = function () { + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.returnToPool(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.returnToPool(); + } + for (var k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null; // + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + }; + AnimationState.prototype._isDisabled = function (slot) { + if (this.displayControl) { + var displayController = slot.displayController; + if (displayController === null || + displayController === this.name || + displayController === this.group) { + return false; + } + } + return true; + }; + AnimationState.prototype._advanceFadeTime = function (passedTime) { + var isFadeOut = this._fadeState > 0; + if (this._subFadeState < 0) { + this._subFadeState = 0; + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + if (passedTime < 0.0) { + passedTime = -passedTime; + } + this._fadeTime += passedTime; + if (this._fadeTime >= this.fadeTotalTime) { + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + if (this._subFadeState > 0) { + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + }; + AnimationState.prototype._blendBoneTimline = function (timeline) { + var bone = timeline.bone; + var bonePose = timeline.bonePose.result; + var animationPose = bone.animationPose; + var boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.init = function (armature, animationData, animationConfig) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (var i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + this._actionTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.updateTimelines = function () { + var boneTimelines = {}; + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + var timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + boneTimelines[timelineName].push(timeline); + } + for (var _b = 0, _c = this._armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + var timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + var timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { + delete boneTimelines[timelineName]; + } + else { + var bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = dragonBones.BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (var _d = 0, timelineDatas_1 = timelineDatas; _d < timelineDatas_1.length; _d++) { + var timelineData = timelineDatas_1[_d]; + switch (timelineData.type) { + case 10 /* BoneAll */: + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + case 11 /* BoneT */: + case 12 /* BoneR */: + case 13 /* BoneS */: + // TODO + break; + case 14 /* BoneX */: + case 15 /* BoneY */: + case 16 /* BoneRotate */: + case 17 /* BoneSkew */: + case 18 /* BoneScaleX */: + case 19 /* BoneScaleY */: + // TODO + break; + } + } + } + else if (this.resetToPose) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + for (var k in boneTimelines) { + for (var _e = 0, _f = boneTimelines[k]; _e < _f.length; _e++) { + var timeline = _f[_e]; + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + var slotTimelines = {}; + var ffdFlags = []; + for (var _g = 0, _h = this._slotTimelines; _g < _h.length; _g++) { + var timeline = _h[_g]; + var timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + slotTimelines[timelineName].push(timeline); + } + for (var _j = 0, _k = this._armature.getSlots(); _j < _k.length; _j++) { + var slot = _k[_j]; + var boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + var timelineName = slot.name; + var timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { + delete slotTimelines[timelineName]; + } + else { + var displayIndexFlag = false; + var colorFlag = false; + ffdFlags.length = 0; + if (timelineDatas !== null) { + for (var _l = 0, timelineDatas_2 = timelineDatas; _l < timelineDatas_2.length; _l++) { + var timelineData = timelineDatas_2[_l]; + switch (timelineData.type) { + case 20 /* SlotDisplay */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + case 21 /* SlotColor */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + case 22 /* SlotFFD */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + if (this.resetToPose) { + if (!displayIndexFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + if (!colorFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + for (var _m = 0, _o = slot._rawDisplayDatas; _m < _o.length; _m++) { + var displayData = _o[_m]; + if (displayData !== null && displayData.type === 2 /* Mesh */ && ffdFlags.indexOf(displayData.offset) < 0) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + for (var k in slotTimelines) { + for (var _p = 0, _q = slotTimelines[k]; _p < _q.length; _p++) { + var timeline = _q[_p]; + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.advanceTime = function (passedTime, cacheFrameRate) { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + // Update time. + if (this._playheadState === 3) { + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + this._time += passedTime; + } + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + if (this.weight === 0.0) { + return; + } + var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + var isUpdateTimeline = true; + var isUpdateBoneTimeline = true; + var time = this._time; + this._weightResult = this.weight * this._fadeProgress; + this._actionTimeline.update(time); // Update main timeline. + if (isCacheEnabled) { + var internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.update(time); + } + if (isCacheEnabled) { + var cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { + isUpdateBoneTimeline = false; + } + else { + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { + var bone = null; + var prevTimeline = null; // + for (var i = 0, l = this._boneTimelines.length; i < l; ++i) { + var timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + bone = timeline.bone; + } + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + for (var i = 0, l = this._slotTimelines.length; i < l; ++i) { + var timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + timeline.update(time); + } + } + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { + this.fadeOut(this.autoFadeOutTime); + } + } + } + }; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.play = function () { + this._playheadState = 3; // 11 + }; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.stop = function () { + this._playheadState &= 1; // 0x + }; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) { + if (pausePlayhead === void 0) { pausePlayhead = true; } + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.fadeOut(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.fadeOut(); + } + } + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + }; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.containsBoneMask = function (name) { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + }; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.addBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + if (this._boneMask.indexOf(name) < 0) { + this._boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + this._timelineDirty = true; + }; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this._boneMask.indexOf(name); + if (index >= 0) { + this._boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = this._armature.getBone(name); + if (currentBone !== null) { + var bones = this._armature.getBones(); + if (this._boneMask.length > 0) { + for (var _i = 0, bones_1 = bones; _i < bones_1.length; _i++) { + var bone = bones_1[_i]; + var index_2 = this._boneMask.indexOf(bone.name); + if (index_2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index_2, 1); + } + } + } + else { + for (var _a = 0, bones_2 = bones; _a < bones_2.length; _a++) { + var bone = bones_2[_a]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + this._timelineDirty = true; + }; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeAllBoneMask = function () { + this._boneMask.length = 0; + this._timelineDirty = true; + }; + Object.defineProperty(AnimationState.prototype, "isFadeIn", { + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState < 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeOut", { + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeComplete", { + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState === 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isPlaying", { + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isCompleted", { + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.playState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentPlayTimes", { + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "totalTime", { + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._duration; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentTime", { + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentTime; + }, + set: function (value) { + var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + if (this._time === value) { + return; + } + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.playState = -1; + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.playState = -1; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "clip", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + get: function () { + return this.animationData; + }, + enumerable: true, + configurable: true + }); + return AnimationState; + }(dragonBones.BaseObject)); + dragonBones.AnimationState = AnimationState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var TimelineState = (function (_super) { + __extends(TimelineState, _super); + function TimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineState.prototype._onClear = function () { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + this._tweenState = 0 /* None */; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + }; + TimelineState.prototype._setCurrentTime = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this._actionTimeline !== null && this._frameCount <= 1) { + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { + var playTimes = this._animationState.playTimes; + var totalTime = playTimes * this._duration; + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + this.currentTime += this._position; + } + else { + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + // Clear frame flag when timeline start or loopComplete. + if ((prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes)) { + this._frameIndex = -1; + } + return true; + }; + TimelineState.prototype.init = function (armature, animationState, timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + if (this === this._actionTimeline) { + this._actionTimeline = null; // + } + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + this._frameCount = this._timelineArray[this._timelineData.offset + 2 /* TimelineKeyFrameCount */]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + 4 /* TimelineFrameValueOffset */]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + 0 /* TimelineScale */]; + this._timeOffset = this._timelineArray[this._timelineData.offset + 1 /* TimelineOffset */] * 0.01; + } + }; + TimelineState.prototype.fadeOut = function () { }; + TimelineState.prototype.update = function (passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[this._timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + } + this._onArriveAtFrame(); + } + if (this._tweenState !== 0 /* None */) { + this._onUpdateFrame(); + } + } + }; + return TimelineState; + }(dragonBones.BaseObject)); + dragonBones.TimelineState = TimelineState; + /** + * @internal + * @private + */ + var TweenTimelineState = (function (_super) { + __extends(TweenTimelineState, _super); + function TweenTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TweenTimelineState._getEasingValue = function (tweenType, progress, easing) { + var value = progress; + switch (tweenType) { + case 3 /* QuadIn */: + value = Math.pow(progress, 2.0); + break; + case 4 /* QuadOut */: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + case 5 /* QuadInOut */: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + return (value - progress) * easing + progress; + }; + TweenTimelineState._getEasingCurveValue = function (progress, samples, count, offset) { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + var segmentCount = count + 1; // + 2 - 1 + var valueIndex = Math.floor(progress * segmentCount); + var fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + var toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + }; + TweenTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._tweenType = 0 /* None */; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + }; + TweenTimelineState.prototype._onArriveAtFrame = function () { + if (this._frameCount > 1 && + (this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) { + this._tweenType = this._frameArray[this._frameOffset + 1 /* FrameTweenType */]; // TODO recode ture tween type. + this._tweenState = this._tweenType === 0 /* None */ ? 1 /* Once */ : 2 /* Always */; + if (this._tweenType === 2 /* Curve */) { + this._curveCount = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */]; + } + else if (this._tweenType !== 0 /* None */ && this._tweenType !== 1 /* Line */) { + this._tweenEasing = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] * 0.01; + } + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = 1 /* Once */; + } + }; + TweenTimelineState.prototype._onUpdateFrame = function () { + if (this._tweenState === 2 /* Always */) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === 2 /* Curve */) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + 3 /* FrameCurveSamples */); + } + else if (this._tweenType !== 1 /* Line */) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + }; + return TweenTimelineState; + }(TimelineState)); + dragonBones.TweenTimelineState = TweenTimelineState; + /** + * @internal + * @private + */ + var BoneTimelineState = (function (_super) { + __extends(BoneTimelineState, _super); + function BoneTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bone = null; // + this.bonePose = null; // + }; + return BoneTimelineState; + }(TweenTimelineState)); + dragonBones.BoneTimelineState = BoneTimelineState; + /** + * @internal + * @private + */ + var SlotTimelineState = (function (_super) { + __extends(SlotTimelineState, _super); + function SlotTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.slot = null; // + }; + return SlotTimelineState; + }(TweenTimelineState)); + dragonBones.SlotTimelineState = SlotTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var ActionTimelineState = (function (_super) { + __extends(ActionTimelineState, _super); + function ActionTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ActionTimelineState.toString = function () { + return "[class dragonBones.ActionTimelineState]"; + }; + ActionTimelineState.prototype._onCrossFrame = function (frameIndex) { + var eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + frameIndex]; + var actionCount = this._frameArray[frameOffset + 1]; + var actions = this._armature.armatureData.actions; + for (var i = 0; i < actionCount; ++i) { + var actionIndex = this._frameArray[frameOffset + 2 + i]; + var action = actions[actionIndex]; + if (action.type === 0 /* Play */) { + if (action.slot !== null) { + var slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + var eventType = action.type === 10 /* Frame */ ? dragonBones.EventObject.FRAME_EVENT : dragonBones.EventObject.SOUND_EVENT; + if (action.type === 11 /* Sound */ || eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + }; + ActionTimelineState.prototype._onArriveAtFrame = function () { }; + ActionTimelineState.prototype._onUpdateFrame = function () { }; + ActionTimelineState.prototype.update = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + var eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { + this._armature._sortZOrder(null, 0); + } + prevPlayTimes = this.currentPlayTimes; + if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = dragonBones.EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + var isReverse = this._animationState.timeScale < 0.0; + var loopCompleteEvent = null; + var completeEvent = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + loopCompleteEvent.type = dragonBones.EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + if (this.playState > 0) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) { + completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + completeEvent.type = dragonBones.EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + } + } + if (this._frameCount > 1) { + var timelineData = this._timelineData; + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + var crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { + if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + // Arrive at frame. + var framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { + if (!isReverse && loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + this._onCrossFrame(this._frameIndex); + } + } + } + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + }; + ActionTimelineState.prototype.setCurrentTime = function (value) { + this._setCurrentTime(value); + this._frameIndex = -1; + }; + return ActionTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ActionTimelineState = ActionTimelineState; + /** + * @internal + * @private + */ + var ZOrderTimelineState = (function (_super) { + __extends(ZOrderTimelineState, _super); + function ZOrderTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZOrderTimelineState.toString = function () { + return "[class dragonBones.ZOrderTimelineState]"; + }; + ZOrderTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + }; + ZOrderTimelineState.prototype._onUpdateFrame = function () { }; + return ZOrderTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ZOrderTimelineState = ZOrderTimelineState; + /** + * @internal + * @private + */ + var BoneAllTimelineState = (function (_super) { + __extends(BoneAllTimelineState, _super); + function BoneAllTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneAllTimelineState.toString = function () { + return "[class dragonBones.BoneAllTimelineState]"; + }; + BoneAllTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { + var current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + }; + BoneAllTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var result = this.bonePose.result; + this.bone._transformDirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + var scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + }; + BoneAllTimelineState.prototype.fadeOut = function () { + var result = this.bonePose.result; + result.rotation = dragonBones.Transform.normalizeRadian(result.rotation); + result.skew = dragonBones.Transform.normalizeRadian(result.skew); + }; + return BoneAllTimelineState; + }(dragonBones.BoneTimelineState)); + dragonBones.BoneAllTimelineState = BoneAllTimelineState; + /** + * @internal + * @private + */ + var SlotDislayIndexTimelineState = (function (_super) { + __extends(SlotDislayIndexTimelineState, _super); + function SlotDislayIndexTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotDislayIndexTimelineState.toString = function () { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + }; + SlotDislayIndexTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + }; + return SlotDislayIndexTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotDislayIndexTimelineState = SlotDislayIndexTimelineState; + /** + * @internal + * @private + */ + var SlotColorTimelineState = (function (_super) { + __extends(SlotColorTimelineState, _super); + function SlotColorTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._delta = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._result = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + return _this; + } + SlotColorTimelineState.toString = function () { + return "[class dragonBones.SlotColorTimelineState]"; + }; + SlotColorTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._dirty = false; + }; + SlotColorTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var intArray = this._dragonBonesData.intArray; + var frameIntArray = this._dragonBonesData.frameIntArray; + var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + var colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { + var color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + }; + SlotColorTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + }; + SlotColorTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotColorTimelineState.prototype.update = function (passedTime) { + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._colorTransform; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + this.slot._colorDirty = true; + } + } + } + }; + return SlotColorTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotColorTimelineState = SlotColorTimelineState; + /** + * @internal + * @private + */ + var SlotFFDTimelineState = (function (_super) { + __extends(SlotFFDTimelineState, _super); + function SlotFFDTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = []; + _this._delta = []; + _this._result = []; + return _this; + } + SlotFFDTimelineState.toString = function () { + return "[class dragonBones.SlotFFDTimelineState]"; + }; + SlotFFDTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.meshOffset = 0; + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + }; + SlotFFDTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var isTween = this._tweenState === 2 /* Always */; + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + if (isTween) { + var nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + }; + SlotFFDTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + for (var i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + }; + SlotFFDTimelineState.prototype.init = function (armature, animationState, timelineData) { + _super.prototype.init.call(this, armature, animationState, timelineData); + if (this._timelineData !== null) { + var frameIntArray = this._dragonBonesData.frameIntArray; + var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + 3 /* TimelineFrameValueCount */]; + this.meshOffset = frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */]; + this._ffdCount = frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */]; + this._valueCount = frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */]; + this._valueOffset = frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */]; + this._frameFloatOffset = frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + }; + SlotFFDTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotFFDTimelineState.prototype.update = function (passedTime) { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._ffdVertices; + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + this.slot._meshDirty = true; + } + } + } + }; + return SlotFFDTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotFFDTimelineState = SlotFFDTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EventObject = (function (_super) { + __extends(EventObject, _super); + function EventObject() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EventObject.toString = function () { + return "[class dragonBones.EventObject]"; + }; + /** + * @private + */ + EventObject.prototype._onClear = function () { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + }; + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.START = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.LOOP_COMPLETE = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.COMPLETE = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN_COMPLETE = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT_COMPLETE = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FRAME_EVENT = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.SOUND_EVENT = "soundEvent"; + return EventObject; + }(dragonBones.BaseObject)); + dragonBones.EventObject = EventObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DataParser = (function () { + function DataParser() { + } + DataParser._getArmatureType = function (value) { + switch (value.toLowerCase()) { + case "stage": + return 2 /* Stage */; + case "armature": + return 0 /* Armature */; + case "movieclip": + return 1 /* MovieClip */; + default: + return 0 /* Armature */; + } + }; + DataParser._getDisplayType = function (value) { + switch (value.toLowerCase()) { + case "image": + return 0 /* Image */; + case "mesh": + return 2 /* Mesh */; + case "armature": + return 1 /* Armature */; + case "boundingbox": + return 3 /* BoundingBox */; + default: + return 0 /* Image */; + } + }; + DataParser._getBoundingBoxType = function (value) { + switch (value.toLowerCase()) { + case "rectangle": + return 0 /* Rectangle */; + case "ellipse": + return 1 /* Ellipse */; + case "polygon": + return 2 /* Polygon */; + default: + return 0 /* Rectangle */; + } + }; + DataParser._getActionType = function (value) { + switch (value.toLowerCase()) { + case "play": + return 0 /* Play */; + case "frame": + return 10 /* Frame */; + case "sound": + return 11 /* Sound */; + default: + return 0 /* Play */; + } + }; + DataParser._getBlendMode = function (value) { + switch (value.toLowerCase()) { + case "normal": + return 0 /* Normal */; + case "add": + return 1 /* Add */; + case "alpha": + return 2 /* Alpha */; + case "darken": + return 3 /* Darken */; + case "difference": + return 4 /* Difference */; + case "erase": + return 5 /* Erase */; + case "hardlight": + return 6 /* HardLight */; + case "invert": + return 7 /* Invert */; + case "layer": + return 8 /* Layer */; + case "lighten": + return 9 /* Lighten */; + case "multiply": + return 10 /* Multiply */; + case "overlay": + return 11 /* Overlay */; + case "screen": + return 12 /* Screen */; + case "subtract": + return 13 /* Subtract */; + default: + return 0 /* Normal */; + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + DataParser.parseDragonBonesData = function (rawData) { + if (rawData instanceof ArrayBuffer) { + return dragonBones.BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + DataParser.parseTextureAtlasData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.warn("已废弃,请参考 @see"); + var textureAtlasData = {}; + var subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (var i = 0, len = subTextureList.length; i < len; i++) { + var subTextureObject = subTextureList[i]; + var subTextureName = subTextureObject[DataParser.NAME]; + var subTextureRegion = new dragonBones.Rectangle(); + var subTextureFrame = null; + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new dragonBones.Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + return textureAtlasData; + }; + DataParser.DATA_VERSION_2_3 = "2.3"; + DataParser.DATA_VERSION_3_0 = "3.0"; + DataParser.DATA_VERSION_4_0 = "4.0"; + DataParser.DATA_VERSION_4_5 = "4.5"; + DataParser.DATA_VERSION_5_0 = "5.0"; + DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0; + DataParser.DATA_VERSIONS = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + DataParser.TEXTURE_ATLAS = "textureAtlas"; + DataParser.SUB_TEXTURE = "SubTexture"; + DataParser.FORMAT = "format"; + DataParser.IMAGE_PATH = "imagePath"; + DataParser.WIDTH = "width"; + DataParser.HEIGHT = "height"; + DataParser.ROTATED = "rotated"; + DataParser.FRAME_X = "frameX"; + DataParser.FRAME_Y = "frameY"; + DataParser.FRAME_WIDTH = "frameWidth"; + DataParser.FRAME_HEIGHT = "frameHeight"; + DataParser.DRADON_BONES = "dragonBones"; + DataParser.USER_DATA = "userData"; + DataParser.ARMATURE = "armature"; + DataParser.BONE = "bone"; + DataParser.IK = "ik"; + DataParser.SLOT = "slot"; + DataParser.SKIN = "skin"; + DataParser.DISPLAY = "display"; + DataParser.ANIMATION = "animation"; + DataParser.Z_ORDER = "zOrder"; + DataParser.FFD = "ffd"; + DataParser.FRAME = "frame"; + DataParser.TRANSLATE_FRAME = "translateFrame"; + DataParser.ROTATE_FRAME = "rotateFrame"; + DataParser.SCALE_FRAME = "scaleFrame"; + DataParser.VISIBLE_FRAME = "visibleFrame"; + DataParser.DISPLAY_FRAME = "displayFrame"; + DataParser.COLOR_FRAME = "colorFrame"; + DataParser.DEFAULT_ACTIONS = "defaultActions"; + DataParser.ACTIONS = "actions"; + DataParser.EVENTS = "events"; + DataParser.INTS = "ints"; + DataParser.FLOATS = "floats"; + DataParser.STRINGS = "strings"; + DataParser.CANVAS = "canvas"; + DataParser.TRANSFORM = "transform"; + DataParser.PIVOT = "pivot"; + DataParser.AABB = "aabb"; + DataParser.COLOR = "color"; + DataParser.VERSION = "version"; + DataParser.COMPATIBLE_VERSION = "compatibleVersion"; + DataParser.FRAME_RATE = "frameRate"; + DataParser.TYPE = "type"; + DataParser.SUB_TYPE = "subType"; + DataParser.NAME = "name"; + DataParser.PARENT = "parent"; + DataParser.TARGET = "target"; + DataParser.SHARE = "share"; + DataParser.PATH = "path"; + DataParser.LENGTH = "length"; + DataParser.DISPLAY_INDEX = "displayIndex"; + DataParser.BLEND_MODE = "blendMode"; + DataParser.INHERIT_TRANSLATION = "inheritTranslation"; + DataParser.INHERIT_ROTATION = "inheritRotation"; + DataParser.INHERIT_SCALE = "inheritScale"; + DataParser.INHERIT_REFLECTION = "inheritReflection"; + DataParser.INHERIT_ANIMATION = "inheritAnimation"; + DataParser.INHERIT_FFD = "inheritFFD"; + DataParser.BEND_POSITIVE = "bendPositive"; + DataParser.CHAIN = "chain"; + DataParser.WEIGHT = "weight"; + DataParser.FADE_IN_TIME = "fadeInTime"; + DataParser.PLAY_TIMES = "playTimes"; + DataParser.SCALE = "scale"; + DataParser.OFFSET = "offset"; + DataParser.POSITION = "position"; + DataParser.DURATION = "duration"; + DataParser.TWEEN_TYPE = "tweenType"; + DataParser.TWEEN_EASING = "tweenEasing"; + DataParser.TWEEN_ROTATE = "tweenRotate"; + DataParser.TWEEN_SCALE = "tweenScale"; + DataParser.CURVE = "curve"; + DataParser.SOUND = "sound"; + DataParser.EVENT = "event"; + DataParser.ACTION = "action"; + DataParser.X = "x"; + DataParser.Y = "y"; + DataParser.SKEW_X = "skX"; + DataParser.SKEW_Y = "skY"; + DataParser.SCALE_X = "scX"; + DataParser.SCALE_Y = "scY"; + DataParser.VALUE = "value"; + DataParser.ROTATE = "rotate"; + DataParser.SKEW = "skew"; + DataParser.ALPHA_OFFSET = "aO"; + DataParser.RED_OFFSET = "rO"; + DataParser.GREEN_OFFSET = "gO"; + DataParser.BLUE_OFFSET = "bO"; + DataParser.ALPHA_MULTIPLIER = "aM"; + DataParser.RED_MULTIPLIER = "rM"; + DataParser.GREEN_MULTIPLIER = "gM"; + DataParser.BLUE_MULTIPLIER = "bM"; + DataParser.UVS = "uvs"; + DataParser.VERTICES = "vertices"; + DataParser.TRIANGLES = "triangles"; + DataParser.WEIGHTS = "weights"; + DataParser.SLOT_POSE = "slotPose"; + DataParser.BONE_POSE = "bonePose"; + DataParser.GOTO_AND_PLAY = "gotoAndPlay"; + DataParser.DEFAULT_NAME = "default"; + return DataParser; + }()); + dragonBones.DataParser = DataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ObjectDataParser = (function (_super) { + __extends(ObjectDataParser, _super); + function ObjectDataParser() { + /** + * @private + */ + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._intArrayJson = []; + _this._floatArrayJson = []; + _this._frameIntArrayJson = []; + _this._frameFloatArrayJson = []; + _this._frameArrayJson = []; + _this._timelineArrayJson = []; + _this._rawTextureAtlasIndex = 0; + _this._rawBones = []; + _this._data = null; // + _this._armature = null; // + _this._bone = null; // + _this._slot = null; // + _this._skin = null; // + _this._mesh = null; // + _this._animation = null; // + _this._timeline = null; // + _this._rawTextureAtlases = null; + _this._defalultColorOffset = -1; + _this._prevTweenRotate = 0; + _this._prevRotation = 0.0; + _this._helpMatrixA = new dragonBones.Matrix(); + _this._helpMatrixB = new dragonBones.Matrix(); + _this._helpTransform = new dragonBones.Transform(); + _this._helpColorTransform = new dragonBones.ColorTransform(); + _this._helpPoint = new dragonBones.Point(); + _this._helpArray = []; + _this._actionFrames = []; + _this._weightSlotPose = {}; + _this._weightBonePoses = {}; + _this._weightBoneIndices = {}; + _this._cacheBones = {}; + _this._meshs = {}; + _this._slotChildActions = {}; + return _this; + } + ObjectDataParser._getBoolean = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + default: + return true; + } + } + else { + return !!value; + } + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getNumber = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + return +value || 0; + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getString = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + return value; + } + return String(value); + } + return defaultValue; + }; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + ObjectDataParser.prototype._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) { + var l_t = 1.0 - t; + var powA = l_t * l_t; + var powB = t * t; + var kA = l_t * powA; + var kB = 3.0 * t * powA; + var kC = 3.0 * l_t * powB; + var kD = t * powB; + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + }; + /** + * @private + */ + ObjectDataParser.prototype._samplingEasingCurve = function (curve, samples) { + var curveCount = curve.length; + var stepIndex = -2; + for (var i = 0, l = samples.length; i < l; ++i) { + var t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { + stepIndex += 6; + } + var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + var x1 = isInCurve ? curve[stepIndex] : 0.0; + var y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + var x2 = curve[stepIndex + 2]; + var y2 = curve[stepIndex + 3]; + var x3 = curve[stepIndex + 4]; + var y3 = curve[stepIndex + 5]; + var x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + var y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + var lower = 0.0; + var higher = 1.0; + while (higher - lower > 0.0001) { + var percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + samples[i] = this._helpPoint.y; + } + }; + ObjectDataParser.prototype._sortActionFrame = function (a, b) { + return a.frameStart > b.frameStart ? 1 : -1; + }; + ObjectDataParser.prototype._parseActionDataInFrame = function (rawData, frameStart, bone, slot) { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, 11 /* Sound */, bone, slot); + } + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, 0 /* Play */, bone, slot); + } + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, 0 /* Play */, bone, slot); + } + }; + ObjectDataParser.prototype._mergeActionFrame = function (rawData, frameStart, type, bone, slot) { + var actionOffset = dragonBones.DragonBones.webAssembly ? this._armature.actions.size() : this._armature.actions.length; + var actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + var frame = null; + if (this._actionFrames.length === 0) { + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + for (var _i = 0, _a = this._actionFrames; _i < _a.length; _i++) { + var eachFrame = _a[_i]; + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + if (frame === null) { + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + for (var i = 0; i < actionCount; ++i) { + frame.actions.push(actionOffset + i); + } + }; + ObjectDataParser.prototype._parseCacheActionFrame = function (frame) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = frameArray.length; + var actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + 0 /* FramePosition */] = frame.frameStart; + frameArray[frameOffset + 0 /* FramePosition */ + 1] = actionCount; // Action count. + for (var i = 0; i < actionCount; ++i) { + frameArray[frameOffset + 0 /* FramePosition */ + 2 + i] = frame.actions[i]; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArmature = function (rawData, scale) { + // const armature = BaseObject.borrowObject(ArmatureData); + var armature = dragonBones.DragonBones.webAssembly ? new Module["ArmatureData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */); + } + if (armature.frameRate === 0) { + armature.frameRate = 24; + } + this._armature = armature; + if (ObjectDataParser.AABB in rawData) { + var rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + if (ObjectDataParser.CANVAS in rawData) { + var rawCanvas = rawData[ObjectDataParser.CANVAS]; + var canvas = dragonBones.BaseObject.borrowObject(dragonBones.CanvasData); + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + armature.canvas = canvas; + } + if (ObjectDataParser.BONE in rawData) { + var rawBones = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawBones_1 = rawBones; _i < rawBones_1.length; _i++) { + var rawBone = rawBones_1[_i]; + var parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + var bone = this._parseBone(rawBone); + if (parentName.length > 0) { + var parent_1 = armature.getBone(parentName); + if (parent_1 !== null) { + bone.parent = parent_1; + } + else { + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + if (bone.name in this._cacheBones) { + for (var _a = 0, _b = this._cacheBones[bone.name]; _a < _b.length; _a++) { + var child = _b[_a]; + child.parent = bone; + } + delete this._cacheBones[bone.name]; + } + armature.addBone(bone); + this._rawBones.push(bone); // Raw bone sort. + } + } + if (ObjectDataParser.IK in rawData) { + var rawIKS = rawData[ObjectDataParser.IK]; + for (var _c = 0, rawIKS_1 = rawIKS; _c < rawIKS_1.length; _c++) { + var rawIK = rawIKS_1[_c]; + this._parseIKConstraint(rawIK); + } + } + armature.sortBones(); + if (ObjectDataParser.SLOT in rawData) { + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _d = 0, rawSlots_1 = rawSlots; _d < rawSlots_1.length; _d++) { + var rawSlot = rawSlots_1[_d]; + armature.addSlot(this._parseSlot(rawSlot)); + } + } + if (ObjectDataParser.SKIN in rawData) { + var rawSkins = rawData[ObjectDataParser.SKIN]; + for (var _e = 0, rawSkins_1 = rawSkins; _e < rawSkins_1.length; _e++) { + var rawSkin = rawSkins_1[_e]; + armature.addSkin(this._parseSkin(rawSkin)); + } + } + if (ObjectDataParser.ANIMATION in rawData) { + var rawAnimations = rawData[ObjectDataParser.ANIMATION]; + for (var _f = 0, rawAnimations_1 = rawAnimations; _f < rawAnimations_1.length; _f++) { + var rawAnimation = rawAnimations_1[_f]; + var animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, 0 /* Play */, null, null); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, 0 /* Play */, null, null); + } + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? armature.defaultActions.size() : armature.defaultActions.length); ++i) { + var action = dragonBones.DragonBones.webAssembly ? armature.defaultActions.get(i) : armature.defaultActions[i]; + if (action.type === 0 /* Play */) { + var animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + // Clear helper. + this._rawBones.length = 0; + this._armature = null; + for (var k in this._meshs) { + delete this._meshs[k]; + } + for (var k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (var k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (var k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (var k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (var k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + return armature; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBone = function (rawData) { + // const bone = BaseObject.borrowObject(BoneData); + var bone = dragonBones.DragonBones.webAssembly ? new Module["BoneData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + } + return bone; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseIKConstraint = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + var target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + // const constraint = BaseObject.borrowObject(IKConstraintData); + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraintData"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + var chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (dragonBones.DragonBones.webAssembly) { + bone.constraints.push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlot = function (rawData) { + // const slot = BaseObject.borrowObject(SlotData); + var slot = dragonBones.DragonBones.webAssembly ? new Module["SlotData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = dragonBones.DragonBones.webAssembly ? this._armature.sortedSlots.size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")); // + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */); + } + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].createColor() : dragonBones.SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : dragonBones.SlotData.DEFAULT_COLOR; + } + if (ObjectDataParser.ACTIONS in rawData) { + var actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, 0 /* Play */, null, null); + } + return slot; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSkin = function (rawData) { + // const skin = BaseObject.borrowObject(SkinData); + var skin = dragonBones.DragonBones.webAssembly ? new Module["SkinData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _i = 0, rawSlots_2 = rawSlots; _i < rawSlots_2.length; _i++) { + var rawSlot = rawSlots_2[_i]; + var slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + if (ObjectDataParser.DISPLAY in rawSlot) { + var rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (var _a = 0, rawDisplays_1 = rawDisplays; _a < rawDisplays_1.length; _a++) { + var rawDisplay = rawDisplays_1[_a]; + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + this._slot = null; // + } + } + this._skin = null; // + } + return skin; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseDisplay = function (rawData) { + var display = null; + var name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + var path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + var type = 0 /* Image */; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + switch (type) { + case 0 /* Image */: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + var imageDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ImageDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + case 1 /* Armature */: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + var armatureDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, 0 /* Play */, null, null); + } + else if (this._slot.name in this._slotChildActions) { + var displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (var _i = 0, _a = this._slotChildActions[this._slot.name]; _i < _a.length; _i++) { + var action = _a[_i]; + if (dragonBones.DragonBones.webAssembly) { + armatureDisplay.actions.push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + delete this._slotChildActions[this._slot.name]; + } + } + break; + case 2 /* Mesh */: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + var meshDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["MeshDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + var shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + var shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + case 3 /* BoundingBox */: + var boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + var boundingBoxDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + return display; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePivot = function (rawData, display) { + if (ObjectDataParser.PIVOT in rawData) { + var rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseMesh = function (rawData, mesh) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var rawUVs = rawData[ObjectDataParser.UVS]; + var rawTriangles = rawData[ObjectDataParser.TRIANGLES]; + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + var vertexCount = Math.floor(rawVertices.length / 2); // uint + var triangleCount = Math.floor(rawTriangles.length / 3); // uint + var vertexOffset = floatArray.length; + var uvOffset = vertexOffset + vertexCount * 2; + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + 0 /* MeshVertexCount */] = vertexCount; + intArray[mesh.offset + 1 /* MeshTriangleCount */] = triangleCount; + intArray[mesh.offset + 2 /* MeshFloatOffset */] = vertexOffset; + for (var i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + 4 /* MeshVertexIndices */ + i] = rawTriangles[i]; + } + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + if (ObjectDataParser.WEIGHTS in rawData) { + var rawWeights = rawData[ObjectDataParser.WEIGHTS]; + var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE]; + var rawBonePoses = rawData[ObjectDataParser.BONE_POSE]; + var weightBoneIndices = new Array(); + var weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + var floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + 1 /* WeigthFloatOffset */] = floatOffset; + for (var i = 0; i < weightBoneCount; ++i) { + var rawBoneIndex = rawBonePoses[i * 7]; // uint + var bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + if (dragonBones.DragonBones.webAssembly) { + for (var j = 0; j < this._armature.sortedBones.size(); j++) { + if (this._armature.sortedBones.get(j) === bone) { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = j; + } + } + } + else { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = this._armature.sortedBones.indexOf(bone); + } + } + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + for (var i = 0, iW = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + var iD = i * 2; + var vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + var x = floatArray[vertexOffset + iD]; + var y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var rawBoneIndex = rawWeights[iW++]; // uint + var bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + mesh.weight = weight; + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoundingBox = function (rawData) { + var boundingBox = null; + var type = 0 /* Rectangle */; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + switch (type) { + case 0 /* Rectangle */: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.RectangleBoundingBoxData); + break; + case 1 /* Ellipse */: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.EllipseBoundingBoxData); + break; + case 2 /* Polygon */: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === 0 /* Rectangle */ || boundingBox.type === 1 /* Ellipse */) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + return boundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + for (var i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + var iN = i + 1; + var x = rawVertices[i]; + var y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + return polygonBoundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (dragonBones.DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + this._animation = animation; + if (ObjectDataParser.FRAME in rawData) { + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (var i = 0, frameStart = 0; i < keyFrameCount; ++i) { + var rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], 1 /* ZOrder */, false, false, 0, this._parseZOrderFrame); + } + if (ObjectDataParser.BONE in rawData) { + var rawTimelines = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawTimelines_1 = rawTimelines; _i < rawTimelines_1.length; _i++) { + var rawTimeline = rawTimelines_1[_i]; + this._parseBoneTimeline(rawTimeline); + } + } + if (ObjectDataParser.SLOT in rawData) { + var rawTimelines = rawData[ObjectDataParser.SLOT]; + for (var _a = 0, rawTimelines_2 = rawTimelines; _a < rawTimelines_2.length; _a++) { + var rawTimeline = rawTimelines_2[_a]; + this._parseSlotTimeline(rawTimeline); + } + } + if (ObjectDataParser.FFD in rawData) { + var rawTimelines = rawData[ObjectDataParser.FFD]; + for (var _b = 0, rawTimelines_3 = rawTimelines; _b < rawTimelines_3.length; _b++) { + var rawTimeline = rawTimelines_3[_b]; + var slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + var displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + this._slot = slot; + this._mesh = this._meshs[displayName]; + var timelineFFD = this._parseTimeline(rawTimeline, 22 /* SlotFFD */, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + this._slot = null; // + this._mesh = null; // + } + } + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + var timeline = this._animation.actionTimeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var keyFrameCount = this._actionFrames.length; + timeline.type = 0 /* Action */; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = 100; + timelineArray[timeline.offset + 1 /* TimelineOffset */] = 0; + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = 0; + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + this._actionFrames.length = 0; + } + this._animation = null; // + return animation; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTimeline = function (rawData, type, addIntOffset, addFloatOffset, frameValueCount, frameParser) { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntArrayLength = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + var frameFloatArrayLength = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + var timeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + 1 /* TimelineOffset */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + } + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + var frameIndices = this._data.frameIndices; + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneTimeline = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + var timeline = this._parseTimeline(rawData, 10 /* BoneAll */, false, true, 6, this._parseBoneFrame); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + this._bone = null; // + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotTimeline = function (rawData) { + var slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + this._slot = slot; + var displayIndexTimeline = this._parseTimeline(rawData, 20 /* SlotDisplay */, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + var colorTimeline = this._parseTimeline(rawData, 21 /* SlotColor */, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseFrame = function (rawData, frameStart, frameCount, frameArray) { + rawData; + frameCount; + var frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + 0 /* FramePosition */] = frameStart; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTweenFrame = function (rawData, frameStart, frameCount, frameArray) { + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + var sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + 1 /* FrameTweenType */] = 2 /* Curve */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = sampleCount; + for (var i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + 3 /* FrameCurveSamples */ + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + var noTween = -2.0; + var tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 1 /* Line */; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 3 /* QuadIn */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 4 /* QuadOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 5 /* QuadInOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (ObjectDataParser.Z_ORDER in rawData) { + var rawZOrder = rawData[ObjectDataParser.Z_ORDER]; + if (rawZOrder.length > 0) { + var slotCount = this._armature.sortedSlots.length; + var unchanged = new Array(slotCount - rawZOrder.length / 2); + var zOrders = new Array(slotCount); + for (var i_1 = 0; i_1 < slotCount; ++i_1) { + zOrders[i_1] = -1; + } + var originalIndex = 0; + var unchangedIndex = 0; + for (var i_2 = 0, l = rawZOrder.length; i_2 < l; i_2 += 2) { + var slotIndex = rawZOrder[i_2]; + var zOrderOffset = rawZOrder[i_2 + 1]; + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + var i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + return frameOffset; + } + } + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) { + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + // Modify rotation. + var rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + dragonBones.Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + rotation = this._prevRotation + rotation - this._prevRotation + dragonBones.Transform.PI_D * this._prevTweenRotate; + } + } + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + var frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotDisplayIndexFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotColorFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + var rawColor = rawData[ObjectDataParser.COLOR]; + for (var k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + colorOffset = this._defalultColorOffset; + } + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotFFDFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameFloatOffset = frameFloatArray.length; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] : null; + var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + var vertexCount = intArray[this._mesh.offset + 0 /* MeshVertexCount */]; + var x = 0.0; + var y = 0.0; + var iB = 0; + var iV = 0; + if (this._mesh.weight !== null) { + var rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + 2 /* WeigthBoneIndices */ + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + for (var i = 0; i < vertexCount * 2; i += 2) { + if (rawVertices === null) { + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + if (this._mesh.weight !== null) { + var rawBonePoses = this._weightBonePoses[this._mesh.name]; + var weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + var vertexBoneCount = intArray[iB++]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._mesh.weight.bones[boneIndex]; + var rawBoneIndex = this._rawBones.indexOf(bone); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + if (frameStart === 0) { + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */] = this._mesh.offset; + frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */] = 0; + frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] = frameFloatOffset; + timelineArray[this._timeline.offset + 3 /* TimelineFrameValueCount */] = frameIntOffset - this._animation.frameIntOffset; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseActionData = function (rawData, actions, type, bone, slot) { + var actionCount = 0; + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (var _i = 0, rawData_1 = rawData; _i < rawData_1.length; _i++) { + var rawAction = rawData_1[_i]; + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = 0 /* Play */; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + if (ObjectDataParser.BONE in rawAction) { + var boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + if (ObjectDataParser.SLOT in rawAction) { + var slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawInts = rawAction[ObjectDataParser.INTS]; + for (var _a = 0, rawInts_1 = rawInts; _a < rawInts_1.length; _a++) { + var rawValue = rawInts_1[_a]; + dragonBones.DragonBones.webAssembly ? action.data.ints.push_back(rawValue) : action.data.ints.push(rawValue); + } + } + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawFloats = rawAction[ObjectDataParser.FLOATS]; + for (var _b = 0, rawFloats_1 = rawFloats; _b < rawFloats_1.length; _b++) { + var rawValue = rawFloats_1[_b]; + dragonBones.DragonBones.webAssembly ? action.data.floats.push_back(rawValue) : action.data.floats.push(rawValue); + } + } + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawStrings = rawAction[ObjectDataParser.STRINGS]; + for (var _c = 0, rawStrings_1 = rawStrings; _c < rawStrings_1.length; _c++) { + var rawValue = rawStrings_1[_c]; + dragonBones.DragonBones.webAssembly ? action.data.strings.push_back(rawValue) : action.data.strings.push(rawValue); + } + } + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + } + return actionCount; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTransform = function (rawData, transform, scale) { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * dragonBones.Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.Transform.DEG_RAD) - transform.rotation; + } + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseColorTransform = function (rawData, color) { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArray = function (rawData) { + rawData; + if (dragonBones.DragonBones.webAssembly) { + return; + } + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseWASMArray = function () { + var intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (var i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (var i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (var i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (var i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (var i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (var i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined); + var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) { + // const data = BaseObject.borrowObject(DragonBonesData); + var data = dragonBones.DragonBones.webAssembly ? new Module["DragonBonesData"]() : dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + if (data.frameRate === 0) { + data.frameRate = 24; + } + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + this._parseArray(rawData); + var rawArmatures = rawData[ObjectDataParser.ARMATURE]; + for (var _i = 0, rawArmatures_1 = rawArmatures; _i < rawArmatures_1.length; _i++) { + var rawArmature = rawArmatures_1[_i]; + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + this._data = null; + } + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + return null; + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) { + if (scale === void 0) { scale = 0.0; } + console.assert(rawData !== undefined); + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + var rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + return true; + } + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + if (scale > 0.0) { + textureAtlasData.scale = scale; + } + else { + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + scale = 1.0 / scale; // + if (ObjectDataParser.SUB_TEXTURE in rawData) { + var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE]; + for (var i = 0, l = rawTextures.length; i < l; ++i) { + var rawTexture = rawTextures[i]; + var textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = dragonBones.DragonBones.webAssembly ? Module["TextureData"].createRectangle() : dragonBones.TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + textureAtlasData.addTexture(textureData); + } + } + return true; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + ObjectDataParser.getInstance = function () { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + return ObjectDataParser._objectDataParserInstance; + }; + /** + * @private + */ + ObjectDataParser._objectDataParserInstance = null; + return ObjectDataParser; + }(dragonBones.DataParser)); + dragonBones.ObjectDataParser = ObjectDataParser; + var ActionFrame = (function () { + function ActionFrame() { + this.frameStart = 0; + this.actions = []; + } + return ActionFrame; + }()); +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BinaryDataParser = (function (_super) { + __extends(BinaryDataParser, _super); + function BinaryDataParser() { + return _super !== null && _super.apply(this, arguments) || this; + } + BinaryDataParser.prototype._inRange = function (a, min, max) { + return min <= a && a <= max; + }; + BinaryDataParser.prototype._decodeUTF8 = function (data) { + var EOF_byte = -1; + var EOF_code_point = -1; + var FATAL_POINT = 0xFFFD; + var pos = 0; + var result = ""; + var code_point; + var utf8_code_point = 0; + var utf8_bytes_needed = 0; + var utf8_bytes_seen = 0; + var utf8_lower_boundary = 0; + while (data.length > pos) { + var _byte = data[pos++]; + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + var cp = utf8_code_point; + var lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) + result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + return result; + }; + BinaryDataParser.prototype._getUTF16Key = function (value) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + return value; + }; + BinaryDataParser.prototype._parseBinaryTimeline = function (type, offset, timelineData) { + if (timelineData === void 0) { timelineData = null; } + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + var timeline = timelineData !== null ? timelineData : (dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData)); + timeline.type = type; + timeline.offset = offset; + this._timeline = timeline; + var keyFrameCount = this._timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK + 1]] - frameStart; + } + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseMesh = function (rawData, mesh) { + mesh.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + var weightOffset = this._intArray[mesh.offset + 3 /* MeshWeightOffset */]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + var vertexCount = this._intArray[mesh.offset + 0 /* MeshVertexCount */]; + var boneCount = this._intArray[weightOffset + 0 /* WeigthBoneCount */]; + weight.offset = weightOffset; + if (dragonBones.DragonBones.webAssembly) { + weight.bones.resize(boneCount, null); + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones.set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + var boneIndicesOffset = weightOffset + 2 /* WeigthBoneIndices */ + boneCount; + for (var i = 0, l = vertexCount; i < l; ++i) { + var vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + mesh.weight = weight; + } + }; + /** + * @private + */ + BinaryDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + return polygonBoundingBox; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.DURATION, 1), 1); + animation.playTimes = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.SCALE, 1.0); + animation.name = dragonBones.ObjectDataParser._getString(rawData, dragonBones.ObjectDataParser.NAME, dragonBones.ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = dragonBones.ObjectDataParser.DEFAULT_NAME; + } + // Offsets. + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + this._animation = animation; + if (dragonBones.ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(0 /* Action */, rawData[dragonBones.ObjectDataParser.ACTION]); + } + if (dragonBones.ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(1 /* ZOrder */, rawData[dragonBones.ObjectDataParser.Z_ORDER]); + } + if (dragonBones.ObjectDataParser.BONE in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.BONE]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + if (dragonBones.ObjectDataParser.SLOT in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.SLOT]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + this._animation = null; + return animation; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseArray = function (rawData) { + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + if (dragonBones.DragonBones.webAssembly) { + var tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + var tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + var tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + var tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + var intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + var floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + var frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + var frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + var frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + var timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + for (var i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + for (var i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + for (var i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + for (var i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + for (var i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + for (var i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + }; + /** + * @inheritDoc + */ + BinaryDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + var tag = new Uint8Array(rawData, 0, 8); + if (tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0)) { + console.assert(false, "Nonsupport data."); + return null; + } + var headerLength = new Uint32Array(rawData, 8, 1)[0]; + var headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + var headerString = this._decodeUTF8(headerBytes); + var header = JSON.parse(headerString); + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + return _super.prototype.parseDragonBonesData.call(this, header, scale); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + BinaryDataParser.getInstance = function () { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + return BinaryDataParser._binaryDataParserInstance; + }; + /** + * @private + */ + BinaryDataParser._binaryDataParserInstance = null; + return BinaryDataParser; + }(dragonBones.ObjectDataParser)); + dragonBones.BinaryDataParser = BinaryDataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BuildArmaturePackage = (function () { + function BuildArmaturePackage() { + this.dataName = ""; + this.textureAtlasName = ""; + this.skin = null; + } + return BuildArmaturePackage; + }()); + dragonBones.BuildArmaturePackage = BuildArmaturePackage; + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var BaseFactory = (function () { + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + function BaseFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + this.autoSearch = false; + /** + * @private + */ + this._dragonBonesDataMap = {}; + /** + * @private + */ + this._textureAtlasDataMap = {}; + /** + * @private + */ + this._dragonBones = null; + /** + * @private + */ + this._dataParser = null; + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new dragonBones.ObjectDataParser(); + } + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new dragonBones.BinaryDataParser(); + } + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + BaseFactory.prototype._isSupportMesh = function () { + return true; + }; + /** + * @private + */ + BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) { + if (textureAtlasName in this._textureAtlasDataMap) { + for (var _i = 0, _a = this._textureAtlasDataMap[textureAtlasName]; _i < _a.length; _i++) { + var textureAtlasData = _a[_i]; + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + if (this.autoSearch) { + for (var k in this._textureAtlasDataMap) { + for (var _b = 0, _c = this._textureAtlasDataMap[k]; _b < _c.length; _b++) { + var textureAtlasData = _c[_b]; + if (textureAtlasData.autoSearch) { + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + return null; + }; + /** + * @private + */ + BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) { + var dragonBonesData = null; + var armatureData = null; + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { + for (var k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (var k in this._dragonBonesDataMap) { + var skinDragonBonesData = this._dragonBonesDataMap[k]; + var skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + return true; + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype._buildBones = function (dataPackage, armature) { + var bones = dataPackage.armature.sortedBones; + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? bones.size() : bones.length); ++i) { + var boneData = dragonBones.DragonBones.webAssembly ? bones.get(i) : bones[i]; + var bone = dragonBones.DragonBones.webAssembly ? new Module["Bone"]() : dragonBones.BaseObject.borrowObject(dragonBones.Bone); + bone.init(boneData); + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + var constraints = boneData.constraints; + for (var j = 0; j < (dragonBones.DragonBones.webAssembly ? constraints.size() : constraints.length); ++j) { + var constraintData = dragonBones.DragonBones.webAssembly ? constraints.get(j) : constraints[j]; + var target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + // TODO more constraint type. + var ikConstraintData = constraintData; + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraint"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraint); + var root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + }; + /** + * @private + */ + BaseFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var skinSlots = {}; + for (var k in defaultSkin.displays) { + var displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + if (currentSkin !== defaultSkin) { + for (var k in currentSkin.displays) { + var displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + for (var _i = 0, _a = dataPackage.armature.sortedSlots; _i < _a.length; _i++) { + var slotData = _a[_i]; + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Array(); + for (var _b = 0, displays_1 = displays; _b < displays_1.length; _b++) { + var displayData = displays_1[_b]; + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + BaseFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_2 = actions; _i < actions_2.length; _i++) { + var action = actions_2[_i]; + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * @private + */ + BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + for (var i = 0, l = displayList.length; i < l; ++i) { + if (!displayList[i]) { + displayList[i] = null; + } + } + } + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.displayList = displayList; + }; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 1.0; } + var dragonBonesData = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + while (true) { + var textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + return dragonBonesData; + }; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + var textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + return textureAtlasData; + }; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.updateTextureAtlasData = function (name, textureAtlases) { + var textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (var i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + }; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getDragonBonesData = function (name) { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + }; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addDragonBonesData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + this._dragonBonesDataMap[name] = data; + }; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + delete this._dragonBonesDataMap[name]; + } + }; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getTextureAtlasData = function (name) { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + }; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addTextureAtlasData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + var textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + }; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._textureAtlasDataMap) { + var textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (var _i = 0, textureAtlasDataList_1 = textureAtlasDataList; _i < textureAtlasDataList_1.length; _i++) { + var textureAtlasData = textureAtlasDataList_1[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[name]; + } + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.getArmatureData = function (name, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = ""; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + return dataPackage.armature; + }; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.clear = function (disposeData) { + if (disposeData === void 0) { disposeData = true; } + for (var k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + delete this._dragonBonesDataMap[k]; + } + for (var k in this._textureAtlasDataMap) { + if (disposeData) { + var textureAtlasDataList = this._textureAtlasDataMap[k]; + for (var _i = 0, textureAtlasDataList_2 = textureAtlasDataList; _i < textureAtlasDataList_2.length; _i++) { + var textureAtlasData = textureAtlasDataList_2[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[k]; + } + }; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + var armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + return armature; + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + for (var _i = 0, displays_2 = displays; _i < displays_2.length; _i++) { + var display = displays_2[_i]; + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) { + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + var displayIndex = 0; + for (var _i = 0, displays_3 = displays; _i < displays_3.length; _i++) { + var displayData = displays_3[_i]; + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + }; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + for (var _i = 0, _a = armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays[slot.name]; + var displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (var i = 0, l = displays.length; i < l; ++i) { + var displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + slot.displayList = displayList; + } + }; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) { + if (fromSkinName === void 0) { fromSkinName = null; } + if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; } + if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; } + var dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + var fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + var animations = {}; + for (var animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + for (var animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + toArmature.animation.animations = animations; + } + if (dataPackage.skin) { + var slots = toArmature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var toSlot = slots[i]; + var toSlotDisplayList = toSlot.displayList; + for (var j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + var toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof dragonBones.Armature) { + var displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + var fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === 1 /* Armature */) { + this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + return true; + } + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype.getAllDragonBonesData = function () { + return this._dragonBonesDataMap; + }; + /** + * @private + */ + BaseFactory.prototype.getAllTextureAtlasData = function () { + return this._textureAtlasDataMap; + }; + /** + * @private + */ + BaseFactory._objectParser = null; + /** + * @private + */ + BaseFactory._binaryParser = null; + return BaseFactory; + }()); + dragonBones.BaseFactory = BaseFactory; +})(dragonBones || (dragonBones = {})); diff --git a/reference/DragonBones/out/dragonBones.min.js b/reference/DragonBones/out/dragonBones.min.js new file mode 100644 index 0000000..1261237 --- /dev/null +++ b/reference/DragonBones/out/dragonBones.min.js @@ -0,0 +1 @@ +"use strict";var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)if(e.hasOwnProperty(i))t[i]=e[i]};return function(e,i){t(e,i);function a(){this.constructor=e}e.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)}}();var dragonBones;(function(t){var e=function(){function e(e){this._clock=new t.WorldClock;this._events=[];this._objects=[];this._eventManager=null;this._eventManager=e}e.prototype.advanceTime=function(e){if(this._objects.length>0){for(var i=0,a=this._objects;i0){for(var n=0;ni){r.length=i}t._maxCountMap[a]=i}else{t._defaultMaxCount=i;for(var a in t._poolsMap){if(a in t._maxCountMap){continue}var r=t._poolsMap[a];if(r.length>i){r.length=i}t._maxCountMap[a]=i}}};t.clearPool=function(e){if(e===void 0){e=null}if(e!==null){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){a.length=0}}else{for(var r in t._poolsMap){var a=t._poolsMap[r];a.length=0}}};t.borrowObject=function(e){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){var r=a.pop();r._isInPool=false;return r}var n=new e;n._onClear();return n};t.prototype.returnToPool=function(){this._onClear();t._returnObject(this)};t._hashCode=0;t._defaultMaxCount=1e3;t._maxCountMap={};t._poolsMap={};return t}();t.BaseObject=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=1}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}this.a=t;this.b=e;this.c=i;this.d=a;this.tx=r;this.ty=n}t.prototype.toString=function(){return"[object dragonBones.Matrix] a:"+this.a+" b:"+this.b+" c:"+this.c+" d:"+this.d+" tx:"+this.tx+" ty:"+this.ty};t.prototype.copyFrom=function(t){this.a=t.a;this.b=t.b;this.c=t.c;this.d=t.d;this.tx=t.tx;this.ty=t.ty;return this};t.prototype.copyFromArray=function(t,e){if(e===void 0){e=0}this.a=t[e];this.b=t[e+1];this.c=t[e+2];this.d=t[e+3];this.tx=t[e+4];this.ty=t[e+5];return this};t.prototype.identity=function(){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this};t.prototype.concat=function(t){var e=this.a*t.a;var i=0;var a=0;var r=this.d*t.d;var n=this.tx*t.a+t.tx;var s=this.ty*t.d+t.ty;if(this.b!==0||this.c!==0){e+=this.b*t.c;i+=this.b*t.d;a+=this.c*t.a;r+=this.c*t.b}if(t.b!==0||t.c!==0){i+=this.a*t.b;a+=this.d*t.c;n+=this.ty*t.c;s+=this.tx*t.b}this.a=e;this.b=i;this.c=a;this.d=r;this.tx=n;this.ty=s;return this};t.prototype.invert=function(){var t=this.a;var e=this.b;var i=this.c;var a=this.d;var r=this.tx;var n=this.ty;if(e===0&&i===0){this.b=this.c=0;if(t===0||a===0){this.a=this.b=this.tx=this.ty=0}else{t=this.a=1/t;a=this.d=1/a;this.tx=-t*r;this.ty=-a*n}return this}var s=t*a-e*i;if(s===0){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this}s=1/s;var o=this.a=a*s;e=this.b=-e*s;i=this.c=-i*s;a=this.d=t*s;this.tx=-(o*r+i*n);this.ty=-(e*r+a*n);return this};t.prototype.transformPoint=function(t,e,i,a){if(a===void 0){a=false}i.x=this.a*t+this.c*e;i.y=this.b*t+this.d*e;if(!a){i.x+=this.tx;i.y+=this.ty}};return t}();t.Matrix=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}if(r===void 0){r=1}if(n===void 0){n=1}this.x=t;this.y=e;this.skew=i;this.rotation=a;this.scaleX=r;this.scaleY=n}t.normalizeRadian=function(t){t=(t+Math.PI)%(Math.PI*2);t+=t>0?-Math.PI:Math.PI;return t};t.prototype.toString=function(){return"[object dragonBones.Transform] x:"+this.x+" y:"+this.y+" skewX:"+this.skew*180/Math.PI+" skewY:"+this.rotation*180/Math.PI+" scaleX:"+this.scaleX+" scaleY:"+this.scaleY};t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.skew=t.skew;this.rotation=t.rotation;this.scaleX=t.scaleX;this.scaleY=t.scaleY;return this};t.prototype.identity=function(){this.x=this.y=0;this.skew=this.rotation=0;this.scaleX=this.scaleY=1;return this};t.prototype.add=function(t){this.x+=t.x;this.y+=t.y;this.skew+=t.skew;this.rotation+=t.rotation;this.scaleX*=t.scaleX;this.scaleY*=t.scaleY;return this};t.prototype.minus=function(t){this.x-=t.x;this.y-=t.y;this.skew-=t.skew;this.rotation-=t.rotation;this.scaleX/=t.scaleX;this.scaleY/=t.scaleY;return this};t.prototype.fromMatrix=function(e){var i=this.scaleX,a=this.scaleY;var r=t.PI_Q;this.x=e.tx;this.y=e.ty;this.rotation=Math.atan(e.b/e.a);var n=Math.atan(-e.c/e.d);this.scaleX=this.rotation>-r&&this.rotation-r&&n=0&&this.scaleX<0){this.scaleX=-this.scaleX;this.rotation=this.rotation-Math.PI}if(a>=0&&this.scaleY<0){this.scaleY=-this.scaleY;n=n-Math.PI}this.skew=n-this.rotation;return this};t.prototype.toMatrix=function(t){if(this.skew!==0||this.rotation!==0){t.a=Math.cos(this.rotation);t.b=Math.sin(this.rotation);if(this.skew===0){t.c=-t.b;t.d=t.a}else{t.c=-Math.sin(this.skew+this.rotation);t.d=Math.cos(this.skew+this.rotation)}if(this.scaleX!==1){t.a*=this.scaleX;t.b*=this.scaleX}if(this.scaleY!==1){t.c*=this.scaleY;t.d*=this.scaleY}}else{t.a=this.scaleX;t.b=0;t.c=0;t.d=this.scaleY}t.tx=this.x;t.ty=this.y;return this};t.PI_D=Math.PI*2;t.PI_H=Math.PI/2;t.PI_Q=Math.PI/4;t.RAD_DEG=180/Math.PI;t.DEG_RAD=Math.PI/180;return t}();t.Transform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n,s,o){if(t===void 0){t=1}if(e===void 0){e=1}if(i===void 0){i=1}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}if(s===void 0){s=0}if(o===void 0){o=0}this.alphaMultiplier=t;this.redMultiplier=e;this.greenMultiplier=i;this.blueMultiplier=a;this.alphaOffset=r;this.redOffset=n;this.greenOffset=s;this.blueOffset=o}t.prototype.copyFrom=function(t){this.alphaMultiplier=t.alphaMultiplier;this.redMultiplier=t.redMultiplier;this.greenMultiplier=t.greenMultiplier;this.blueMultiplier=t.blueMultiplier;this.alphaOffset=t.alphaOffset;this.redOffset=t.redOffset;this.greenOffset=t.greenOffset;this.blueOffset=t.blueOffset};t.prototype.identity=function(){this.alphaMultiplier=this.redMultiplier=this.greenMultiplier=this.blueMultiplier=1;this.alphaOffset=this.redOffset=this.greenOffset=this.blueOffset=0};return t}();t.ColorTransform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e){if(t===void 0){t=0}if(e===void 0){e=0}this.x=t;this.y=e}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y};t.prototype.clear=function(){this.x=this.y=0};return t}();t.Point=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}this.x=t;this.y=e;this.width=i;this.height=a}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.width=t.width;this.height=t.height};t.prototype.clear=function(){this.x=this.y=0;this.width=this.height=0};return t}();t.Rectangle=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.ints=[];e.floats=[];e.strings=[];return e}e.toString=function(){return"[class dragonBones.UserData]"};e.prototype._onClear=function(){this.ints.length=0;this.floats.length=0;this.strings.length=0};e.prototype.getInt=function(t){if(t===void 0){t=0}return t>=0&&t=0&&t=0&&t=t){i=0}if(this.sortedBones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s0){return}this.cacheFrameRate=t;for(var e in this.animations){this.animations[e].cacheFrames(this.cacheFrameRate)}};i.prototype.setCacheFrame=function(t,e){var i=this.parent.cachedFrames;var a=i.length;i.length+=10;i[a]=t.a;i[a+1]=t.b;i[a+2]=t.c;i[a+3]=t.d;i[a+4]=t.tx;i[a+5]=t.ty;i[a+6]=e.rotation;i[a+7]=e.skew;i[a+8]=e.scaleX;i[a+9]=e.scaleY;return a};i.prototype.getCacheFrame=function(t,e,i){var a=this.parent.cachedFrames;t.a=a[i];t.b=a[i+1];t.c=a[i+2];t.d=a[i+3];t.tx=a[i+4];t.ty=a[i+5];e.rotation=a[i+6];e.skew=a[i+7];e.scaleX=a[i+8];e.scaleY=a[i+9];e.x=t.tx;e.y=t.ty};i.prototype.addBone=function(t){if(t.name in this.bones){console.warn("Replace bone: "+t.name);this.bones[t.name].returnToPool()}this.bones[t.name]=t;this.sortedBones.push(t)};i.prototype.addSlot=function(t){if(t.name in this.slots){console.warn("Replace slot: "+t.name);this.slots[t.name].returnToPool()}this.slots[t.name]=t;this.sortedSlots.push(t)};i.prototype.addSkin=function(t){if(t.name in this.skins){console.warn("Replace skin: "+t.name);this.skins[t.name].returnToPool()}this.skins[t.name]=t;if(this.defaultSkin===null){this.defaultSkin=t}};i.prototype.addAnimation=function(t){if(t.name in this.animations){console.warn("Replace animation: "+t.name);this.animations[t.name].returnToPool()}t.parent=this;this.animations[t.name]=t;this.animationNames.push(t.name);if(this.defaultAnimation===null){this.defaultAnimation=t}};i.prototype.getBone=function(t){return t in this.bones?this.bones[t]:null};i.prototype.getSlot=function(t){return t in this.slots?this.slots[t]:null};i.prototype.getSkin=function(t){return t in this.skins?this.skins[t]:null};i.prototype.getAnimation=function(t){return t in this.animations?this.animations[t]:null};return i}(t.BaseObject);t.ArmatureData=i;var a=function(e){__extends(i,e);function i(){var i=e!==null&&e.apply(this,arguments)||this;i.transform=new t.Transform;i.constraints=[];i.userData=null;return i}i.toString=function(){return"[class dragonBones.BoneData]"};i.prototype._onClear=function(){for(var t=0,e=this.constraints;tr){s|=2}if(en){s|=8}return s};e.rectangleIntersectsSegment=function(t,i,a,r,n,s,o,l,h,f,u){if(h===void 0){h=null}if(f===void 0){f=null}if(u===void 0){u=null}var _=t>n&&ts&&in&&as&&r=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){return true}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=this.width*.5;var h=this.height*.5;var f=e.rectangleIntersectsSegment(t,i,a,r,-l,-h,l,h,n,s,o);return f};return e}(e);t.RectangleBoundingBoxData=i;var a=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.EllipseData]"};e.ellipseIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h,f){if(l===void 0){l=null}if(h===void 0){h=null}if(f===void 0){f=null}var u=s/o;var _=u*u;e*=u;a*=u;var m=i-t;var c=a-e;var p=Math.sqrt(m*m+c*c);var d=m/p;var y=c/p;var g=(r-t)*d+(n-e)*y;var v=g*g;var b=t*t+e*e;var D=s*s;var T=D-b+v;var A=0;if(T>=0){var O=Math.sqrt(T);var B=g-O;var S=g+O;var x=B<0?-1:B<=p?0:1;var M=S<0?-1:S<=p?0:1;var w=x*M;if(w<0){return-1}else if(w===0){if(x===-1){A=2;i=t+S*d;a=(e+S*y)/u;if(l!==null){l.x=i;l.y=a}if(h!==null){h.x=i;h.y=a}if(f!==null){f.x=Math.atan2(a/D*_,i/D);f.y=f.x+Math.PI}}else if(M===1){A=1;t=t+B*d;e=(e+B*y)/u;if(l!==null){l.x=t;l.y=e}if(h!==null){h.x=t;h.y=e}if(f!==null){f.x=Math.atan2(e/D*_,t/D);f.y=f.x+Math.PI}}else{A=3;if(l!==null){l.x=t+B*d;l.y=(e+B*y)/u;if(f!==null){f.x=Math.atan2(l.y/D*_,l.x/D)}}if(h!==null){h.x=t+S*d;h.y=(e+S*y)/u;if(f!==null){f.y=Math.atan2(h.y/D*_,h.x/D)}}}}}return A};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.type=1};e.prototype.containsPoint=function(t,e){var i=this.width*.5;if(t>=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){e*=i/a;return Math.sqrt(t*t+e*e)<=i}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=e.ellipseIntersectsSegment(t,i,a,r,0,0,this.width*.5,this.height*.5,n,s,o);return l};return e}(e);t.EllipseBoundingBoxData=a;var r=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.weight=null;return e}e.toString=function(){return"[class dragonBones.PolygonBoundingBoxData]"};e.polygonIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h){if(o===void 0){o=null}if(l===void 0){l=null}if(h===void 0){h=null}if(t===i){t=i+1e-6}if(e===a){e=a+1e-6}var f=t-i;var u=e-a;var _=t*a-e*i;var m=0;var c=r[n+s-2];var p=r[n+s-1];var d=0;var y=0;var g=0;var v=0;var b=0;var D=0;for(var T=0;T=c&&w<=A||w>=A&&w<=c)&&(f===0||w>=t&&w<=i||w>=i&&w<=t)){var E=(_*S-u*x)/M;if((E>=p&&E<=O||E>=O&&E<=p)&&(u===0||E>=e&&E<=a||E>=a&&E<=e)){if(l!==null){var P=w-t;if(P<0){P=-P}if(m===0){d=P;y=P;g=w;v=E;b=w;D=E;if(h!==null){h.x=Math.atan2(O-p,A-c)-Math.PI*.5;h.y=h.x}}else{if(Py){y=P;b=w;D=E;if(h!==null){h.y=Math.atan2(O-p,A-c)-Math.PI*.5}}}m++}else{g=w;v=E;b=w;D=E;m++;if(h!==null){h.x=Math.atan2(O-p,A-c)-Math.PI*.5;h.y=h.x}break}}}c=A;p=O}if(m===1){if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=g;l.y=v}if(h!==null){h.y=h.x+Math.PI}}else if(m>1){m++;if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=b;l.y=D}}return m};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.weight!==null){this.weight.returnToPool()}this.type=2;this.count=0;this.offset=0;this.x=0;this.y=0;this.vertices=null;this.weight=null};e.prototype.containsPoint=function(t,e){var i=false;if(t>=this.x&&t<=this.width&&e>=this.y&&e<=this.height){for(var a=0,r=this.count,n=r-2;a=e||s=e){var l=this.vertices[this.offset+n];var h=this.vertices[this.offset+a];if((e-o)*(l-h)/(s-o)+h0){return}this.cacheFrameRate=Math.max(Math.ceil(t*this.scale),1);var e=Math.ceil(this.cacheFrameRate*this.duration)+1;this.cachedFrames.length=e;for(var i=0,a=this.cacheFrames.length;i=0};e.prototype.addBoneMask=function(t,e,i){if(i===void 0){i=true}var a=t.getBone(e);if(a===null){return}if(this.boneMask.indexOf(e)<0){this.boneMask.push(e)}if(i){for(var r=0,n=t.getBones();r=0){this.boneMask.splice(a,1)}if(i){var r=t.getBone(e);if(r!==null){if(this.boneMask.length>0){for(var n=0,s=t.getBones();n=0&&r.contains(o)){this.boneMask.splice(l,1)}}}else{for(var h=0,f=t.getBones();he._zOrder?1:-1};i.prototype._onClear=function(){if(this._clock!==null){this._clock.remove(this)}for(var t=0,e=this._bones;t=t){i=0}if(this._bones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s=n){continue}var o=i[s];var l=this.getSlot(o.name);if(l!==null){l._setZorder(r)}}this._slotsDirty=true;this._zOrderDirty=!a}};i.prototype._addBoneToBoneList=function(t){if(this._bones.indexOf(t)<0){this._bonesDirty=true;this._bones.push(t);this._animation._timelineDirty=true}};i.prototype._removeBoneFromBoneList=function(t){var e=this._bones.indexOf(t);if(e>=0){this._bones.splice(e,1);this._animation._timelineDirty=true}};i.prototype._addSlotToSlotList=function(t){if(this._slots.indexOf(t)<0){this._slotsDirty=true;this._slots.push(t);this._animation._timelineDirty=true}};i.prototype._removeSlotFromSlotList=function(t){var e=this._slots.indexOf(t);if(e>=0){this._slots.splice(e,1);this._animation._timelineDirty=true}};i.prototype._bufferAction=function(t,e){if(this._actions.indexOf(t)<0){if(e){this._actions.push(t)}else{this._actions.unshift(t)}}};i.prototype.dispose=function(){if(this.armatureData!==null){this._lockUpdate=true;this._dragonBones.bufferObject(this)}};i.prototype.init=function(e,i,a,r){if(this.armatureData!==null){return}this.armatureData=e;this._animation=t.BaseObject.borrowObject(t.Animation);this._proxy=i;this._display=a;this._dragonBones=r;this._proxy.init(this);this._animation.init(this);this._animation.animations=this.armatureData.animations};i.prototype.advanceTime=function(e){if(this._lockUpdate){return}if(this.armatureData===null){console.assert(false,"The armature has been disposed.");return}else if(this.armatureData.parent===null){console.assert(false,"The armature data has been disposed.");return}var i=this._cacheFrameIndex;this._animation.advanceTime(e);if(this._bonesDirty){this._bonesDirty=false;this._sortBones()}if(this._slotsDirty){this._slotsDirty=false;this._sortSlots()}if(this._cacheFrameIndex<0||this._cacheFrameIndex!==i){var a=0,r=0;for(a=0,r=this._bones.length;a0){this._lockUpdate=true;for(var n=0,s=this._actions;n0){var i=this.getBone(t);if(i!==null){i.invalidUpdate();if(e){for(var a=0,r=this._slots;a0){if(r!==null||n!==null){if(r!==null){var T=o?r.y-e:r.x-t;if(T<0){T=-T}if(d===null||Th){h=T;_=n.x;m=n.y;y=b;if(s!==null){p=s.y}}}}else{d=b;break}}}if(d!==null&&r!==null){r.x=f;r.y=u;if(s!==null){s.x=c}}if(y!==null&&n!==null){n.x=_;n.y=m;if(s!==null){s.y=p}}return d};i.prototype.getBone=function(t){for(var e=0,i=this._bones;e=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else{if(this.constraints.length>0){for(var i=0,a=this.constraints;i=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}}else{if(this.constraints.length>0){for(var n=0,s=this.constraints;n=0;if(this._localDirty){this._updateGlobalTransformMatrix(o)}if(o&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}}else if(this._childrenTransformDirty){this._childrenTransformDirty=false}this._localDirty=true};i.prototype.updateByConstraint=function(){if(this._localDirty){this._localDirty=false;if(this._transformDirty||this._parent!==null&&this._parent._childrenTransformDirty){this._updateGlobalTransformMatrix(true)}this._transformDirty=true}};i.prototype.addConstraint=function(t){if(this.constraints.indexOf(t)<0){this.constraints.push(t)}};i.prototype.invalidUpdate=function(){this._transformDirty=true};i.prototype.contains=function(t){if(t===this){return false}var e=t;while(e!==this&&e!==null){e=e.parent}return e===this};i.prototype.getBones=function(){this._bones.length=0;for(var t=0,e=this._armature.getBones();t=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex0){for(var o=0,l=n;o0){if(this._displayList.length!==e.length){this._displayList.length=e.length}for(var i=0,a=e.length;i0){this._displayList.length=0}if(this._displayIndex>=0&&this._displayIndex=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else if(this._transformDirty||this._parent._childrenTransformDirty){this._transformDirty=true;this._cachedFrameIndex=-1}else if(this._cachedFrameIndex>=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}else if(this._transformDirty||this._parent._childrenTransformDirty){t=-1;this._transformDirty=true;this._cachedFrameIndex=-1}if(this._display===null){return}if(this._blendModeDirty){this._blendModeDirty=false;this._updateBlendMode()}if(this._colorDirty){this._colorDirty=false;this._updateColor()}if(this._meshData!==null&&this._display===this._meshDisplay){var i=this._meshData.weight!==null;if(this._meshDirty||i&&this._isMeshBonesUpdate()){this._meshDirty=false;this._updateMesh()}if(i){if(this._transformDirty){this._transformDirty=false;this._updateTransform(true)}return}}if(this._transformDirty){this._transformDirty=false;if(this._cachedFrameIndex<0){var a=t>=0;this._updateGlobalTransformMatrix(a);if(a&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}this._updateTransform(false)}};i.prototype.updateTransformAndMatrix=function(){if(this._transformDirty){this._transformDirty=false;this._updateGlobalTransformMatrix(false)}};i.prototype.containsPoint=function(t,e){if(this._boundingBoxData===null){return false}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);return this._boundingBoxData.containsPoint(i._helpPoint.x,i._helpPoint.y)};i.prototype.intersectsSegment=function(t,e,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}if(this._boundingBoxData===null){return 0}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);t=i._helpPoint.x;e=i._helpPoint.y;i._helpMatrix.transformPoint(a,r,i._helpPoint);a=i._helpPoint.x;r=i._helpPoint.y;var l=this._boundingBoxData.intersectsSegment(t,e,a,r,n,s,o);if(l>0){if(l===1||l===2){if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n);if(s!==null){s.x=n.x;s.y=n.y}}else if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}else{if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n)}if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}if(o!==null){this.globalTransformMatrix.transformPoint(Math.cos(o.x),Math.sin(o.x),i._helpPoint,true);o.x=Math.atan2(i._helpPoint.y,i._helpPoint.x);this.globalTransformMatrix.transformPoint(Math.cos(o.y),Math.sin(o.y),i._helpPoint,true);o.y=Math.atan2(i._helpPoint.y,i._helpPoint.x)}}return l};i.prototype.invalidUpdate=function(){this._displayDirty=true;this._transformDirty=true};Object.defineProperty(i.prototype,"displayIndex",{get:function(){return this._displayIndex},set:function(t){if(this._setDisplayIndex(t)){this.update(-1)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"displayList",{get:function(){return this._displayList.concat()},set:function(e){var i=this._displayList.concat();var a=new Array;if(this._setDisplayList(e)){this.update(-1)}for(var r=0,n=i;r0){this._animatebles[e-i]=r;this._animatebles[e]=null}r.advanceTime(t)}else{i++}}if(i>0){a=this._animatebles.length;for(;e=0};t.prototype.add=function(t){if(this._animatebles.indexOf(t)<0){this._animatebles.push(t);t.clock=this}};t.prototype.remove=function(t){var e=this._animatebles.indexOf(t);if(e>=0){this._animatebles[e]=null;t.clock=null}};t.prototype.clear=function(){for(var t=0,e=this._animatebles;t0&&i._subFadeState>0){this._armature._dragonBones.bufferObject(i);this._animationStates.length=0;this._lastAnimationState=null}else{var a=i.animationData;var r=a.cacheFrameRate;if(this._animationDirty&&r>0){this._animationDirty=false;for(var n=0,s=this._armature.getBones();n1){for(var u=0,_=0;u0&&i._subFadeState>0){_++;this._armature._dragonBones.bufferObject(i);this._animationDirty=true;if(this._lastAnimationState===i){this._lastAnimationState=null}}else{if(_>0){this._animationStates[u-_]=i}if(this._timelineDirty){i.updateTimelines()}i.advanceTime(t,0)}if(u===e-1&&_>0){this._animationStates.length-=_;if(this._lastAnimationState===null&&this._animationStates.length>0){this._lastAnimationState=this._animationStates[this._animationStates.length-1]}}}this._armature._cacheFrameIndex=-1}else{this._armature._cacheFrameIndex=-1}this._timelineDirty=false};i.prototype.reset=function(){for(var t=0,e=this._animationStates;t1){if(e.position<0){e.position%=a.duration;e.position=a.duration-e.position}else if(e.position===a.duration){e.position-=1e-6}else if(e.position>a.duration){e.position%=a.duration}if(e.duration>0&&e.position+e.duration>a.duration){e.duration=a.duration-e.position}if(e.playTimes<0){e.playTimes=a.playTimes}}else{e.playTimes=1;e.position=0;if(e.duration>0){e.duration=0}}if(e.duration===0){e.duration=-1}this._fadeOut(e);var o=t.BaseObject.borrowObject(t.AnimationState);o.init(this._armature,a,e);this._animationDirty=true;this._armature._cacheFrameIndex=-1;if(this._animationStates.length>0){var l=false;for(var h=0,f=this._animationStates.length;h=this._animationStates[h].layer){}else{l=true;this._animationStates.splice(h+1,0,o);break}}if(!l){this._animationStates.push(o)}}else{this._animationStates.push(o)}for(var u=0,_=this._armature.getSlots();u<_.length;u++){var m=_[u];var c=m.childArmature;if(c!==null&&c.inheritAnimation&&c.animation.hasAnimation(i)&&c.animation.getState(i)===null){c.animation.fadeIn(i)}}if(e.fadeInTime<=0){this._armature.advanceTime(0)}this._lastAnimationState=o;return o};i.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t!==null?t:"";if(t!==null&&t.length>0){this.playConfig(this._animationConfig)}else if(this._lastAnimationState===null){var i=this._armature.armatureData.defaultAnimation;if(i!==null){this._animationConfig.animation=i.name;this.playConfig(this._animationConfig)}}else if(!this._lastAnimationState.isPlaying&&!this._lastAnimationState.isCompleted){this._lastAnimationState.play()}else{this._animationConfig.animation=this._lastAnimationState.name;this.playConfig(this._animationConfig)}return this._lastAnimationState};i.prototype.fadeIn=function(t,e,i,a,r,n){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=0}if(r===void 0){r=null}if(n===void 0){n=3}this._animationConfig.clear();this._animationConfig.fadeOutMode=n;this._animationConfig.playTimes=i;this._animationConfig.layer=a;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=r!==null?r:"";return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByTime=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.position=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByFrame=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*e/a.frameCount}return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByProgress=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*(e>0?e:0)}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStopByTime=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByTime(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByFrame=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByFrame(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByProgress=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByProgress(t,e,1);if(i!==null){i.stop()}return i};i.prototype.getState=function(t){var e=this._animationStates.length;while(e--){var i=this._animationStates[e];if(i.name===t){return i}}return null};i.prototype.hasAnimation=function(t){return t in this._animations};i.prototype.getStates=function(){return this._animationStates};Object.defineProperty(i.prototype,"isPlaying",{get:function(){for(var t=0,e=this._animationStates;t0},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationName",{get:function(){return this._lastAnimationState!==null?this._lastAnimationState.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationNames",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animations",{get:function(){return this._animations},set:function(t){if(this._animations===t){return}this._animationNames.length=0;for(var e in this._animations){delete this._animations[e]}for(var e in t){this._animations[e]=t[e];this._animationNames.push(e)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationConfig",{get:function(){this._animationConfig.clear();return this._animationConfig},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationState",{get:function(){return this._lastAnimationState},enumerable:true,configurable:true});i.prototype.gotoAndPlay=function(t,e,i,a,r,n,s,o,l){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=-1}if(r===void 0){r=0}if(n===void 0){n=null}if(s===void 0){s=3}if(o===void 0){o=true}if(l===void 0){l=true}o;l;this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.fadeOutMode=s;this._animationConfig.playTimes=a;this._animationConfig.layer=r;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=n!==null?n:"";var h=this._animations[t];if(h&&i>0){this._animationConfig.timeScale=h.duration/i}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStop=function(t,e){if(e===void 0){e=0}return this.gotoAndStopByTime(t,e)};Object.defineProperty(i.prototype,"animationList",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationDataList",{get:function(){var t=[];for(var e=0,i=this._animationNames.length;e0;if(this._subFadeState<0){this._subFadeState=0;var a=i?t.EventObject.FADE_OUT:t.EventObject.FADE_IN;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}if(e<0){e=-e}this._fadeTime+=e;if(this._fadeTime>=this.fadeTotalTime){this._subFadeState=1;this._fadeProgress=i?0:1}else if(this._fadeTime>0){this._fadeProgress=i?1-this._fadeTime/this.fadeTotalTime:this._fadeTime/this.fadeTotalTime}else{this._fadeProgress=i?1:0}if(this._subFadeState>0){if(!i){this._playheadState|=1;this._fadeState=0}var a=i?t.EventObject.FADE_OUT_COMPLETE:t.EventObject.FADE_IN_COMPLETE;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}};a.prototype._blendBoneTimline=function(t){var e=t.bone;var i=t.bonePose.result;var a=e.animationPose;var r=this._weightResult>0?this._weightResult:-this._weightResult;if(!e._blendDirty){e._blendDirty=true;e._blendLayer=this.layer;e._blendLayerWeight=r;e._blendLeftWeight=1;a.x=i.x*r;a.y=i.y*r;a.rotation=i.rotation*r;a.skew=i.skew*r;a.scaleX=(i.scaleX-1)*r+1;a.scaleY=(i.scaleY-1)*r+1}else{r*=e._blendLeftWeight;e._blendLayerWeight+=r;a.x+=i.x*r;a.y+=i.y*r;a.rotation+=i.rotation*r;a.skew+=i.skew*r;a.scaleX+=(i.scaleX-1)*r;a.scaleY+=(i.scaleY-1)*r}if(this._fadeState!==0||this._subFadeState!==0){e._transformDirty=true}};a.prototype.init=function(e,i,a){if(this._armature!==null){return}this._armature=e;this.animationData=i;this.resetToPose=a.resetToPose;this.additiveBlending=a.additiveBlending;this.displayControl=a.displayControl;this.actionEnabled=a.actionEnabled;this.layer=a.layer;this.playTimes=a.playTimes;this.timeScale=a.timeScale;this.fadeTotalTime=a.fadeInTime;this.autoFadeOutTime=a.autoFadeOutTime;this.weight=a.weight;this.name=a.name.length>0?a.name:a.animation;this.group=a.group;if(a.pauseFadeIn){this._playheadState=2}else{this._playheadState=3}if(a.duration<0){this._position=0;this._duration=this.animationData.duration;if(a.position!==0){if(this.timeScale>=0){this._time=a.position}else{this._time=a.position-this._duration}}else{this._time=0}}else{this._position=a.position;this._duration=a.duration;this._time=0}if(this.timeScale<0&&this._time===0){this._time=-1e-6}if(this.fadeTotalTime<=0){this._fadeProgress=.999999}if(a.boneMask.length>0){this._boneMask.length=a.boneMask.length;for(var r=0,n=this._boneMask.length;r0;var a=true;var r=true;var n=this._time;this._weightResult=this.weight*this._fadeProgress;this._actionTimeline.update(n);if(i){var s=e*2;this._actionTimeline.currentTime=Math.floor(this._actionTimeline.currentTime*s)/s}if(this._zOrderTimeline!==null){this._zOrderTimeline.update(n)}if(i){var o=Math.floor(this._actionTimeline.currentTime*e);if(this._armature._cacheFrameIndex===o){a=false;r=false}else{this._armature._cacheFrameIndex=o;if(this.animationData.cachedFrames[o]){r=false}else{this.animationData.cachedFrames[o]=true}}}if(a){if(r){var l=null;var h=null;for(var f=0,u=this._boneTimelines.length;f0){if(l._blendLayer!==this.layer){if(l._blendLayerWeight>=l._blendLeftWeight){l._blendLeftWeight=0;l=null}else{l._blendLayer=this.layer;l._blendLeftWeight-=l._blendLayerWeight;l._blendLayerWeight=0}}}else{l=null}}}l=_.bone}if(l!==null){_.update(n);if(f===u-1){this._blendBoneTimline(_)}else{h=_}}}}for(var f=0,u=this._slotTimelines.length;f0){this._subFadeState=0}if(this._actionTimeline.playState>0){if(this.autoFadeOutTime>=0){this.fadeOut(this.autoFadeOutTime)}}}};a.prototype.play=function(){this._playheadState=3};a.prototype.stop=function(){this._playheadState&=1};a.prototype.fadeOut=function(t,e){if(e===void 0){e=true}if(t<0){t=0}if(e){this._playheadState&=2}if(this._fadeState>0){if(t>this.fadeTotalTime-this._fadeTime){return}}else{this._fadeState=1;this._subFadeState=-1;if(t<=0||this._fadeProgress<=0){this._fadeProgress=1e-6}for(var i=0,a=this._boneTimelines;i1e-6?t/this._fadeProgress:0;this._fadeTime=this.fadeTotalTime*(1-this._fadeProgress)};a.prototype.containsBoneMask=function(t){return this._boneMask.length===0||this._boneMask.indexOf(t)>=0};a.prototype.addBoneMask=function(t,e){if(e===void 0){e=true}var i=this._armature.getBone(t);if(i===null){return}if(this._boneMask.indexOf(t)<0){this._boneMask.push(t)}if(e){for(var a=0,r=this._armature.getBones();a=0){this._boneMask.splice(i,1)}if(e){var a=this._armature.getBone(t);if(a!==null){var r=this._armature.getBones();if(this._boneMask.length>0){for(var n=0,s=r;n=0&&a.contains(o)){this._boneMask.splice(l,1)}}}else{for(var h=0,f=r;h0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isFadeComplete",{get:function(){return this._fadeState===0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isPlaying",{get:function(){return(this._playheadState&2)!==0&&this._actionTimeline.playState<=0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isCompleted",{get:function(){return this._actionTimeline.playState>0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentPlayTimes",{get:function(){return this._actionTimeline.currentPlayTimes},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"totalTime",{get:function(){return this._duration},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentTime",{get:function(){return this._actionTimeline.currentTime},set:function(t){var e=this._actionTimeline.currentPlayTimes-(this._actionTimeline.playState>0?1:0);if(t<0||this._duration0&&e===this.playTimes-1&&t===this._duration){t=this._duration-1e-6}if(this._time===t){return}this._time=t;this._actionTimeline.setCurrentTime(this._time);if(this._zOrderTimeline!==null){this._zOrderTimeline.playState=-1}for(var i=0,a=this._boneTimelines;i=0?1:-1;this.currentPlayTimes=1;this.currentTime=this._actionTimeline.currentTime}else if(this._actionTimeline===null||this._timeScale!==1||this._timeOffset!==0){var r=this._animationState.playTimes;var n=r*this._duration;t*=this._timeScale;if(this._timeOffset!==0){t+=this._timeOffset*this._animationData.duration}if(r>0&&(t>=n||t<=-n)){if(this.playState<=0&&this._animationState._playheadState===3){this.playState=1}this.currentPlayTimes=r;if(t<0){this.currentTime=0}else{this.currentTime=this._duration}}else{if(this.playState!==0&&this._animationState._playheadState===3){this.playState=0}if(t<0){t=-t;this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=this._duration-t%this._duration}else{this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=t%this._duration}}this.currentTime+=this._position}else{this.playState=this._actionTimeline.playState;this.currentPlayTimes=this._actionTimeline.currentPlayTimes;this.currentTime=this._actionTimeline.currentTime}if(this.currentPlayTimes===i&&this.currentTime===a){return false}if(e<0&&this.playState!==e||this.playState<=0&&this.currentPlayTimes!==i){this._frameIndex=-1}return true};e.prototype.init=function(t,e,i){this._armature=t;this._animationState=e;this._timelineData=i;this._actionTimeline=this._animationState._actionTimeline;if(this===this._actionTimeline){this._actionTimeline=null}this._frameRate=this._armature.armatureData.frameRate;this._frameRateR=1/this._frameRate;this._position=this._animationState._position;this._duration=this._animationState._duration;this._dragonBonesData=this._armature.armatureData.parent;this._animationData=this._animationState.animationData;if(this._timelineData!==null){this._frameIntArray=this._dragonBonesData.frameIntArray;this._frameFloatArray=this._dragonBonesData.frameFloatArray;this._frameArray=this._dragonBonesData.frameArray;this._timelineArray=this._dragonBonesData.timelineArray;this._frameIndices=this._dragonBonesData.frameIndices;this._frameCount=this._timelineArray[this._timelineData.offset+2];this._frameValueOffset=this._timelineArray[this._timelineData.offset+4];this._timeScale=100/this._timelineArray[this._timelineData.offset+0];this._timeOffset=this._timelineArray[this._timelineData.offset+1]*.01}};e.prototype.fadeOut=function(){};e.prototype.update=function(t){if(this.playState<=0&&this._setCurrentTime(t)){if(this._frameCount>1){var e=Math.floor(this.currentTime*this._frameRate);var i=this._frameIndices[this._timelineData.frameIndicesOffset+e];if(this._frameIndex!==i){this._frameIndex=i;this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5+this._frameIndex];this._onArriveAtFrame()}}else if(this._frameIndex<0){this._frameIndex=0;if(this._timelineData!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5]}this._onArriveAtFrame()}if(this._tweenState!==0){this._onUpdateFrame()}}};return e}(t.BaseObject);t.TimelineState=e;var i=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e._getEasingValue=function(t,e,i){var a=e;switch(t){case 3:a=Math.pow(e,2);break;case 4:a=1-Math.pow(1-e,2);break;case 5:a=.5*(1-Math.cos(e*Math.PI));break}return(a-e)*i+e};e._getEasingCurveValue=function(t,e,i,a){if(t<=0){return 0}else if(t>=1){return 1}var r=i+1;var n=Math.floor(t*r);var s=n===0?0:e[a+n-1];var o=n===r-1?1e4:e[a+n];return(s+(o-s)*(t*r-n))*1e-4};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._tweenType=0;this._curveCount=0;this._framePosition=0;this._frameDurationR=0;this._tweenProgress=0;this._tweenEasing=0};e.prototype._onArriveAtFrame=function(){if(this._frameCount>1&&(this._frameIndex!==this._frameCount-1||this._animationState.playTimes===0||this._animationState.currentPlayTimes0){if(n.hasEvent(t.EventObject.COMPLETE)){h=t.BaseObject.borrowObject(t.EventObject);h.type=t.EventObject.COMPLETE;h.armature=this._armature;h.animationState=this._animationState}}}if(this._frameCount>1){var f=this._timelineData;var u=Math.floor(this.currentTime*this._frameRate);var _=this._frameIndices[f.frameIndicesOffset+u];if(this._frameIndex!==_){var m=this._frameIndex;this._frameIndex=_;if(this._timelineArray!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[f.offset+5+this._frameIndex];if(o){if(m<0){var c=Math.floor(r*this._frameRate);m=this._frameIndices[f.frameIndicesOffset+c];if(this.currentPlayTimes===a){if(m===_){m=-1}}}while(m>=0){var p=this._animationData.frameOffset+this._timelineArray[f.offset+5+m];var d=this._frameArray[p]/this._frameRate;if(this._position<=d&&d<=this._position+this._duration){this._onCrossFrame(m)}if(l!==null&&m===0){this._armature._dragonBones.bufferEvent(l);l=null}if(m>0){m--}else{m=this._frameCount-1}if(m===_){break}}}else{if(m<0){var c=Math.floor(r*this._frameRate);m=this._frameIndices[f.frameIndicesOffset+c];var p=this._animationData.frameOffset+this._timelineArray[f.offset+5+m];var d=this._frameArray[p]/this._frameRate;if(this.currentPlayTimes===a){if(r<=d){if(m>0){m--}else{m=this._frameCount-1}}else if(m===_){m=-1}}}while(m>=0){if(m=0){var t=this._frameArray[this._frameOffset+1];if(t>0){this._armature._sortZOrder(this._frameArray,this._frameOffset+2)}else{this._armature._sortZOrder(null,0)}}};e.prototype._onUpdateFrame=function(){};return e}(t.TimelineState);t.ZOrderTimelineState=i;var a=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.toString=function(){return"[class dragonBones.BoneAllTimelineState]"};i.prototype._onArriveAtFrame=function(){e.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var t=this._dragonBonesData.frameFloatArray;var i=this.bonePose.current;var a=this.bonePose.delta;var r=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*6;i.x=t[r++];i.y=t[r++];i.rotation=t[r++];i.skew=t[r++];i.scaleX=t[r++];i.scaleY=t[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}a.x=t[r++]-i.x;a.y=t[r++]-i.y;a.rotation=t[r++]-i.rotation;a.skew=t[r++]-i.skew;a.scaleX=t[r++]-i.scaleX;a.scaleY=t[r++]-i.scaleY}}else{var i=this.bonePose.current;i.x=0;i.y=0;i.rotation=0;i.skew=0;i.scaleX=1;i.scaleY=1}};i.prototype._onUpdateFrame=function(){e.prototype._onUpdateFrame.call(this);var t=this.bonePose.current;var i=this.bonePose.delta;var a=this.bonePose.result;this.bone._transformDirty=true;if(this._tweenState!==2){this._tweenState=0}var r=this._armature.armatureData.scale;a.x=(t.x+i.x*this._tweenProgress)*r;a.y=(t.y+i.y*this._tweenProgress)*r;a.rotation=t.rotation+i.rotation*this._tweenProgress;a.skew=t.skew+i.skew*this._tweenProgress;a.scaleX=t.scaleX+i.scaleX*this._tweenProgress;a.scaleY=t.scaleY+i.scaleY*this._tweenProgress};i.prototype.fadeOut=function(){var e=this.bonePose.result;e.rotation=t.Transform.normalizeRadian(e.rotation);e.skew=t.Transform.normalizeRadian(e.skew)};return i}(t.BoneTimelineState);t.BoneAllTimelineState=a;var r=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.SlotDislayIndexTimelineState]"};e.prototype._onArriveAtFrame=function(){if(this.playState>=0){var t=this._timelineData!==null?this._frameArray[this._frameOffset+1]:this.slot.slotData.displayIndex;if(this.slot.displayIndex!==t){this.slot._setDisplayIndex(t,true)}}};return e}(t.SlotTimelineState);t.SlotDislayIndexTimelineState=r;var n=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[0,0,0,0,0,0,0,0];e._delta=[0,0,0,0,0,0,0,0];e._result=[0,0,0,0,0,0,0,0];return e}e.toString=function(){return"[class dragonBones.SlotColorTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._dirty=false};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._dragonBonesData.intArray;var i=this._dragonBonesData.frameIntArray;var a=this._animationData.frameIntOffset+this._frameValueOffset+this._frameIndex*1;var r=i[a];this._current[0]=e[r++];this._current[1]=e[r++];this._current[2]=e[r++];this._current[3]=e[r++];this._current[4]=e[r++];this._current[5]=e[r++];this._current[6]=e[r++];this._current[7]=e[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=i[this._animationData.frameIntOffset+this._frameValueOffset]}else{r=i[a+1*1]}this._delta[0]=e[r++]-this._current[0];this._delta[1]=e[r++]-this._current[1];this._delta[2]=e[r++]-this._current[2];this._delta[3]=e[r++]-this._current[3];this._delta[4]=e[r++]-this._current[4];this._delta[5]=e[r++]-this._current[5];this._delta[6]=e[r++]-this._current[6];this._delta[7]=e[r++]-this._current[7]}}else{var n=this.slot.slotData.color;this._current[0]=n.alphaMultiplier*100;this._current[1]=n.redMultiplier*100;this._current[2]=n.greenMultiplier*100;this._current[3]=n.blueMultiplier*100;this._current[4]=n.alphaOffset;this._current[5]=n.redOffset;this._current[6]=n.greenOffset;this._current[7]=n.blueOffset}};e.prototype._onUpdateFrame=function(){t.prototype._onUpdateFrame.call(this);this._dirty=true;if(this._tweenState!==2){this._tweenState=0}this._result[0]=(this._current[0]+this._delta[0]*this._tweenProgress)*.01;this._result[1]=(this._current[1]+this._delta[1]*this._tweenProgress)*.01;this._result[2]=(this._current[2]+this._delta[2]*this._tweenProgress)*.01;this._result[3]=(this._current[3]+this._delta[3]*this._tweenProgress)*.01;this._result[4]=this._current[4]+this._delta[4]*this._tweenProgress;this._result[5]=this._current[5]+this._delta[5]*this._tweenProgress;this._result[6]=this._current[6]+this._delta[6]*this._tweenProgress;this._result[7]=this._current[7]+this._delta[7]*this._tweenProgress};e.prototype.fadeOut=function(){this._tweenState=0;this._dirty=false};e.prototype.update=function(e){t.prototype.update.call(this,e);if(this._tweenState!==0||this._dirty){var i=this.slot._colorTransform;if(this._animationState._fadeState!==0||this._animationState._subFadeState!==0){if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){var a=Math.pow(this._animationState._fadeProgress,4);i.alphaMultiplier+=(this._result[0]-i.alphaMultiplier)*a;i.redMultiplier+=(this._result[1]-i.redMultiplier)*a;i.greenMultiplier+=(this._result[2]-i.greenMultiplier)*a;i.blueMultiplier+=(this._result[3]-i.blueMultiplier)*a;i.alphaOffset+=(this._result[4]-i.alphaOffset)*a;i.redOffset+=(this._result[5]-i.redOffset)*a;i.greenOffset+=(this._result[6]-i.greenOffset)*a;i.blueOffset+=(this._result[7]-i.blueOffset)*a;this.slot._colorDirty=true}}else if(this._dirty){this._dirty=false;if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){i.alphaMultiplier=this._result[0];i.redMultiplier=this._result[1];i.greenMultiplier=this._result[2];i.blueMultiplier=this._result[3];i.alphaOffset=this._result[4];i.redOffset=this._result[5];i.greenOffset=this._result[6];i.blueOffset=this._result[7];this.slot._colorDirty=true}}}};return e}(t.SlotTimelineState);t.SlotColorTimelineState=n;var s=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[];e._delta=[];e._result=[];return e}e.toString=function(){return"[class dragonBones.SlotFFDTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.meshOffset=0;this._dirty=false;this._frameFloatOffset=0;this._valueCount=0;this._ffdCount=0;this._valueOffset=0;this._current.length=0;this._delta.length=0;this._result.length=0};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._tweenState===2;var i=this._dragonBonesData.frameFloatArray;var a=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*this._valueCount;if(e){var r=a+this._valueCount;if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}for(var n=0;n255){return encodeURI(r)}}}return r}return String(r)}return a};a.prototype._getCurvePoint=function(t,e,i,a,r,n,s,o,l,h){var f=1-l;var u=f*f;var _=l*l;var m=f*u;var c=3*l*u;var p=3*f*_;var d=l*_;h.x=m*t+c*i+p*r+d*s;h.y=m*e+c*a+p*n+d*o};a.prototype._samplingEasingCurve=function(t,e){var i=t.length;var a=-2;for(var r=0,n=e.length;r=0&&a+61e-4){var g=(y+d)*.5;this._getCurvePoint(l,h,f,u,_,m,c,p,g,this._helpPoint);if(s-this._helpPoint.x>0){d=g}else{y=g}}e[r]=this._helpPoint.y}};a.prototype._sortActionFrame=function(t,e){return t.frameStart>e.frameStart?1:-1};a.prototype._parseActionDataInFrame=function(t,e,i,r){if(a.EVENT in t){this._mergeActionFrame(t[a.EVENT],e,10,i,r)}if(a.SOUND in t){this._mergeActionFrame(t[a.SOUND],e,11,i,r)}if(a.ACTION in t){this._mergeActionFrame(t[a.ACTION],e,0,i,r)}if(a.EVENTS in t){this._mergeActionFrame(t[a.EVENTS],e,10,i,r)}if(a.ACTIONS in t){this._mergeActionFrame(t[a.ACTIONS],e,0,i,r)}};a.prototype._mergeActionFrame=function(e,a,r,n,s){var o=t.DragonBones.webAssembly?this._armature.actions.size():this._armature.actions.length;var l=this._parseActionData(e,this._armature.actions,r,n,s);var h=null;if(this._actionFrames.length===0){h=new i;h.frameStart=0;this._actionFrames.push(h);h=null}for(var f=0,u=this._actionFrames;f0){var c=r.getBone(_);if(c!==null){m.parent=c}else{(this._cacheBones[_]=this._cacheBones[_]||[]).push(m)}}if(m.name in this._cacheBones){for(var p=0,d=this._cacheBones[m.name];p0){n.root=i.parent}if(t.DragonBones.webAssembly){i.constraints.push_back(n)}else{i.constraints.push(n)}};a.prototype._parseSlot=function(e){var i=t.DragonBones.webAssembly?new Module["SlotData"]:t.BaseObject.borrowObject(t.SlotData);i.displayIndex=a._getNumber(e,a.DISPLAY_INDEX,0);i.zOrder=t.DragonBones.webAssembly?this._armature.sortedSlots.size():this._armature.sortedSlots.length;i.name=a._getString(e,a.NAME,"");i.parent=this._armature.getBone(a._getString(e,a.PARENT,""));if(a.BLEND_MODE in e&&typeof e[a.BLEND_MODE]==="string"){i.blendMode=a._getBlendMode(e[a.BLEND_MODE])}else{i.blendMode=a._getNumber(e,a.BLEND_MODE,0)}if(a.COLOR in e){i.color=t.DragonBones.webAssembly?Module["SlotData"].createColor():t.SlotData.createColor();this._parseColorTransform(e[a.COLOR],i.color)}else{i.color=t.DragonBones.webAssembly?Module["SlotData"].DEFAULT_COLOR:t.SlotData.DEFAULT_COLOR}if(a.ACTIONS in e){var r=this._slotChildActions[i.name]=[];this._parseActionData(e[a.ACTIONS],r,0,null,null)}return i};a.prototype._parseSkin=function(e){var i=t.DragonBones.webAssembly?new Module["SkinData"]:t.BaseObject.borrowObject(t.SkinData);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length===0){i.name=a.DEFAULT_NAME}if(a.SLOT in e){this._skin=i;var r=e[a.SLOT];for(var n=0,s=r;n0?n:r;this._parsePivot(e,o);break;case 1:var l=i=t.DragonBones.webAssembly?new Module["ArmatureDisplayData"]:t.BaseObject.borrowObject(t.ArmatureDisplayData);l.name=r;l.path=n.length>0?n:r;l.inheritAnimation=true;if(a.ACTIONS in e){this._parseActionData(e[a.ACTIONS],l.actions,0,null,null)}else if(this._slot.name in this._slotChildActions){var h=this._skin.getDisplays(this._slot.name);if(h===null?this._slot.displayIndex===0:this._slot.displayIndex===h.length){for(var f=0,u=this._slotChildActions[this._slot.name];f0?n:r;m.inheritAnimation=a._getBoolean(e,a.INHERIT_FFD,true);this._parsePivot(e,m);var c=a._getString(e,a.SHARE,"");if(c.length>0){var p=this._meshs[c];m.offset=p.offset;m.weight=p.weight}else{this._parseMesh(e,m);this._meshs[m.name]=m}break;case 3:var d=this._parseBoundingBox(e);if(d!==null){var y=i=t.DragonBones.webAssembly?new Module["BoundingBoxDisplayData"]:t.BaseObject.borrowObject(t.BoundingBoxDisplayData);y.name=r;y.path=n.length>0?n:r;y.boundingBox=d}break}if(i!==null){i.parent=this._armature;if(a.TRANSFORM in e){this._parseTransform(e[a.TRANSFORM],i.transform,this._armature.scale)}}return i};a.prototype._parsePivot=function(t,e){if(a.PIVOT in t){var i=t[a.PIVOT];e.pivot.x=a._getNumber(i,a.X,0);e.pivot.y=a._getNumber(i,a.Y,0)}else{e.pivot.x=.5;e.pivot.y=.5}};a.prototype._parseMesh=function(e,i){var r=e[a.VERTICES];var n=e[a.UVS];var s=e[a.TRIANGLES];var o=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var l=t.DragonBones.webAssembly?this._floatArrayJson:this._data.floatArray;var h=Math.floor(r.length/2);var f=Math.floor(s.length/3);var u=l.length;var _=u+h*2;i.offset=o.length;o.length+=1+1+1+1+f*3;o[i.offset+0]=h;o[i.offset+1]=f;o[i.offset+2]=u;for(var m=0,c=f*3;mn.width){n.width=h}if(fn.height){n.height=f}}}return n};a.prototype._parseAnimation=function(e){var i=t.DragonBones.webAssembly?new Module["AnimationData"]:t.BaseObject.borrowObject(t.AnimationData);i.frameCount=Math.max(a._getNumber(e,a.DURATION,1),1);i.playTimes=a._getNumber(e,a.PLAY_TIMES,1);i.duration=i.frameCount/this._armature.frameRate;i.fadeInTime=a._getNumber(e,a.FADE_IN_TIME,0);i.scale=a._getNumber(e,a.SCALE,1);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length<1){i.name=a.DEFAULT_NAME}if(t.DragonBones.webAssembly){i.frameIntOffset=this._frameIntArrayJson.length;i.frameFloatOffset=this._frameFloatArrayJson.length;i.frameOffset=this._frameArrayJson.length}else{i.frameIntOffset=this._data.frameIntArray.length;i.frameFloatOffset=this._data.frameFloatArray.length;i.frameOffset=this._data.frameArray.length}this._animation=i;if(a.FRAME in e){var r=e[a.FRAME];var n=r.length;if(n>0){for(var s=0,o=0;s0){this._actionFrames.sort(this._sortActionFrame);var D=this._animation.actionTimeline=t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);var T=t.DragonBones.webAssembly?this._timelineArrayJson:this._data.timelineArray;var n=this._actionFrames.length;D.type=0;D.offset=T.length;T.length+=1+1+1+1+1+n;T[D.offset+0]=100;T[D.offset+1]=0;T[D.offset+2]=n;T[D.offset+3]=0;T[D.offset+4]=0;this._timeline=D;if(n===1){D.frameIndicesOffset=-1;T[D.offset+5+0]=this._parseCacheActionFrame(this._actionFrames[0])-this._animation.frameOffset}else{var A=this._animation.frameCount+1;var O=this._data.frameIndices;if(t.DragonBones.webAssembly){D.frameIndicesOffset=O.size();for(var B=0;B0){if(a.CURVE in t){var s=i+1;this._helpArray.length=s;this._samplingEasingCurve(t[a.CURVE],this._helpArray);r.length+=1+1+this._helpArray.length;r[n+1]=2;r[n+2]=s;for(var o=0;o0){var l=this._armature.sortedSlots.length;var h=new Array(l-o.length/2);var f=new Array(l);for(var u=0;u0?l>=this._prevRotation:l<=this._prevRotation){this._prevTweenRotate=this._prevTweenRotate>0?this._prevTweenRotate-1:this._prevTweenRotate+1}l=this._prevRotation+l-this._prevRotation+t.Transform.PI_D*this._prevTweenRotate}}this._prevTweenRotate=a._getNumber(e,a.TWEEN_ROTATE,0);this._prevRotation=l;var h=n.length;n.length+=6;n[h++]=this._helpTransform.x;n[h++]=this._helpTransform.y;n[h++]=l;n[h++]=this._helpTransform.skew;n[h++]=this._helpTransform.scaleX;n[h++]=this._helpTransform.scaleY;this._parseActionDataInFrame(e,i,this._bone,this._slot);return o};a.prototype._parseSlotDisplayIndexFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var s=this._parseFrame(e,i,r,n);n.length+=1;n[s+1]=a._getNumber(e,a.DISPLAY_INDEX,0);this._parseActionDataInFrame(e,i,this._slot.parent,this._slot);return s};a.prototype._parseSlotColorFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameIntArrayJson:this._data.frameIntArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=this._parseTweenFrame(e,i,r,o);var h=-1;if(a.COLOR in e){var f=e[a.COLOR];for(var u in f){u;this._parseColorTransform(f,this._helpColorTransform);h=n.length;n.length+=8;n[h++]=Math.round(this._helpColorTransform.alphaMultiplier*100);n[h++]=Math.round(this._helpColorTransform.redMultiplier*100);n[h++]=Math.round(this._helpColorTransform.greenMultiplier*100);n[h++]=Math.round(this._helpColorTransform.blueMultiplier*100);n[h++]=Math.round(this._helpColorTransform.alphaOffset);n[h++]=Math.round(this._helpColorTransform.redOffset);n[h++]=Math.round(this._helpColorTransform.greenOffset);n[h++]=Math.round(this._helpColorTransform.blueOffset);h-=8;break}}if(h<0){if(this._defalultColorOffset<0){this._defalultColorOffset=h=n.length;n.length+=8;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=0;n[h++]=0;n[h++]=0;n[h++]=0}h=this._defalultColorOffset}var _=s.length;s.length+=1;s[_]=h;return l};a.prototype._parseSlotFFDFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameFloatArrayJson:this._data.frameFloatArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=s.length;var h=this._parseTweenFrame(e,i,r,o);var f=a.VERTICES in e?e[a.VERTICES]:null;var u=a._getNumber(e,a.OFFSET,0);var _=n[this._mesh.offset+0];var m=0;var c=0;var p=0;var d=0;if(this._mesh.weight!==null){var y=this._weightSlotPose[this._mesh.name];this._helpMatrixA.copyFromArray(y,0);s.length+=this._mesh.weight.count*2;p=this._mesh.weight.offset+2+this._mesh.weight.bones.length}else{s.length+=_*2}for(var g=0;g<_*2;g+=2){if(f===null){m=0;c=0}else{if(g=f.length){m=0}else{m=f[g-u]}if(g+1=f.length){c=0}else{c=f[g+1-u]}}if(this._mesh.weight!==null){var v=this._weightBonePoses[this._mesh.name];var b=this._weightBoneIndices[this._mesh.name];var D=n[p++];this._helpMatrixA.transformPoint(m,c,this._helpPoint,true);m=this._helpPoint.x;c=this._helpPoint.y;for(var T=0;T=0||a.DATA_VERSIONS.indexOf(n)>=0){var s=t.DragonBones.webAssembly?new Module["DragonBonesData"]:t.BaseObject.borrowObject(t.DragonBonesData);s.version=r;s.name=a._getString(e,a.NAME,"");s.frameRate=a._getNumber(e,a.FRAME_RATE,24);if(s.frameRate===0){s.frameRate=24}if(a.ARMATURE in e){this._defalultColorOffset=-1;this._data=s;this._parseArray(e);var o=e[a.ARMATURE];for(var l=0,h=o;l0){this._parseWASMArray()}this._data=null}this._rawTextureAtlasIndex=0;if(a.TEXTURE_ATLAS in e){this._rawTextureAtlases=e[a.TEXTURE_ATLAS]}else{this._rawTextureAtlases=null}return s}else{console.assert(false,"Nonsupport data version.")}return null};a.prototype.parseTextureAtlasData=function(e,i,r){if(r===void 0){r=0}console.assert(e!==undefined);if(e===null){if(this._rawTextureAtlases===null){return false}var n=this._rawTextureAtlases[this._rawTextureAtlasIndex++];this.parseTextureAtlasData(n,i,r);if(this._rawTextureAtlasIndex>=this._rawTextureAtlases.length){this._rawTextureAtlasIndex=0;this._rawTextureAtlases=null}return true}i.width=a._getNumber(e,a.WIDTH,0);i.height=a._getNumber(e,a.HEIGHT,0);i.name=a._getString(e,a.NAME,"");i.imagePath=a._getString(e,a.IMAGE_PATH,"");if(r>0){i.scale=r}else{r=i.scale=a._getNumber(e,a.SCALE,i.scale)}r=1/r;if(a.SUB_TEXTURE in e){var s=e[a.SUB_TEXTURE];for(var o=0,l=s.length;o0&&_>0){f.frame=t.DragonBones.webAssembly?Module["TextureData"].createRectangle():t.TextureData.createRectangle();f.frame.x=a._getNumber(h,a.FRAME_X,0)*r;f.frame.y=a._getNumber(h,a.FRAME_Y,0)*r;f.frame.width=u*r;f.frame.height=_*r}i.addTexture(f)}}return true};a.getInstance=function(){if(a._objectDataParserInstance===null){a._objectDataParserInstance=new a}return a._objectDataParserInstance};a._objectDataParserInstance=null;return a}(t.DataParser);t.ObjectDataParser=e;var i=function(){function t(){this.frameStart=0;this.actions=[]}return t}()})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.prototype._inRange=function(t,e,i){return e<=t&&t<=i};i.prototype._decodeUTF8=function(t){var e=-1;var i=-1;var a=65533;var r=0;var n="";var s;var o=0;var l=0;var h=0;var f=0;while(t.length>r){var u=t[r++];if(u===e){if(l!==0){s=a}else{s=i}}else{if(l===0){if(this._inRange(u,0,127)){s=u}else{if(this._inRange(u,194,223)){l=1;f=128;o=u-192}else if(this._inRange(u,224,239)){l=2;f=2048;o=u-224}else if(this._inRange(u,240,244)){l=3;f=65536;o=u-240}else{}o=o*Math.pow(64,l);s=null}}else if(!this._inRange(u,128,191)){o=0;l=0;h=0;f=0;r--;s=u}else{h+=1;o=o+(u-128)*Math.pow(64,l-h);if(h!==l){s=null}else{var _=o;var m=f;o=0;l=0;h=0;f=0;if(this._inRange(_,m,1114111)&&!this._inRange(_,55296,57343)){s=_}else{s=u}}}}if(s!==null&&s!==i){if(s<=65535){if(s>0)n+=String.fromCharCode(s)}else{s-=65536;n+=String.fromCharCode(55296+(s>>10&1023));n+=String.fromCharCode(56320+(s&1023))}}}return n};i.prototype._getUTF16Key=function(t){for(var e=0,i=t.length;e255){return encodeURI(t)}}return t};i.prototype._parseBinaryTimeline=function(e,i,a){if(a===void 0){a=null}var r=a!==null?a:t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);r.type=e;r.offset=i;this._timeline=r;var n=this._timelineArray[r.offset+2];if(n===1){r.frameIndicesOffset=-1}else{var s=this._animation.frameCount+1;var o=this._data.frameIndices;if(t.DragonBones.webAssembly){r.frameIndicesOffset=o.size();for(var l=0;l=0){var r=t.DragonBones.webAssembly?new Module["WeightData"]:t.BaseObject.borrowObject(t.WeightData);var n=this._intArray[i.offset+0];var s=this._intArray[a+0];r.offset=a;if(t.DragonBones.webAssembly){r.bones.resize(s,null);for(var o=0;o0){if(e in this._dragonBonesDataMap){n=this._dragonBonesDataMap[e];s=n.getArmature(i)}}if(s===null&&(e.length===0||this.autoSearch)){for(var o in this._dragonBonesDataMap){n=this._dragonBonesDataMap[o];if(e.length===0||n.autoSearch){s=n.getArmature(i);if(s!==null){e=o;break}}}}if(s!==null){t.dataName=e;t.textureAtlasName=r;t.data=n;t.armature=s;t.skin=null;if(a.length>0){t.skin=s.getSkin(a);if(t.skin===null&&this.autoSearch){for(var o in this._dragonBonesDataMap){var l=this._dragonBonesDataMap[o];var h=l.getArmature(a);if(h!==null){t.skin=h.defaultSkin;break}}}}if(t.skin===null){t.skin=s.defaultSkin}return true}return false};i.prototype._buildBones=function(e,i){var a=e.armature.sortedBones;for(var r=0;r<(t.DragonBones.webAssembly?a.size():a.length);++r){var n=t.DragonBones.webAssembly?a.get(r):a[r];var s=t.DragonBones.webAssembly?new Module["Bone"]:t.BaseObject.borrowObject(t.Bone);s.init(n);if(n.parent!==null){i.addBone(s,n.parent.name)}else{i.addBone(s)}var o=n.constraints;for(var l=0;l<(t.DragonBones.webAssembly?o.size():o.length);++l){var h=t.DragonBones.webAssembly?o.get(l):o[l];var f=i.getBone(h.target.name);if(f===null){continue}var u=h;var _=t.DragonBones.webAssembly?new Module["IKConstraint"]:t.BaseObject.borrowObject(t.IKConstraint);var m=u.root!==null?i.getBone(u.root.name):null;_.target=f;_.bone=s;_.root=m;_.bendPositive=u.bendPositive;_.scaleEnabled=u.scaleEnabled;_.weight=u.weight;if(m!==null){m.addConstraint(_)}else{s.addConstraint(_)}}}};i.prototype._buildSlots=function(t,e){var i=t.skin;var a=t.armature.defaultSkin;if(i===null||a===null){return}var r={};for(var n in a.displays){var s=a.displays[n];r[n]=s}if(i!==a){for(var n in i.displays){var s=i.displays[n];r[n]=s}}for(var o=0,l=t.armature.sortedSlots;o0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var f=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(f.length>0){for(var u=0,_=f;u<_.length;u++){var m=_[u];h._bufferAction(m,true)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype._replaceSlotDisplay=function(t,e,i,a){if(a<0){a=i.displayIndex}if(a<0){a=0}var r=i.displayList;if(r.length<=a){r.length=a+1;for(var n=0,s=r.length;n=0){continue}var s=e.displays[n.name];var o=n.displayList;o.length=s.length;for(var l=0,h=s.length;l = []; + private readonly _animationStates: Array = []; + private readonly _animations: Map = {}; + private _armature: Armature; + private _animationConfig: AnimationConfig = null as any; // Initial value. + private _lastAnimationState: AnimationState | null; + /** + * @private + */ + protected _onClear(): void { + for (const animationState of this._animationStates) { + animationState.returnToPool(); + } + + for (let k in this._animations) { + delete this._animations[k]; + } + + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + + this.timeScale = 1.0; + + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null as any; // + this._animationConfig = null as any; // + this._lastAnimationState = null; + } + + private _fadeOut(animationConfig: AnimationConfig): void { + switch (animationConfig.fadeOutMode) { + case AnimationFadeOutMode.SameLayer: + for (const animationState of this._animationStates) { + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case AnimationFadeOutMode.SameGroup: + for (const animationState of this._animationStates) { + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case AnimationFadeOutMode.SameLayerAndGroup: + for (const animationState of this._animationStates) { + if ( + animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group + ) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case AnimationFadeOutMode.All: + for (const animationState of this._animationStates) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + + case AnimationFadeOutMode.None: + case AnimationFadeOutMode.Single: + default: + break; + } + } + /** + * @internal + * @private + */ + public init(armature: Armature): void { + if (this._armature !== null) { + return; + } + + this._armature = armature; + this._animationConfig = BaseObject.borrowObject(AnimationConfig); + } + /** + * @internal + * @private + */ + public advanceTime(passedTime: number): void { + if (passedTime < 0.0) { // Only animationState can reverse play. + passedTime = -passedTime; + } + + if (this._armature.inheritAnimation && this._armature._parent !== null) { // Inherit parent animation timeScale. + passedTime *= this._armature._parent._armature.animation.timeScale; + } + + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + + const animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + const animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + const animationData = animationState.animationData; + const cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { // Update cachedFrameIndices. + this._animationDirty = false; + for (const bone of this._armature.getBones()) { + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + + for (const slot of this._armature.getSlots()) { + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + + if (this._timelineDirty) { + animationState.updateTimelines(); + } + + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (let i = 0, r = 0; i < animationStateCount; ++i) { + const animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { // Update last animation state. + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + + if (this._timelineDirty) { + animationState.updateTimelines(); + } + + animationState.advanceTime(passedTime, 0.0); + } + + if (i === animationStateCount - 1 && r > 0) { // Modify animation states size. + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + + this._timelineDirty = false; + } + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public reset(): void { + for (const animationState of this._animationStates) { + animationState.returnToPool(); + } + + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public stop(animationName: string | null = null): void { + if (animationName !== null) { + const animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (const animationState of this._animationStates) { + animationState.stop(); + } + } + } + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + public playConfig(animationConfig: AnimationConfig): AnimationState | null { + const animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn( + "Non-existent animation.\n", + "DragonBones name: " + this._armature.armatureData.parent.name, + "Armature name: " + this._armature.name, + "Animation name: " + animationName + ); + + return null; + } + + const animationData = this._animations[animationName]; + + if (animationConfig.fadeOutMode === AnimationFadeOutMode.Single) { + for (const animationState of this._animationStates) { + if (animationState.animationData === animationData) { + return animationState; + } + } + } + + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + + this._fadeOut(animationConfig); + + const animationState = BaseObject.borrowObject(AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + + if (this._animationStates.length > 0) { + let added = false; + for (let i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + + // Child armature play same name animation. + for (const slot of this._armature.getSlots()) { + const childArmature = slot.childArmature; + if ( + childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null + ) { + childArmature.animation.fadeIn(animationName); // + } + } + + if (animationConfig.fadeInTime <= 0.0) { // Blend animation state, update armature. + this._armature.advanceTime(0.0); + } + + this._lastAnimationState = animationState; + + return animationState; + } + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public play(animationName: string | null = null, playTimes: number = -1): AnimationState | null { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + const defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + + return this._lastAnimationState; + } + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public fadeIn( + animationName: string, fadeInTime: number = -1.0, playTimes: number = -1, + layer: number = 0, group: string | null = null, fadeOutMode: AnimationFadeOutMode = AnimationFadeOutMode.SameLayerAndGroup + ): AnimationState | null { + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + + return this.playConfig(this._animationConfig); + } + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndPlayByTime(animationName: string, time: number = 0.0, playTimes: number = -1): AnimationState | null { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + + return this.playConfig(this._animationConfig); + } + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndPlayByFrame(animationName: string, frame: number = 0, playTimes: number = -1): AnimationState | null { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + + const animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + + return this.playConfig(this._animationConfig); + } + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndPlayByProgress(animationName: string, progress: number = 0.0, playTimes: number = -1): AnimationState | null { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + + const animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + + return this.playConfig(this._animationConfig); + } + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndStopByTime(animationName: string, time: number = 0.0): AnimationState | null { + const animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + + return animationState; + } + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndStopByFrame(animationName: string, frame: number = 0): AnimationState | null { + const animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + + return animationState; + } + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + public gotoAndStopByProgress(animationName: string, progress: number = 0.0): AnimationState | null { + const animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + + return animationState; + } + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public getState(animationName: string): AnimationState | null { + let i = this._animationStates.length; + while (i--) { + const animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + + return null; + } + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + public hasAnimation(animationName: string): boolean { + return animationName in this._animations; + } + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + public getStates(): Array { + return this._animationStates; + } + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get isPlaying(): boolean { + for (const animationState of this._animationStates) { + if (animationState.isPlaying) { + return true; + } + } + + return false; + } + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public get isCompleted(): boolean { + for (const animationState of this._animationStates) { + if (!animationState.isCompleted) { + return false; + } + } + + return this._animationStates.length > 0; + } + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public get lastAnimationName(): string { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + } + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + public get animationNames(): Array { + return this._animationNames; + } + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + public get animations(): Map { + return this._animations; + } + public set animations(value: Map) { + if (this._animations === value) { + return; + } + + this._animationNames.length = 0; + + for (let k in this._animations) { + delete this._animations[k]; + } + + for (let k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + } + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + public get animationConfig(): AnimationConfig { + this._animationConfig.clear(); + return this._animationConfig; + } + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + public get lastAnimationState(): AnimationState | null { + return this._lastAnimationState; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + public gotoAndPlay( + animationName: string, fadeInTime: number = -1, duration: number = -1, playTimes: number = -1, + layer: number = 0, group: string | null = null, fadeOutMode: AnimationFadeOutMode = AnimationFadeOutMode.SameLayerAndGroup, + pauseFadeOut: boolean = true, pauseFadeIn: boolean = true + ): AnimationState | null { + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + + const animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + + return this.playConfig(this._animationConfig); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + public gotoAndStop(animationName: string, time: number = 0): AnimationState | null { + return this.gotoAndStopByTime(animationName, time); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + public get animationList(): Array { + return this._animationNames; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + public get animationDataList(): Array { + const list: AnimationData[] = []; + for (let i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + + return list; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/animation/AnimationState.ts b/reference/DragonBones/src/dragonBones/animation/AnimationState.ts new file mode 100644 index 0000000..a258c4a --- /dev/null +++ b/reference/DragonBones/src/dragonBones/animation/AnimationState.ts @@ -0,0 +1,953 @@ +namespace dragonBones { + /** + * @internal + * @private + */ + export class BonePose extends BaseObject { + public static toString(): string { + return "[class dragonBones.BonePose]"; + } + + public readonly current: Transform = new Transform(); + public readonly delta: Transform = new Transform(); + public readonly result: Transform = new Transform(); + + protected _onClear(): void { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + } + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + export class AnimationState extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.AnimationState]"; + } + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + public resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + public displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + public playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + public timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public autoFadeOutTime: number; + /** + * @private + */ + public fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public animationData: AnimationData; + + private _timelineDirty: boolean; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + public _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + public _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + public _subFadeState: number; + /** + * @internal + * @private + */ + public _position: number; + /** + * @internal + * @private + */ + public _duration: number; + private _fadeTime: number; + private _time: number; + /** + * @internal + * @private + */ + public _fadeProgress: number; + private _weightResult: number; + private readonly _boneMask: Array = []; + private readonly _boneTimelines: Array = []; + private readonly _slotTimelines: Array = []; + private readonly _bonePoses: Map = {}; + private _armature: Armature; + /** + * @internal + * @private + */ + public _actionTimeline: ActionTimelineState = null as any; // Initial value. + private _zOrderTimeline: ZOrderTimelineState | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + for (const timeline of this._boneTimelines) { + timeline.returnToPool(); + } + + for (const timeline of this._slotTimelines) { + timeline.returnToPool(); + } + + for (let k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null as any; // + + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null as any; // + this._actionTimeline = null as any; // + this._zOrderTimeline = null; + } + + private _isDisabled(slot: Slot): boolean { + if (this.displayControl) { + const displayController = slot.displayController; + if ( + displayController === null || + displayController === this.name || + displayController === this.group + ) { + return false; + } + } + + return true; + } + + private _advanceFadeTime(passedTime: number): void { + const isFadeOut = this._fadeState > 0; + + if (this._subFadeState < 0) { // Fade start event. + this._subFadeState = 0; + + const eventType = isFadeOut ? EventObject.FADE_OUT : EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + const eventObject = BaseObject.borrowObject(EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + + if (passedTime < 0.0) { + passedTime = -passedTime; + } + + this._fadeTime += passedTime; + + if (this._fadeTime >= this.fadeTotalTime) { // Fade complete. + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { // Fading. + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { // Before fade. + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + + if (this._subFadeState > 0) { // Fade complete event. + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + + const eventType = isFadeOut ? EventObject.FADE_OUT_COMPLETE : EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + const eventObject = BaseObject.borrowObject(EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + + private _blendBoneTimline(timeline: BoneTimelineState): void { + const bone = timeline.bone; + const bonePose = timeline.bonePose.result; + const animationPose = bone.animationPose; + let boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + } + /** + * @private + * @internal + */ + public init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void { + if (this._armature !== null) { + return; + } + + this._armature = armature; + + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (let i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + + this._actionTimeline = BaseObject.borrowObject(ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = BaseObject.borrowObject(ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + } + /** + * @private + * @internal + */ + public updateTimelines(): void { + const boneTimelines: Map> = {}; + for (const timeline of this._boneTimelines) { // Create bone timelines map. + const timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + + boneTimelines[timelineName].push(timeline); + } + + for (const bone of this._armature.getBones()) { + const timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + + const timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { // Remove bone timeline from map. + delete boneTimelines[timelineName]; + } + else { // Create new bone timeline. + const bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (const timelineData of timelineDatas) { + switch (timelineData.type) { + case TimelineType.BoneAll: + const timeline = BaseObject.borrowObject(BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + + case TimelineType.BoneT: + case TimelineType.BoneR: + case TimelineType.BoneS: + // TODO + break; + + case TimelineType.BoneX: + case TimelineType.BoneY: + case TimelineType.BoneRotate: + case TimelineType.BoneSkew: + case TimelineType.BoneScaleX: + case TimelineType.BoneScaleY: + // TODO + break; + } + } + } + else if (this.resetToPose) { // Pose timeline. + const timeline = BaseObject.borrowObject(BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + + for (let k in boneTimelines) { // Remove bone timelines. + for (const timeline of boneTimelines[k]) { + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + + const slotTimelines: Map> = {}; + const ffdFlags: Array = []; + for (const timeline of this._slotTimelines) { // Create slot timelines map. + const timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + + slotTimelines[timelineName].push(timeline); + } + + for (const slot of this._armature.getSlots()) { + const boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + + const timelineName = slot.name; + const timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { // Remove slot timeline from map. + delete slotTimelines[timelineName]; + } + else { // Create new slot timeline. + let displayIndexFlag = false; + let colorFlag = false; + ffdFlags.length = 0; + + if (timelineDatas !== null) { + for (const timelineData of timelineDatas) { + switch (timelineData.type) { + case TimelineType.SlotDisplay: + { + const timeline = BaseObject.borrowObject(SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + + case TimelineType.SlotColor: + { + const timeline = BaseObject.borrowObject(SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + + case TimelineType.SlotFFD: + { + const timeline = BaseObject.borrowObject(SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + + if (this.resetToPose) { // Pose timeline. + if (!displayIndexFlag) { + const timeline = BaseObject.borrowObject(SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + + if (!colorFlag) { + const timeline = BaseObject.borrowObject(SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + + for (const displayData of slot._rawDisplayDatas) { + if (displayData !== null && displayData.type === DisplayType.Mesh && ffdFlags.indexOf((displayData as MeshDisplayData).offset) < 0) { + const timeline = BaseObject.borrowObject(SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + + for (let k in slotTimelines) { // Remove slot timelines. + for (const timeline of slotTimelines[k]) { + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + } + /** + * @private + * @internal + */ + public advanceTime(passedTime: number, cacheFrameRate: number): void { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + + // Update time. + if (this._playheadState === 3) { // 11 + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + + this._time += passedTime; + } + + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + + if (this.weight === 0.0) { + return; + } + + const isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + let isUpdateTimeline = true; + let isUpdateBoneTimeline = true; + let time = this._time; + this._weightResult = this.weight * this._fadeProgress; + + this._actionTimeline.update(time); // Update main timeline. + + if (isCacheEnabled) { // Cache time internval. + const internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + + if (this._zOrderTimeline !== null) { // Update zOrder timeline. + this._zOrderTimeline.update(time); + } + + if (isCacheEnabled) { // Update cache. + const cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { // Same cache. + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { // Cached. + isUpdateBoneTimeline = false; + } + else { // Cache. + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { // Update bone timelines. + let bone: Bone | null = null; + let prevTimeline: BoneTimelineState = null as any; // + for (let i = 0, l = this._boneTimelines.length; i < l; ++i) { + const timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { // Blend bone pose. + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + + bone = timeline.bone; + } + + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + + for (let i = 0, l = this._slotTimelines.length; i < l; ++i) { + const timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + + timeline.update(time); + } + } + + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { // Auto fade out. + this.fadeOut(this.autoFadeOutTime); + } + } + } + } + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public play(): void { + this._playheadState = 3; // 11 + } + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public stop(): void { + this._playheadState &= 1; // 0x + } + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public fadeOut(fadeOutTime: number, pausePlayhead: boolean = true): void { + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { // If the animation is already in fade out, the new fade out will be ignored. + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + + for (const timeline of this._boneTimelines) { + timeline.fadeOut(); + } + + for (const timeline of this._slotTimelines) { + timeline.fadeOut(); + } + } + + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + } + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public containsBoneMask(name: string): boolean { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + } + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public addBoneMask(name: string, recursive: boolean = true): void { + const currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + + if (this._boneMask.indexOf(name) < 0) { // Add mixing + this._boneMask.push(name); + } + + if (recursive) { // Add recursive mixing. + for (const bone of this._armature.getBones()) { + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + + this._timelineDirty = true; + } + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public removeBoneMask(name: string, recursive: boolean = true): void { + const index = this._boneMask.indexOf(name); + if (index >= 0) { // Remove mixing. + this._boneMask.splice(index, 1); + } + + if (recursive) { + const currentBone = this._armature.getBone(name); + if (currentBone !== null) { + const bones = this._armature.getBones(); + if (this._boneMask.length > 0) { // Remove recursive mixing. + for (const bone of bones) { + const index = this._boneMask.indexOf(bone.name); + if (index >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index, 1); + } + } + } + else { // Add unrecursive mixing. + for (const bone of bones) { + if (bone === currentBone) { + continue; + } + + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + + this._timelineDirty = true; + } + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public removeAllBoneMask(): void { + this._boneMask.length = 0; + this._timelineDirty = true; + } + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + public get isFadeIn(): boolean { + return this._fadeState < 0; + } + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + public get isFadeOut(): boolean { + return this._fadeState > 0; + } + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + public get isFadeComplete(): boolean { + return this._fadeState === 0; + } + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get isPlaying(): boolean { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + } + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get isCompleted(): boolean { + return this._actionTimeline.playState > 0; + } + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get currentPlayTimes(): number { + return this._actionTimeline.currentPlayTimes; + } + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public get totalTime(): number { + return this._duration; + } + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public get currentTime(): number { + return this._actionTimeline.currentTime; + } + public set currentTime(value: number) { + const currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + + if (this._time === value) { + return; + } + + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + + for (const timeline of this._boneTimelines) { + timeline.playState = -1; + } + + for (const timeline of this._slotTimelines) { + timeline.playState = -1; + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + public get clip(): AnimationData { + return this.animationData; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/animation/BaseTimelineState.ts b/reference/DragonBones/src/dragonBones/animation/BaseTimelineState.ts new file mode 100644 index 0000000..05632f0 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/animation/BaseTimelineState.ts @@ -0,0 +1,340 @@ +namespace dragonBones { + /** + * @internal + * @private + */ + export const enum TweenState { + None, + Once, + Always + } + /** + * @internal + * @private + */ + export abstract class TimelineState extends BaseObject { + public playState: number; // -1: start, 0: play, 1: complete; + public currentPlayTimes: number; + public currentTime: number; + + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + + protected _onClear(): void { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + + this._tweenState = TweenState.None; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null as any; // + this._animationData = null as any; // + this._timelineData = null as any; // + this._armature = null as any; // + this._animationState = null as any; // + this._actionTimeline = null as any; // + this._frameArray = null as any; // + this._frameIntArray = null as any; // + this._frameFloatArray = null as any; // + this._timelineArray = null as any; // + this._frameIndices = null as any; // + } + + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + + protected _setCurrentTime(passedTime: number): boolean { + const prevState = this.playState; + const prevPlayTimes = this.currentPlayTimes; + const prevTime = this.currentTime; + + if (this._actionTimeline !== null && this._frameCount <= 1) { // No frame or only one frame. + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { // Action timeline or has scale and offset. + const playTimes = this._animationState.playTimes; + const totalTime = playTimes * this._duration; + + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + + this.currentTime += this._position; + } + else { // Multi frames. + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + + // Clear frame flag when timeline start or loopComplete. + if ( + (prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes) + ) { + this._frameIndex = -1; + } + + return true; + } + + public init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + + if (this === this._actionTimeline) { + this._actionTimeline = null as any; // + } + + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + + this._frameCount = this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineKeyFrameCount]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineFrameValueOffset]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineScale]; + this._timeOffset = this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineOffset] * 0.01; + } + } + + public fadeOut(): void { } + + public update(passedTime: number): void { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + const timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + const frameIndex = this._frameIndices[(this._timelineData as TimelineData).frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + BinaryOffset.TimelineFrameOffset + this._frameIndex]; + + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { // May be pose timeline. + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineFrameOffset]; + } + + this._onArriveAtFrame(); + } + + if (this._tweenState !== TweenState.None) { + this._onUpdateFrame(); + } + } + } + } + /** + * @internal + * @private + */ + export abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType: TweenType, progress: number, easing: number): number { + let value = progress; + + switch (tweenType) { + case TweenType.QuadIn: + value = Math.pow(progress, 2.0); + break; + + case TweenType.QuadOut: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + + case TweenType.QuadInOut: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + + return (value - progress) * easing + progress; + } + + private static _getEasingCurveValue(progress: number, samples: Array | Int16Array, count: number, offset: number): number { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + + const segmentCount = count + 1; // + 2 - 1 + const valueIndex = Math.floor(progress * segmentCount); + const fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + const toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + } + + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + + protected _onClear(): void { + super._onClear(); + + this._tweenType = TweenType.None; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + } + + protected _onArriveAtFrame(): void { + if ( + this._frameCount > 1 && + ( + this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1 + ) + ) { + this._tweenType = this._frameArray[this._frameOffset + BinaryOffset.FrameTweenType]; // TODO recode ture tween type. + this._tweenState = this._tweenType === TweenType.None ? TweenState.Once : TweenState.Always; + if (this._tweenType === TweenType.Curve) { + this._curveCount = this._frameArray[this._frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount]; + } + else if (this._tweenType !== TweenType.None && this._tweenType !== TweenType.Line) { + this._tweenEasing = this._frameArray[this._frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount] * 0.01; + } + + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + const nextFrameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + BinaryOffset.TimelineFrameOffset + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = TweenState.Once; + } + } + + protected _onUpdateFrame(): void { + if (this._tweenState === TweenState.Always) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === TweenType.Curve) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + BinaryOffset.FrameCurveSamples); + } + else if (this._tweenType !== TweenType.Line) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + } + } + /** + * @internal + * @private + */ + export abstract class BoneTimelineState extends TweenTimelineState { + public bone: Bone; + public bonePose: BonePose; + + protected _onClear(): void { + super._onClear(); + + this.bone = null as any; // + this.bonePose = null as any; // + } + } + /** + * @internal + * @private + */ + export abstract class SlotTimelineState extends TweenTimelineState { + public slot: Slot; + + protected _onClear(): void { + super._onClear(); + + this.slot = null as any; // + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/animation/IAnimatable.ts b/reference/DragonBones/src/dragonBones/animation/IAnimatable.ts new file mode 100644 index 0000000..adbb9ac --- /dev/null +++ b/reference/DragonBones/src/dragonBones/animation/IAnimatable.ts @@ -0,0 +1,25 @@ +namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + export interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/animation/TimelineState.ts b/reference/DragonBones/src/dragonBones/animation/TimelineState.ts new file mode 100644 index 0000000..2b614b9 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/animation/TimelineState.ts @@ -0,0 +1,714 @@ +namespace dragonBones { + /** + * @internal + * @private + */ + export class ActionTimelineState extends TimelineState { + public static toString(): string { + return "[class dragonBones.ActionTimelineState]"; + } + + private _onCrossFrame(frameIndex: number): void { + const eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + const frameOffset = this._animationData.frameOffset + this._timelineArray[(this._timelineData as TimelineData).offset + BinaryOffset.TimelineFrameOffset + frameIndex]; + const actionCount = this._frameArray[frameOffset + 1]; + const actions = this._armature.armatureData.actions; + for (let i = 0; i < actionCount; ++i) { + const actionIndex = this._frameArray[frameOffset + 2 + i]; + const action = actions[actionIndex]; + if (action.type === ActionType.Play) { + if (action.slot !== null) { + const slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + const childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (const slot of this._armature.getSlots()) { + const childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + const eventType = action.type === ActionType.Frame ? EventObject.FRAME_EVENT : EventObject.SOUND_EVENT; + if (action.type === ActionType.Sound || eventDispatcher.hasEvent(eventType)) { + const eventObject = BaseObject.borrowObject(EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + } + + protected _onArriveAtFrame(): void { } + protected _onUpdateFrame(): void { } + + public update(passedTime: number): void { + const prevState = this.playState; + let prevPlayTimes = this.currentPlayTimes; + let prevTime = this.currentTime; + + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + const eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { // Reset zorder to pose. + this._armature._sortZOrder(null, 0); + } + + prevPlayTimes = this.currentPlayTimes; + + if (eventDispatcher.hasEvent(EventObject.START)) { + const eventObject = BaseObject.borrowObject(EventObject); + eventObject.type = EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + + const isReverse = this._animationState.timeScale < 0.0; + let loopCompleteEvent: EventObject | null = null; + let completeEvent: EventObject | null = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = BaseObject.borrowObject(EventObject); + loopCompleteEvent.type = EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + + if (this.playState > 0) { + if (eventDispatcher.hasEvent(EventObject.COMPLETE)) { + completeEvent = BaseObject.borrowObject(EventObject); + completeEvent.type = EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + + } + } + + if (this._frameCount > 1) { + const timelineData = this._timelineData as TimelineData; + const timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + const frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { // Arrive at frame. + let crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + BinaryOffset.TimelineFrameOffset + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + const prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { // Start. + if (crossedFrameIndex === frameIndex) { // Uncrossed. + crossedFrameIndex = -1; + } + } + } + + while (crossedFrameIndex >= 0) { + const frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + BinaryOffset.TimelineFrameOffset + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + const framePosition = this._frameArray[frameOffset] / this._frameRate; + if ( + this._position <= framePosition && + framePosition <= this._position + this._duration + ) { // Support interval play. + this._onCrossFrame(crossedFrameIndex); + } + + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { // Add loop complete event after first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + const prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + const frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + BinaryOffset.TimelineFrameOffset + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + const framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { // Start. + if (prevTime <= framePosition) { // Crossed. + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { // Uncrossed. + crossedFrameIndex = -1; + } + } + } + + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + + const frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + BinaryOffset.TimelineFrameOffset + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + const framePosition = this._frameArray[frameOffset] / this._frameRate; + if ( + this._position <= framePosition && + framePosition <= this._position + this._duration + ) { // Support interval play. + this._onCrossFrame(crossedFrameIndex); + } + + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { // Add loop complete event before first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineFrameOffset]; + // Arrive at frame. + const framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { // Start. + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { // Loop complete. + if (!isReverse && loopCompleteEvent !== null) { // Add loop complete event before first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + this._onCrossFrame(this._frameIndex); + } + } + } + + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + } + + public setCurrentTime(value: number): void { + this._setCurrentTime(value); + this._frameIndex = -1; + } + } + /** + * @internal + * @private + */ + export class ZOrderTimelineState extends TimelineState { + public static toString(): string { + return "[class dragonBones.ZOrderTimelineState]"; + } + + protected _onArriveAtFrame(): void { + if (this.playState >= 0) { + const count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + } + + protected _onUpdateFrame(): void { } + } + /** + * @internal + * @private + */ + export class BoneAllTimelineState extends BoneTimelineState { + public static toString(): string { + return "[class dragonBones.BoneAllTimelineState]"; + } + + protected _onArriveAtFrame(): void { + super._onArriveAtFrame(); + + if (this._timelineData !== null) { + const frameFloatArray = this._dragonBonesData.frameFloatArray; + const current = this.bonePose.current; + const delta = this.bonePose.delta; + let valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + + if (this._tweenState === TweenState.Always) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { // Pose. + const current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + } + + protected _onUpdateFrame(): void { + super._onUpdateFrame(); + + const current = this.bonePose.current; + const delta = this.bonePose.delta; + const result = this.bonePose.result; + + this.bone._transformDirty = true; + if (this._tweenState !== TweenState.Always) { + this._tweenState = TweenState.None; + } + + const scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + } + + public fadeOut(): void { + const result = this.bonePose.result; + result.rotation = Transform.normalizeRadian(result.rotation); + result.skew = Transform.normalizeRadian(result.skew); + } + } + /** + * @internal + * @private + */ + export class SlotDislayIndexTimelineState extends SlotTimelineState { + public static toString(): string { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + } + + protected _onArriveAtFrame(): void { + if (this.playState >= 0) { + const displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + } + } + /** + * @internal + * @private + */ + export class SlotColorTimelineState extends SlotTimelineState { + public static toString(): string { + return "[class dragonBones.SlotColorTimelineState]"; + } + + private _dirty: boolean; + private readonly _current: Array = [0, 0, 0, 0, 0, 0, 0, 0]; + private readonly _delta: Array = [0, 0, 0, 0, 0, 0, 0, 0]; + private readonly _result: Array = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + + protected _onClear(): void { + super._onClear(); + + this._dirty = false; + } + + protected _onArriveAtFrame(): void { + super._onArriveAtFrame(); + + if (this._timelineData !== null) { + const intArray = this._dragonBonesData.intArray; + const frameIntArray = this._dragonBonesData.frameIntArray; + const valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + let colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + + if (this._tweenState === TweenState.Always) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { // Pose. + const color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + } + + protected _onUpdateFrame(): void { + super._onUpdateFrame(); + + this._dirty = true; + if (this._tweenState !== TweenState.Always) { + this._tweenState = TweenState.None; + } + + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + } + + public fadeOut(): void { + this._tweenState = TweenState.None; + this._dirty = false; + } + + public update(passedTime: number): void { + super.update(passedTime); + + // Fade animation. + if (this._tweenState !== TweenState.None || this._dirty) { + const result = this.slot._colorTransform; + + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if ( + result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7] + ) { + const fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if ( + result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7] + ) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + + this.slot._colorDirty = true; + } + } + } + } + } + /** + * @internal + * @private + */ + export class SlotFFDTimelineState extends SlotTimelineState { + public static toString(): string { + return "[class dragonBones.SlotFFDTimelineState]"; + } + + public meshOffset: number; + + private _dirty: boolean; + private _frameFloatOffset: number; + private _valueCount: number; + private _ffdCount: number; + private _valueOffset: number; + private readonly _current: Array = []; + private readonly _delta: Array = []; + private readonly _result: Array = []; + + protected _onClear(): void { + super._onClear(); + + this.meshOffset = 0; + + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + } + + protected _onArriveAtFrame(): void { + super._onArriveAtFrame(); + + if (this._timelineData !== null) { + const isTween = this._tweenState === TweenState.Always; + const frameFloatArray = this._dragonBonesData.frameFloatArray; + const valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + + if (isTween) { + let nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + + for (let i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (let i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (let i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + } + + protected _onUpdateFrame(): void { + super._onUpdateFrame(); + + this._dirty = true; + if (this._tweenState !== TweenState.Always) { + this._tweenState = TweenState.None; + } + + for (let i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + } + + public init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void { + super.init(armature, animationState, timelineData); + + if (this._timelineData !== null) { + const frameIntArray = this._dragonBonesData.frameIntArray; + const frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + BinaryOffset.TimelineFrameValueCount]; + this.meshOffset = frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineMeshOffset]; + this._ffdCount = frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineFFDCount]; + this._valueCount = frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineValueCount]; + this._valueOffset = frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineValueOffset]; + this._frameFloatOffset = frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineFloatOffset] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + + for (let i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + } + + public fadeOut(): void { + this._tweenState = TweenState.None; + this._dirty = false; + } + + public update(passedTime: number): void { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + + super.update(passedTime); + + // Fade animation. + if (this._tweenState !== TweenState.None || this._dirty) { + const result = this.slot._ffdVertices; + if (this._timelineData !== null) { + const frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + const fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + + for (let i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + + for (let i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + const fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (let i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + + for (let i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + + this.slot._meshDirty = true; + } + } + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/animation/WorldClock.ts b/reference/DragonBones/src/dragonBones/animation/WorldClock.ts new file mode 100644 index 0000000..be10551 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/animation/WorldClock.ts @@ -0,0 +1,175 @@ +namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + export class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + public static readonly clock: WorldClock = new WorldClock(); + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public time: number = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + public timeScale: number = 1.0; + private readonly _animatebles: Array = []; + private _clock: WorldClock | null = null; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + public constructor(time: number = -1.0) { + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + public advanceTime(passedTime: number): void { + if (passedTime !== passedTime) { // isNaN + passedTime = 0.0; + } + + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + + if (passedTime === 0.0) { + return; + } + + let i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + const animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + const animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + + this._animatebles.length -= r; + } + } + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public contains(value: IAnimatable): boolean { + return this._animatebles.indexOf(value) >= 0; + } + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public add(value: IAnimatable): void { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + } + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public remove(value: IAnimatable): void { + const index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + } + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public clear(): void { + for (const animatable of this._animatebles) { + if (animatable !== null) { + animatable.clock = null; + } + } + } + /** + * @inheritDoc + */ + public get clock(): WorldClock | null { + return this._clock; + } + public set clock(value: WorldClock | null) { + if (this._clock === value) { + return; + } + + if (this._clock !== null) { + this._clock.remove(this); + } + + this._clock = value; + + if (this._clock !== null) { + this._clock.add(this); + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/Armature.ts b/reference/DragonBones/src/dragonBones/armature/Armature.ts new file mode 100644 index 0000000..1d259ae --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/Armature.ts @@ -0,0 +1,841 @@ +namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + export class Armature extends BaseObject implements IAnimatable { + public static toString(): string { + return "[class dragonBones.Armature]"; + } + private static _onSortSlots(a: Slot, b: Slot): number { + return a._zOrder > b._zOrder ? 1 : -1; + } + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + public inheritAnimation: boolean; + /** + * @private + */ + public debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + public armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public userData: any; + + private _debugDraw: boolean; + private _lockUpdate: boolean; + private _bonesDirty: boolean; + private _slotsDirty: boolean; + private _zOrderDirty: boolean; + private _flipX: boolean; + private _flipY: boolean; + /** + * @internal + * @private + */ + public _cacheFrameIndex: number; + private readonly _bones: Array = []; + private readonly _slots: Array = []; + private readonly _actions: Array = []; + private _animation: Animation = null as any; // Initial value. + private _proxy: IArmatureProxy = null as any; // Initial value. + private _display: any; + /** + * @private + */ + public _replaceTextureAtlasData: TextureAtlasData | null = null; // Initial value. + private _replacedTexture: any; + /** + * @internal + * @private + */ + public _dragonBones: DragonBones; + private _clock: WorldClock | null = null; // Initial value. + /** + * @internal + * @private + */ + public _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void { + if (this._clock !== null) { // Remove clock first. + this._clock.remove(this); + } + + for (const bone of this._bones) { + bone.returnToPool(); + } + + for (const slot of this._slots) { + slot.returnToPool(); + } + + for (const action of this._actions) { + action.returnToPool(); + } + + if (this._animation !== null) { + this._animation.returnToPool(); + } + + if (this._proxy !== null) { + this._proxy.clear(); + } + + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null as any; // + this.userData = null; + + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null as any; // + this._proxy = null as any; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null as any; // + this._clock = null; + this._parent = null; + } + + private _sortBones(): void { + const total = this._bones.length; + if (total <= 0) { + return; + } + + const sortHelper = this._bones.concat(); + let index = 0; + let count = 0; + + this._bones.length = 0; + while (count < total) { + const bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + + if (this._bones.indexOf(bone) >= 0) { + continue; + } + + if (bone.constraints.length > 0) { // Wait constraint. + let flag = false; + for (const constraint of bone.constraints) { + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + + if (flag) { + continue; + } + } + + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { // Wait parent. + continue; + } + + this._bones.push(bone); + count++; + } + } + + private _sortSlots(): void { + this._slots.sort(Armature._onSortSlots); + } + /** + * @internal + * @private + */ + public _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void { + const slotDatas = this.armatureData.sortedSlots; + const isOriginal = slotIndices === null; + + if (this._zOrderDirty || !isOriginal) { + for (let i = 0, l = slotDatas.length; i < l; ++i) { + const slotIndex = isOriginal ? i : (slotIndices as Array)[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + + const slotData = slotDatas[slotIndex]; + const slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + } + /** + * @internal + * @private + */ + public _addBoneToBoneList(value: Bone): void { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + } + /** + * @internal + * @private + */ + public _removeBoneFromBoneList(value: Bone): void { + const index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + } + /** + * @internal + * @private + */ + public _addSlotToSlotList(value: Slot): void { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + } + /** + * @internal + * @private + */ + public _removeSlotFromSlotList(value: Slot): void { + const index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + } + /** + * @internal + * @private + */ + public _bufferAction(action: ActionData, append: boolean): void { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + } + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + public dispose(): void { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + } + /** + * @private + */ + public init( + armatureData: ArmatureData, + proxy: IArmatureProxy, display: any, dragonBones: DragonBones + ): void { + if (this.armatureData !== null) { + return; + } + + this.armatureData = armatureData; + this._animation = BaseObject.borrowObject(Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + } + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + public advanceTime(passedTime: number): void { + if (this._lockUpdate) { + return; + } + + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + + const prevCacheFrameIndex = this._cacheFrameIndex; + + // Update nimation. + this._animation.advanceTime(passedTime); + + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + let i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + + if (this._actions.length > 0) { + this._lockUpdate = true; + for (const action of this._actions) { + if (action.type === ActionType.Play) { + this._animation.fadeIn(action.name); + } + } + + this._actions.length = 0; + this._lockUpdate = false; + } + + // + const drawed = this.debugDraw || DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + } + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public invalidUpdate(boneName: string | null = null, updateSlotDisplay: boolean = false): void { + if (boneName !== null && boneName.length > 0) { + const bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + + if (updateSlotDisplay) { + for (const slot of this._slots) { + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (const bone of this._bones) { + bone.invalidUpdate(); + } + + if (updateSlotDisplay) { + for (const slot of this._slots) { + slot.invalidUpdate(); + } + } + } + } + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + public containsPoint(x: number, y: number): Slot | null { + for (const slot of this._slots) { + if (slot.containsPoint(x, y)) { + return slot; + } + } + + return null; + } + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): Slot | null { + const isV = xA === xB; + let dMin = 0.0; + let dMax = 0.0; + let intXA = 0.0; + let intYA = 0.0; + let intXB = 0.0; + let intYB = 0.0; + let intAN = 0.0; + let intBN = 0.0; + let intSlotA: Slot | null = null; + let intSlotB: Slot | null = null; + + for (const slot of this._slots) { + const intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + let d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + + if (intersectionPointB !== null) { + let d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + + return intSlotA; + } + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + public getBone(name: string): Bone | null { + for (const bone of this._bones) { + if (bone.name === name) { + return bone; + } + } + + return null; + } + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + public getBoneByDisplay(display: any): Bone | null { + const slot = this.getSlotByDisplay(display); + + return slot !== null ? slot.parent : null; + } + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public getSlot(name: string): Slot | null { + for (const slot of this._slots) { + if (slot.name === name) { + return slot; + } + } + + return null; + } + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public getSlotByDisplay(display: any): Slot | null { + if (display !== null) { + for (const slot of this._slots) { + if (slot.display === display) { + return slot; + } + } + } + + return null; + } + /** + * @deprecated + */ + public addBone(value: Bone, parentName: string | null = null): void { + console.assert(value !== null); + + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + } + /** + * @deprecated + */ + public removeBone(value: Bone): void { + console.assert(value !== null && value.armature === this); + + value._setParent(null); + value._setArmature(null); + } + /** + * @deprecated + */ + public addSlot(value: Slot, parentName: string): void { + const bone = this.getBone(parentName); + + console.assert(value !== null && bone !== null); + + value._setArmature(this); + value._setParent(bone); + } + /** + * @deprecated + */ + public removeSlot(value: Slot): void { + console.assert(value !== null && value.armature === this); + + value._setParent(null); + value._setArmature(null); + } + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + public getBones(): Array { + return this._bones; + } + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public getSlots(): Array { + return this._slots; + } + + public get flipX(): boolean { + return this._flipX; + } + public set flipX(value: boolean) { + if (this._flipX === value) { + return; + } + + this._flipX = value; + this.invalidUpdate(); + } + + public get flipY(): boolean { + return this._flipY; + } + public set flipY(value: boolean) { + if (this._flipY === value) { + return; + } + + this._flipY = value; + this.invalidUpdate(); + } + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + public get cacheFrameRate(): number { + return this.armatureData.cacheFrameRate; + } + public set cacheFrameRate(value: number) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + + // Set child armature frameRate. + for (const slot of this._slots) { + const childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + } + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + public get name(): string { + return this.armatureData.name; + } + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + public get animation(): Animation { + return this._animation; + } + /** + * @pivate + */ + public get proxy(): IArmatureProxy { + return this._proxy; + } + /** + * @pivate + */ + public get eventDispatcher(): IEventDispatcher { + return this._proxy; + } + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get display(): any { + return this._display; + } + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + public get replacedTexture(): any { + return this._replacedTexture; + } + public set replacedTexture(value: any) { + if (this._replacedTexture === value) { + return; + } + + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + + this._replacedTexture = value; + + for (const slot of this._slots) { + slot.invalidUpdate(); + slot.update(-1); + } + } + /** + * @inheritDoc + */ + public get clock(): WorldClock | null { + return this._clock; + } + public set clock(value: WorldClock | null) { + if (this._clock === value) { + return; + } + + if (this._clock !== null) { + this._clock.remove(this); + } + + this._clock = value; + + if (this._clock) { + this._clock.add(this); + } + + // Update childArmature clock. + for (const slot of this._slots) { + const childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + } + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + public get parent(): Slot | null { + return this._parent; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + public replaceTexture(texture: any): void { + this.replacedTexture = texture; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + public hasEventListener(type: EventStringType): boolean { + return this._proxy.hasEvent(type); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + public addEventListener(type: EventStringType, listener: Function, target: any): void { + this._proxy.addEvent(type, listener, target); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + public removeEventListener(type: EventStringType, listener: Function, target: any): void { + this._proxy.removeEvent(type, listener, target); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + public enableAnimationCache(frameRate: number): void { + this.cacheFrameRate = frameRate; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + public getDisplay(): any { + return this._display; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/Bone.ts b/reference/DragonBones/src/dragonBones/armature/Bone.ts new file mode 100644 index 0000000..668b513 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/Bone.ts @@ -0,0 +1,503 @@ +namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + export class Bone extends TransformObject { + public static toString(): string { + return "[class dragonBones.Bone]"; + } + /** + * @private + */ + public offsetMode: OffsetMode; + /** + * @internal + * @private + */ + public readonly animationPose: Transform = new Transform(); + /** + * @internal + * @private + */ + public readonly constraints: Array = []; + /** + * @readonly + */ + public boneData: BoneData; + /** + * @internal + * @private + */ + public _transformDirty: boolean; + /** + * @internal + * @private + */ + public _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + public _blendDirty: boolean; + private _localDirty: boolean; + private _visible: boolean; + private _cachedFrameIndex: number; + /** + * @internal + * @private + */ + public _blendLayer: number; + /** + * @internal + * @private + */ + public _blendLeftWeight: number; + /** + * @internal + * @private + */ + public _blendLayerWeight: number; + private readonly _bones: Array = []; + private readonly _slots: Array = []; + /** + * @internal + * @private + */ + public _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + for (const constraint of this.constraints) { + constraint.returnToPool(); + } + + this.offsetMode = OffsetMode.Additive; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null as any; // + + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + } + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache: boolean): void { + const flipX = this._armature.flipX; + const flipY = this._armature.flipY === DragonBones.yDown; + const global = this.global; + const globalTransformMatrix = this.globalTransformMatrix; + let inherit = this._parent !== null; + let dR = 0.0; + + if (this.offsetMode === OffsetMode.Additive) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === OffsetMode.None) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + + if (inherit) { + const parentMatrix = this._parent.globalTransformMatrix; + + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + const x = global.x; + const y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + + if (flipY) { + global.y = -global.y; + } + } + + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + + global.skew += Math.PI; + } + + global.rotation += dR; + } + + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + + if (flipY) { + global.y = -global.y; + } + + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + + global.skew += Math.PI; + } + + global.rotation += dR; + } + + global.toMatrix(globalTransformMatrix); + } + } + /** + * @internal + * @private + */ + public _setArmature(value: Armature | null): void { + if (this._armature === value) { + return; + } + + let oldSlots: Array | null = null; + let oldBones: Array | null = null; + + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + + this._armature = value as any; // + + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + + if (oldSlots !== null) { + for (const slot of oldSlots) { + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + + if (oldBones !== null) { + for (const bone of oldBones) { + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + } + /** + * @internal + * @private + */ + public init(boneData: BoneData): void { + if (this.boneData !== null) { + return; + } + + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + } + /** + * @internal + * @private + */ + public update(cacheFrameIndex: number): void { + this._blendDirty = false; + + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + const cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { // Same cache. + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { // Has been Cached. + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { // Update constraints. + for (const constraint of this.constraints) { + constraint.update(); + } + } + + if ( + this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty) + ) { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { // Same cache, but not set index yet. + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { // Update constraints. + for (const constraint of this.constraints) { + constraint.update(); + } + } + + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { // Dirty. + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + + if (this._cachedFrameIndex < 0) { + const isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + + this._localDirty = true; + } + /** + * @internal + * @private + */ + public updateByConstraint(): void { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + + this._transformDirty = true; + } + } + /** + * @internal + * @private + */ + public addConstraint(constraint: Constraint): void { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + } + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + public invalidUpdate(): void { + this._transformDirty = true; + } + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + public contains(child: TransformObject): boolean { + if (child === this) { + return false; + } + + let ancestor: TransformObject | null = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + + return ancestor === this; + } + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public getBones(): Array { + this._bones.length = 0; + + for (const bone of this._armature.getBones()) { + if (bone.parent === this) { + this._bones.push(bone); + } + } + + return this._bones; + } + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public getSlots(): Array { + this._slots.length = 0; + + for (const slot of this._armature.getSlots()) { + if (slot.parent === this) { + this._slots.push(slot); + } + } + + return this._slots; + } + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + public get visible(): boolean { + return this._visible; + } + public set visible(value: boolean) { + if (this._visible === value) { + return; + } + + this._visible = value; + + for (const slot of this._armature.getSlots()) { + if (slot._parent === this) { + slot._updateVisible(); + } + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + public get length(): number { + return this.boneData.length; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + public get slot(): Slot | null { + for (const slot of this._armature.getSlots()) { + if (slot.parent === this) { + return slot; + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/Constraint.ts b/reference/DragonBones/src/dragonBones/armature/Constraint.ts new file mode 100644 index 0000000..7cb84db --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/Constraint.ts @@ -0,0 +1,150 @@ +namespace dragonBones { + /** + * @private + * @internal + */ + export abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix = new Matrix(); + protected static readonly _helpTransform: Transform = new Transform(); + protected static readonly _helpPoint: Point = new Point(); + + public target: Bone; + public bone: Bone; + public root: Bone | null; + + protected _onClear(): void { + this.target = null as any; // + this.bone = null as any; // + this.root = null; // + } + + public abstract update(): void; + } + /** + * @private + * @internal + */ + export class IKConstraint extends Constraint { + public static toString(): string { + return "[class dragonBones.IKConstraint]"; + } + + public bendPositive: boolean; + public scaleEnabled: boolean; // TODO + public weight: number; + + protected _onClear(): void { + super._onClear(); + + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + } + + private _computeA(): void { + const ikGlobal = this.target.global; + const global = this.bone.global; + const globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + + let ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + } + + private _computeB(): void { + const boneLength = this.bone.boneData.length; + const parent = this.root as Bone; + const ikGlobal = this.target.global; + const parentGlobal = parent.global; + const global = this.bone.global; + const globalTransformMatrix = this.bone.globalTransformMatrix; + + const x = globalTransformMatrix.a * boneLength; + const y = globalTransformMatrix.b * boneLength; + + const lLL = x * x + y * y; + const lL = Math.sqrt(lLL); + + let dX = global.x - parentGlobal.x; + let dY = global.y - parentGlobal.y; + const lPP = dX * dX + dY * dY; + const lP = Math.sqrt(lPP); + const rawRadianA = Math.atan2(dY, dX); + + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + const lTT = dX * dX + dY * dY; + const lT = Math.sqrt(lTT); + + let ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + const h = (lPP - lLL + lTT) / (2.0 * lTT); + const r = Math.sqrt(lPP - h * h * lTT) / lT; + const hX = parentGlobal.x + (dX * h); + const hY = parentGlobal.y + (dY * h); + const rX = -dY * r; + const rY = dX * r; + + let isPPR = false; + if (parent._parent !== null) { + const parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + + let dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + + const parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + + let ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + } + + public update(): void { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/IArmatureProxy.ts b/reference/DragonBones/src/dragonBones/armature/IArmatureProxy.ts new file mode 100644 index 0000000..d29ae49 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/IArmatureProxy.ts @@ -0,0 +1,41 @@ +namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + export interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/Slot.ts b/reference/DragonBones/src/dragonBones/armature/Slot.ts new file mode 100644 index 0000000..c6b8b29 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/Slot.ts @@ -0,0 +1,1005 @@ +namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + export abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + public displayController: string | null; + /** + * @readonly + */ + public slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + public _colorDirty: boolean; + /** + * @private + */ + public _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + public _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + public _pivotX: number; + /** + * @private + */ + public _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix = new Matrix(); + /** + * @private + */ + public readonly _colorTransform: ColorTransform = new ColorTransform(); + /** + * @private + */ + public readonly _ffdVertices: Array = []; + /** + * @private + */ + public readonly _displayDatas: Array = []; + /** + * @private + */ + protected readonly _displayList: Array = []; + /** + * @private + */ + protected readonly _meshBones: Array = []; + /** + * @internal + * @private + */ + public _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + public _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any = null; // Initial value. + /** + * @private + */ + protected _meshDisplay: any = null; // Initial value. + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + public _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + const disposeDisplayList: Array = []; + for (const eachDisplay of this._displayList) { + if ( + eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0 + ) { + disposeDisplayList.push(eachDisplay); + } + } + + for (const eachDisplay of disposeDisplayList) { + if (eachDisplay instanceof Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { // May be _meshDisplay and _rawDisplay is the same one. + this._disposeDisplay(this._meshDisplay); + } + + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + + this.displayController = null; + this.slotData = null as any; // + + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = BlendMode.Normal; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null as any; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + } + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + public abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void { + const prevDisplayData = this._displayData; + const prevTextureData = this._textureData; + const prevMeshData = this._meshData; + const rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === DisplayType.Image || this._displayData.type === DisplayType.Mesh) { + this._textureData = (this._displayData as ImageDisplayData).texture; + if (this._displayData.type === DisplayType.Mesh) { + this._meshData = this._displayData as MeshDisplayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === DisplayType.Mesh) { + this._meshData = rawDisplayData as MeshDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === DisplayType.BoundingBox) { + this._boundingBoxData = (this._displayData as BoundingBoxDisplayData).boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === DisplayType.BoundingBox) { + this._boundingBoxData = (rawDisplayData as BoundingBoxDisplayData).boundingBox; + } + else { + this._boundingBoxData = null; + } + + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + const imageDisplayData = this._displayData as ImageDisplayData; + const scale = this._armature.armatureData.scale; + const frame = this._textureData.frame; + + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + + const rect = frame !== null ? frame : this._textureData.region; + let width = rect.width * scale; + let height = rect.height * scale; + + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + + this._pivotX *= width; + this._pivotY *= height; + + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { // && this._meshData === this._displayData + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + + for (let i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + const vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + BinaryOffset.MeshVertexCount]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + + for (let i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { // Update mesh after update frame. + this._meshDirty = true; + } + + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + + this._displayDirty = true; + this._transformDirty = true; + } + } + /** + * @private + */ + protected _updateDisplay(): void { + const prevDisplay = this._display !== null ? this._display : this._rawDisplay; + const prevChildArmature = this._childArmature; + + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof Armature) { + this._childArmature = this._display as Armature; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + + // Update display. + const currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { // Set child armature cache frameRate. + if (this._childArmature.cacheFrameRate === 0) { + const cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + + // Child armature action. + let actions: Array | null = null; + if (this._displayData !== null && this._displayData.type === DisplayType.Armature) { + actions = (this._displayData as ArmatureDisplayData).actions; + } + else { + const rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === DisplayType.Armature) { + actions = (rawDisplayData as ArmatureDisplayData).actions; + } + } + + if (actions !== null && actions.length > 0) { + for (const action of actions) { + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + } + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean { + for (const bone of this._meshBones) { + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + + return false; + } + /** + * @internal + * @private + */ + public _setArmature(value: Armature | null): void { + if (this._armature === value) { + return; + } + + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + + this._armature = value as any; // + + this._onUpdateDisplay(); + + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + } + /** + * @internal + * @private + */ + public _setDisplayIndex(value: number, isAnimation: boolean = false): boolean { + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + + this._animationDisplayIndex = value; + } + + if (this._displayIndex === value) { + return false; + } + + this._displayIndex = value; + this._displayDirty = true; + + this._updateDisplayData(); + + return this._displayDirty; + } + /** + * @internal + * @private + */ + public _setZorder(value: number): boolean { + if (this._zOrder === value) { + //return false; + } + + this._zOrder = value; + this._zOrderDirty = true; + + return this._zOrderDirty; + } + /** + * @internal + * @private + */ + public _setColor(value: ColorTransform): boolean { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + + return this._colorDirty; + } + /** + * @private + */ + public _setDisplayList(value: Array | null): boolean { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + + for (let i = 0, l = value.length; i < l; ++i) { // Retain input render displays. + const eachDisplay = value[i]; + if ( + eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof Armature) && this._displayList.indexOf(eachDisplay) < 0 + ) { + this._initDisplay(eachDisplay); + } + + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + + this._updateDisplayData(); + + return this._displayDirty; + } + /** + * @private + */ + public init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void { + if (this.slotData !== null) { + return; + } + + this.slotData = slotData; + this.name = this.slotData.name; + + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + + this._displayDatas.length = this._rawDisplayDatas.length; + for (let i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + } + /** + * @internal + * @private + */ + public update(cacheFrameIndex: number): void { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + + if (this._transformDirty) { // Update local matrix. (Only updated when both display and transform are dirty.) + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + const cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { // Same cache. + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { // Has been Cached. + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { // Same cache, but not set index yet. + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { // Dirty. + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + + if (this._display === null) { + return; + } + + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + + if (this._meshData !== null && this._display === this._meshDisplay) { + const isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + + return; + } + } + + if (this._transformDirty) { + this._transformDirty = false; + + if (this._cachedFrameIndex < 0) { + const isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + + this._updateTransform(false); + } + } + /** + * @private + */ + public updateTransformAndMatrix(): void { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + } + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + public containsPoint(x: number, y: number): boolean { + if (this._boundingBoxData === null) { + return false; + } + + this.updateTransformAndMatrix(); + + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + } + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + public intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + if (this._boundingBoxData === null) { + return 0; + } + + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + + const intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + + return intersectionCount; + } + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public invalidUpdate(): void { + this._displayDirty = true; + this._transformDirty = true; + } + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public get displayIndex(): number { + return this._displayIndex; + } + public set displayIndex(value: number) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + } + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get displayList(): Array { + return this._displayList.concat(); + } + public set displayList(value: Array) { + const backupDisplayList = this._displayList.concat(); // Copy. + const disposeDisplayList = new Array(); + + if (this._setDisplayList(value)) { + this.update(-1); + } + + // Release replaced displays. + for (const eachDisplay of backupDisplayList) { + if ( + eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0 + ) { + disposeDisplayList.push(eachDisplay); + } + } + + for (const eachDisplay of disposeDisplayList) { + if (eachDisplay instanceof Armature) { + (eachDisplay as Armature).dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + } + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + public get boundingBoxData(): BoundingBoxData | null { + return this._boundingBoxData; + } + /** + * @private + */ + public get rawDisplay(): any { + return this._rawDisplay; + } + /** + * @private + */ + public get meshDisplay(): any { + return this._meshDisplay; + } + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get display(): any { + return this._display; + } + public set display(value: any) { + if (this._display === value) { + return; + } + + const displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { // Emprty. + this._displayIndex = 0; + } + + if (this._displayIndex < 0) { + return; + } + else { + const replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + } + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + public get childArmature(): Armature | null { + return this._childArmature; + } + public set childArmature(value: Armature | null) { + if (this._childArmature === value) { + return; + } + + this.display = value; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + public getDisplay(): any { + return this._display; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + public setDisplay(value: any) { + this.display = value; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/armature/TransformObject.ts b/reference/DragonBones/src/dragonBones/armature/TransformObject.ts new file mode 100644 index 0000000..dfb31f4 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/armature/TransformObject.ts @@ -0,0 +1,129 @@ +namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + export abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix = new Matrix(); + /** + * @private + */ + protected static readonly _helpTransform: Transform = new Transform(); + /** + * @private + */ + protected static readonly _helpPoint: Point = new Point(); + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly globalTransformMatrix: Matrix = new Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly global: Transform = new Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly offset: Transform = new Transform(); + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + public origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + public _armature: Armature; + /** + * @private + */ + public _parent: Bone; + /** + * @private + */ + protected _onClear(): void { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null as any; // + this.userData = null; + + this._globalDirty = false; + this._armature = null as any; // + this._parent = null as any; // + } + /** + * @internal + * @private + */ + public _setArmature(value: Armature | null): void { + this._armature = value as any; + } + /** + * @internal + * @private + */ + public _setParent(value: Bone | null): void { + this._parent = value as any; + } + /** + * @private + */ + public updateGlobalTransform(): void { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + } + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + public get armature(): Armature { + return this._armature; + } + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + public get parent(): Bone { + return this._parent; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/core/BaseObject.ts b/reference/DragonBones/src/dragonBones/core/BaseObject.ts new file mode 100644 index 0000000..e80be0f --- /dev/null +++ b/reference/DragonBones/src/dragonBones/core/BaseObject.ts @@ -0,0 +1,133 @@ +namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + export abstract class BaseObject { + private static _hashCode: number = 0; + private static _defaultMaxCount: number = 1000; + private static readonly _maxCountMap: Map = {}; + private static readonly _poolsMap: Map> = {}; + + private static _returnObject(object: BaseObject): void { + const classType = String(object.constructor); + const maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + const pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + } + /** + * @private + */ + public static toString(): string { + throw new Error(); + } + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + public static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void { + if (maxCount < 0 || maxCount !== maxCount) { // isNaN + maxCount = 0; + } + + if (objectConstructor !== null) { + const classType = String(objectConstructor); + const pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (let classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + + const pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + + BaseObject._maxCountMap[classType] = maxCount; + } + } + } + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + public static clearPool(objectConstructor: (typeof BaseObject) | null = null): void { + if (objectConstructor !== null) { + const classType = String(objectConstructor); + const pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (let k in BaseObject._poolsMap) { + const pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + } + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static borrowObject(objectConstructor: { new (): T; }): T { + const classType = String(objectConstructor); + const pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + const object = pool.pop() as T; + object._isInPool = false; + return object; + } + + const object = new objectConstructor(); + object._onClear(); + return object; + } + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public readonly hashCode: number = BaseObject._hashCode++; + private _isInPool: boolean = false; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public returnToPool(): void { + this._onClear(); + BaseObject._returnObject(this); + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/core/DragonBones.ts b/reference/DragonBones/src/dragonBones/core/DragonBones.ts new file mode 100644 index 0000000..db2f505 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/core/DragonBones.ts @@ -0,0 +1,259 @@ + + +namespace dragonBones { + /** + * @private + */ + export const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4 + } + /** + * @private + */ + export const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2 + } + /** + * @private + */ + export const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3 + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + export const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2 + } + /** + * @private + */ + export const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11 + } + /** + * @private + */ + export const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13 + } + /** + * @private + */ + export const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5 + } + /** + * @private + */ + export const enum TimelineType { + Action = 0, + ZOrder = 1, + + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + + AnimationTime = 40, + AnimationWeight = 41 + } + /** + * @private + */ + export const enum OffsetMode { + None, + Additive, + Override + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + export const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5 + } + /** + * @private + */ + export interface Map { + [key: string]: T; + } + /** + * @private + */ + export class DragonBones { + public static yDown: boolean = true; + public static debug: boolean = false; + public static debugDraw: boolean = false; + public static webAssembly: boolean = false; + public static readonly VERSION: string = "5.1.0"; + + private readonly _clock: WorldClock = new WorldClock(); + private readonly _events: Array = []; + private readonly _objects: Array = []; + private _eventManager: IEventDispatcher = null as any; + + public constructor(eventManager: IEventDispatcher) { + this._eventManager = eventManager; + } + + public advanceTime(passedTime: number): void { + if (this._objects.length > 0) { + for (const object of this._objects) { + object.returnToPool(); + } + + this._objects.length = 0; + } + + this._clock.advanceTime(passedTime); + + if (this._events.length > 0) { + for (let i = 0; i < this._events.length; ++i) { + const eventObject = this._events[i]; + const armature = eventObject.armature; + + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + + this.bufferObject(eventObject); + } + + this._events.length = 0; + } + } + + public bufferEvent(value: EventObject): void { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + } + + public bufferObject(object: BaseObject): void { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + } + + public get clock(): WorldClock { + return this._clock; + } + + public get eventManager(): IEventDispatcher { + return this._eventManager; + } + } + + if (!console.warn) { + console.warn = function () { }; + } + + if (!console.assert) { + console.assert = function () { }; + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/event/EventObject.ts b/reference/DragonBones/src/dragonBones/event/EventObject.ts new file mode 100644 index 0000000..6764435 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/event/EventObject.ts @@ -0,0 +1,129 @@ +namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + export class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly START: string = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly LOOP_COMPLETE: string = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly COMPLETE: string = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly FADE_IN: string = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly FADE_IN_COMPLETE: string = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly FADE_OUT: string = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly FADE_OUT_COMPLETE: string = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly FRAME_EVENT: string = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public static readonly SOUND_EVENT: string = "soundEvent"; + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.EventObject]"; + } + /** + * @private + */ + public time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + public name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + public data: UserData | null; + /** + * @private + */ + protected _onClear(): void { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null as any; + this.bone = null; + this.slot = null; + this.animationState = null as any; + this.data = null; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/event/IEventDispatcher.ts b/reference/DragonBones/src/dragonBones/event/IEventDispatcher.ts new file mode 100644 index 0000000..8dc7f6a --- /dev/null +++ b/reference/DragonBones/src/dragonBones/event/IEventDispatcher.ts @@ -0,0 +1,43 @@ +namespace dragonBones { + /** + * @private + */ + export type EventStringType = + string | "start" | "loopComplete" | "complete" | + "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | + "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + export interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/factory/BaseFactory.ts b/reference/DragonBones/src/dragonBones/factory/BaseFactory.ts new file mode 100644 index 0000000..a11eda2 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/factory/BaseFactory.ts @@ -0,0 +1,813 @@ +namespace dragonBones { + /** + * @private + */ + export class BuildArmaturePackage { + public dataName: string = ""; + public textureAtlasName: string = ""; + public data: DragonBonesData; + public armature: ArmatureData; + public skin: SkinData | null = null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + export abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser = null as any; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser = null as any; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + public autoSearch: boolean = false; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map = {}; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map> = {}; + /** + * @private + */ + protected _dragonBones: DragonBones = null as any; + /** + * @private + */ + protected _dataParser: DataParser = null as any; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public constructor(dataParser: DataParser | null = null) { + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new ObjectDataParser(); + } + + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new BinaryDataParser(); + } + + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + protected _isSupportMesh(): boolean { + return true; + } + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null { + if (textureAtlasName in this._textureAtlasDataMap) { + for (const textureAtlasData of this._textureAtlasDataMap[textureAtlasName]) { + const textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + + if (this.autoSearch) { // Will be search all data, if the autoSearch is true. + for (let k in this._textureAtlasDataMap) { + for (const textureAtlasData of this._textureAtlasDataMap[k]) { + if (textureAtlasData.autoSearch) { + const textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + + return null; + } + /** + * @private + */ + protected _fillBuildArmaturePackage( + dataPackage: BuildArmaturePackage, + dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string + ): boolean { + let dragonBonesData: DragonBonesData | null = null; + let armatureData: ArmatureData | null = null; + + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { // Will be search all data, if do not give a data name or the autoSearch is true. + for (let k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData as any; + dataPackage.armature = armatureData; + dataPackage.skin = null; + + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (let k in this._dragonBonesDataMap) { + const skinDragonBonesData = this._dragonBonesDataMap[k]; + const skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + + return true; + } + + return false; + } + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void { + const bones = dataPackage.armature.sortedBones; + for (let i = 0; i < (DragonBones.webAssembly ? (bones as any).size() : bones.length); ++i) { + const boneData = DragonBones.webAssembly ? (bones as any).get(i) as BoneData : bones[i]; + const bone = DragonBones.webAssembly ? new Module["Bone"]() as Bone : BaseObject.borrowObject(Bone); + bone.init(boneData); + + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + + const constraints = boneData.constraints; + for (let j = 0; j < (DragonBones.webAssembly ? (constraints as any).size() : constraints.length); ++j) { + const constraintData = DragonBones.webAssembly ? (constraints as any).get(j) as ConstraintData : constraints[j]; + const target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + + // TODO more constraint type. + const ikConstraintData = constraintData as IKConstraintData; + const constraint = DragonBones.webAssembly ? new Module["IKConstraint"]() as IKConstraint : BaseObject.borrowObject(IKConstraint); + const root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + } + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void { + const currentSkin = dataPackage.skin; + const defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + + const skinSlots: Map> = {}; + for (let k in defaultSkin.displays) { + const displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + + if (currentSkin !== defaultSkin) { + for (let k in currentSkin.displays) { + const displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + + for (const slotData of dataPackage.armature.sortedSlots) { + if (!(slotData.name in skinSlots)) { + continue; + } + + const displays = skinSlots[slotData.name]; + const slot = this._buildSlot(dataPackage, slotData, displays, armature); + const displayList = new Array(); + for (const displayData of displays) { + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + } + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any { + const dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + let display: any = null; + switch (displayData.type) { + case DisplayType.Image: + const imageDisplayData = displayData as ImageDisplayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + + if (rawDisplayData !== null && rawDisplayData.type === DisplayType.Mesh && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + + case DisplayType.Mesh: + const meshDisplayData = displayData as MeshDisplayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + + case DisplayType.Armature: + const armatureDisplayData = displayData as ArmatureDisplayData; + const childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + const actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (const action of actions) { + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + + armatureDisplayData.armature = childArmature.armatureData; // + } + + display = childArmature; + break; + } + + return display; + } + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + + if (displayIndex < 0) { + displayIndex = 0; + } + + const displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + + for (let i = 0, l = displayList.length; i < l; ++i) { // Clean undefined. + if (!displayList[i]) { + displayList[i] = null; + } + } + } + + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + + for (let i = 0, l = slot._displayDatas.length; i < l; ++i) { // Clean undefined. + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay( + dataPackage, + displayData, + displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, + slot + ); + } + else { + displayList[displayIndex] = null; + } + + slot.displayList = displayList; + } + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + public parseDragonBonesData(rawData: any, name: string | null = null, scale: number = 1.0): DragonBonesData | null { + let dragonBonesData: DragonBonesData | null = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + + while (true) { + const textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + + return dragonBonesData; + } + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + public parseTextureAtlasData(rawData: any, textureAtlas: any, name: string | null = null, scale: number = 0.0): TextureAtlasData { + const textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + + return textureAtlasData; + } + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + public updateTextureAtlasData(name: string, textureAtlases: Array): void { + const textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (let i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + } + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + public getDragonBonesData(name: string): DragonBonesData | null { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + } + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + public addDragonBonesData(data: DragonBonesData, name: string | null = null): void { + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + + this._dragonBonesDataMap[name] = data; + } + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + public removeDragonBonesData(name: string, disposeData: boolean = true): void { + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + + delete this._dragonBonesDataMap[name]; + } + } + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + public getTextureAtlasData(name: string): Array | null { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + } + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + public addTextureAtlasData(data: TextureAtlasData, name: string | null = null): void { + name = name !== null ? name : data.name; + const textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + } + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + public removeTextureAtlasData(name: string, disposeData: boolean = true): void { + if (name in this._textureAtlasDataMap) { + const textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (const textureAtlasData of textureAtlasDataList) { + this._dragonBones.bufferObject(textureAtlasData); + } + } + + delete this._textureAtlasDataMap[name]; + } + } + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + public getArmatureData(name: string, dragonBonesName: string = ""): ArmatureData | null { + const dataPackage: BuildArmaturePackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + + return dataPackage.armature; + } + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public clear(disposeData: boolean = true): void { + for (let k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + + delete this._dragonBonesDataMap[k]; + } + + for (let k in this._textureAtlasDataMap) { + if (disposeData) { + const textureAtlasDataList = this._textureAtlasDataMap[k]; + for (const textureAtlasData of textureAtlasDataList) { + this._dragonBones.bufferObject(textureAtlasData); + } + } + + delete this._textureAtlasDataMap[k]; + } + } + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + public buildArmature(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null, textureAtlasName: string | null = null): Armature | null { + const dataPackage: BuildArmaturePackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + + const armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + + return armature; + } + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public replaceSlotDisplay( + dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, + slot: Slot, displayIndex: number = -1 + ): void { + const dataPackage: BuildArmaturePackage = {} as any; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + + const displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + + for (const display of displays) { + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + } + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public replaceSlotDisplayList( + dragonBonesName: string | null, armatureName: string, slotName: string, + slot: Slot + ): void { + const dataPackage: BuildArmaturePackage = {} as any; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + + const displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + + let displayIndex = 0; + for (const displayData of displays) { + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + } + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + public changeSkin(armature: Armature, skin: SkinData, exclude: Array | null = null): void { + for (const slot of armature.getSlots()) { + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + + const displays = skin.displays[slot.name]; + const displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (let i = 0, l = displays.length; i < l; ++i) { + const displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (let i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + + slot.displayList = displayList; + } + } + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + public copyAnimationsToArmature( + toArmature: Armature, + fromArmatreName: string, fromSkinName: string | null = null, fromDragonBonesDataName: string | null = null, + replaceOriginalAnimation: boolean = true + ): boolean { + const dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + const fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + const animations: Map = {}; + for (let animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + + for (let animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + + toArmature.animation.animations = animations; + } + + if (dataPackage.skin) { + const slots = toArmature.getSlots(); + for (let i = 0, l = slots.length; i < l; ++i) { + const toSlot = slots[i]; + const toSlotDisplayList = toSlot.displayList; + for (let j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + const toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof Armature) { + const displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + const fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === DisplayType.Armature) { + this.copyAnimationsToArmature(toDisplayObject as Armature, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + + return true; + } + } + + return false; + } + /** + * @private + */ + public getAllDragonBonesData(): Map { + return this._dragonBonesDataMap; + } + /** + * @private + */ + public getAllTextureAtlasData(): Map> { + return this._textureAtlasDataMap; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/geom/ColorTransform.ts b/reference/DragonBones/src/dragonBones/geom/ColorTransform.ts new file mode 100644 index 0000000..faca3b8 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/geom/ColorTransform.ts @@ -0,0 +1,28 @@ +namespace dragonBones { + /** + * @private + */ + export class ColorTransform { + public constructor( + public alphaMultiplier: number = 1.0, public redMultiplier: number = 1.0, public greenMultiplier: number = 1.0, public blueMultiplier: number = 1.0, + public alphaOffset: number = 0, public redOffset: number = 0, public greenOffset: number = 0, public blueOffset: number = 0 + ) { + } + + public copyFrom(value: ColorTransform): void { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + } + + public identity(): void { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/geom/Matrix.ts b/reference/DragonBones/src/dragonBones/geom/Matrix.ts new file mode 100644 index 0000000..f45146a --- /dev/null +++ b/reference/DragonBones/src/dragonBones/geom/Matrix.ts @@ -0,0 +1,161 @@ +namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class Matrix { + public constructor( + public a: number = 1.0, public b: number = 0.0, + public c: number = 0.0, public d: number = 1.0, + public tx: number = 0.0, public ty: number = 0.0 + ) { + } + /** + * @private + */ + public toString(): string { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + } + /** + * @private + */ + public copyFrom(value: Matrix): Matrix { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + + return this; + } + /** + * @private + */ + public copyFromArray(value: Array, offset: number = 0): Matrix { + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + + return this; + } + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public identity(): Matrix { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + + return this; + } + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public concat(value: Matrix): Matrix { + let aA = this.a * value.a; + let bA = 0.0; + let cA = 0.0; + let dA = this.d * value.d; + let txA = this.tx * value.a + value.tx; + let tyA = this.ty * value.d + value.ty; + + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + + return this; + } + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public invert(): Matrix { + let aA = this.a; + let bA = this.b; + let cA = this.c; + let dA = this.d; + const txA = this.tx; + const tyA = this.ty; + + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + + return this; + } + + let determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + + return this; + } + + determinant = 1.0 / determinant; + let k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + + return this; + } + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public transformPoint(x: number, y: number, result: { x: number, y: number }, delta: boolean = false): void { + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/geom/Point.ts b/reference/DragonBones/src/dragonBones/geom/Point.ts new file mode 100644 index 0000000..37dfcf6 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/geom/Point.ts @@ -0,0 +1,15 @@ +namespace dragonBones { + export class Point { + public constructor(public x: number = 0.0, public y: number = 0.0) { + } + + public copyFrom(value: Point): void { + this.x = value.x; + this.y = value.y; + } + + public clear(): void { + this.x = this.y = 0.0; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/geom/Rectangle.ts b/reference/DragonBones/src/dragonBones/geom/Rectangle.ts new file mode 100644 index 0000000..8e48bc8 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/geom/Rectangle.ts @@ -0,0 +1,21 @@ +namespace dragonBones { + export class Rectangle { + public constructor( + public x: number = 0.0, public y: number = 0.0, + public width: number = 0.0, public height: number = 0.0 + ) { + } + + public copyFrom(value: Rectangle): void { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + } + + public clear(): void { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/geom/Transform.ts b/reference/DragonBones/src/dragonBones/geom/Transform.ts new file mode 100644 index 0000000..3d05cb8 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/geom/Transform.ts @@ -0,0 +1,207 @@ +namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class Transform { + /** + * @private + */ + public static readonly PI_D: number = Math.PI * 2.0; + /** + * @private + */ + public static readonly PI_H: number = Math.PI / 2.0; + /** + * @private + */ + public static readonly PI_Q: number = Math.PI / 4.0; + /** + * @private + */ + public static readonly RAD_DEG: number = 180.0 / Math.PI; + /** + * @private + */ + public static readonly DEG_RAD: number = Math.PI / 180.0; + /** + * @private + */ + public static normalizeRadian(value: number): number { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + + return value; + } + + public constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public x: number = 0.0, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public y: number = 0.0, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public skew: number = 0.0, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public rotation: number = 0.0, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public scaleX: number = 1.0, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public scaleY: number = 1.0 + ) { + } + /** + * @private + */ + public toString(): string { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + } + /** + * @private + */ + public copyFrom(value: Transform): Transform { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + + return this; + } + /** + * @private + */ + public identity(): Transform { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + + return this; + } + /** + * @private + */ + public add(value: Transform): Transform { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + + return this; + } + /** + * @private + */ + public minus(value: Transform): Transform { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + + return this; + } + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public fromMatrix(matrix: Matrix): Transform { + const backupScaleX = this.scaleX, backupScaleY = this.scaleY; + const PI_Q = Transform.PI_Q; + + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + let skewX = Math.atan(-matrix.c / matrix.d); + + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + + this.skew = skewX - this.rotation; + + return this; + } + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public toMatrix(matrix: Matrix): Transform { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + + matrix.tx = this.x; + matrix.ty = this.y; + + return this; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/AnimationConfig.ts b/reference/DragonBones/src/dragonBones/model/AnimationConfig.ts new file mode 100644 index 0000000..056b64f --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/AnimationConfig.ts @@ -0,0 +1,285 @@ +namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + export class AnimationConfig extends BaseObject { + public static toString(): string { + return "[class dragonBones.AnimationConfig]"; + } + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + public fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + public fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public fadeOutTime: number; + + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + public additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + public resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + public fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + public layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + public position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + public timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public readonly boneMask: Array = []; + /** + * @private + */ + protected _onClear(): void { + this.pauseFadeOut = true; + this.fadeOutMode = AnimationFadeOutMode.All; + this.fadeOutTweenType = TweenType.Line; + this.fadeOutTime = -1.0; + + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = TweenType.Line; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + } + + public clear(): void { + this._onClear(); + } + + public copyFrom(value: AnimationConfig): void { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + + this.boneMask.length = value.boneMask.length; + for (let i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + } + + public containsBoneMask(name: string): boolean { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + } + + public addBoneMask(armature: Armature, name: string, recursive: boolean = true): void { + const currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + + if (this.boneMask.indexOf(name) < 0) { // Add mixing + this.boneMask.push(name); + } + + if (recursive) { // Add recursive mixing. + for (const bone of armature.getBones()) { + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + + public removeBoneMask(armature: Armature, name: string, recursive: boolean = true): void { + const index = this.boneMask.indexOf(name); + if (index >= 0) { // Remove mixing. + this.boneMask.splice(index, 1); + } + + if (recursive) { + const currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { // Remove recursive mixing. + for (const bone of armature.getBones()) { + const index = this.boneMask.indexOf(bone.name); + if (index >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index, 1); + } + } + } + else { // Add unrecursive mixing. + for (const bone of armature.getBones()) { + if (bone === currentBone) { + continue; + } + + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/AnimationData.ts b/reference/DragonBones/src/dragonBones/model/AnimationData.ts new file mode 100644 index 0000000..f331fa3 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/AnimationData.ts @@ -0,0 +1,246 @@ +namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class AnimationData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.AnimationData]"; + } + /** + * @private + */ + public frameIntOffset: number; // FrameIntArray. + /** + * @private + */ + public frameFloatOffset: number; // FrameFloatArray. + /** + * @private + */ + public frameOffset: number; // FrameArray. + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + public frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + public playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public duration: number; + /** + * @private + */ + public scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + public fadeInTime: number; + /** + * @private + */ + public cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public readonly cachedFrames: Array = []; + /** + * @private + */ + public readonly boneTimelines: Map> = {}; + /** + * @private + */ + public readonly slotTimelines: Map> = {}; + /** + * @private + */ + public readonly boneCachedFrameIndices: Map> = {}; + /** + * @private + */ + public readonly slotCachedFrameIndices: Map> = {}; + /** + * @private + */ + public actionTimeline: TimelineData | null = null; // Initial value. + /** + * @private + */ + public zOrderTimeline: TimelineData | null = null; // Initial value. + /** + * @private + */ + public parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void { + for (let k in this.boneTimelines) { + for (let kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + + delete this.boneTimelines[k]; + } + + for (let k in this.slotTimelines) { + for (let kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + + delete this.slotTimelines[k]; + } + + for (let k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + + for (let k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null as any; // + } + /** + * @private + */ + public cacheFrames(frameRate: number): void { + if (this.cacheFrameRate > 0.0) { // TODO clear cache. + return; + } + + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + const cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + + this.cachedFrames.length = cacheFrameCount; + for (let i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + + for (const bone of this.parent.sortedBones) { + const indices = new Array(cacheFrameCount); + for (let i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + + this.boneCachedFrameIndices[bone.name] = indices; + } + + for (const slot of this.parent.sortedSlots) { + const indices = new Array(cacheFrameCount); + for (let i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + + this.slotCachedFrameIndices[slot.name] = indices; + } + } + /** + * @private + */ + public addBoneTimeline(bone: BoneData, timeline: TimelineData): void { + const timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + } + /** + * @private + */ + public addSlotTimeline(slot: SlotData, timeline: TimelineData): void { + const timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + } + /** + * @private + */ + public getBoneTimelines(name: string): Array | null { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + } + /** + * @private + */ + public getSlotTimeline(name: string): Array | null { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + } + /** + * @private + */ + public getBoneCachedFrameIndices(name: string): Array | null { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + } + /** + * @private + */ + public getSlotCachedFrameIndices(name: string): Array | null { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + } + } + /** + * @private + */ + export class TimelineData extends BaseObject { + public static toString(): string { + return "[class dragonBones.TimelineData]"; + } + + public type: TimelineType; + public offset: number; // TimelineArray. + public frameIndicesOffset: number; // FrameIndices. + + protected _onClear(): void { + this.type = TimelineType.BoneAll; + this.offset = 0; + this.frameIndicesOffset = -1; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/ArmatureData.ts b/reference/DragonBones/src/dragonBones/model/ArmatureData.ts new file mode 100644 index 0000000..638d002 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/ArmatureData.ts @@ -0,0 +1,630 @@ +namespace dragonBones { + /** + * @private + */ + export class CanvasData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.CanvasData]"; + } + + public hasBackground: boolean; + public color: number; + public x: number; + public y: number; + public width: number; + public height: number; + /** + * @private + */ + protected _onClear(): void { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class ArmatureData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.ArmatureData]"; + } + /** + * @private + */ + public type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public frameRate: number; + /** + * @private + */ + public cacheFrameRate: number; + /** + * @private + */ + public scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public readonly aabb: Rectangle = new Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly animationNames: Array = []; + /** + * @private + */ + public readonly sortedBones: Array = []; + /** + * @private + */ + public readonly sortedSlots: Array = []; + /** + * @private + */ + public readonly defaultActions: Array = []; + /** + * @private + */ + public readonly actions: Array = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly bones: Map = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly slots: Map = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly skins: Map = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly animations: Map = {}; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + public defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + public defaultAnimation: AnimationData | null; + /** + * @private + */ + public canvas: CanvasData | null = null; // Initial value. + /** + * @private + */ + public userData: UserData | null = null; // Initial value. + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + public parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void { + for (const action of this.defaultActions) { + action.returnToPool(); + } + + for (const action of this.actions) { + action.returnToPool(); + } + + for (let k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + + for (let k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + + for (let k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + + for (let k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + + if (this.userData !== null) { + this.userData.returnToPool(); + } + + this.type = ArmatureType.Armature; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null as any; // + } + /** + * @private + */ + public sortBones(): void { + const total = this.sortedBones.length; + if (total <= 0) { + return; + } + + const sortHelper = this.sortedBones.concat(); + let index = 0; + let count = 0; + this.sortedBones.length = 0; + while (count < total) { + const bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + + if (bone.constraints.length > 0) { // Wait constraint. + let flag = false; + for (const constraint of bone.constraints) { + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + + if (flag) { + continue; + } + } + + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { // Wait parent. + continue; + } + + this.sortedBones.push(bone); + count++; + } + } + /** + * @private + */ + public cacheFrames(frameRate: number): void { + if (this.cacheFrameRate > 0) { // TODO clear cache. + return; + } + + this.cacheFrameRate = frameRate; + for (let k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + } + /** + * @private + */ + public setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number { + const dataArray = this.parent.cachedFrames; + let arrayOffset = dataArray.length; + + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + + return arrayOffset; + } + /** + * @private + */ + public getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void { + const dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + } + /** + * @private + */ + public addBone(value: BoneData): void { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + + this.bones[value.name] = value; + this.sortedBones.push(value); + } + /** + * @private + */ + public addSlot(value: SlotData): void { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + + this.slots[value.name] = value; + this.sortedSlots.push(value); + } + /** + * @private + */ + public addSkin(value: SkinData): void { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + } + /** + * @private + */ + public addAnimation(value: AnimationData): void { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + } + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + public getBone(name: string): BoneData | null { + return name in this.bones ? this.bones[name] : null; + } + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + public getSlot(name: string): SlotData | null { + return name in this.slots ? this.slots[name] : null; + } + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + public getSkin(name: string): SkinData | null { + return name in this.skins ? this.skins[name] : null; + } + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + public getAnimation(name: string): AnimationData | null { + return name in this.animations ? this.animations[name] : null; + } + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class BoneData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.BoneData]"; + } + /** + * @private + */ + public inheritTranslation: boolean; + /** + * @private + */ + public inheritRotation: boolean; + /** + * @private + */ + public inheritScale: boolean; + /** + * @private + */ + public inheritReflection: boolean; + /** + * @private + */ + public length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public readonly transform: Transform = new Transform(); + /** + * @private + */ + public readonly constraints: Array = []; + /** + * @private + */ + public userData: UserData | null = null; // Initial value. + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void { + for (const constraint of this.constraints) { + constraint.returnToPool(); + } + + if (this.userData !== null) { + this.userData.returnToPool(); + } + + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + } + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + export class SlotData extends BaseObject { + /** + * @private + */ + public static readonly DEFAULT_COLOR: ColorTransform = new ColorTransform(); + /** + * @private + */ + public static createColor(): ColorTransform { + return new ColorTransform(); + } + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.SlotData]"; + } + /** + * @private + */ + public blendMode: BlendMode; + /** + * @private + */ + public displayIndex: number; + /** + * @private + */ + public zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public color: ColorTransform = null as any; // Initial value. + /** + * @private + */ + public userData: UserData | null = null; // Initial value. + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + public parent: BoneData; + /** + * @private + */ + protected _onClear(): void { + if (this.userData !== null) { + this.userData.returnToPool(); + } + + this.blendMode = BlendMode.Normal; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null as any; // + this.userData = null; + this.parent = null as any; // + } + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + export class SkinData extends BaseObject { + public static toString(): string { + return "[class dragonBones.SkinData]"; + } + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public readonly displays: Map> = {}; + /** + * @private + */ + protected _onClear(): void { + for (let k in this.displays) { + const slotDisplays = this.displays[k]; + for (const display of slotDisplays) { + if (display !== null) { + display.returnToPool(); + } + } + + delete this.displays[k]; + } + + this.name = ""; + // this.displays.clear(); + } + /** + * @private + */ + public addDisplay(slotName: string, value: DisplayData | null): void { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + + const slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + } + /** + * @private + */ + public getDisplay(slotName: string, displayName: string): DisplayData | null { + const slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (const display of slotDisplays) { + if (display !== null && display.name === displayName) { + return display; + } + } + } + + return null; + } + /** + * @private + */ + public getDisplays(slotName: string): Array | null { + if (!(slotName in this.displays)) { + return null; + } + + return this.displays[slotName]; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/BoundingBoxData.ts b/reference/DragonBones/src/dragonBones/model/BoundingBoxData.ts new file mode 100644 index 0000000..9deac0b --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/BoundingBoxData.ts @@ -0,0 +1,705 @@ +namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + export abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + public width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + public height: number; + /** + * @private + */ + protected _onClear(): void { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + } + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public abstract intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null, + intersectionPointB: { x: number, y: number } | null, + normalRadians: { x: number, y: number } | null + ): number; + } + /** + * Cohen–Sutherland algorithm https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm + * ---------------------- + * | 0101 | 0100 | 0110 | + * ---------------------- + * | 0001 | 0000 | 0010 | + * ---------------------- + * | 1001 | 1000 | 1010 | + * ---------------------- + */ + const enum OutCode { + InSide = 0, // 0000 + Left = 1, // 0001 + Right = 2, // 0010 + Top = 4, // 0100 + Bottom = 8 // 1000 + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + export class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.RectangleBoundingBoxData]"; + } + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x: number, y: number, xMin: number, yMin: number, xMax: number, yMax: number): number { + let code = OutCode.InSide; // initialised as being inside of [[clip window]] + + if (x < xMin) { // to the left of clip window + code |= OutCode.Left; + } + else if (x > xMax) { // to the right of clip window + code |= OutCode.Right; + } + + if (y < yMin) { // below the clip window + code |= OutCode.Top; + } + else if (y > yMax) { // above the clip window + code |= OutCode.Bottom; + } + + return code; + } + /** + * @private + */ + public static rectangleIntersectsSegment( + xA: number, yA: number, xB: number, yB: number, + xMin: number, yMin: number, xMax: number, yMax: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + const inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + const inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + + if (inSideA && inSideB) { + return -1; + } + + let intersectionCount = 0; + let outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + let outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + + while (true) { + if ((outcode0 | outcode1) === 0) { // Bitwise OR is 0. Trivially accept and get out of loop + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { // Bitwise AND is not 0. Trivially reject and get out of loop + break; + } + + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + let x = 0.0; + let y = 0.0; + let normalRadian = 0.0; + + // At least one endpoint is outside the clip rectangle; pick it. + const outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + + // Now find the intersection point; + if ((outcodeOut & OutCode.Top) !== 0) { // point is above the clip rectangle + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & OutCode.Bottom) !== 0) { // point is below the clip rectangle + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & OutCode.Right) !== 0) { // point is to the right of clip rectangle + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & OutCode.Left) !== 0) { // point is to the left of clip rectangle + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + + return intersectionCount; + } + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + this.type = BoundingBoxType.Rectangle; + } + /** + * @inherDoc + */ + public containsPoint(pX: number, pY: number): boolean { + const widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + const heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + + return false; + } + /** + * @inherDoc + */ + public intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + const widthH = this.width * 0.5; + const heightH = this.height * 0.5; + const intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment( + xA, yA, xB, yB, + -widthH, -heightH, widthH, heightH, + intersectionPointA, intersectionPointB, normalRadians + ); + + return intersectionCount; + } + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + export class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.EllipseData]"; + } + /** + * @private + */ + public static ellipseIntersectsSegment( + xA: number, yA: number, xB: number, yB: number, + xC: number, yC: number, widthH: number, heightH: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + const d = widthH / heightH; + const dd = d * d; + + yA *= d; + yB *= d; + + const dX = xB - xA; + const dY = yB - yA; + const lAB = Math.sqrt(dX * dX + dY * dY); + const xD = dX / lAB; + const yD = dY / lAB; + const a = (xC - xA) * xD + (yC - yA) * yD; + const aa = a * a; + const ee = xA * xA + yA * yA; + const rr = widthH * widthH; + const dR = rr - ee + aa; + let intersectionCount = 0; + + if (dR >= 0.0) { + const dT = Math.sqrt(dR); + const sA = a - dT; + const sB = a + dT; + const inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + const inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + const sideAB = inSideA * inSideB; + + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + + return intersectionCount; + } + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + this.type = BoundingBoxType.Ellipse; + } + /** + * @inherDoc + */ + public containsPoint(pX: number, pY: number): boolean { + const widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + const heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + + return false; + } + /** + * @inherDoc + */ + public intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + const intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment( + xA, yA, xB, yB, + 0.0, 0.0, this.width * 0.5, this.height * 0.5, + intersectionPointA, intersectionPointB, normalRadians + ); + + return intersectionCount; + } + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + export class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.PolygonBoundingBoxData]"; + } + /** + * @private + */ + public static polygonIntersectsSegment( + xA: number, yA: number, xB: number, yB: number, + vertices: Array | Float32Array, offset: number, count: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + if (xA === xB) { + xA = xB + 0.000001; + } + + if (yA === yB) { + yA = yB + 0.000001; + } + + const dXAB = xA - xB; + const dYAB = yA - yB; + const llAB = xA * yB - yA * xB; + let intersectionCount = 0; + let xC = vertices[offset + count - 2]; + let yC = vertices[offset + count - 1]; + let dMin = 0.0; + let dMax = 0.0; + let xMin = 0.0; + let yMin = 0.0; + let xMax = 0.0; + let yMax = 0.0; + + for (let i = 0; i < count; i += 2) { + const xD = vertices[offset + i]; + const yD = vertices[offset + i + 1]; + + if (xC === xD) { + xC = xD + 0.0001; + } + + if (yC === yD) { + yC = yD + 0.0001; + } + + const dXCD = xC - xD; + const dYCD = yC - yD; + const llCD = xC * yD - yC * xD; + const ll = dXAB * dYCD - dYAB * dXCD; + const x = (llAB * dXCD - dXAB * llCD) / ll; + + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + const y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + let d = x - xA; + if (d < 0.0) { + d = -d; + } + + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + + xC = xD; + yC = yD; + } + + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + + return intersectionCount; + } + /** + * @private + */ + public count: number; + /** + * @private + */ + public offset: number; // FloatArray. + /** + * @private + */ + public x: number; + /** + * @private + */ + public y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + public vertices: Array | Float32Array; // FloatArray. + /** + * @private + */ + public weight: WeightData | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + if (this.weight !== null) { + this.weight.returnToPool(); + } + + this.type = BoundingBoxType.Polygon; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null as any; // + this.weight = null; + } + /** + * @inherDoc + */ + public containsPoint(pX: number, pY: number): boolean { + let isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (let i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + const yA = this.vertices[this.offset + iP + 1]; + const yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + const xA = this.vertices[this.offset + iP]; + const xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + + iP = i; + } + } + + return isInSide; + } + /** + * @inherDoc + */ + public intersectsSegment( + xA: number, yA: number, xB: number, yB: number, + intersectionPointA: { x: number, y: number } | null = null, + intersectionPointB: { x: number, y: number } | null = null, + normalRadians: { x: number, y: number } | null = null + ): number { + let intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment( + xA, yA, xB, yB, + this.vertices, this.offset, this.count, + intersectionPointA, intersectionPointB, normalRadians + ); + } + + return intersectionCount; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/ConstraintData.ts b/reference/DragonBones/src/dragonBones/model/ConstraintData.ts new file mode 100644 index 0000000..44528f6 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/ConstraintData.ts @@ -0,0 +1,38 @@ +namespace dragonBones { + /** + * @private + */ + export abstract class ConstraintData extends BaseObject { + public order: number; + public target: BoneData; + public bone: BoneData; + public root: BoneData | null; + + protected _onClear(): void { + this.order = 0; + this.target = null as any; // + this.bone = null as any; // + this.root = null; + } + } + /** + * @private + */ + export class IKConstraintData extends ConstraintData { + public static toString(): string { + return "[class dragonBones.IKConstraintData]"; + } + + public bendPositive: boolean; + public scaleEnabled: boolean; + public weight: number; + + protected _onClear(): void { + super._onClear(); + + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/DisplayData.ts b/reference/DragonBones/src/dragonBones/model/DisplayData.ts new file mode 100644 index 0000000..a65b232 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/DisplayData.ts @@ -0,0 +1,127 @@ +namespace dragonBones { + /** + * @private + */ + export abstract class DisplayData extends BaseObject { + public type: DisplayType; + public name: string; + public path: string; + public readonly transform: Transform = new Transform(); + public parent: ArmatureData; + + protected _onClear(): void { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null as any; // + } + } + /** + * @private + */ + export class ImageDisplayData extends DisplayData { + public static toString(): string { + return "[class dragonBones.ImageDisplayData]"; + } + + public readonly pivot: Point = new Point(); + public texture: TextureData | null; + + protected _onClear(): void { + super._onClear(); + + this.type = DisplayType.Image; + this.pivot.clear(); + this.texture = null; + } + } + /** + * @private + */ + export class ArmatureDisplayData extends DisplayData { + public static toString(): string { + return "[class dragonBones.ArmatureDisplayData]"; + } + + public inheritAnimation: boolean; + public readonly actions: Array = []; + public armature: ArmatureData | null; + + protected _onClear(): void { + super._onClear(); + + for (const action of this.actions) { + action.returnToPool(); + } + + this.type = DisplayType.Armature; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + } + } + /** + * @private + */ + export class MeshDisplayData extends ImageDisplayData { + public static toString(): string { + return "[class dragonBones.MeshDisplayData]"; + } + + public inheritAnimation: boolean; + public offset: number; // IntArray. + public weight: WeightData | null = null; // Initial value. + + protected _onClear(): void { + super._onClear(); + + if (this.weight !== null) { + this.weight.returnToPool(); + } + + this.type = DisplayType.Mesh; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + } + } + /** + * @private + */ + export class BoundingBoxDisplayData extends DisplayData { + public static toString(): string { + return "[class dragonBones.BoundingBoxDisplayData]"; + } + + public boundingBox: BoundingBoxData | null = null; // Initial value. + + protected _onClear(): void { + super._onClear(); + + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + + this.type = DisplayType.BoundingBox; + this.boundingBox = null; + } + } + /** + * @private + */ + export class WeightData extends BaseObject { + public static toString(): string { + return "[class dragonBones.WeightData]"; + } + + public count: number; + public offset: number; // IntArray. + public readonly bones: Array = []; + + protected _onClear(): void { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/DragonBonesData.ts b/reference/DragonBones/src/dragonBones/model/DragonBonesData.ts new file mode 100644 index 0000000..e12c2ad --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/DragonBonesData.ts @@ -0,0 +1,154 @@ +namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + export class DragonBonesData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.DragonBonesData]"; + } + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + public autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * @private + */ + public readonly frameIndices: Array = []; + /** + * @private + */ + public readonly cachedFrames: Array = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly armatureNames: Array = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + public readonly armatures: Map = {}; + /** + * @private + */ + public intArray: Array | Int16Array; + /** + * @private + */ + public floatArray: Array | Float32Array; + /** + * @private + */ + public frameIntArray: Array | Int16Array; + /** + * @private + */ + public frameFloatArray: Array | Float32Array; + /** + * @private + */ + public frameArray: Array | Int16Array; + /** + * @private + */ + public timelineArray: Array | Uint16Array; + /** + * @private + */ + public userData: UserData | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + for (let k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + + if (this.userData !== null) { + this.userData.returnToPool(); + } + + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null as any; // + this.floatArray = null as any; // + this.frameIntArray = null as any; // + this.frameFloatArray = null as any; // + this.frameArray = null as any; // + this.timelineArray = null as any; // + this.userData = null; + } + /** + * @private + */ + public addArmature(value: ArmatureData): void { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + } + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + public getArmature(name: string): ArmatureData | null { + return name in this.armatures ? this.armatures[name] : null; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + public dispose(): void { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/TextureAtlasData.ts b/reference/DragonBones/src/dragonBones/model/TextureAtlasData.ts new file mode 100644 index 0000000..6c423f0 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/TextureAtlasData.ts @@ -0,0 +1,149 @@ +namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + public autoSearch: boolean; + /** + * @private + */ + public width: number; + /** + * @private + */ + public height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public imagePath: string; + /** + * @private + */ + public readonly textures: Map = {}; + /** + * @private + */ + protected _onClear(): void { + for (let k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + } + /** + * @private + */ + public copyFrom(value: TextureAtlasData): void { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + + for (let k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + + // this.textures.clear(); + + for (let k in value.textures) { + const texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + } + /** + * @private + */ + public abstract createTexture(): TextureData; + /** + * @private + */ + public addTexture(value: TextureData): void { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + + value.parent = this; + this.textures[value.name] = value; + } + /** + * @private + */ + public getTexture(name: string): TextureData | null { + return name in this.textures ? this.textures[name] : null; + } + } + /** + * @private + */ + export abstract class TextureData extends BaseObject { + public static createRectangle(): Rectangle { + return new Rectangle(); + } + + public rotated: boolean; + public name: string; + public readonly region: Rectangle = new Rectangle(); + public parent: TextureAtlasData; + public frame: Rectangle | null = null; // Initial value. + + protected _onClear(): void { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null as any; // + this.frame = null; + } + + public copyFrom(value: TextureData): void { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/model/UserData.ts b/reference/DragonBones/src/dragonBones/model/UserData.ts new file mode 100644 index 0000000..fb13f52 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/model/UserData.ts @@ -0,0 +1,91 @@ +namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + export class UserData extends BaseObject { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.UserData]"; + } + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public readonly ints: Array = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public readonly floats: Array = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public readonly strings: Array = []; + /** + * @private + */ + protected _onClear(): void { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + } + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public getInt(index: number = 0): number { + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + } + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public getFloat(index: number = 0): number { + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + } + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + public getString(index: number = 0): string { + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + } + } + /** + * @private + */ + export class ActionData extends BaseObject { + public static toString(): string { + return "[class dragonBones.ActionData]"; + } + + public type: ActionType; + public name: string; // Frame event name | Sound event name | Animation name + public bone: BoneData | null; + public slot: SlotData | null; + public data: UserData | null = null; // + + protected _onClear(): void { + if (this.data !== null) { + this.data.returnToPool(); + } + + this.type = ActionType.Play; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/modules.ts b/reference/DragonBones/src/dragonBones/modules.ts new file mode 100644 index 0000000..c5a9303 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/modules.ts @@ -0,0 +1 @@ +declare const Module: any; // TODO need remove. \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/parser/BinaryDataParser.ts b/reference/DragonBones/src/dragonBones/parser/BinaryDataParser.ts new file mode 100644 index 0000000..e6a22af --- /dev/null +++ b/reference/DragonBones/src/dragonBones/parser/BinaryDataParser.ts @@ -0,0 +1,435 @@ +namespace dragonBones { + /** + * @private + */ + export class BinaryDataParser extends ObjectDataParser { + private _binary: ArrayBuffer; + private _binaryOffset: number; + private _intArray: Int16Array; + private _floatArray: Float32Array; + private _frameIntArray: Int16Array; + private _frameFloatArray: Float32Array; + private _frameArray: Int16Array; + private _timelineArray: Uint16Array; + + private _inRange(a: number, min: number, max: number): boolean { + return min <= a && a <= max; + } + + private _decodeUTF8(data: Uint8Array): string { + const EOF_byte = -1; + const EOF_code_point = -1; + const FATAL_POINT = 0xFFFD; + + let pos = 0; + let result = ""; + let code_point; + let utf8_code_point = 0; + let utf8_bytes_needed = 0; + let utf8_bytes_seen = 0; + let utf8_lower_boundary = 0; + + while (data.length > pos) { + + let _byte = data[pos++]; + + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + + let cp = utf8_code_point; + let lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + + return result; + } + + private _getUTF16Key(value: string): string { + for (let i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + + return value; + } + + private _parseBinaryTimeline(type: TimelineType, offset: number, timelineData: TimelineData | null = null): TimelineData { + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + const timeline = timelineData !== null ? timelineData : (DragonBones.webAssembly ? new Module["TimelineData"]() as TimelineData : BaseObject.borrowObject(TimelineData)); + timeline.type = type; + timeline.offset = offset; + + this._timeline = timeline; + + const keyFrameCount = this._timelineArray[timeline.offset + BinaryOffset.TimelineKeyFrameCount]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + const totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + const frameIndices = this._data.frameIndices; + if (DragonBones.webAssembly) { + timeline.frameIndicesOffset = (frameIndices as any).size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (let j = 0; j < totalFrameCount; ++j) { + (frameIndices as any).push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + + for ( + let i = 0, iK = 0, frameStart = 0, frameCount = 0; + i < totalFrameCount; + ++i + ) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + iK + 1]] - frameStart; + } + + iK++; + } + + if (DragonBones.webAssembly) { + (frameIndices as any).set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + + this._timeline = null as any; // + + return timeline; + } + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void { + mesh.offset = rawData[ObjectDataParser.OFFSET]; + + const weightOffset = this._intArray[mesh.offset + BinaryOffset.MeshWeightOffset]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + const weight = DragonBones.webAssembly ? new Module["WeightData"]() as WeightData : BaseObject.borrowObject(WeightData); + const vertexCount = this._intArray[mesh.offset + BinaryOffset.MeshVertexCount]; + const boneCount = this._intArray[weightOffset + BinaryOffset.WeigthBoneCount]; + weight.offset = weightOffset; + if (DragonBones.webAssembly) { + (weight.bones as any).resize(boneCount, null); + for (let i = 0; i < boneCount; ++i) { + const boneIndex = this._intArray[weightOffset + BinaryOffset.WeigthBoneIndices + i]; + (weight.bones as any).set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + + for (let i = 0; i < boneCount; ++i) { + const boneIndex = this._intArray[weightOffset + BinaryOffset.WeigthBoneIndices + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + + let boneIndicesOffset = weightOffset + BinaryOffset.WeigthBoneIndices + boneCount; + for (let i = 0, l = vertexCount; i < l; ++i) { + const vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + + mesh.weight = weight; + } + } + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + const polygonBoundingBox = DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() as PolygonBoundingBoxData : BaseObject.borrowObject(PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + + return polygonBoundingBox; + } + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData { + // const animation = BaseObject.borrowObject(AnimationData); + const animation = DragonBones.webAssembly ? new Module["AnimationData"]() as AnimationData : BaseObject.borrowObject(AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + + // Offsets. + const offsets = rawData[ObjectDataParser.OFFSET] as Array; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + + this._animation = animation; + + if (ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(TimelineType.Action, rawData[ObjectDataParser.ACTION]); + } + + if (ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(TimelineType.ZOrder, rawData[ObjectDataParser.Z_ORDER]); + } + + if (ObjectDataParser.BONE in rawData) { + const rawTimeliness = rawData[ObjectDataParser.BONE]; + for (let k in rawTimeliness) { + const rawTimelines = rawTimeliness[k] as Array; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + + const bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + + for (let i = 0, l = rawTimelines.length; i < l; i += 2) { + const timelineType = rawTimelines[i]; + const timelineOffset = rawTimelines[i + 1]; + const timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + + if (ObjectDataParser.SLOT in rawData) { + const rawTimeliness = rawData[ObjectDataParser.SLOT]; + for (let k in rawTimeliness) { + const rawTimelines = rawTimeliness[k] as Array; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + + const slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + + for (let i = 0, l = rawTimelines.length; i < l; i += 2) { + const timelineType = rawTimelines[i]; + const timelineOffset = rawTimelines[i + 1]; + const timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + + this._animation = null as any; + + return animation; + } + /** + * @private + */ + protected _parseArray(rawData: any): void { + const offsets = rawData[ObjectDataParser.OFFSET] as Array; + if (DragonBones.webAssembly) { + const tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + const tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + const tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + const tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + const tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + const tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + + const intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + const floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + const frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + const frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + const frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + const timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + + for (let i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + + for (let i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + + for (let i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + + for (let i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + + for (let i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + + for (let i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], + [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + } + /** + * @inheritDoc + */ + public parseDragonBonesData(rawData: any, scale: number = 1): DragonBonesData | null { + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + + const tag = new Uint8Array(rawData, 0, 8); + if ( + tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0) + ) { + console.assert(false, "Nonsupport data."); + return null; + } + + const headerLength = new Uint32Array(rawData, 8, 1)[0]; + const headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + const headerString = this._decodeUTF8(headerBytes); + const header = JSON.parse(headerString); + + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + + return super.parseDragonBonesData(header, scale); + } + + /** + * @private + */ + private static _binaryDataParserInstance: BinaryDataParser = null as any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + public static getInstance(): BinaryDataParser { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + + return BinaryDataParser._binaryDataParserInstance; + } + } +} \ No newline at end of file diff --git a/reference/DragonBones/src/dragonBones/parser/DataParser.ts b/reference/DragonBones/src/dragonBones/parser/DataParser.ts new file mode 100644 index 0000000..46d96f9 --- /dev/null +++ b/reference/DragonBones/src/dragonBones/parser/DataParser.ts @@ -0,0 +1,302 @@ +namespace dragonBones { + /** + * @private + */ + export abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string = "2.3"; + protected static readonly DATA_VERSION_3_0: string = "3.0"; + protected static readonly DATA_VERSION_4_0: string = "4.0"; + protected static readonly DATA_VERSION_4_5: string = "4.5"; + protected static readonly DATA_VERSION_5_0: string = "5.0"; + protected static readonly DATA_VERSION: string = DataParser.DATA_VERSION_5_0; + + protected static readonly DATA_VERSIONS: Array = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + + protected static readonly TEXTURE_ATLAS: string = "textureAtlas"; + protected static readonly SUB_TEXTURE: string = "SubTexture"; + protected static readonly FORMAT: string = "format"; + protected static readonly IMAGE_PATH: string = "imagePath"; + protected static readonly WIDTH: string = "width"; + protected static readonly HEIGHT: string = "height"; + protected static readonly ROTATED: string = "rotated"; + protected static readonly FRAME_X: string = "frameX"; + protected static readonly FRAME_Y: string = "frameY"; + protected static readonly FRAME_WIDTH: string = "frameWidth"; + protected static readonly FRAME_HEIGHT: string = "frameHeight"; + + protected static readonly DRADON_BONES: string = "dragonBones"; + protected static readonly USER_DATA: string = "userData"; + protected static readonly ARMATURE: string = "armature"; + protected static readonly BONE: string = "bone"; + protected static readonly IK: string = "ik"; + protected static readonly SLOT: string = "slot"; + protected static readonly SKIN: string = "skin"; + protected static readonly DISPLAY: string = "display"; + protected static readonly ANIMATION: string = "animation"; + protected static readonly Z_ORDER: string = "zOrder"; + protected static readonly FFD: string = "ffd"; + protected static readonly FRAME: string = "frame"; + protected static readonly TRANSLATE_FRAME: string = "translateFrame"; + protected static readonly ROTATE_FRAME: string = "rotateFrame"; + protected static readonly SCALE_FRAME: string = "scaleFrame"; + protected static readonly VISIBLE_FRAME: string = "visibleFrame"; + protected static readonly DISPLAY_FRAME: string = "displayFrame"; + protected static readonly COLOR_FRAME: string = "colorFrame"; + protected static readonly DEFAULT_ACTIONS: string = "defaultActions"; + protected static readonly ACTIONS: string = "actions"; + protected static readonly EVENTS: string = "events"; + protected static readonly INTS: string = "ints"; + protected static readonly FLOATS: string = "floats"; + protected static readonly STRINGS: string = "strings"; + protected static readonly CANVAS: string = "canvas"; + + protected static readonly TRANSFORM: string = "transform"; + protected static readonly PIVOT: string = "pivot"; + protected static readonly AABB: string = "aabb"; + protected static readonly COLOR: string = "color"; + + protected static readonly VERSION: string = "version"; + protected static readonly COMPATIBLE_VERSION: string = "compatibleVersion"; + protected static readonly FRAME_RATE: string = "frameRate"; + protected static readonly TYPE: string = "type"; + protected static readonly SUB_TYPE: string = "subType"; + protected static readonly NAME: string = "name"; + protected static readonly PARENT: string = "parent"; + protected static readonly TARGET: string = "target"; + protected static readonly SHARE: string = "share"; + protected static readonly PATH: string = "path"; + protected static readonly LENGTH: string = "length"; + protected static readonly DISPLAY_INDEX: string = "displayIndex"; + protected static readonly BLEND_MODE: string = "blendMode"; + protected static readonly INHERIT_TRANSLATION: string = "inheritTranslation"; + protected static readonly INHERIT_ROTATION: string = "inheritRotation"; + protected static readonly INHERIT_SCALE: string = "inheritScale"; + protected static readonly INHERIT_REFLECTION: string = "inheritReflection"; + protected static readonly INHERIT_ANIMATION: string = "inheritAnimation"; + protected static readonly INHERIT_FFD: string = "inheritFFD"; + protected static readonly BEND_POSITIVE: string = "bendPositive"; + protected static readonly CHAIN: string = "chain"; + protected static readonly WEIGHT: string = "weight"; + + protected static readonly FADE_IN_TIME: string = "fadeInTime"; + protected static readonly PLAY_TIMES: string = "playTimes"; + protected static readonly SCALE: string = "scale"; + protected static readonly OFFSET: string = "offset"; + protected static readonly POSITION: string = "position"; + protected static readonly DURATION: string = "duration"; + protected static readonly TWEEN_TYPE: string = "tweenType"; + protected static readonly TWEEN_EASING: string = "tweenEasing"; + protected static readonly TWEEN_ROTATE: string = "tweenRotate"; + protected static readonly TWEEN_SCALE: string = "tweenScale"; + protected static readonly CURVE: string = "curve"; + protected static readonly SOUND: string = "sound"; + protected static readonly EVENT: string = "event"; + protected static readonly ACTION: string = "action"; + + protected static readonly X: string = "x"; + protected static readonly Y: string = "y"; + protected static readonly SKEW_X: string = "skX"; + protected static readonly SKEW_Y: string = "skY"; + protected static readonly SCALE_X: string = "scX"; + protected static readonly SCALE_Y: string = "scY"; + protected static readonly VALUE: string = "value"; + protected static readonly ROTATE: string = "rotate"; + protected static readonly SKEW: string = "skew"; + + protected static readonly ALPHA_OFFSET: string = "aO"; + protected static readonly RED_OFFSET: string = "rO"; + protected static readonly GREEN_OFFSET: string = "gO"; + protected static readonly BLUE_OFFSET: string = "bO"; + protected static readonly ALPHA_MULTIPLIER: string = "aM"; + protected static readonly RED_MULTIPLIER: string = "rM"; + protected static readonly GREEN_MULTIPLIER: string = "gM"; + protected static readonly BLUE_MULTIPLIER: string = "bM"; + + protected static readonly UVS: string = "uvs"; + protected static readonly VERTICES: string = "vertices"; + protected static readonly TRIANGLES: string = "triangles"; + protected static readonly WEIGHTS: string = "weights"; + protected static readonly SLOT_POSE: string = "slotPose"; + protected static readonly BONE_POSE: string = "bonePose"; + + protected static readonly GOTO_AND_PLAY: string = "gotoAndPlay"; + + protected static readonly DEFAULT_NAME: string = "default"; + + protected static _getArmatureType(value: string): ArmatureType { + switch (value.toLowerCase()) { + case "stage": + return ArmatureType.Stage; + + case "armature": + return ArmatureType.Armature; + + case "movieclip": + return ArmatureType.MovieClip; + + default: + return ArmatureType.Armature; + } + } + + protected static _getDisplayType(value: string): DisplayType { + switch (value.toLowerCase()) { + case "image": + return DisplayType.Image; + + case "mesh": + return DisplayType.Mesh; + + case "armature": + return DisplayType.Armature; + + case "boundingbox": + return DisplayType.BoundingBox; + + default: + return DisplayType.Image; + } + } + + protected static _getBoundingBoxType(value: string): BoundingBoxType { + switch (value.toLowerCase()) { + case "rectangle": + return BoundingBoxType.Rectangle; + + case "ellipse": + return BoundingBoxType.Ellipse; + + case "polygon": + return BoundingBoxType.Polygon; + + default: + return BoundingBoxType.Rectangle; + } + } + + protected static _getActionType(value: string): ActionType { + switch (value.toLowerCase()) { + case "play": + return ActionType.Play; + + case "frame": + return ActionType.Frame; + + case "sound": + return ActionType.Sound; + + default: + return ActionType.Play; + } + } + + protected static _getBlendMode(value: string): BlendMode { + switch (value.toLowerCase()) { + case "normal": + return BlendMode.Normal; + + case "add": + return BlendMode.Add; + + case "alpha": + return BlendMode.Alpha; + + case "darken": + return BlendMode.Darken; + + case "difference": + return BlendMode.Difference; + + case "erase": + return BlendMode.Erase; + + case "hardlight": + return BlendMode.HardLight; + + case "invert": + return BlendMode.Invert; + + case "layer": + return BlendMode.Layer; + + case "lighten": + return BlendMode.Lighten; + + case "multiply": + return BlendMode.Multiply; + + case "overlay": + return BlendMode.Overlay; + + case "screen": + return BlendMode.Screen; + + case "subtract": + return BlendMode.Subtract; + + default: + return BlendMode.Normal; + } + } + /** + * @private + */ + public abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + public abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + public static parseDragonBonesData(rawData: any): DragonBonesData | null { + if (rawData instanceof ArrayBuffer) { + return BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + public static parseTextureAtlasData(rawData: any, scale: number = 1): any { + console.warn("已废弃,请参考 @see"); + const textureAtlasData = {} as any; + + const subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (let i = 0, len = subTextureList.length; i < len; i++) { + const subTextureObject = subTextureList[i]; + const subTextureName = subTextureObject[DataParser.NAME]; + const subTextureRegion = new Rectangle(); + let subTextureFrame: Rectangle | null = null; + + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + + return textureAtlasData; + } + } +} diff --git a/reference/DragonBones/src/dragonBones/parser/ObjectDataParser.ts b/reference/DragonBones/src/dragonBones/parser/ObjectDataParser.ts new file mode 100644 index 0000000..130b24c --- /dev/null +++ b/reference/DragonBones/src/dragonBones/parser/ObjectDataParser.ts @@ -0,0 +1,1795 @@ +namespace dragonBones { + /** + * @private + */ + export class ObjectDataParser extends DataParser { + + /** + * @private + */ + + private _intArrayJson: Array = []; + private _floatArrayJson: Array = []; + private _frameIntArrayJson: Array = []; + private _frameFloatArrayJson: Array = []; + private _frameArrayJson: Array = []; + private _timelineArrayJson: Array = []; + + private _intArrayBuffer: Int16Array; + private _floatArrayBuffer: Float32Array; + private _frameIntArrayBuffer: Int16Array; + private _frameFloatArrayBuffer: Float32Array; + private _frameArrayBuffer: Int16Array; + private _timelineArrayBuffer: Uint16Array; + + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean { + if (key in rawData) { + const value = rawData[key]; + const type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + + default: + return true; + } + } + else { + return !!value; + } + } + + return defaultValue; + } + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number { + if (key in rawData) { + const value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + + return +value || 0; + } + + return defaultValue; + } + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string { + if (key in rawData) { + const value = rawData[key]; + const type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (let i = 0, l = (value as string).length; i < l; ++i) { + if ((value as string).charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + + return value; + } + + return String(value); + } + + return defaultValue; + } + + protected _rawTextureAtlasIndex: number = 0; + protected readonly _rawBones: Array = []; + protected _data: DragonBonesData = null as any; // + protected _armature: ArmatureData = null as any; // + protected _bone: BoneData = null as any; // + protected _slot: SlotData = null as any; // + protected _skin: SkinData = null as any; // + protected _mesh: MeshDisplayData = null as any; // + protected _animation: AnimationData = null as any; // + protected _timeline: TimelineData = null as any; // + protected _rawTextureAtlases: Array | null = null; + + private _defalultColorOffset: number = -1; + private _prevTweenRotate: number = 0; + private _prevRotation: number = 0.0; + private readonly _helpMatrixA: Matrix = new Matrix(); + private readonly _helpMatrixB: Matrix = new Matrix(); + private readonly _helpTransform: Transform = new Transform(); + private readonly _helpColorTransform: ColorTransform = new ColorTransform(); + private readonly _helpPoint: Point = new Point(); + private readonly _helpArray: Array = []; + private readonly _actionFrames: Array = []; + private readonly _weightSlotPose: Map> = {}; + private readonly _weightBonePoses: Map> = {}; + private readonly _weightBoneIndices: Map> = {}; + private readonly _cacheBones: Map> = {}; + private readonly _meshs: Map = {}; + private readonly _slotChildActions: Map> = {}; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + private _getCurvePoint(x1: number, y1: number, x2: number, y2: number, x3: number, y3: number, x4: number, y4: number, t: number, result: Point): void { + const l_t = 1.0 - t; + const powA = l_t * l_t; + const powB = t * t; + const kA = l_t * powA; + const kB = 3.0 * t * powA; + const kC = 3.0 * l_t * powB; + const kD = t * powB; + + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + } + /** + * @private + */ + private _samplingEasingCurve(curve: Array, samples: Array): void { + const curveCount = curve.length; + let stepIndex = -2; + for (let i = 0, l = samples.length; i < l; ++i) { + let t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { // stepIndex + 3 * 2 + stepIndex += 6; + } + + const isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + const x1 = isInCurve ? curve[stepIndex] : 0.0; + const y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + const x2 = curve[stepIndex + 2]; + const y2 = curve[stepIndex + 3]; + const x3 = curve[stepIndex + 4]; + const y3 = curve[stepIndex + 5]; + const x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + const y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + + let lower = 0.0; + let higher = 1.0; + while (higher - lower > 0.0001) { + const percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + + samples[i] = this._helpPoint.y; + } + } + + private _sortActionFrame(a: ActionFrame, b: ActionFrame): number { + return a.frameStart > b.frameStart ? 1 : -1; + } + + private _parseActionDataInFrame(rawData: any, frameStart: number, bone: BoneData | null, slot: SlotData | null): void { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, ActionType.Frame, bone, slot); + } + + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, ActionType.Sound, bone, slot); + } + + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, ActionType.Play, bone, slot); + } + + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, ActionType.Frame, bone, slot); + } + + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, ActionType.Play, bone, slot); + } + } + + private _mergeActionFrame(rawData: any, frameStart: number, type: ActionType, bone: BoneData | null, slot: SlotData | null): void { + const actionOffset = DragonBones.webAssembly ? (this._armature.actions as any).size() : this._armature.actions.length; + const actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + let frame: ActionFrame | null = null; + + if (this._actionFrames.length === 0) { // First frame. + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + + for (const eachFrame of this._actionFrames) { // Get same frame. + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + + if (frame === null) { // Create and cache frame. + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + + for (let i = 0; i < actionCount; ++i) { // Cache action offsets. + frame.actions.push(actionOffset + i); + } + } + + private _parseCacheActionFrame(frame: ActionFrame): number { + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : (this._data.frameArray as Array); + const frameOffset = frameArray.length; + const actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + BinaryOffset.FramePosition] = frame.frameStart; + frameArray[frameOffset + BinaryOffset.FramePosition + 1] = actionCount; // Action count. + + for (let i = 0; i < actionCount; ++i) { // Action offsets. + frameArray[frameOffset + BinaryOffset.FramePosition + 2 + i] = frame.actions[i]; + } + + return frameOffset; + } + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData { + // const armature = BaseObject.borrowObject(ArmatureData); + const armature = DragonBones.webAssembly ? new Module["ArmatureData"]() as ArmatureData : BaseObject.borrowObject(ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, ArmatureType.Armature); + } + + if (armature.frameRate === 0) { // Data error. + armature.frameRate = 24; + } + + this._armature = armature; + + if (ObjectDataParser.AABB in rawData) { + const rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + + if (ObjectDataParser.CANVAS in rawData) { + const rawCanvas = rawData[ObjectDataParser.CANVAS]; + const canvas = BaseObject.borrowObject(CanvasData); + + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + + armature.canvas = canvas; + } + + if (ObjectDataParser.BONE in rawData) { + const rawBones = rawData[ObjectDataParser.BONE] as Array; + for (const rawBone of rawBones) { + const parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + const bone = this._parseBone(rawBone); + + if (parentName.length > 0) { // Get bone parent. + const parent = armature.getBone(parentName); + if (parent !== null) { + bone.parent = parent; + } + else { // Cache. + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + + if (bone.name in this._cacheBones) { + for (const child of this._cacheBones[bone.name]) { + child.parent = bone; + } + + delete this._cacheBones[bone.name]; + } + + armature.addBone(bone); + + this._rawBones.push(bone); // Raw bone sort. + } + } + + if (ObjectDataParser.IK in rawData) { + const rawIKS = rawData[ObjectDataParser.IK] as Array; + for (const rawIK of rawIKS) { + this._parseIKConstraint(rawIK); + } + } + + armature.sortBones(); + + if (ObjectDataParser.SLOT in rawData) { + const rawSlots = rawData[ObjectDataParser.SLOT] as Array; + for (const rawSlot of rawSlots) { + armature.addSlot(this._parseSlot(rawSlot)); + } + } + + if (ObjectDataParser.SKIN in rawData) { + const rawSkins = rawData[ObjectDataParser.SKIN] as Array; + for (const rawSkin of rawSkins) { + armature.addSkin(this._parseSkin(rawSkin)); + } + } + + if (ObjectDataParser.ANIMATION in rawData) { + const rawAnimations = rawData[ObjectDataParser.ANIMATION] as Array; + for (const rawAnimation of rawAnimations) { + const animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, ActionType.Play, null, null); + } + + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, ActionType.Play, null, null); + } + + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (let i = 0; i < (DragonBones.webAssembly ? (armature.defaultActions as any).size() : armature.defaultActions.length); ++i) { + const action = DragonBones.webAssembly ? (armature.defaultActions as any).get(i) as ActionData : armature.defaultActions[i]; + if (action.type === ActionType.Play) { + const animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + + // Clear helper. + this._rawBones.length = 0; + this._armature = null as any; + for (let k in this._meshs) { + delete this._meshs[k]; + } + for (let k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (let k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (let k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (let k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (let k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + + return armature; + } + /** + * @private + */ + protected _parseBone(rawData: any): BoneData { + // const bone = BaseObject.borrowObject(BoneData); + const bone = DragonBones.webAssembly ? new Module["BoneData"]() as BoneData : BaseObject.borrowObject(BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + + } + + return bone; + } + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void { + const bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + + const target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + + // const constraint = BaseObject.borrowObject(IKConstraintData); + const constraint = DragonBones.webAssembly ? new Module["IKConstraintData"]() : BaseObject.borrowObject(IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + + const chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (DragonBones.webAssembly) { + (bone.constraints as any).push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + } + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData { + // const slot = BaseObject.borrowObject(SlotData); + const slot = DragonBones.webAssembly ? new Module["SlotData"]() : BaseObject.borrowObject(SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = DragonBones.webAssembly ? (this._armature.sortedSlots as any).size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")) as any; // + + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, BlendMode.Normal); + } + + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = DragonBones.webAssembly ? Module["SlotData"].createColor() : SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : SlotData.DEFAULT_COLOR; + } + + if (ObjectDataParser.ACTIONS in rawData) { + const actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, ActionType.Play, null, null); + } + + return slot; + } + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData { + // const skin = BaseObject.borrowObject(SkinData); + const skin = DragonBones.webAssembly ? new Module["SkinData"]() : BaseObject.borrowObject(SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + + const rawSlots = rawData[ObjectDataParser.SLOT]; + for (const rawSlot of rawSlots) { + const slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + const slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + + if (ObjectDataParser.DISPLAY in rawSlot) { + const rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (const rawDisplay of rawDisplays) { + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + + this._slot = null as any; // + } + } + + this._skin = null as any; // + } + + return skin; + } + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null { + let display: DisplayData | null = null; + const name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + const path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + let type = DisplayType.Image; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + + switch (type) { + case DisplayType.Image: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + const imageDisplay = display = DragonBones.webAssembly ? new Module["ImageDisplayData"]() as ImageDisplayData : BaseObject.borrowObject(ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + + case DisplayType.Armature: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + const armatureDisplay = display = DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() as ArmatureDisplayData : BaseObject.borrowObject(ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, ActionType.Play, null, null); + } + else if (this._slot.name in this._slotChildActions) { + const displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (const action of this._slotChildActions[this._slot.name]) { + if (DragonBones.webAssembly) { + (armatureDisplay.actions as any).push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + + delete this._slotChildActions[this._slot.name]; + } + } + break; + + case DisplayType.Mesh: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + const meshDisplay = display = DragonBones.webAssembly ? new Module["MeshDisplayData"]() as MeshDisplayData : BaseObject.borrowObject(MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + + const shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + const shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + + case DisplayType.BoundingBox: + const boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + const boundingBoxDisplay = display = DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() as BoundingBoxDisplayData : BaseObject.borrowObject(BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + + return display; + } + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void { + if (ObjectDataParser.PIVOT in rawData) { + const rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + } + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void { + const rawVertices = rawData[ObjectDataParser.VERTICES] as Array; + const rawUVs = rawData[ObjectDataParser.UVS] as Array; + const rawTriangles = rawData[ObjectDataParser.TRIANGLES] as Array; + const intArray = DragonBones.webAssembly ? this._intArrayJson : this._data.intArray as Array; + const floatArray = DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray as Array; + const vertexCount = Math.floor(rawVertices.length / 2); // uint + const triangleCount = Math.floor(rawTriangles.length / 3); // uint + const vertexOffset = floatArray.length; + const uvOffset = vertexOffset + vertexCount * 2; + + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + BinaryOffset.MeshVertexCount] = vertexCount; + intArray[mesh.offset + BinaryOffset.MeshTriangleCount] = triangleCount; + intArray[mesh.offset + BinaryOffset.MeshFloatOffset] = vertexOffset; + for (let i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + BinaryOffset.MeshVertexIndices + i] = rawTriangles[i]; + } + + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + + if (ObjectDataParser.WEIGHTS in rawData) { + const rawWeights = rawData[ObjectDataParser.WEIGHTS] as Array; + const rawSlotPose = rawData[ObjectDataParser.SLOT_POSE] as Array; + const rawBonePoses = rawData[ObjectDataParser.BONE_POSE] as Array; + const weightBoneIndices = new Array(); + const weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + const floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + const weight = DragonBones.webAssembly ? new Module["WeightData"]() : BaseObject.borrowObject(WeightData); + + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + BinaryOffset.WeigthFloatOffset] = floatOffset; + + for (let i = 0; i < weightBoneCount; ++i) { + const rawBoneIndex = rawBonePoses[i * 7]; // uint + const bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + + if (DragonBones.webAssembly) { + for (let j = 0; j < (this._armature.sortedBones as any).size(); j++) { + if ((this._armature.sortedBones as any).get(j) === bone) { + intArray[weight.offset + BinaryOffset.WeigthBoneIndices + i] = j; + } + } + } + else { + intArray[weight.offset + BinaryOffset.WeigthBoneIndices + i] = this._armature.sortedBones.indexOf(bone); + } + } + + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + + for ( + let i = 0, iW = 0, iB = weight.offset + BinaryOffset.WeigthBoneIndices + weightBoneCount, iV = floatOffset; + i < vertexCount; + ++i + ) { + const iD = i * 2; + const vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + + let x = floatArray[vertexOffset + iD]; + let y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + + for (let j = 0; j < vertexBoneCount; ++j) { + const rawBoneIndex = rawWeights[iW++]; // uint + const bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + + mesh.weight = weight; + + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + } + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null { + let boundingBox: BoundingBoxData | null = null; + let type = BoundingBoxType.Rectangle; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + + switch (type) { + case BoundingBoxType.Rectangle: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() as RectangleBoundingBoxData : BaseObject.borrowObject(RectangleBoundingBoxData); + break; + + case BoundingBoxType.Ellipse: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() as EllipseBoundingBoxData : BaseObject.borrowObject(EllipseBoundingBoxData); + break; + + case BoundingBoxType.Polygon: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === BoundingBoxType.Rectangle || boundingBox.type === BoundingBoxType.Ellipse) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + + return boundingBox; + } + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData { + const rawVertices = rawData[ObjectDataParser.VERTICES] as Array; + const floatArray = DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray as Array; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + const polygonBoundingBox = DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() as PolygonBoundingBoxData : BaseObject.borrowObject(PolygonBoundingBoxData); + + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + + for (let i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + const iN = i + 1; + const x = rawVertices[i]; + const y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + + return polygonBoundingBox; + } + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData { + // const animation = BaseObject.borrowObject(AnimationData); + const animation = DragonBones.webAssembly ? new Module["AnimationData"]() as AnimationData : BaseObject.borrowObject(AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + + this._animation = animation; + + if (ObjectDataParser.FRAME in rawData) { + const rawFrames = rawData[ObjectDataParser.FRAME] as Array; + const keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (let i = 0, frameStart = 0; i < keyFrameCount; ++i) { + const rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline( + rawData[ObjectDataParser.Z_ORDER], TimelineType.ZOrder, + false, false, 0, + this._parseZOrderFrame + ); + } + + if (ObjectDataParser.BONE in rawData) { + const rawTimelines = rawData[ObjectDataParser.BONE] as Array; + for (const rawTimeline of rawTimelines) { + this._parseBoneTimeline(rawTimeline); + } + } + + if (ObjectDataParser.SLOT in rawData) { + const rawTimelines = rawData[ObjectDataParser.SLOT] as Array; + for (const rawTimeline of rawTimelines) { + this._parseSlotTimeline(rawTimeline); + } + } + + if (ObjectDataParser.FFD in rawData) { + const rawTimelines = rawData[ObjectDataParser.FFD] as Array; + for (const rawTimeline of rawTimelines) { + const slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + const displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + const slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + + this._slot = slot; + this._mesh = this._meshs[displayName]; + + const timelineFFD = this._parseTimeline(rawTimeline, TimelineType.SlotFFD, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + + this._slot = null as any; // + this._mesh = null as any; // + } + } + + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + const timeline = this._animation.actionTimeline = DragonBones.webAssembly ? new Module["TimelineData"]() as TimelineData : BaseObject.borrowObject(TimelineData); + const timelineArray = DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray as Array; + const keyFrameCount = this._actionFrames.length; + timeline.type = TimelineType.Action; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + BinaryOffset.TimelineScale] = 100; + timelineArray[timeline.offset + BinaryOffset.TimelineOffset] = 0; + timelineArray[timeline.offset + BinaryOffset.TimelineKeyFrameCount] = keyFrameCount; + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueCount] = 0; + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueOffset] = 0; + + this._timeline = timeline; + + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + const totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + const frameIndices = this._data.frameIndices; + if (DragonBones.webAssembly) { + timeline.frameIndicesOffset = (frameIndices as any).size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (let j = 0; j < totalFrameCount; ++j) { + (frameIndices as any).push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + + for ( + let i = 0, iK = 0, frameStart = 0, frameCount = 0; + i < totalFrameCount; + ++i + ) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + const frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + + timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + + if (DragonBones.webAssembly) { + (frameIndices as any).set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + + this._timeline = null as any; // + this._actionFrames.length = 0; + } + + this._animation = null as any; // + + return animation; + } + /** + * @private + */ + protected _parseTimeline( + rawData: any, type: TimelineType, + addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, + frameParser: (rawData: any, frameStart: number, frameCount: number) => number + ): TimelineData | null { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + + const rawFrames: Array = rawData[ObjectDataParser.FRAME]; + const keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + + const timelineArray = DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray as Array; + const frameIntArrayLength = DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + const frameFloatArrayLength = DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + const timeline = DragonBones.webAssembly ? new Module["TimelineData"]() as TimelineData : BaseObject.borrowObject(TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + BinaryOffset.TimelineScale] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + BinaryOffset.TimelineOffset] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + BinaryOffset.TimelineKeyFrameCount] = keyFrameCount; + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueCount] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueOffset] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueOffset] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + BinaryOffset.TimelineFrameValueOffset] = 0; + } + + this._timeline = timeline; + + if (keyFrameCount === 1) { // Only one frame. + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + const frameIndices = this._data.frameIndices; + const totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (DragonBones.webAssembly) { + timeline.frameIndicesOffset = (frameIndices as any).size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (let j = 0; j < totalFrameCount; ++j) { + (frameIndices as any).push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + + for ( + let i = 0, iK = 0, frameStart = 0, frameCount = 0; + i < totalFrameCount; + ++i + ) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + const rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + + timelineArray[timeline.offset + BinaryOffset.TimelineFrameOffset + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + + if (DragonBones.webAssembly) { + (frameIndices as any).set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + + this._timeline = null as any; // + + return timeline; + } + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void { + const bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name) as any; + + const timeline = this._parseTimeline( + rawData, TimelineType.BoneAll, + false, true, 6, + this._parseBoneFrame + ); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + + this._bone = null as any; // + this._slot = null as any; // + } + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void { + const slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + + this._slot = slot; + + const displayIndexTimeline = this._parseTimeline(rawData, TimelineType.SlotDisplay, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + + const colorTimeline = this._parseTimeline(rawData, TimelineType.SlotColor, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + + this._slot = null as any; // + } + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number { + rawData; + frameCount; + + const frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + BinaryOffset.FramePosition] = frameStart; + + return frameOffset; + } + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number { + const frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + const sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.Curve; + frameArray[frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount] = sampleCount; + for (let i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + BinaryOffset.FrameCurveSamples + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + const noTween = -2.0; + let tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.None; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.Line; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.QuadIn; + frameArray[frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.QuadOut; + frameArray[frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.QuadInOut; + frameArray[frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + BinaryOffset.FrameTweenType] = TweenType.None; + } + + return frameOffset; + } + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number { + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray as Array; + const frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + if (ObjectDataParser.Z_ORDER in rawData) { + const rawZOrder = rawData[ObjectDataParser.Z_ORDER] as Array; + if (rawZOrder.length > 0) { + const slotCount = this._armature.sortedSlots.length; + const unchanged = new Array(slotCount - rawZOrder.length / 2); + const zOrders = new Array(slotCount); + + for (let i = 0; i < slotCount; ++i) { + zOrders[i] = -1; + } + + let originalIndex = 0; + let unchangedIndex = 0; + for (let i = 0, l = rawZOrder.length; i < l; i += 2) { + const slotIndex = rawZOrder[i]; + const zOrderOffset = rawZOrder[i + 1]; + + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + + let i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + + return frameOffset; + } + } + + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + + return frameOffset; + } + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number { + const frameFloatArray = DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray as Array; + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray as Array; + const frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + + // Modify rotation. + let rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + + rotation = this._prevRotation + rotation - this._prevRotation + Transform.PI_D * this._prevTweenRotate; + } + } + + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + + let frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + + return frameOffset; + } + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number { + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray as Array; + const frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + + return frameOffset; + } + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number { + const intArray = DragonBones.webAssembly ? this._intArrayJson : this._data.intArray as Array; + const frameIntArray = DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray as Array; + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray as Array; + const frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + + let colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + const rawColor = rawData[ObjectDataParser.COLOR]; + for (let k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + + colorOffset = this._defalultColorOffset; + } + + const frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + + return frameOffset; + } + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number { + const intArray = DragonBones.webAssembly ? this._intArrayJson : this._data.intArray as Array; + const frameFloatArray = DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray as Array; + const frameArray = DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray as Array; + const frameFloatOffset = frameFloatArray.length; + const frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + const rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] as Array : null; + const offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + const vertexCount = intArray[this._mesh.offset + BinaryOffset.MeshVertexCount]; + + let x = 0.0; + let y = 0.0; + let iB = 0; + let iV = 0; + if (this._mesh.weight !== null) { + const rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + BinaryOffset.WeigthBoneIndices + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + + for ( + let i = 0; + i < vertexCount * 2; + i += 2 + ) { + if (rawVertices === null) { // Fill 0. + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + + if (this._mesh.weight !== null) { // If mesh is skinned, transform point by bone bind pose. + const rawBonePoses = this._weightBonePoses[this._mesh.name]; + const weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + const vertexBoneCount = intArray[iB++]; + + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + + for (let j = 0; j < vertexBoneCount; ++j) { + const boneIndex = intArray[iB++]; + const bone = this._mesh.weight.bones[boneIndex]; + const rawBoneIndex = this._rawBones.indexOf(bone); + + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + + if (frameStart === 0) { + const frameIntArray = DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray as Array; + const timelineArray = DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray as Array; + const frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineMeshOffset] = this._mesh.offset; + frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineFFDCount] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineValueCount] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineValueOffset] = 0; + frameIntArray[frameIntOffset + BinaryOffset.FFDTimelineFloatOffset] = frameFloatOffset; + timelineArray[this._timeline.offset + BinaryOffset.TimelineFrameValueCount] = frameIntOffset - this._animation.frameIntOffset; + } + + return frameOffset; + } + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number { + let actionCount = 0; + + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + const action = DragonBones.webAssembly ? new Module["ActionData"]() as ActionData : BaseObject.borrowObject(ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + DragonBones.webAssembly ? (actions as any).push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (const rawAction of rawData) { + // const action = BaseObject.borrowObject(ActionData); + const action = DragonBones.webAssembly ? new Module["ActionData"]() as ActionData : BaseObject.borrowObject(ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = ActionType.Play; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + + if (ObjectDataParser.BONE in rawAction) { + const boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + + if (ObjectDataParser.SLOT in rawAction) { + const slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = DragonBones.webAssembly ? new Module["UserData"]() as UserData : BaseObject.borrowObject(UserData); + } + + const rawInts = rawAction[ObjectDataParser.INTS] as Array; + for (const rawValue of rawInts) { + DragonBones.webAssembly ? (action.data.ints as any).push_back(rawValue) : action.data.ints.push(rawValue); + } + } + + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = DragonBones.webAssembly ? new Module["UserData"]() as UserData : BaseObject.borrowObject(UserData); + } + + const rawFloats = rawAction[ObjectDataParser.FLOATS] as Array; + for (const rawValue of rawFloats) { + DragonBones.webAssembly ? (action.data.floats as any).push_back(rawValue) : action.data.floats.push(rawValue); + } + } + + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = DragonBones.webAssembly ? new Module["UserData"]() as UserData : BaseObject.borrowObject(UserData); + } + + const rawStrings = rawAction[ObjectDataParser.STRINGS] as Array; + for (const rawValue of rawStrings) { + DragonBones.webAssembly ? (action.data.strings as any).push_back(rawValue) : action.data.strings.push(rawValue); + } + } + + DragonBones.webAssembly ? (actions as any).push_back(action) : actions.push(action); + actionCount++; + } + } + + return actionCount; + } + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * Transform.DEG_RAD); + transform.skew = Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * Transform.DEG_RAD); + transform.skew = Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * Transform.DEG_RAD) - transform.rotation; + } + + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + } + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + } + /** + * @private + */ + protected _parseArray(rawData: any): void { + rawData; + + if (DragonBones.webAssembly) { + return; + } + + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + } + /** + * @private + */ + protected _parseWASMArray(): void { + let intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (let i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (let i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (let i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (let i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (let i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (let i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], + [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + + } + + /** + * @inheritDoc + */ + public parseDragonBonesData(rawData: any, scale: number = 1): DragonBonesData | null { + console.assert(rawData !== null && rawData !== undefined); + + const version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + const compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + + if ( + ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0 + ) { + // const data = BaseObject.borrowObject(DragonBonesData); + const data = DragonBones.webAssembly ? new Module["DragonBonesData"]() as DragonBonesData : BaseObject.borrowObject(DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + + if (data.frameRate === 0) { // Data error. + data.frameRate = 24; + } + + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + + this._parseArray(rawData); + + const rawArmatures = rawData[ObjectDataParser.ARMATURE] as Array; + for (const rawArmature of rawArmatures) { + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + + this._data = null as any; + } + + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + + return null; + } + /** + * @inheritDoc + */ + public parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number = 0.0): boolean { + console.assert(rawData !== undefined); + + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + + const rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + + return true; + } + + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + + if (scale > 0.0) { // Use params scale. + textureAtlasData.scale = scale; + } + else { // Use data scale. + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + + scale = 1.0 / scale; // + + if (ObjectDataParser.SUB_TEXTURE in rawData) { + const rawTextures = rawData[ObjectDataParser.SUB_TEXTURE] as Array; + for (let i = 0, l = rawTextures.length; i < l; ++i) { + const rawTexture = rawTextures[i]; + const textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + + const frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + const frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = DragonBones.webAssembly ? Module["TextureData"].createRectangle() as Rectangle : TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + + textureAtlasData.addTexture(textureData); + } + } + + return true; + } + + /** + * @private + */ + private static _objectDataParserInstance: ObjectDataParser = null as any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + public static getInstance(): ObjectDataParser { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + + return ObjectDataParser._objectDataParserInstance; + } + } + class ActionFrame { + public frameStart: number = 0; + public readonly actions: Array = []; + } +} diff --git a/reference/DragonBones/tsconfig.json b/reference/DragonBones/tsconfig.json new file mode 100644 index 0000000..7ef7244 --- /dev/null +++ b/reference/DragonBones/tsconfig.json @@ -0,0 +1,71 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": true, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "outFile": "out/dragonBones.js", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ], + "files": [ + "./src/dragonBones/modules.ts", + + "./src/dragonBones/core/DragonBones.ts", + "./src/dragonBones/core/BaseObject.ts", + + "./src/dragonBones/geom/Matrix.ts", + "./src/dragonBones/geom/Transform.ts", + "./src/dragonBones/geom/ColorTransform.ts", + "./src/dragonBones/geom/Point.ts", + "./src/dragonBones/geom/Rectangle.ts", + + "./src/dragonBones/model/UserData.ts", + "./src/dragonBones/model/DragonBonesData.ts", + "./src/dragonBones/model/ArmatureData.ts", + "./src/dragonBones/model/ConstraintData.ts", + "./src/dragonBones/model/DisplayData.ts", + "./src/dragonBones/model/BoundingBoxData.ts", + "./src/dragonBones/model/AnimationData.ts", + "./src/dragonBones/model/AnimationConfig.ts", + "./src/dragonBones/model/TextureAtlasData.ts", + + "./src/dragonBones/armature/IArmatureProxy.ts", + "./src/dragonBones/armature/Armature.ts", + "./src/dragonBones/armature/TransformObject.ts", + "./src/dragonBones/armature/Bone.ts", + "./src/dragonBones/armature/Slot.ts", + "./src/dragonBones/armature/Constraint.ts", + + "./src/dragonBones/animation/IAnimatable.ts", + "./src/dragonBones/animation/WorldClock.ts", + "./src/dragonBones/animation/Animation.ts", + "./src/dragonBones/animation/AnimationState.ts", + "./src/dragonBones/animation/BaseTimelineState.ts", + "./src/dragonBones/animation/TimelineState.ts", + + "./src/dragonBones/event/EventObject.ts", + "./src/dragonBones/event/IEventDispatcher.ts", + + "./src/dragonBones/parser/DataParser.ts", + "./src/dragonBones/parser/ObjectDataParser.ts", + "./src/dragonBones/parser/BinaryDataParser.ts", + + "./src/dragonBones/factory/BaseFactory.ts" + ] +} \ No newline at end of file diff --git a/reference/DragonBones/tslint.json b/reference/DragonBones/tslint.json new file mode 100644 index 0000000..eeb58d1 --- /dev/null +++ b/reference/DragonBones/tslint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "no-unused-expression": true, + "no-unreachable": true, + "no-duplicate-variable": true, + "no-duplicate-key": true, + "no-unused-variable": true, + "curly": false, + "class-name": true, + "triple-equals": true, + "semicolon": [ + true + ] + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/README.md b/reference/Egret/4.x/README.md new file mode 100644 index 0000000..161b092 --- /dev/null +++ b/reference/Egret/4.x/README.md @@ -0,0 +1,8 @@ +## How to build +``` +$npm install +$npm run build +``` + +## Egret declaration +[egret.d.ts](https://github.com/egret-labs/egret-core/blob/master/build/egret/egret.d.ts) \ No newline at end of file diff --git a/reference/Egret/4.x/out/dragonBones.d.ts b/reference/Egret/4.x/out/dragonBones.d.ts new file mode 100644 index 0000000..d663a30 --- /dev/null +++ b/reference/Egret/4.x/out/dragonBones.d.ts @@ -0,0 +1,5313 @@ +declare const Module: any; +declare namespace dragonBones { + /** + * @private + */ + const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4, + } + /** + * @private + */ + const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2, + } + /** + * @private + */ + const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3, + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2, + } + /** + * @private + */ + const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11, + } + /** + * @private + */ + const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13, + } + /** + * @private + */ + const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5, + } + /** + * @private + */ + const enum TimelineType { + Action = 0, + ZOrder = 1, + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + AnimationTime = 40, + AnimationWeight = 41, + } + /** + * @private + */ + const enum OffsetMode { + None = 0, + Additive = 1, + Override = 2, + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5, + } + /** + * @private + */ + interface Map { + [key: string]: T; + } + /** + * @private + */ + class DragonBones { + static yDown: boolean; + static debug: boolean; + static debugDraw: boolean; + static webAssembly: boolean; + static readonly VERSION: string; + private readonly _clock; + private readonly _events; + private readonly _objects; + private _eventManager; + constructor(eventManager: IEventDispatcher); + advanceTime(passedTime: number): void; + bufferEvent(value: EventObject): void; + bufferObject(object: BaseObject): void; + readonly clock: WorldClock; + readonly eventManager: IEventDispatcher; + } +} +declare namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class BaseObject { + private static _hashCode; + private static _defaultMaxCount; + private static readonly _maxCountMap; + private static readonly _poolsMap; + private static _returnObject(object); + /** + * @private + */ + static toString(): string; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static clearPool(objectConstructor?: (typeof BaseObject) | null): void; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static borrowObject(objectConstructor: { + new (): T; + }): T; + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly hashCode: number; + private _isInPool; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + returnToPool(): void; + } +} +declare namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Matrix { + a: number; + b: number; + c: number; + d: number; + tx: number; + ty: number; + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Matrix): Matrix; + /** + * @private + */ + copyFromArray(value: Array, offset?: number): Matrix; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + identity(): Matrix; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + concat(value: Matrix): Matrix; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + invert(): Matrix; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + transformPoint(x: number, y: number, result: { + x: number; + y: number; + }, delta?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Transform { + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x: number; + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y: number; + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew: number; + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation: number; + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX: number; + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY: number; + /** + * @private + */ + static readonly PI_D: number; + /** + * @private + */ + static readonly PI_H: number; + /** + * @private + */ + static readonly PI_Q: number; + /** + * @private + */ + static readonly RAD_DEG: number; + /** + * @private + */ + static readonly DEG_RAD: number; + /** + * @private + */ + static normalizeRadian(value: number): number; + constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x?: number, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y?: number, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew?: number, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation?: number, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX?: number, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Transform): Transform; + /** + * @private + */ + identity(): Transform; + /** + * @private + */ + add(value: Transform): Transform; + /** + * @private + */ + minus(value: Transform): Transform; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fromMatrix(matrix: Matrix): Transform; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + toMatrix(matrix: Matrix): Transform; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ColorTransform { + alphaMultiplier: number; + redMultiplier: number; + greenMultiplier: number; + blueMultiplier: number; + alphaOffset: number; + redOffset: number; + greenOffset: number; + blueOffset: number; + constructor(alphaMultiplier?: number, redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaOffset?: number, redOffset?: number, greenOffset?: number, blueOffset?: number); + copyFrom(value: ColorTransform): void; + identity(): void; + } +} +declare namespace dragonBones { + class Point { + x: number; + y: number; + constructor(x?: number, y?: number); + copyFrom(value: Point): void; + clear(): void; + } +} +declare namespace dragonBones { + class Rectangle { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + copyFrom(value: Rectangle): void; + clear(): void; + } +} +declare namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + class UserData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly ints: Array; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly floats: Array; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly strings: Array; + /** + * @private + */ + protected _onClear(): void; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getInt(index?: number): number; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getFloat(index?: number): number; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getString(index?: number): string; + } + /** + * @private + */ + class ActionData extends BaseObject { + static toString(): string; + type: ActionType; + name: string; + bone: BoneData | null; + slot: SlotData | null; + data: UserData | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + class DragonBonesData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly frameIndices: Array; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatureNames: Array; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatures: Map; + /** + * @private + */ + intArray: Array | Int16Array; + /** + * @private + */ + floatArray: Array | Float32Array; + /** + * @private + */ + frameIntArray: Array | Int16Array; + /** + * @private + */ + frameFloatArray: Array | Float32Array; + /** + * @private + */ + frameArray: Array | Int16Array; + /** + * @private + */ + timelineArray: Array | Uint16Array; + /** + * @private + */ + userData: UserData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addArmature(value: ArmatureData): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + getArmature(name: string): ArmatureData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + dispose(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + class CanvasData extends BaseObject { + /** + * @private + */ + static toString(): string; + hasBackground: boolean; + color: number; + x: number; + y: number; + width: number; + height: number; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class ArmatureData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * @private + */ + scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly aabb: Rectangle; + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * @private + */ + readonly sortedBones: Array; + /** + * @private + */ + readonly sortedSlots: Array; + /** + * @private + */ + readonly defaultActions: Array; + /** + * @private + */ + readonly actions: Array; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly bones: Map; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly slots: Map; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly skins: Map; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animations: Map; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultAnimation: AnimationData | null; + /** + * @private + */ + canvas: CanvasData | null; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + sortBones(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number; + /** + * @private + */ + getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void; + /** + * @private + */ + addBone(value: BoneData): void; + /** + * @private + */ + addSlot(value: SlotData): void; + /** + * @private + */ + addSkin(value: SkinData): void; + /** + * @private + */ + addAnimation(value: AnimationData): void; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + getBone(name: string): BoneData | null; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + getSlot(name: string): SlotData | null; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + getSkin(name: string): SkinData | null; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + getAnimation(name: string): AnimationData | null; + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class BoneData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + inheritTranslation: boolean; + /** + * @private + */ + inheritRotation: boolean; + /** + * @private + */ + inheritScale: boolean; + /** + * @private + */ + inheritReflection: boolean; + /** + * @private + */ + length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly transform: Transform; + /** + * @private + */ + readonly constraints: Array; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class SlotData extends BaseObject { + /** + * @private + */ + static readonly DEFAULT_COLOR: ColorTransform; + /** + * @private + */ + static createColor(): ColorTransform; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + blendMode: BlendMode; + /** + * @private + */ + displayIndex: number; + /** + * @private + */ + zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + color: ColorTransform; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + class SkinData extends BaseObject { + static toString(): string; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly displays: Map>; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addDisplay(slotName: string, value: DisplayData | null): void; + /** + * @private + */ + getDisplay(slotName: string, displayName: string): DisplayData | null; + /** + * @private + */ + getDisplays(slotName: string): Array | null; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class ConstraintData extends BaseObject { + order: number; + target: BoneData; + bone: BoneData; + root: BoneData | null; + protected _onClear(): void; + } + /** + * @private + */ + class IKConstraintData extends ConstraintData { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DisplayData extends BaseObject { + type: DisplayType; + name: string; + path: string; + readonly transform: Transform; + parent: ArmatureData; + protected _onClear(): void; + } + /** + * @private + */ + class ImageDisplayData extends DisplayData { + static toString(): string; + readonly pivot: Point; + texture: TextureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class ArmatureDisplayData extends DisplayData { + static toString(): string; + inheritAnimation: boolean; + readonly actions: Array; + armature: ArmatureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class MeshDisplayData extends ImageDisplayData { + static toString(): string; + inheritAnimation: boolean; + offset: number; + weight: WeightData | null; + protected _onClear(): void; + } + /** + * @private + */ + class BoundingBoxDisplayData extends DisplayData { + static toString(): string; + boundingBox: BoundingBoxData | null; + protected _onClear(): void; + } + /** + * @private + */ + class WeightData extends BaseObject { + static toString(): string; + count: number; + offset: number; + readonly bones: Array; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + height: number; + /** + * @private + */ + protected _onClear(): void; + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA: { + x: number; + y: number; + } | null, intersectionPointB: { + x: number; + y: number; + } | null, normalRadians: { + x: number; + y: number; + } | null): number; + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x, y, xMin, yMin, xMax, yMax); + /** + * @private + */ + static rectangleIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xMin: number, yMin: number, xMax: number, yMax: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static ellipseIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xC: number, yC: number, widthH: number, heightH: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static polygonIntersectsSegment(xA: number, yA: number, xB: number, yB: number, vertices: Array | Float32Array, offset: number, count: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + count: number; + /** + * @private + */ + offset: number; + /** + * @private + */ + x: number; + /** + * @private + */ + y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + vertices: Array | Float32Array; + /** + * @private + */ + weight: WeightData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } +} +declare namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + frameIntOffset: number; + /** + * @private + */ + frameFloatOffset: number; + /** + * @private + */ + frameOffset: number; + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + duration: number; + /** + * @private + */ + scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * @private + */ + readonly boneTimelines: Map>; + /** + * @private + */ + readonly slotTimelines: Map>; + /** + * @private + */ + readonly boneCachedFrameIndices: Map>; + /** + * @private + */ + readonly slotCachedFrameIndices: Map>; + /** + * @private + */ + actionTimeline: TimelineData | null; + /** + * @private + */ + zOrderTimeline: TimelineData | null; + /** + * @private + */ + parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + addBoneTimeline(bone: BoneData, timeline: TimelineData): void; + /** + * @private + */ + addSlotTimeline(slot: SlotData, timeline: TimelineData): void; + /** + * @private + */ + getBoneTimelines(name: string): Array | null; + /** + * @private + */ + getSlotTimeline(name: string): Array | null; + /** + * @private + */ + getBoneCachedFrameIndices(name: string): Array | null; + /** + * @private + */ + getSlotCachedFrameIndices(name: string): Array | null; + } + /** + * @private + */ + class TimelineData extends BaseObject { + static toString(): string; + type: TimelineType; + offset: number; + frameIndicesOffset: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + class AnimationConfig extends BaseObject { + static toString(): string; + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTime: number; + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly boneMask: Array; + /** + * @private + */ + protected _onClear(): void; + clear(): void; + copyFrom(value: AnimationConfig): void; + containsBoneMask(name: string): boolean; + addBoneMask(armature: Armature, name: string, recursive?: boolean): void; + removeBoneMask(armature: Armature, name: string, recursive?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + width: number; + /** + * @private + */ + height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + imagePath: string; + /** + * @private + */ + readonly textures: Map; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + copyFrom(value: TextureAtlasData): void; + /** + * @private + */ + abstract createTexture(): TextureData; + /** + * @private + */ + addTexture(value: TextureData): void; + /** + * @private + */ + getTexture(name: string): TextureData | null; + } + /** + * @private + */ + abstract class TextureData extends BaseObject { + static createRectangle(): Rectangle; + rotated: boolean; + name: string; + readonly region: Rectangle; + parent: TextureAtlasData; + frame: Rectangle | null; + protected _onClear(): void; + copyFrom(value: TextureData): void; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} +declare namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + class Armature extends BaseObject implements IAnimatable { + static toString(): string; + private static _onSortSlots(a, b); + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + inheritAnimation: boolean; + /** + * @private + */ + debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + private _debugDraw; + private _lockUpdate; + private _bonesDirty; + private _slotsDirty; + private _zOrderDirty; + private _flipX; + private _flipY; + /** + * @internal + * @private + */ + _cacheFrameIndex: number; + private readonly _bones; + private readonly _slots; + private readonly _actions; + private _animation; + private _proxy; + private _display; + /** + * @private + */ + _replaceTextureAtlasData: TextureAtlasData | null; + private _replacedTexture; + /** + * @internal + * @private + */ + _dragonBones: DragonBones; + private _clock; + /** + * @internal + * @private + */ + _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void; + private _sortBones(); + private _sortSlots(); + /** + * @internal + * @private + */ + _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void; + /** + * @internal + * @private + */ + _addBoneToBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _removeBoneFromBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _addSlotToSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _removeSlotFromSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _bufferAction(action: ActionData, append: boolean): void; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @private + */ + init(armatureData: ArmatureData, proxy: IArmatureProxy, display: any, dragonBones: DragonBones): void; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(boneName?: string | null, updateSlotDisplay?: boolean): void; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): Slot | null; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): Slot | null; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBone(name: string): Bone | null; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBoneByDisplay(display: any): Bone | null; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlot(name: string): Slot | null; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlotByDisplay(display: any): Slot | null; + /** + * @deprecated + */ + addBone(value: Bone, parentName?: string | null): void; + /** + * @deprecated + */ + removeBone(value: Bone): void; + /** + * @deprecated + */ + addSlot(value: Slot, parentName: string): void; + /** + * @deprecated + */ + removeSlot(value: Slot): void; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + flipX: boolean; + flipY: boolean; + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + cacheFrameRate: number; + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly name: string; + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animation: Animation; + /** + * @pivate + */ + readonly proxy: IArmatureProxy; + /** + * @pivate + */ + readonly eventDispatcher: IEventDispatcher; + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly display: any; + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + replacedTexture: any; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly parent: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + replaceTexture(texture: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + hasEventListener(type: EventStringType): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + addEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + removeEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + enableAnimationCache(frameRate: number): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + } +} +declare namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix; + /** + * @private + */ + protected static readonly _helpTransform: Transform; + /** + * @private + */ + protected static readonly _helpPoint: Point; + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly globalTransformMatrix: Matrix; + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly global: Transform; + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly offset: Transform; + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + _armature: Armature; + /** + * @private + */ + _parent: Bone; + /** + * @private + */ + protected _onClear(): void; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setParent(value: Bone | null): void; + /** + * @private + */ + updateGlobalTransform(): void; + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armature: Armature; + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly parent: Bone; + } +} +declare namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class Bone extends TransformObject { + static toString(): string; + /** + * @private + */ + offsetMode: OffsetMode; + /** + * @internal + * @private + */ + readonly animationPose: Transform; + /** + * @internal + * @private + */ + readonly constraints: Array; + /** + * @readonly + */ + boneData: BoneData; + /** + * @internal + * @private + */ + _transformDirty: boolean; + /** + * @internal + * @private + */ + _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + _blendDirty: boolean; + private _localDirty; + private _visible; + private _cachedFrameIndex; + /** + * @internal + * @private + */ + _blendLayer: number; + /** + * @internal + * @private + */ + _blendLeftWeight: number; + /** + * @internal + * @private + */ + _blendLayerWeight: number; + private readonly _bones; + private readonly _slots; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache); + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + init(boneData: BoneData): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @internal + * @private + */ + updateByConstraint(): void; + /** + * @internal + * @private + */ + addConstraint(constraint: Constraint): void; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(child: TransformObject): boolean; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + visible: boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + readonly length: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + readonly slot: Slot | null; + } +} +declare namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + displayController: string | null; + /** + * @readonly + */ + slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + _colorDirty: boolean; + /** + * @private + */ + _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + _pivotX: number; + /** + * @private + */ + _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix; + /** + * @private + */ + readonly _colorTransform: ColorTransform; + /** + * @private + */ + readonly _ffdVertices: Array; + /** + * @private + */ + readonly _displayDatas: Array; + /** + * @private + */ + protected readonly _displayList: Array; + /** + * @private + */ + protected readonly _meshBones: Array; + /** + * @internal + * @private + */ + _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any; + /** + * @private + */ + protected _meshDisplay: any; + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void; + /** + * @private + */ + protected _updateDisplay(): void; + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void; + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setDisplayIndex(value: number, isAnimation?: boolean): boolean; + /** + * @internal + * @private + */ + _setZorder(value: number): boolean; + /** + * @internal + * @private + */ + _setColor(value: ColorTransform): boolean; + /** + * @private + */ + _setDisplayList(value: Array | null): boolean; + /** + * @private + */ + init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @private + */ + updateTransformAndMatrix(): void; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): boolean; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + displayIndex: number; + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + displayList: Array; + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + readonly boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + readonly rawDisplay: any; + /** + * @private + */ + readonly meshDisplay: any; + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + display: any; + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + childArmature: Armature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + setDisplay(value: any): void; + } +} +declare namespace dragonBones { + /** + * @private + * @internal + */ + abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix; + protected static readonly _helpTransform: Transform; + protected static readonly _helpPoint: Point; + target: Bone; + bone: Bone; + root: Bone | null; + protected _onClear(): void; + abstract update(): void; + } + /** + * @private + * @internal + */ + class IKConstraint extends Constraint { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + private _computeA(); + private _computeB(); + update(): void; + } +} +declare namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + time: number; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private readonly _animatebles; + private _clock; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(time?: number); + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(value: IAnimatable): boolean; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + add(value: IAnimatable): void; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + remove(value: IAnimatable): void; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + clear(): void; + /** + * @inheritDoc + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + class Animation extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private _animationDirty; + /** + * @internal + * @private + */ + _timelineDirty: boolean; + private readonly _animationNames; + private readonly _animationStates; + private readonly _animations; + private _armature; + private _animationConfig; + private _lastAnimationState; + /** + * @private + */ + protected _onClear(): void; + private _fadeOut(animationConfig); + /** + * @internal + * @private + */ + init(armature: Armature): void; + /** + * @internal + * @private + */ + advanceTime(passedTime: number): void; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + reset(): void; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(animationName?: string | null): void; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + playConfig(animationConfig: AnimationConfig): AnimationState | null; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + play(animationName?: string | null, playTimes?: number): AnimationState | null; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + fadeIn(animationName: string, fadeInTime?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode): AnimationState | null; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByTime(animationName: string, time?: number, playTimes?: number): AnimationState | null; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByFrame(animationName: string, frame?: number, playTimes?: number): AnimationState | null; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByProgress(animationName: string, progress?: number, playTimes?: number): AnimationState | null; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByTime(animationName: string, time?: number): AnimationState | null; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByFrame(animationName: string, frame?: number): AnimationState | null; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByProgress(animationName: string, progress?: number): AnimationState | null; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + getState(animationName: string): AnimationState | null; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + hasAnimation(animationName: string): boolean; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + getStates(): Array; + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationName: string; + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + animations: Map; + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly animationConfig: AnimationConfig; + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + gotoAndPlay(animationName: string, fadeInTime?: number, duration?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode, pauseFadeOut?: boolean, pauseFadeIn?: boolean): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + gotoAndStop(animationName: string, time?: number): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationList: Array; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationDataList: Array; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class BonePose extends BaseObject { + static toString(): string; + readonly current: Transform; + readonly delta: Transform; + readonly result: Transform; + protected _onClear(): void; + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationState extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * @private + */ + fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + animationData: AnimationData; + private _timelineDirty; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + _subFadeState: number; + /** + * @internal + * @private + */ + _position: number; + /** + * @internal + * @private + */ + _duration: number; + private _fadeTime; + private _time; + /** + * @internal + * @private + */ + _fadeProgress: number; + private _weightResult; + private readonly _boneMask; + private readonly _boneTimelines; + private readonly _slotTimelines; + private readonly _bonePoses; + private _armature; + /** + * @internal + * @private + */ + _actionTimeline: ActionTimelineState; + private _zOrderTimeline; + /** + * @private + */ + protected _onClear(): void; + private _isDisabled(slot); + private _advanceFadeTime(passedTime); + private _blendBoneTimline(timeline); + /** + * @private + * @internal + */ + init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void; + /** + * @private + * @internal + */ + updateTimelines(): void; + /** + * @private + * @internal + */ + advanceTime(passedTime: number, cacheFrameRate: number): void; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + play(): void; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(): void; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeOut(fadeOutTime: number, pausePlayhead?: boolean): void; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + containsBoneMask(name: string): boolean; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + addBoneMask(name: string, recursive?: boolean): void; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeBoneMask(name: string, recursive?: boolean): void; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeAllBoneMask(): void; + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeIn: boolean; + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeOut: boolean; + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeComplete: boolean; + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + currentTime: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + readonly clip: AnimationData; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + const enum TweenState { + None = 0, + Once = 1, + Always = 2, + } + /** + * @internal + * @private + */ + abstract class TimelineState extends BaseObject { + playState: number; + currentPlayTimes: number; + currentTime: number; + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + protected _onClear(): void; + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + protected _setCurrentTime(passedTime: number): boolean; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType, progress, easing); + private static _getEasingCurveValue(progress, samples, count, offset); + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + abstract class BoneTimelineState extends TweenTimelineState { + bone: Bone; + bonePose: BonePose; + protected _onClear(): void; + } + /** + * @internal + * @private + */ + abstract class SlotTimelineState extends TweenTimelineState { + slot: Slot; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class ActionTimelineState extends TimelineState { + static toString(): string; + private _onCrossFrame(frameIndex); + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + update(passedTime: number): void; + setCurrentTime(value: number): void; + } + /** + * @internal + * @private + */ + class ZOrderTimelineState extends TimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + class BoneAllTimelineState extends BoneTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + } + /** + * @internal + * @private + */ + class SlotDislayIndexTimelineState extends SlotTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + } + /** + * @internal + * @private + */ + class SlotColorTimelineState extends SlotTimelineState { + static toString(): string; + private _dirty; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + class SlotFFDTimelineState extends SlotTimelineState { + static toString(): string; + meshOffset: number; + private _dirty; + private _frameFloatOffset; + private _valueCount; + private _ffdCount; + private _valueOffset; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } +} +declare namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly START: string; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly LOOP_COMPLETE: string; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly COMPLETE: string; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN: string; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN_COMPLETE: string; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT: string; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT_COMPLETE: string; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FRAME_EVENT: string; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly SOUND_EVENT: string; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + data: UserData | null; + /** + * @private + */ + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + type EventStringType = string | "start" | "loopComplete" | "complete" | "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string; + protected static readonly DATA_VERSION_3_0: string; + protected static readonly DATA_VERSION_4_0: string; + protected static readonly DATA_VERSION_4_5: string; + protected static readonly DATA_VERSION_5_0: string; + protected static readonly DATA_VERSION: string; + protected static readonly DATA_VERSIONS: Array; + protected static readonly TEXTURE_ATLAS: string; + protected static readonly SUB_TEXTURE: string; + protected static readonly FORMAT: string; + protected static readonly IMAGE_PATH: string; + protected static readonly WIDTH: string; + protected static readonly HEIGHT: string; + protected static readonly ROTATED: string; + protected static readonly FRAME_X: string; + protected static readonly FRAME_Y: string; + protected static readonly FRAME_WIDTH: string; + protected static readonly FRAME_HEIGHT: string; + protected static readonly DRADON_BONES: string; + protected static readonly USER_DATA: string; + protected static readonly ARMATURE: string; + protected static readonly BONE: string; + protected static readonly IK: string; + protected static readonly SLOT: string; + protected static readonly SKIN: string; + protected static readonly DISPLAY: string; + protected static readonly ANIMATION: string; + protected static readonly Z_ORDER: string; + protected static readonly FFD: string; + protected static readonly FRAME: string; + protected static readonly TRANSLATE_FRAME: string; + protected static readonly ROTATE_FRAME: string; + protected static readonly SCALE_FRAME: string; + protected static readonly VISIBLE_FRAME: string; + protected static readonly DISPLAY_FRAME: string; + protected static readonly COLOR_FRAME: string; + protected static readonly DEFAULT_ACTIONS: string; + protected static readonly ACTIONS: string; + protected static readonly EVENTS: string; + protected static readonly INTS: string; + protected static readonly FLOATS: string; + protected static readonly STRINGS: string; + protected static readonly CANVAS: string; + protected static readonly TRANSFORM: string; + protected static readonly PIVOT: string; + protected static readonly AABB: string; + protected static readonly COLOR: string; + protected static readonly VERSION: string; + protected static readonly COMPATIBLE_VERSION: string; + protected static readonly FRAME_RATE: string; + protected static readonly TYPE: string; + protected static readonly SUB_TYPE: string; + protected static readonly NAME: string; + protected static readonly PARENT: string; + protected static readonly TARGET: string; + protected static readonly SHARE: string; + protected static readonly PATH: string; + protected static readonly LENGTH: string; + protected static readonly DISPLAY_INDEX: string; + protected static readonly BLEND_MODE: string; + protected static readonly INHERIT_TRANSLATION: string; + protected static readonly INHERIT_ROTATION: string; + protected static readonly INHERIT_SCALE: string; + protected static readonly INHERIT_REFLECTION: string; + protected static readonly INHERIT_ANIMATION: string; + protected static readonly INHERIT_FFD: string; + protected static readonly BEND_POSITIVE: string; + protected static readonly CHAIN: string; + protected static readonly WEIGHT: string; + protected static readonly FADE_IN_TIME: string; + protected static readonly PLAY_TIMES: string; + protected static readonly SCALE: string; + protected static readonly OFFSET: string; + protected static readonly POSITION: string; + protected static readonly DURATION: string; + protected static readonly TWEEN_TYPE: string; + protected static readonly TWEEN_EASING: string; + protected static readonly TWEEN_ROTATE: string; + protected static readonly TWEEN_SCALE: string; + protected static readonly CURVE: string; + protected static readonly SOUND: string; + protected static readonly EVENT: string; + protected static readonly ACTION: string; + protected static readonly X: string; + protected static readonly Y: string; + protected static readonly SKEW_X: string; + protected static readonly SKEW_Y: string; + protected static readonly SCALE_X: string; + protected static readonly SCALE_Y: string; + protected static readonly VALUE: string; + protected static readonly ROTATE: string; + protected static readonly SKEW: string; + protected static readonly ALPHA_OFFSET: string; + protected static readonly RED_OFFSET: string; + protected static readonly GREEN_OFFSET: string; + protected static readonly BLUE_OFFSET: string; + protected static readonly ALPHA_MULTIPLIER: string; + protected static readonly RED_MULTIPLIER: string; + protected static readonly GREEN_MULTIPLIER: string; + protected static readonly BLUE_MULTIPLIER: string; + protected static readonly UVS: string; + protected static readonly VERTICES: string; + protected static readonly TRIANGLES: string; + protected static readonly WEIGHTS: string; + protected static readonly SLOT_POSE: string; + protected static readonly BONE_POSE: string; + protected static readonly GOTO_AND_PLAY: string; + protected static readonly DEFAULT_NAME: string; + protected static _getArmatureType(value: string): ArmatureType; + protected static _getDisplayType(value: string): DisplayType; + protected static _getBoundingBoxType(value: string): BoundingBoxType; + protected static _getActionType(value: string): ActionType; + protected static _getBlendMode(value: string): BlendMode; + /** + * @private + */ + abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static parseDragonBonesData(rawData: any): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + static parseTextureAtlasData(rawData: any, scale?: number): any; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ObjectDataParser extends DataParser { + /** + * @private + */ + private _intArrayJson; + private _floatArrayJson; + private _frameIntArrayJson; + private _frameFloatArrayJson; + private _frameArrayJson; + private _timelineArrayJson; + private _intArrayBuffer; + private _floatArrayBuffer; + private _frameIntArrayBuffer; + private _frameFloatArrayBuffer; + private _frameArrayBuffer; + private _timelineArrayBuffer; + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean; + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number; + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string; + protected _rawTextureAtlasIndex: number; + protected readonly _rawBones: Array; + protected _data: DragonBonesData; + protected _armature: ArmatureData; + protected _bone: BoneData; + protected _slot: SlotData; + protected _skin: SkinData; + protected _mesh: MeshDisplayData; + protected _animation: AnimationData; + protected _timeline: TimelineData; + protected _rawTextureAtlases: Array | null; + private _defalultColorOffset; + private _prevTweenRotate; + private _prevRotation; + private readonly _helpMatrixA; + private readonly _helpMatrixB; + private readonly _helpTransform; + private readonly _helpColorTransform; + private readonly _helpPoint; + private readonly _helpArray; + private readonly _actionFrames; + private readonly _weightSlotPose; + private readonly _weightBonePoses; + private readonly _weightBoneIndices; + private readonly _cacheBones; + private readonly _meshs; + private readonly _slotChildActions; + /** + * @private + */ + private _getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, t, result); + /** + * @private + */ + private _samplingEasingCurve(curve, samples); + private _sortActionFrame(a, b); + private _parseActionDataInFrame(rawData, frameStart, bone, slot); + private _mergeActionFrame(rawData, frameStart, type, bone, slot); + private _parseCacheActionFrame(frame); + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData; + /** + * @private + */ + protected _parseBone(rawData: any): BoneData; + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void; + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData; + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData; + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null; + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void; + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseTimeline(rawData: any, type: TimelineType, addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, frameParser: (rawData: any, frameStart: number, frameCount: number) => number): TimelineData | null; + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void; + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void; + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number; + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void; + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @private + */ + protected _parseWASMArray(): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @inheritDoc + */ + parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale?: number): boolean; + /** + * @private + */ + private static _objectDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): ObjectDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BinaryDataParser extends ObjectDataParser { + private _binary; + private _binaryOffset; + private _intArray; + private _floatArray; + private _frameIntArray; + private _frameFloatArray; + private _frameArray; + private _timelineArray; + private _inRange(a, min, max); + private _decodeUTF8(data); + private _getUTF16Key(value); + private _parseBinaryTimeline(type, offset, timelineData?); + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @private + */ + private static _binaryDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): BinaryDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BuildArmaturePackage { + dataName: string; + textureAtlasName: string; + data: DragonBonesData; + armature: ArmatureData; + skin: SkinData | null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map>; + /** + * @private + */ + protected _dragonBones: DragonBones; + /** + * @private + */ + protected _dataParser: DataParser; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null; + /** + * @private + */ + protected _fillBuildArmaturePackage(dataPackage: BuildArmaturePackage, dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string): boolean; + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseDragonBonesData(rawData: any, name?: string | null, scale?: number): DragonBonesData | null; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + updateTextureAtlasData(name: string, textureAtlases: Array): void; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + getDragonBonesData(name: string): DragonBonesData | null; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + addDragonBonesData(data: DragonBonesData, name?: string | null): void; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeDragonBonesData(name: string, disposeData?: boolean): void; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureAtlasData(name: string): Array | null; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + addTextureAtlasData(data: TextureAtlasData, name?: string | null): void; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeTextureAtlasData(name: string, disposeData?: boolean): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + getArmatureData(name: string, dragonBonesName?: string): ArmatureData | null; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + clear(disposeData?: boolean): void; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + buildArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): Armature | null; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplayList(dragonBonesName: string | null, armatureName: string, slotName: string, slot: Slot): void; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + copyAnimationsToArmature(toArmature: Armature, fromArmatreName: string, fromSkinName?: string | null, fromDragonBonesDataName?: string | null, replaceOriginalAnimation?: boolean): boolean; + /** + * @private + */ + getAllDragonBonesData(): Map; + /** + * @private + */ + getAllTextureAtlasData(): Map>; + } +} +declare namespace dragonBones { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretTextureAtlasData extends TextureAtlasData { + static toString(): string; + private _renderTexture; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + createTexture(): TextureData; + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + renderTexture: egret.Texture | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + dispose(): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + readonly texture: egret.Texture | null; + } + /** + * @private + */ + class EgretTextureData extends TextureData { + static toString(): string; + renderTexture: egret.Texture | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EgretEvent extends egret.Event { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly eventObject: EventObject; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationName: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + readonly armature: Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + readonly bone: Bone | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + readonly slot: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + readonly frameLabel: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + readonly sound: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationName + */ + readonly movementID: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + static START: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + static LOOP_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + static COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + static FADE_IN: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + static FADE_IN_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + static FADE_OUT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + static FADE_OUT_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static ANIMATION_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static BONE_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static MOVEMENT_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND: string; + } + /** + * @inheritDoc + */ + class EgretArmatureDisplay extends egret.DisplayObjectContainer implements IArmatureProxy { + private static _cleanBeforeRender(); + /** + * @internal + * @private + */ + _batchEnabled: boolean; + private _disposeProxy; + protected _armature: Armature; + private _debugDrawer; + /** + * @inheritDoc + */ + init(armature: Armature): void; + /** + * @inheritDoc + */ + clear(): void; + /** + * @inheritDoc + */ + dispose(disposeProxy?: boolean): void; + /** + * @inheritDoc + */ + debugUpdate(isEnabled: boolean): void; + /** + * @inheritDoc + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * @inheritDoc + */ + hasEvent(type: EventStringType): boolean; + /** + * @inheritDoc + */ + addEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * @inheritDoc + */ + removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * 关闭批次渲染。(批次渲染处于性能考虑,不会更新渲染对象的边界属性,这样无法正确获得渲染对象的绘制区域,如果需要使用这些属性,可以关闭批次渲染) + * @version DragonBones 5.1 + * @language zh_CN + */ + disableBatch(): void; + /** + * @inheritDoc + */ + readonly armature: Armature; + /** + * @inheritDoc + */ + readonly animation: Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + advanceTimeBySelf(on: boolean): void; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature + */ + type FastArmature = Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Bone + */ + type FastBone = Bone; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Slot + */ + type FastSlot = Slot; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Animation + */ + type FastAnimation = Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.AnimationState + */ + type FastAnimationState = AnimationState; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class Event extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class ArmatureEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class AnimationEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class FrameEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class SoundEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFacory#parseTextureAtlasData() + */ + class EgretTextureAtlas extends EgretTextureAtlasData { + /** + * @private + */ + static toString(): string; + constructor(texture: egret.Texture, rawData: any, scale?: number); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + class EgretSheetAtlas extends EgretTextureAtlas { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + class SoundEventManager { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + static getInstance(): EgretArmatureDisplay; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + class AnimationCacheManager { + constructor(); + } +} +declare namespace dragonBones { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretSlot extends Slot { + static toString(): string; + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + transformUpdateEnabled: boolean; + private _armatureDisplay; + private _renderDisplay; + private _colorFilter; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected _initDisplay(value: any): void; + /** + * @private + */ + protected _disposeDisplay(value: any): void; + /** + * @private + */ + protected _onUpdateDisplay(): void; + /** + * @private + */ + protected _addDisplay(): void; + /** + * @private + */ + protected _replaceDisplay(value: any): void; + /** + * @private + */ + protected _removeDisplay(): void; + /** + * @private + */ + protected _updateZOrder(): void; + /** + * @internal + * @private + */ + _updateVisible(): void; + /** + * @private + */ + protected _updateBlendMode(): void; + /** + * @private + */ + protected _updateColor(): void; + /** + * @private + */ + protected _updateFrame(): void; + /** + * @private + */ + protected _updateMesh(): void; + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void; + } +} +declare namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretFactory extends BaseFactory { + private static _dragonBonesInstance; + private static _factory; + private static _clockHandler(time); + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + static readonly factory: EgretFactory; + /** + * @inheritDoc + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: EgretTextureAtlasData | null, textureAtlas: egret.Texture | null): EgretTextureAtlasData; + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + buildArmatureDisplay(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): EgretArmatureDisplay | null; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureDisplay(textureName: string, textureAtlasName?: string | null): egret.Bitmap | null; + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly soundEventManager: EgretArmatureDisplay; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + addSkeletonData(dragonBonesData: DragonBonesData, dragonBonesName?: string | null): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + getSkeletonData(dragonBonesName: string): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + removeSkeletonData(dragonBonesName: string): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + addTextureAtlas(textureAtlasData: TextureAtlasData, dragonBonesName?: string | null): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + getTextureAtlas(dragonBonesName: string): TextureAtlasData[] | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + removeTextureAtlas(dragonBonesName: string): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + buildFastArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null): FastArmature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + dispose(): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + readonly soundEventManater: EgretArmatureDisplay; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 是否包含指定名称的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function hasMovieGroup(groupName: string): boolean; + /** + * @language zh_CN + * 添加动画组。 + * @param groupData 动画二进制数据。 + * @param textureAtlas 贴图集或贴图集列表。 + * @param groupName 为动画组指定一个名称,如果未设置,则使用数据中的名称。 + * @version DragonBones 4.7 + */ + function addMovieGroup(groupData: ArrayBuffer, textureAtlas: egret.Texture | egret.Texture[], groupName?: string | null): void; + /** + * @language zh_CN + * 移除动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function removeMovieGroup(groupName: string): void; + /** + * @language zh_CN + * 移除所有的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function removeAllMovieGroup(): void; + /** + * @language zh_CN + * 创建一个动画。 + * @param movieName 动画的名称。 + * @param groupName 动画组的名称,如果未设置,将检索所有的动画组,当多个动画组中包含同名的动画时,可能无法创建出准确的动画。 + * @version DragonBones 4.7 + */ + function buildMovie(movieName: string, groupName?: string | null): Movie | null; + /** + * @language zh_CN + * 获取指定动画组内包含的所有动画名称。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function getMovieNames(groupName: string): string[] | null; + /** + * @language zh_CN + * 动画事件。 + * @version DragonBones 4.7 + */ + class MovieEvent extends egret.Event { + /** + * @language zh_CN + * 动画剪辑开始播放。 + * @version DragonBones 4.7 + */ + static START: string; + /** + * @language zh_CN + * 动画剪辑循环播放一次完成。 + * @version DragonBones 4.7 + */ + static LOOP_COMPLETE: string; + /** + * @language zh_CN + * 动画剪辑播放完成。 + * @version DragonBones 4.7 + */ + static COMPLETE: string; + /** + * @language zh_CN + * 动画剪辑帧事件。 + * @version DragonBones 4.7 + */ + static FRAME_EVENT: string; + /** + * @language zh_CN + * 动画剪辑声音事件。 + * @version DragonBones 4.7 + */ + static SOUND_EVENT: string; + /** + * @language zh_CN + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.7 + */ + name: string; + /** + * @language zh_CN + * 发出事件的插槽名称。 + * @version DragonBones 4.7 + */ + slotName: string; + /** + * @language zh_CN + * 发出事件的动画剪辑名称。 + * @version DragonBones 4.7 + */ + clipName: string; + /** + * @language zh_CN + * 发出事件的动画。 + * @version DragonBones 4.7 + */ + movie: Movie; + /** + * @private + */ + constructor(type: string); + /** + * @private + */ + readonly armature: any; + /** + * @private + */ + readonly bone: any; + /** + * @private + */ + readonly animationState: any; + /** + * @private + */ + readonly frameLabel: any; + /** + * @private + */ + readonly movementID: any; + } + /** + * @language zh_CN + * 通过读取缓存的二进制动画数据来更新动画,具有良好的运行性能,同时对内存的占用也非常低。 + * @see dragonBones.buildMovie + * @version DragonBones 4.7 + */ + class Movie extends egret.DisplayObjectContainer implements IAnimatable { + private static _cleanBeforeRender(); + /** + * @language zh_CN + * 动画的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 4.7 + */ + timeScale: number; + /** + * @language zh_CN + * 动画剪辑的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * (当再次播放其他动画剪辑时,此值将被重置为 1) + * @default 1 + * @version DragonBones 4.7 + */ + clipTimeScale: number; + private _batchEnabled; + private _isLockDispose; + private _isDelayDispose; + private _isStarted; + private _isPlaying; + private _isReversing; + private _isCompleted; + private _playTimes; + private _time; + private _currentTime; + private _currentPlayTimes; + private _cacheFrameIndex; + private _frameSize; + private _cacheRectangle; + private _clock; + private _groupConfig; + private _config; + private _clipConfig; + private _currentFrameConfig; + private _clipArray; + private _clipNames; + private _slots; + private _childMovies; + /** + * @internal + * @private + */ + constructor(createMovieHelper: any); + private _configToEvent(config, event); + private _onCrossFrame(frameConfig); + private _updateSlotBlendMode(slot); + private _updateSlotColor(slot, aM, rM, gM, bM, aO, rO, gO, bO); + private _updateSlotDisplay(slot); + private _getSlot(name); + /** + * @inheritDoc + */ + $render(): void; + /** + * @inheritDoc + */ + $measureContentBounds(bounds: egret.Rectangle): void; + /** + * @inheritDoc + */ + $doAddChild(child: egret.DisplayObject, index: number, notifyListeners?: boolean): egret.DisplayObject; + /** + * @inheritDoc + */ + $doRemoveChild(index: number, notifyListeners?: boolean): egret.DisplayObject; + /** + * 释放动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @inheritDoc + */ + advanceTime(passedTime: number): void; + /** + * 播放动画剪辑。 + * @param clipName 动画剪辑的名称,如果未设置,则播放默认动画剪辑,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画剪辑。 + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + play(clipName?: string | null, playTimes?: number): void; + /** + * 暂停播放动画。 + * @version DragonBones 4.7 + * @language zh_CN + */ + stop(): void; + /** + * 从指定时间播放动画。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 5.0 + * @language zh_CN + */ + gotoAndPlay(clipName: string | null | undefined, time: number, playTimes?: number): void; + /** + * 将动画停止到指定时间。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @version DragonBones 5.0 + * @language zh_CN + */ + gotoAndStop(clipName: string | null | undefined, time: number): void; + /** + * 是否包含指定动画剪辑。 + * @param clipName 动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + hasClip(clipName: string): boolean; + /** + * 动画剪辑是否处正在播放。 + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 动画剪辑是否均播放完毕。 + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly isComplete: boolean; + /** + * 当前动画剪辑的播放时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly currentTime: number; + /** + * 当前动画剪辑的总时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前动画剪辑的播放次数。 + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 当前动画剪辑需要播放的次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly playTimes: number; + readonly groupName: string; + /** + * 正在播放的动画剪辑名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly clipName: string; + /** + * 所有动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + readonly clipNames: string[]; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Movie#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Movie#timescale + * @see dragonBones.Movie#stop() + */ + advanceTimeBySelf(on: boolean): void; + /** + * @private + */ + readonly display: any; + /** + * @private + */ + readonly animation: any; + /** + * @private + */ + readonly armature: any; + /** + * @private + */ + getAnimation(): any; + /** + * @private + */ + getArmature(): any; + /** + * @private + */ + getDisplay(): any; + /** + * @private + */ + hasAnimation(name: string): boolean; + /** + * @private + */ + invalidUpdate(...args: any[]): void; + /** + * @private + */ + readonly lastAnimationName: string; + /** + * @private + */ + readonly animationNames: string[]; + /** + * @private + */ + readonly animationList: string[]; + } +} diff --git a/reference/Egret/4.x/out/dragonBones.js b/reference/Egret/4.x/out/dragonBones.js new file mode 100644 index 0000000..ce1ef9d --- /dev/null +++ b/reference/Egret/4.x/out/dragonBones.js @@ -0,0 +1,13179 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DragonBones = (function () { + function DragonBones(eventManager) { + this._clock = new dragonBones.WorldClock(); + this._events = []; + this._objects = []; + this._eventManager = null; + this._eventManager = eventManager; + } + DragonBones.prototype.advanceTime = function (passedTime) { + if (this._objects.length > 0) { + for (var _i = 0, _a = this._objects; _i < _a.length; _i++) { + var object = _a[_i]; + object.returnToPool(); + } + this._objects.length = 0; + } + this._clock.advanceTime(passedTime); + if (this._events.length > 0) { + for (var i = 0; i < this._events.length; ++i) { + var eventObject = this._events[i]; + var armature = eventObject.armature; + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + this.bufferObject(eventObject); + } + this._events.length = 0; + } + }; + DragonBones.prototype.bufferEvent = function (value) { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + }; + DragonBones.prototype.bufferObject = function (object) { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + }; + Object.defineProperty(DragonBones.prototype, "clock", { + get: function () { + return this._clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DragonBones.prototype, "eventManager", { + get: function () { + return this._eventManager; + }, + enumerable: true, + configurable: true + }); + DragonBones.yDown = true; + DragonBones.debug = false; + DragonBones.debugDraw = false; + DragonBones.webAssembly = false; + DragonBones.VERSION = "5.1.0"; + return DragonBones; + }()); + dragonBones.DragonBones = DragonBones; + if (!console.warn) { + console.warn = function () { }; + } + if (!console.assert) { + console.assert = function () { }; + } +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var BaseObject = (function () { + function BaseObject() { + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + this.hashCode = BaseObject._hashCode++; + this._isInPool = false; + } + BaseObject._returnObject = function (object) { + var classType = String(object.constructor); + var maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + }; + /** + * @private + */ + BaseObject.toString = function () { + throw new Error(); + }; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.setMaxCount = function (objectConstructor, maxCount) { + if (maxCount < 0 || maxCount !== maxCount) { + maxCount = 0; + } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (var classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + var pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + } + }; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.clearPool = function (objectConstructor) { + if (objectConstructor === void 0) { objectConstructor = null; } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (var k in BaseObject._poolsMap) { + var pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + }; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.borrowObject = function (objectConstructor) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + var object_1 = pool.pop(); + object_1._isInPool = false; + return object_1; + } + var object = new objectConstructor(); + object._onClear(); + return object; + }; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.prototype.returnToPool = function () { + this._onClear(); + BaseObject._returnObject(this); + }; + BaseObject._hashCode = 0; + BaseObject._defaultMaxCount = 1000; + BaseObject._maxCountMap = {}; + BaseObject._poolsMap = {}; + return BaseObject; + }()); + dragonBones.BaseObject = BaseObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Matrix = (function () { + function Matrix(a, b, c, d, tx, ty) { + if (a === void 0) { a = 1.0; } + if (b === void 0) { b = 0.0; } + if (c === void 0) { c = 0.0; } + if (d === void 0) { d = 1.0; } + if (tx === void 0) { tx = 0.0; } + if (ty === void 0) { ty = 0.0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * @private + */ + Matrix.prototype.toString = function () { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + }; + /** + * @private + */ + Matrix.prototype.copyFrom = function (value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + return this; + }; + /** + * @private + */ + Matrix.prototype.copyFromArray = function (value, offset) { + if (offset === void 0) { offset = 0; } + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + return this; + }; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.identity = function () { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + }; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.concat = function (value) { + var aA = this.a * value.a; + var bA = 0.0; + var cA = 0.0; + var dA = this.d * value.d; + var txA = this.tx * value.a + value.tx; + var tyA = this.ty * value.d + value.ty; + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + return this; + }; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.invert = function () { + var aA = this.a; + var bA = this.b; + var cA = this.c; + var dA = this.d; + var txA = this.tx; + var tyA = this.ty; + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + return this; + } + var determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + } + determinant = 1.0 / determinant; + var k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + return this; + }; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.transformPoint = function (x, y, result, delta) { + if (delta === void 0) { delta = false; } + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + }; + return Matrix; + }()); + dragonBones.Matrix = Matrix; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Transform = (function () { + function Transform( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (skew === void 0) { skew = 0.0; } + if (rotation === void 0) { rotation = 0.0; } + if (scaleX === void 0) { scaleX = 1.0; } + if (scaleY === void 0) { scaleY = 1.0; } + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + /** + * @private + */ + Transform.normalizeRadian = function (value) { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + return value; + }; + /** + * @private + */ + Transform.prototype.toString = function () { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + }; + /** + * @private + */ + Transform.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.identity = function () { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + return this; + }; + /** + * @private + */ + Transform.prototype.add = function (value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.minus = function (value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + return this; + }; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.fromMatrix = function (matrix) { + var backupScaleX = this.scaleX, backupScaleY = this.scaleY; + var PI_Q = Transform.PI_Q; + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + var skewX = Math.atan(-matrix.c / matrix.d); + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + this.skew = skewX - this.rotation; + return this; + }; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.toMatrix = function (matrix) { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + matrix.tx = this.x; + matrix.ty = this.y; + return this; + }; + /** + * @private + */ + Transform.PI_D = Math.PI * 2.0; + /** + * @private + */ + Transform.PI_H = Math.PI / 2.0; + /** + * @private + */ + Transform.PI_Q = Math.PI / 4.0; + /** + * @private + */ + Transform.RAD_DEG = 180.0 / Math.PI; + /** + * @private + */ + Transform.DEG_RAD = Math.PI / 180.0; + return Transform; + }()); + dragonBones.Transform = Transform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ColorTransform = (function () { + function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) { + if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; } + if (redMultiplier === void 0) { redMultiplier = 1.0; } + if (greenMultiplier === void 0) { greenMultiplier = 1.0; } + if (blueMultiplier === void 0) { blueMultiplier = 1.0; } + if (alphaOffset === void 0) { alphaOffset = 0; } + if (redOffset === void 0) { redOffset = 0; } + if (greenOffset === void 0) { greenOffset = 0; } + if (blueOffset === void 0) { blueOffset = 0; } + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + ColorTransform.prototype.copyFrom = function (value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + }; + ColorTransform.prototype.identity = function () { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + }; + return ColorTransform; + }()); + dragonBones.ColorTransform = ColorTransform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Point = (function () { + function Point(x, y) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + this.x = x; + this.y = y; + } + Point.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + }; + Point.prototype.clear = function () { + this.x = this.y = 0.0; + }; + return Point; + }()); + dragonBones.Point = Point; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Rectangle = (function () { + function Rectangle(x, y, width, height) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (width === void 0) { width = 0.0; } + if (height === void 0) { height = 0.0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Rectangle.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + }; + Rectangle.prototype.clear = function () { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + }; + return Rectangle; + }()); + dragonBones.Rectangle = Rectangle; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + var UserData = (function (_super) { + __extends(UserData, _super); + function UserData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.ints = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.floats = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.strings = []; + return _this; + } + /** + * @private + */ + UserData.toString = function () { + return "[class dragonBones.UserData]"; + }; + /** + * @private + */ + UserData.prototype._onClear = function () { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + }; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getInt = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + }; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getFloat = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + }; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getString = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + }; + return UserData; + }(dragonBones.BaseObject)); + dragonBones.UserData = UserData; + /** + * @private + */ + var ActionData = (function (_super) { + __extends(ActionData, _super); + function ActionData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.data = null; // + return _this; + } + ActionData.toString = function () { + return "[class dragonBones.ActionData]"; + }; + ActionData.prototype._onClear = function () { + if (this.data !== null) { + this.data.returnToPool(); + } + this.type = 0 /* Play */; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + }; + return ActionData; + }(dragonBones.BaseObject)); + dragonBones.ActionData = ActionData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + var DragonBonesData = (function (_super) { + __extends(DragonBonesData, _super); + function DragonBonesData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.frameIndices = []; + /** + * @private + */ + _this.cachedFrames = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatureNames = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatures = {}; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + DragonBonesData.toString = function () { + return "[class dragonBones.DragonBonesData]"; + }; + /** + * @private + */ + DragonBonesData.prototype._onClear = function () { + for (var k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + }; + /** + * @private + */ + DragonBonesData.prototype.addArmature = function (value) { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + DragonBonesData.prototype.getArmature = function (name) { + return name in this.armatures ? this.armatures[name] : null; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + DragonBonesData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + return DragonBonesData; + }(dragonBones.BaseObject)); + dragonBones.DragonBonesData = DragonBonesData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var CanvasData = (function (_super) { + __extends(CanvasData, _super); + function CanvasData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + CanvasData.toString = function () { + return "[class dragonBones.CanvasData]"; + }; + /** + * @private + */ + CanvasData.prototype._onClear = function () { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + return CanvasData; + }(dragonBones.BaseObject)); + dragonBones.CanvasData = CanvasData; + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var ArmatureData = (function (_super) { + __extends(ArmatureData, _super); + function ArmatureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.aabb = new dragonBones.Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animationNames = []; + /** + * @private + */ + _this.sortedBones = []; + /** + * @private + */ + _this.sortedSlots = []; + /** + * @private + */ + _this.defaultActions = []; + /** + * @private + */ + _this.actions = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.bones = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.slots = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.skins = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animations = {}; + /** + * @private + */ + _this.canvas = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + ArmatureData.toString = function () { + return "[class dragonBones.ArmatureData]"; + }; + /** + * @private + */ + ArmatureData.prototype._onClear = function () { + for (var _i = 0, _a = this.defaultActions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + for (var _b = 0, _c = this.actions; _b < _c.length; _b++) { + var action = _c[_b]; + action.returnToPool(); + } + for (var k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + for (var k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + for (var k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + for (var k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.type = 0 /* Armature */; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + ArmatureData.prototype.sortBones = function () { + var total = this.sortedBones.length; + if (total <= 0) { + return; + } + var sortHelper = this.sortedBones.concat(); + var index = 0; + var count = 0; + this.sortedBones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { + continue; + } + this.sortedBones.push(bone); + count++; + } + }; + /** + * @private + */ + ArmatureData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0) { + return; + } + this.cacheFrameRate = frameRate; + for (var k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + }; + /** + * @private + */ + ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform) { + var dataArray = this.parent.cachedFrames; + var arrayOffset = dataArray.length; + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + return arrayOffset; + }; + /** + * @private + */ + ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) { + var dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + }; + /** + * @private + */ + ArmatureData.prototype.addBone = function (value) { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + this.bones[value.name] = value; + this.sortedBones.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSlot = function (value) { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + this.slots[value.name] = value; + this.sortedSlots.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSkin = function (value) { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + }; + /** + * @private + */ + ArmatureData.prototype.addAnimation = function (value) { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + }; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + ArmatureData.prototype.getBone = function (name) { + return name in this.bones ? this.bones[name] : null; + }; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + ArmatureData.prototype.getSlot = function (name) { + return name in this.slots ? this.slots[name] : null; + }; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + ArmatureData.prototype.getSkin = function (name) { + return name in this.skins ? this.skins[name] : null; + }; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + ArmatureData.prototype.getAnimation = function (name) { + return name in this.animations ? this.animations[name] : null; + }; + return ArmatureData; + }(dragonBones.BaseObject)); + dragonBones.ArmatureData = ArmatureData; + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var BoneData = (function (_super) { + __extends(BoneData, _super); + function BoneData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.transform = new dragonBones.Transform(); + /** + * @private + */ + _this.constraints = []; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + BoneData.toString = function () { + return "[class dragonBones.BoneData]"; + }; + /** + * @private + */ + BoneData.prototype._onClear = function () { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + }; + return BoneData; + }(dragonBones.BaseObject)); + dragonBones.BoneData = BoneData; + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var SlotData = (function (_super) { + __extends(SlotData, _super); + function SlotData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.color = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + SlotData.createColor = function () { + return new dragonBones.ColorTransform(); + }; + /** + * @private + */ + SlotData.toString = function () { + return "[class dragonBones.SlotData]"; + }; + /** + * @private + */ + SlotData.prototype._onClear = function () { + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.blendMode = 0 /* Normal */; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform(); + return SlotData; + }(dragonBones.BaseObject)); + dragonBones.SlotData = SlotData; + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + var SkinData = (function (_super) { + __extends(SkinData, _super); + function SkinData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.displays = {}; + return _this; + } + SkinData.toString = function () { + return "[class dragonBones.SkinData]"; + }; + /** + * @private + */ + SkinData.prototype._onClear = function () { + for (var k in this.displays) { + var slotDisplays = this.displays[k]; + for (var _i = 0, slotDisplays_1 = slotDisplays; _i < slotDisplays_1.length; _i++) { + var display = slotDisplays_1[_i]; + if (display !== null) { + display.returnToPool(); + } + } + delete this.displays[k]; + } + this.name = ""; + // this.displays.clear(); + }; + /** + * @private + */ + SkinData.prototype.addDisplay = function (slotName, value) { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + var slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + }; + /** + * @private + */ + SkinData.prototype.getDisplay = function (slotName, displayName) { + var slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (var _i = 0, slotDisplays_2 = slotDisplays; _i < slotDisplays_2.length; _i++) { + var display = slotDisplays_2[_i]; + if (display !== null && display.name === displayName) { + return display; + } + } + } + return null; + }; + /** + * @private + */ + SkinData.prototype.getDisplays = function (slotName) { + if (!(slotName in this.displays)) { + return null; + } + return this.displays[slotName]; + }; + return SkinData; + }(dragonBones.BaseObject)); + dragonBones.SkinData = SkinData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ConstraintData = (function (_super) { + __extends(ConstraintData, _super); + function ConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstraintData.prototype._onClear = function () { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + }; + return ConstraintData; + }(dragonBones.BaseObject)); + dragonBones.ConstraintData = ConstraintData; + /** + * @private + */ + var IKConstraintData = (function (_super) { + __extends(IKConstraintData, _super); + function IKConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraintData.toString = function () { + return "[class dragonBones.IKConstraintData]"; + }; + IKConstraintData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + return IKConstraintData; + }(ConstraintData)); + dragonBones.IKConstraintData = IKConstraintData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DisplayData = (function (_super) { + __extends(DisplayData, _super); + function DisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.transform = new dragonBones.Transform(); + return _this; + } + DisplayData.prototype._onClear = function () { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + }; + return DisplayData; + }(dragonBones.BaseObject)); + dragonBones.DisplayData = DisplayData; + /** + * @private + */ + var ImageDisplayData = (function (_super) { + __extends(ImageDisplayData, _super); + function ImageDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pivot = new dragonBones.Point(); + return _this; + } + ImageDisplayData.toString = function () { + return "[class dragonBones.ImageDisplayData]"; + }; + ImageDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Image */; + this.pivot.clear(); + this.texture = null; + }; + return ImageDisplayData; + }(DisplayData)); + dragonBones.ImageDisplayData = ImageDisplayData; + /** + * @private + */ + var ArmatureDisplayData = (function (_super) { + __extends(ArmatureDisplayData, _super); + function ArmatureDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.actions = []; + return _this; + } + ArmatureDisplayData.toString = function () { + return "[class dragonBones.ArmatureDisplayData]"; + }; + ArmatureDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.actions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + this.type = 1 /* Armature */; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + }; + return ArmatureDisplayData; + }(DisplayData)); + dragonBones.ArmatureDisplayData = ArmatureDisplayData; + /** + * @private + */ + var MeshDisplayData = (function (_super) { + __extends(MeshDisplayData, _super); + function MeshDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.weight = null; // Initial value. + return _this; + } + MeshDisplayData.toString = function () { + return "[class dragonBones.MeshDisplayData]"; + }; + MeshDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Mesh */; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + }; + return MeshDisplayData; + }(ImageDisplayData)); + dragonBones.MeshDisplayData = MeshDisplayData; + /** + * @private + */ + var BoundingBoxDisplayData = (function (_super) { + __extends(BoundingBoxDisplayData, _super); + function BoundingBoxDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.boundingBox = null; // Initial value. + return _this; + } + BoundingBoxDisplayData.toString = function () { + return "[class dragonBones.BoundingBoxDisplayData]"; + }; + BoundingBoxDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + this.type = 3 /* BoundingBox */; + this.boundingBox = null; + }; + return BoundingBoxDisplayData; + }(DisplayData)); + dragonBones.BoundingBoxDisplayData = BoundingBoxDisplayData; + /** + * @private + */ + var WeightData = (function (_super) { + __extends(WeightData, _super); + function WeightData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.bones = []; + return _this; + } + WeightData.toString = function () { + return "[class dragonBones.WeightData]"; + }; + WeightData.prototype._onClear = function () { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + }; + return WeightData; + }(dragonBones.BaseObject)); + dragonBones.WeightData = WeightData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + var BoundingBoxData = (function (_super) { + __extends(BoundingBoxData, _super); + function BoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + BoundingBoxData.prototype._onClear = function () { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + }; + return BoundingBoxData; + }(dragonBones.BaseObject)); + dragonBones.BoundingBoxData = BoundingBoxData; + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var RectangleBoundingBoxData = (function (_super) { + __extends(RectangleBoundingBoxData, _super); + function RectangleBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + RectangleBoundingBoxData.toString = function () { + return "[class dragonBones.RectangleBoundingBoxData]"; + }; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + RectangleBoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) { + var code = 0 /* InSide */; // initialised as being inside of [[clip window]] + if (x < xMin) { + code |= 1 /* Left */; + } + else if (x > xMax) { + code |= 2 /* Right */; + } + if (y < yMin) { + code |= 4 /* Top */; + } + else if (y > yMax) { + code |= 8 /* Bottom */; + } + return code; + }; + /** + * @private + */ + RectangleBoundingBoxData.rectangleIntersectsSegment = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + if (inSideA && inSideB) { + return -1; + } + var intersectionCount = 0; + var outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + var outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + while (true) { + if ((outcode0 | outcode1) === 0) { + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { + break; + } + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + var x = 0.0; + var y = 0.0; + var normalRadian = 0.0; + // At least one endpoint is outside the clip rectangle; pick it. + var outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + // Now find the intersection point; + if ((outcodeOut & 4 /* Top */) !== 0) { + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & 8 /* Bottom */) !== 0) { + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & 2 /* Right */) !== 0) { + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & 1 /* Left */) !== 0) { + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + return intersectionCount; + }; + /** + * @private + */ + RectangleBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Rectangle */; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + return false; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var widthH = this.width * 0.5; + var heightH = this.height * 0.5; + var intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return RectangleBoundingBoxData; + }(BoundingBoxData)); + dragonBones.RectangleBoundingBoxData = RectangleBoundingBoxData; + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var EllipseBoundingBoxData = (function (_super) { + __extends(EllipseBoundingBoxData, _super); + function EllipseBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EllipseBoundingBoxData.toString = function () { + return "[class dragonBones.EllipseData]"; + }; + /** + * @private + */ + EllipseBoundingBoxData.ellipseIntersectsSegment = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var d = widthH / heightH; + var dd = d * d; + yA *= d; + yB *= d; + var dX = xB - xA; + var dY = yB - yA; + var lAB = Math.sqrt(dX * dX + dY * dY); + var xD = dX / lAB; + var yD = dY / lAB; + var a = (xC - xA) * xD + (yC - yA) * yD; + var aa = a * a; + var ee = xA * xA + yA * yA; + var rr = widthH * widthH; + var dR = rr - ee + aa; + var intersectionCount = 0; + if (dR >= 0.0) { + var dT = Math.sqrt(dR); + var sA = a - dT; + var sB = a + dT; + var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + var sideAB = inSideA * inSideB; + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + return intersectionCount; + }; + /** + * @private + */ + EllipseBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 1 /* Ellipse */; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + return false; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return EllipseBoundingBoxData; + }(BoundingBoxData)); + dragonBones.EllipseBoundingBoxData = EllipseBoundingBoxData; + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var PolygonBoundingBoxData = (function (_super) { + __extends(PolygonBoundingBoxData, _super); + function PolygonBoundingBoxData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.weight = null; // Initial value. + return _this; + } + /** + * @private + */ + PolygonBoundingBoxData.toString = function () { + return "[class dragonBones.PolygonBoundingBoxData]"; + }; + /** + * @private + */ + PolygonBoundingBoxData.polygonIntersectsSegment = function (xA, yA, xB, yB, vertices, offset, count, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (xA === xB) { + xA = xB + 0.000001; + } + if (yA === yB) { + yA = yB + 0.000001; + } + var dXAB = xA - xB; + var dYAB = yA - yB; + var llAB = xA * yB - yA * xB; + var intersectionCount = 0; + var xC = vertices[offset + count - 2]; + var yC = vertices[offset + count - 1]; + var dMin = 0.0; + var dMax = 0.0; + var xMin = 0.0; + var yMin = 0.0; + var xMax = 0.0; + var yMax = 0.0; + for (var i = 0; i < count; i += 2) { + var xD = vertices[offset + i]; + var yD = vertices[offset + i + 1]; + if (xC === xD) { + xC = xD + 0.0001; + } + if (yC === yD) { + yC = yD + 0.0001; + } + var dXCD = xC - xD; + var dYCD = yC - yD; + var llCD = xC * yD - yC * xD; + var ll = dXAB * dYCD - dYAB * dXCD; + var x = (llAB * dXCD - dXAB * llCD) / ll; + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + var y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + var d = x - xA; + if (d < 0.0) { + d = -d; + } + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + xC = xD; + yC = yD; + } + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + return intersectionCount; + }; + /** + * @private + */ + PolygonBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Polygon */; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null; // + this.weight = null; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (var i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + var yA = this.vertices[this.offset + iP + 1]; + var yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + var xA = this.vertices[this.offset + iP]; + var xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + iP = i; + } + } + return isInSide; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment(xA, yA, xB, yB, this.vertices, this.offset, this.count, intersectionPointA, intersectionPointB, normalRadians); + } + return intersectionCount; + }; + return PolygonBoundingBoxData; + }(BoundingBoxData)); + dragonBones.PolygonBoundingBoxData = PolygonBoundingBoxData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationData = (function (_super) { + __extends(AnimationData, _super); + function AnimationData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.cachedFrames = []; + /** + * @private + */ + _this.boneTimelines = {}; + /** + * @private + */ + _this.slotTimelines = {}; + /** + * @private + */ + _this.boneCachedFrameIndices = {}; + /** + * @private + */ + _this.slotCachedFrameIndices = {}; + /** + * @private + */ + _this.actionTimeline = null; // Initial value. + /** + * @private + */ + _this.zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationData.toString = function () { + return "[class dragonBones.AnimationData]"; + }; + /** + * @private + */ + AnimationData.prototype._onClear = function () { + for (var k in this.boneTimelines) { + for (var kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + delete this.boneTimelines[k]; + } + for (var k in this.slotTimelines) { + for (var kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + delete this.slotTimelines[k]; + } + for (var k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + for (var k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + }; + /** + * @private + */ + AnimationData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0.0) { + return; + } + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + this.cachedFrames.length = cacheFrameCount; + for (var i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + for (var _i = 0, _a = this.parent.sortedBones; _i < _a.length; _i++) { + var bone = _a[_i]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.boneCachedFrameIndices[bone.name] = indices; + } + for (var _b = 0, _c = this.parent.sortedSlots; _b < _c.length; _b++) { + var slot = _c[_b]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.slotCachedFrameIndices[slot.name] = indices; + } + }; + /** + * @private + */ + AnimationData.prototype.addBoneTimeline = function (bone, timeline) { + var timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.addSlotTimeline = function (slot, timeline) { + var timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.getBoneTimelines = function (name) { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotTimeline = function (name) { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getBoneCachedFrameIndices = function (name) { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotCachedFrameIndices = function (name) { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + }; + return AnimationData; + }(dragonBones.BaseObject)); + dragonBones.AnimationData = AnimationData; + /** + * @private + */ + var TimelineData = (function (_super) { + __extends(TimelineData, _super); + function TimelineData() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineData.toString = function () { + return "[class dragonBones.TimelineData]"; + }; + TimelineData.prototype._onClear = function () { + this.type = 10 /* BoneAll */; + this.offset = 0; + this.frameIndicesOffset = -1; + }; + return TimelineData; + }(dragonBones.BaseObject)); + dragonBones.TimelineData = TimelineData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + var AnimationConfig = (function (_super) { + __extends(AnimationConfig, _super); + function AnimationConfig() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.boneMask = []; + return _this; + } + AnimationConfig.toString = function () { + return "[class dragonBones.AnimationConfig]"; + }; + /** + * @private + */ + AnimationConfig.prototype._onClear = function () { + this.pauseFadeOut = true; + this.fadeOutMode = 4 /* All */; + this.fadeOutTweenType = 1 /* Line */; + this.fadeOutTime = -1.0; + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = 1 /* Line */; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + }; + AnimationConfig.prototype.clear = function () { + this._onClear(); + }; + AnimationConfig.prototype.copyFrom = function (value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + this.boneMask.length = value.boneMask.length; + for (var i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + }; + AnimationConfig.prototype.containsBoneMask = function (name) { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + }; + AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + if (this.boneMask.indexOf(name) < 0) { + this.boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + }; + AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this.boneMask.indexOf(name); + if (index >= 0) { + this.boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var index_1 = this.boneMask.indexOf(bone.name); + if (index_1 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index_1, 1); + } + } + } + else { + for (var _b = 0, _c = armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + }; + return AnimationConfig; + }(dragonBones.BaseObject)); + dragonBones.AnimationConfig = AnimationConfig; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var TextureAtlasData = (function (_super) { + __extends(TextureAtlasData, _super); + function TextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.textures = {}; + return _this; + } + /** + * @private + */ + TextureAtlasData.prototype._onClear = function () { + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + }; + /** + * @private + */ + TextureAtlasData.prototype.copyFrom = function (value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + // this.textures.clear(); + for (var k in value.textures) { + var texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + }; + /** + * @private + */ + TextureAtlasData.prototype.addTexture = function (value) { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + value.parent = this; + this.textures[value.name] = value; + }; + /** + * @private + */ + TextureAtlasData.prototype.getTexture = function (name) { + return name in this.textures ? this.textures[name] : null; + }; + return TextureAtlasData; + }(dragonBones.BaseObject)); + dragonBones.TextureAtlasData = TextureAtlasData; + /** + * @private + */ + var TextureData = (function (_super) { + __extends(TextureData, _super); + function TextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = new dragonBones.Rectangle(); + _this.frame = null; // Initial value. + return _this; + } + TextureData.createRectangle = function () { + return new dragonBones.Rectangle(); + }; + TextureData.prototype._onClear = function () { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + }; + TextureData.prototype.copyFrom = function (value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + }; + return TextureData; + }(dragonBones.BaseObject)); + dragonBones.TextureData = TextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones_1) { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + var Armature = (function (_super) { + __extends(Armature, _super); + function Armature() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._bones = []; + _this._slots = []; + _this._actions = []; + _this._animation = null; // Initial value. + _this._proxy = null; // Initial value. + /** + * @private + */ + _this._replaceTextureAtlasData = null; // Initial value. + _this._clock = null; // Initial value. + return _this; + } + Armature.toString = function () { + return "[class dragonBones.Armature]"; + }; + Armature._onSortSlots = function (a, b) { + return a._zOrder > b._zOrder ? 1 : -1; + }; + /** + * @private + */ + Armature.prototype._onClear = function () { + if (this._clock !== null) { + this._clock.remove(this); + } + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + bone.returnToPool(); + } + for (var _b = 0, _c = this._slots; _b < _c.length; _b++) { + var slot = _c[_b]; + slot.returnToPool(); + } + for (var _d = 0, _e = this._actions; _d < _e.length; _d++) { + var action = _e[_d]; + action.returnToPool(); + } + if (this._animation !== null) { + this._animation.returnToPool(); + } + if (this._proxy !== null) { + this._proxy.clear(); + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + }; + Armature.prototype._sortBones = function () { + var total = this._bones.length; + if (total <= 0) { + return; + } + var sortHelper = this._bones.concat(); + var index = 0; + var count = 0; + this._bones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this._bones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { + continue; + } + this._bones.push(bone); + count++; + } + }; + Armature.prototype._sortSlots = function () { + this._slots.sort(Armature._onSortSlots); + }; + /** + * @internal + * @private + */ + Armature.prototype._sortZOrder = function (slotIndices, offset) { + var slotDatas = this.armatureData.sortedSlots; + var isOriginal = slotIndices === null; + if (this._zOrderDirty || !isOriginal) { + for (var i = 0, l = slotDatas.length; i < l; ++i) { + var slotIndex = isOriginal ? i : slotIndices[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + var slotData = slotDatas[slotIndex]; + var slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addBoneToBoneList = function (value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeBoneFromBoneList = function (value) { + var index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addSlotToSlotList = function (value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeSlotFromSlotList = function (value) { + var index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._bufferAction = function (action, append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + }; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.dispose = function () { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + }; + /** + * @private + */ + Armature.prototype.init = function (armatureData, proxy, display, dragonBones) { + if (this.armatureData !== null) { + return; + } + this.armatureData = armatureData; + this._animation = dragonBones_1.BaseObject.borrowObject(dragonBones_1.Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + }; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.advanceTime = function (passedTime) { + if (this._lockUpdate) { + return; + } + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + var prevCacheFrameIndex = this._cacheFrameIndex; + // Update nimation. + this._animation.advanceTime(passedTime); + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + var i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + if (this._actions.length > 0) { + this._lockUpdate = true; + for (var _i = 0, _a = this._actions; _i < _a.length; _i++) { + var action = _a[_i]; + if (action.type === 0 /* Play */) { + this._animation.fadeIn(action.name); + } + } + this._actions.length = 0; + this._lockUpdate = false; + } + // + var drawed = this.debugDraw || dragonBones_1.DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + }; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName !== null && boneName.length > 0) { + var bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + if (updateSlotDisplay) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (var _b = 0, _c = this._bones; _b < _c.length; _b++) { + var bone = _c[_b]; + bone.invalidUpdate(); + } + if (updateSlotDisplay) { + for (var _d = 0, _e = this._slots; _d < _e.length; _d++) { + var slot = _e[_d]; + slot.invalidUpdate(); + } + } + } + }; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.containsPoint = function (x, y) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.containsPoint(x, y)) { + return slot; + } + } + return null; + }; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var isV = xA === xB; + var dMin = 0.0; + var dMax = 0.0; + var intXA = 0.0; + var intYA = 0.0; + var intXB = 0.0; + var intYB = 0.0; + var intAN = 0.0; + var intBN = 0.0; + var intSlotA = null; + var intSlotB = null; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + if (intersectionPointB !== null) { + var d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + return intSlotA; + }; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBone = function (name) { + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.name === name) { + return bone; + } + } + return null; + }; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBoneByDisplay = function (display) { + var slot = this.getSlotByDisplay(display); + return slot !== null ? slot.parent : null; + }; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlot = function (name) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.name === name) { + return slot; + } + } + return null; + }; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlotByDisplay = function (display) { + if (display !== null) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.display === display) { + return slot; + } + } + } + return null; + }; + /** + * @deprecated + */ + Armature.prototype.addBone = function (value, parentName) { + if (parentName === void 0) { parentName = null; } + console.assert(value !== null); + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + }; + /** + * @deprecated + */ + Armature.prototype.removeBone = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * @deprecated + */ + Armature.prototype.addSlot = function (value, parentName) { + var bone = this.getBone(parentName); + console.assert(value !== null && bone !== null); + value._setArmature(this); + value._setParent(bone); + }; + /** + * @deprecated + */ + Armature.prototype.removeSlot = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBones = function () { + return this._bones; + }; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlots = function () { + return this._slots; + }; + Object.defineProperty(Armature.prototype, "flipX", { + get: function () { + return this._flipX; + }, + set: function (value) { + if (this._flipX === value) { + return; + } + this._flipX = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "flipY", { + get: function () { + return this._flipY; + }, + set: function (value) { + if (this._flipY === value) { + return; + } + this._flipY = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "cacheFrameRate", { + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.armatureData.cacheFrameRate; + }, + set: function (value) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + // Set child armature frameRate. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "name", { + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this.armatureData.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "animation", { + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._animation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "proxy", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "eventDispatcher", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "display", { + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "replacedTexture", { + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + get: function () { + return this._replacedTexture; + }, + set: function (value) { + if (this._replacedTexture === value) { + return; + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + this._replacedTexture = value; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + slot.invalidUpdate(); + slot.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + // Update childArmature clock. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "parent", { + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + Armature.prototype.replaceTexture = function (texture) { + this.replacedTexture = texture; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.hasEventListener = function (type) { + return this._proxy.hasEvent(type); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.addEventListener = function (type, listener, target) { + this._proxy.addEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.removeEventListener = function (type, listener, target) { + this._proxy.removeEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + Armature.prototype.enableAnimationCache = function (frameRate) { + this.cacheFrameRate = frameRate; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Armature.prototype.getDisplay = function () { + return this._display; + }; + return Armature; + }(dragonBones_1.BaseObject)); + dragonBones_1.Armature = Armature; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var TransformObject = (function (_super) { + __extends(TransformObject, _super); + function TransformObject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.globalTransformMatrix = new dragonBones.Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.global = new dragonBones.Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.offset = new dragonBones.Transform(); + return _this; + } + /** + * @private + */ + TransformObject.prototype._onClear = function () { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setArmature = function (value) { + this._armature = value; + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setParent = function (value) { + this._parent = value; + }; + /** + * @private + */ + TransformObject.prototype.updateGlobalTransform = function () { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + }; + Object.defineProperty(TransformObject.prototype, "armature", { + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TransformObject.prototype, "parent", { + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + TransformObject._helpMatrix = new dragonBones.Matrix(); + /** + * @private + */ + TransformObject._helpTransform = new dragonBones.Transform(); + /** + * @private + */ + TransformObject._helpPoint = new dragonBones.Point(); + return TransformObject; + }(dragonBones.BaseObject)); + dragonBones.TransformObject = TransformObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var Bone = (function (_super) { + __extends(Bone, _super); + function Bone() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this.animationPose = new dragonBones.Transform(); + /** + * @internal + * @private + */ + _this.constraints = []; + _this._bones = []; + _this._slots = []; + return _this; + } + Bone.toString = function () { + return "[class dragonBones.Bone]"; + }; + /** + * @private + */ + Bone.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + this.offsetMode = 1 /* Additive */; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null; // + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Bone.prototype._updateGlobalTransformMatrix = function (isCache) { + var flipX = this._armature.flipX; + var flipY = this._armature.flipY === dragonBones.DragonBones.yDown; + var global = this.global; + var globalTransformMatrix = this.globalTransformMatrix; + var inherit = this._parent !== null; + var dR = 0.0; + if (this.offsetMode === 1 /* Additive */) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === 0 /* None */) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + if (inherit) { + var parentMatrix = this._parent.globalTransformMatrix; + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + var x = global.x; + var y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + } + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + }; + /** + * @internal + * @private + */ + Bone.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + var oldSlots = null; + var oldBones = null; + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + this._armature = value; // + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + if (oldSlots !== null) { + for (var _i = 0, oldSlots_1 = oldSlots; _i < oldSlots_1.length; _i++) { + var slot = oldSlots_1[_i]; + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + if (oldBones !== null) { + for (var _a = 0, oldBones_1 = oldBones; _a < oldBones_1.length; _a++) { + var bone = oldBones_1[_a]; + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + }; + /** + * @internal + * @private + */ + Bone.prototype.init = function (boneData) { + if (this.boneData !== null) { + return; + } + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + }; + /** + * @internal + * @private + */ + Bone.prototype.update = function (cacheFrameIndex) { + this._blendDirty = false; + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.update(); + } + } + if (this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty)) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { + for (var _b = 0, _c = this.constraints; _b < _c.length; _b++) { + var constraint = _c[_b]; + constraint.update(); + } + } + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + this._localDirty = true; + }; + /** + * @internal + * @private + */ + Bone.prototype.updateByConstraint = function () { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + this._transformDirty = true; + } + }; + /** + * @internal + * @private + */ + Bone.prototype.addConstraint = function (constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + }; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.invalidUpdate = function () { + this._transformDirty = true; + }; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.contains = function (child) { + if (child === this) { + return false; + } + var ancestor = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + return ancestor === this; + }; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getBones = function () { + this._bones.length = 0; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.parent === this) { + this._bones.push(bone); + } + } + return this._bones; + }; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getSlots = function () { + this._slots.length = 0; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + this._slots.push(slot); + } + } + return this._slots; + }; + Object.defineProperty(Bone.prototype, "visible", { + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._visible; + }, + set: function (value) { + if (this._visible === value) { + return; + } + this._visible = value; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot._parent === this) { + slot._updateVisible(); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "length", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + get: function () { + return this.boneData.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + get: function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + return slot; + } + } + return null; + }, + enumerable: true, + configurable: true + }); + return Bone; + }(dragonBones.TransformObject)); + dragonBones.Bone = Bone; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + var Slot = (function (_super) { + __extends(Slot, _super); + function Slot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this._localMatrix = new dragonBones.Matrix(); + /** + * @private + */ + _this._colorTransform = new dragonBones.ColorTransform(); + /** + * @private + */ + _this._ffdVertices = []; + /** + * @private + */ + _this._displayDatas = []; + /** + * @private + */ + _this._displayList = []; + /** + * @private + */ + _this._meshBones = []; + /** + * @private + */ + _this._rawDisplay = null; // Initial value. + /** + * @private + */ + _this._meshDisplay = null; // Initial value. + return _this; + } + /** + * @private + */ + Slot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + var disposeDisplayList = []; + for (var _i = 0, _a = this._displayList; _i < _a.length; _i++) { + var eachDisplay = _a[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _b = 0, disposeDisplayList_1 = disposeDisplayList; _b < disposeDisplayList_1.length; _b++) { + var eachDisplay = disposeDisplayList_1[_b]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { + this._disposeDisplay(this._meshDisplay); + } + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + this.displayController = null; + this.slotData = null; // + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = 0 /* Normal */; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Slot.prototype._updateDisplayData = function () { + var prevDisplayData = this._displayData; + var prevTextureData = this._textureData; + var prevMeshData = this._meshData; + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === 0 /* Image */ || this._displayData.type === 2 /* Mesh */) { + this._textureData = this._displayData.texture; + if (this._displayData.type === 2 /* Mesh */) { + this._meshData = this._displayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */) { + this._meshData = rawDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = this._displayData.boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = rawDisplayData.boundingBox; + } + else { + this._boundingBoxData = null; + } + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + var imageDisplayData = this._displayData; + var scale = this._armature.armatureData.scale; + var frame = this._textureData.frame; + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + var rect = frame !== null ? frame : this._textureData.region; + var width = rect.width * scale; + var height = rect.height * scale; + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + this._pivotX *= width; + this._pivotY *= height; + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + for (var i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + var vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + 0 /* MeshVertexCount */]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + for (var i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { + this._meshDirty = true; + } + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + this._displayDirty = true; + this._transformDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._updateDisplay = function () { + var prevDisplay = this._display !== null ? this._display : this._rawDisplay; + var prevChildArmature = this._childArmature; + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof dragonBones.Armature) { + this._childArmature = this._display; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + // Update display. + var currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { + if (this._childArmature.cacheFrameRate === 0) { + var cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + // Child armature action. + var actions = null; + if (this._displayData !== null && this._displayData.type === 1 /* Armature */) { + actions = this._displayData.actions; + } + else { + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === 1 /* Armature */) { + actions = rawDisplayData.actions; + } + } + if (actions !== null && actions.length > 0) { + for (var _i = 0, actions_1 = actions; _i < actions_1.length; _i++) { + var action = actions_1[_i]; + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + }; + /** + * @private + */ + Slot.prototype._updateGlobalTransformMatrix = function (isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._isMeshBonesUpdate = function () { + for (var _i = 0, _a = this._meshBones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + return false; + }; + /** + * @internal + * @private + */ + Slot.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + this._armature = value; // + this._onUpdateDisplay(); + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + }; + /** + * @internal + * @private + */ + Slot.prototype._setDisplayIndex = function (value, isAnimation) { + if (isAnimation === void 0) { isAnimation = false; } + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + this._animationDisplayIndex = value; + } + if (this._displayIndex === value) { + return false; + } + this._displayIndex = value; + this._displayDirty = true; + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setZorder = function (value) { + if (this._zOrder === value) { + //return false; + } + this._zOrder = value; + this._zOrderDirty = true; + return this._zOrderDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setColor = function (value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + return this._colorDirty; + }; + /** + * @private + */ + Slot.prototype._setDisplayList = function (value) { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + for (var i = 0, l = value.length; i < l; ++i) { + var eachDisplay = value[i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) { + this._initDisplay(eachDisplay); + } + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @private + */ + Slot.prototype.init = function (slotData, displayDatas, rawDisplay, meshDisplay) { + if (this.slotData !== null) { + return; + } + this.slotData = slotData; + this.name = this.slotData.name; + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._displayDatas.length = this._rawDisplayDatas.length; + for (var i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + }; + /** + * @internal + * @private + */ + Slot.prototype.update = function (cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + if (this._transformDirty) { + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + if (this._display === null) { + return; + } + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + if (this._meshData !== null && this._display === this._meshDisplay) { + var isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + return; + } + } + if (this._transformDirty) { + this._transformDirty = false; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + this._updateTransform(false); + } + }; + /** + * @private + */ + Slot.prototype.updateTransformAndMatrix = function () { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + }; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.containsPoint = function (x, y) { + if (this._boundingBoxData === null) { + return false; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + }; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (this._boundingBoxData === null) { + return 0; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + return intersectionCount; + }; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + Slot.prototype.invalidUpdate = function () { + this._displayDirty = true; + this._transformDirty = true; + }; + Object.defineProperty(Slot.prototype, "displayIndex", { + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._displayIndex; + }, + set: function (value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "displayList", { + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._displayList.concat(); + }, + set: function (value) { + var backupDisplayList = this._displayList.concat(); // Copy. + var disposeDisplayList = new Array(); + if (this._setDisplayList(value)) { + this.update(-1); + } + // Release replaced displays. + for (var _i = 0, backupDisplayList_1 = backupDisplayList; _i < backupDisplayList_1.length; _i++) { + var eachDisplay = backupDisplayList_1[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _a = 0, disposeDisplayList_2 = disposeDisplayList; _a < disposeDisplayList_2.length; _a++) { + var eachDisplay = disposeDisplayList_2[_a]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "boundingBoxData", { + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + get: function () { + return this._boundingBoxData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "rawDisplay", { + /** + * @private + */ + get: function () { + return this._rawDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "meshDisplay", { + /** + * @private + */ + get: function () { + return this._meshDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "display", { + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + set: function (value) { + if (this._display === value) { + return; + } + var displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { + this._displayIndex = 0; + } + if (this._displayIndex < 0) { + return; + } + else { + var replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "childArmature", { + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._childArmature; + }, + set: function (value) { + if (this._childArmature === value) { + return; + } + this.display = value; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.getDisplay = function () { + return this._display; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.setDisplay = function (value) { + this.display = value; + }; + return Slot; + }(dragonBones.TransformObject)); + dragonBones.Slot = Slot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + * @internal + */ + var Constraint = (function (_super) { + __extends(Constraint, _super); + function Constraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + Constraint.prototype._onClear = function () { + this.target = null; // + this.bone = null; // + this.root = null; // + }; + Constraint._helpMatrix = new dragonBones.Matrix(); + Constraint._helpTransform = new dragonBones.Transform(); + Constraint._helpPoint = new dragonBones.Point(); + return Constraint; + }(dragonBones.BaseObject)); + dragonBones.Constraint = Constraint; + /** + * @private + * @internal + */ + var IKConstraint = (function (_super) { + __extends(IKConstraint, _super); + function IKConstraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraint.toString = function () { + return "[class dragonBones.IKConstraint]"; + }; + IKConstraint.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + IKConstraint.prototype._computeA = function () { + var ikGlobal = this.target.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + var ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype._computeB = function () { + var boneLength = this.bone.boneData.length; + var parent = this.root; + var ikGlobal = this.target.global; + var parentGlobal = parent.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + var x = globalTransformMatrix.a * boneLength; + var y = globalTransformMatrix.b * boneLength; + var lLL = x * x + y * y; + var lL = Math.sqrt(lLL); + var dX = global.x - parentGlobal.x; + var dY = global.y - parentGlobal.y; + var lPP = dX * dX + dY * dY; + var lP = Math.sqrt(lPP); + var rawRadianA = Math.atan2(dY, dX); + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + var lTT = dX * dX + dY * dY; + var lT = Math.sqrt(lTT); + var ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + var h = (lPP - lLL + lTT) / (2.0 * lTT); + var r = Math.sqrt(lPP - h * h * lTT) / lT; + var hX = parentGlobal.x + (dX * h); + var hY = parentGlobal.y + (dY * h); + var rX = -dY * r; + var rY = dX * r; + var isPPR = false; + if (parent._parent !== null) { + var parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + var dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + var parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + var ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype.update = function () { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + }; + return IKConstraint; + }(Constraint)); + dragonBones.IKConstraint = IKConstraint; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var WorldClock = (function () { + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + function WorldClock(time) { + if (time === void 0) { time = -1.0; } + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + this.time = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + this.timeScale = 1.0; + this._animatebles = []; + this._clock = null; + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.advanceTime = function (passedTime) { + if (passedTime !== passedTime) { + passedTime = 0.0; + } + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + if (passedTime === 0.0) { + return; + } + var i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + var animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + var animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + this._animatebles.length -= r; + } + }; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.contains = function (value) { + return this._animatebles.indexOf(value) >= 0; + }; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.add = function (value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + }; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.remove = function (value) { + var index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + }; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.clear = function () { + for (var _i = 0, _a = this._animatebles; _i < _a.length; _i++) { + var animatable = _a[_i]; + if (animatable !== null) { + animatable.clock = null; + } + } + }; + Object.defineProperty(WorldClock.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock !== null) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.clock = new WorldClock(); + return WorldClock; + }()); + dragonBones.WorldClock = WorldClock; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._animationNames = []; + _this._animationStates = []; + _this._animations = {}; + _this._animationConfig = null; // Initial value. + return _this; + } + /** + * @private + */ + Animation.toString = function () { + return "[class dragonBones.Animation]"; + }; + /** + * @private + */ + Animation.prototype._onClear = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + for (var k in this._animations) { + delete this._animations[k]; + } + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + this.timeScale = 1.0; + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + }; + Animation.prototype._fadeOut = function (animationConfig) { + switch (animationConfig.fadeOutMode) { + case 1 /* SameLayer */: + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 2 /* SameGroup */: + for (var _b = 0, _c = this._animationStates; _b < _c.length; _b++) { + var animationState = _c[_b]; + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 3 /* SameLayerAndGroup */: + for (var _d = 0, _e = this._animationStates; _d < _e.length; _d++) { + var animationState = _e[_d]; + if (animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 4 /* All */: + for (var _f = 0, _g = this._animationStates; _f < _g.length; _f++) { + var animationState = _g[_f]; + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + case 0 /* None */: + case 5 /* Single */: + default: + break; + } + }; + /** + * @internal + * @private + */ + Animation.prototype.init = function (armature) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig); + }; + /** + * @internal + * @private + */ + Animation.prototype.advanceTime = function (passedTime) { + if (passedTime < 0.0) { + passedTime = -passedTime; + } + if (this._armature.inheritAnimation && this._armature._parent !== null) { + passedTime *= this._armature._parent._armature.animation.timeScale; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + var animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + var animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + var animationData = animationState.animationData; + var cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { + this._animationDirty = false; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (var i = 0, r = 0; i < animationStateCount; ++i) { + var animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, 0.0); + } + if (i === animationStateCount - 1 && r > 0) { + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + this._timelineDirty = false; + }; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.reset = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + }; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.stop = function (animationName) { + if (animationName === void 0) { animationName = null; } + if (animationName !== null) { + var animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.stop(); + } + } + }; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + Animation.prototype.playConfig = function (animationConfig) { + var animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName); + return null; + } + var animationData = this._animations[animationName]; + if (animationConfig.fadeOutMode === 5 /* Single */) { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState_1 = _a[_i]; + if (animationState_1.animationData === animationData) { + return animationState_1; + } + } + } + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + this._fadeOut(animationConfig); + var animationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + if (this._animationStates.length > 0) { + var added = false; + for (var i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + // Child armature play same name animation. + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var childArmature = slot.childArmature; + if (childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null) { + childArmature.animation.fadeIn(animationName); // + } + } + if (animationConfig.fadeInTime <= 0.0) { + this._armature.advanceTime(0.0); + } + this._lastAnimationState = animationState; + return animationState; + }; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + var defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + return this._lastAnimationState; + }; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) { + if (time === void 0) { time = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) { + if (frame === void 0) { frame = 0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + return this.playConfig(this._animationConfig); + }; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) { + if (progress === void 0) { progress = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + return this.playConfig(this._animationConfig); + }; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByTime = function (animationName, time) { + if (time === void 0) { time = 0.0; } + var animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByFrame = function (animationName, frame) { + if (frame === void 0) { frame = 0; } + var animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByProgress = function (animationName, progress) { + if (progress === void 0) { progress = 0.0; } + var animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.getState = function (animationName) { + var i = this._animationStates.length; + while (i--) { + var animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + return null; + }; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.hasAnimation = function (animationName) { + return animationName in this._animations; + }; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + Animation.prototype.getStates = function () { + return this._animationStates; + }; + Object.defineProperty(Animation.prototype, "isPlaying", { + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.isPlaying) { + return true; + } + } + return false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "isCompleted", { + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (!animationState.isCompleted) { + return false; + } + } + return this._animationStates.length > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationName", { + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationNames", { + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animations", { + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animations; + }, + set: function (value) { + if (this._animations === value) { + return; + } + this._animationNames.length = 0; + for (var k in this._animations) { + delete this._animations[k]; + } + for (var k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationConfig", { + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + this._animationConfig.clear(); + return this._animationConfig; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationState", { + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) { + if (fadeInTime === void 0) { fadeInTime = -1; } + if (duration === void 0) { duration = -1; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (pauseFadeOut === void 0) { pauseFadeOut = true; } + if (pauseFadeIn === void 0) { pauseFadeIn = true; } + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + var animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + return this.playConfig(this._animationConfig); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + Animation.prototype.gotoAndStop = function (animationName, time) { + if (time === void 0) { time = 0; } + return this.gotoAndStopByTime(animationName, time); + }; + Object.defineProperty(Animation.prototype, "animationList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationDataList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + var list = []; + for (var i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + return list; + }, + enumerable: true, + configurable: true + }); + return Animation; + }(dragonBones.BaseObject)); + dragonBones.Animation = Animation; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var BonePose = (function (_super) { + __extends(BonePose, _super); + function BonePose() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.current = new dragonBones.Transform(); + _this.delta = new dragonBones.Transform(); + _this.result = new dragonBones.Transform(); + return _this; + } + BonePose.toString = function () { + return "[class dragonBones.BonePose]"; + }; + BonePose.prototype._onClear = function () { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + }; + return BonePose; + }(dragonBones.BaseObject)); + dragonBones.BonePose = BonePose; + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationState = (function (_super) { + __extends(AnimationState, _super); + function AnimationState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._boneMask = []; + _this._boneTimelines = []; + _this._slotTimelines = []; + _this._bonePoses = {}; + /** + * @internal + * @private + */ + _this._actionTimeline = null; // Initial value. + _this._zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationState.toString = function () { + return "[class dragonBones.AnimationState]"; + }; + /** + * @private + */ + AnimationState.prototype._onClear = function () { + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.returnToPool(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.returnToPool(); + } + for (var k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null; // + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + }; + AnimationState.prototype._isDisabled = function (slot) { + if (this.displayControl) { + var displayController = slot.displayController; + if (displayController === null || + displayController === this.name || + displayController === this.group) { + return false; + } + } + return true; + }; + AnimationState.prototype._advanceFadeTime = function (passedTime) { + var isFadeOut = this._fadeState > 0; + if (this._subFadeState < 0) { + this._subFadeState = 0; + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + if (passedTime < 0.0) { + passedTime = -passedTime; + } + this._fadeTime += passedTime; + if (this._fadeTime >= this.fadeTotalTime) { + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + if (this._subFadeState > 0) { + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + }; + AnimationState.prototype._blendBoneTimline = function (timeline) { + var bone = timeline.bone; + var bonePose = timeline.bonePose.result; + var animationPose = bone.animationPose; + var boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.init = function (armature, animationData, animationConfig) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (var i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + this._actionTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.updateTimelines = function () { + var boneTimelines = {}; + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + var timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + boneTimelines[timelineName].push(timeline); + } + for (var _b = 0, _c = this._armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + var timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + var timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { + delete boneTimelines[timelineName]; + } + else { + var bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = dragonBones.BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (var _d = 0, timelineDatas_1 = timelineDatas; _d < timelineDatas_1.length; _d++) { + var timelineData = timelineDatas_1[_d]; + switch (timelineData.type) { + case 10 /* BoneAll */: + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + case 11 /* BoneT */: + case 12 /* BoneR */: + case 13 /* BoneS */: + // TODO + break; + case 14 /* BoneX */: + case 15 /* BoneY */: + case 16 /* BoneRotate */: + case 17 /* BoneSkew */: + case 18 /* BoneScaleX */: + case 19 /* BoneScaleY */: + // TODO + break; + } + } + } + else if (this.resetToPose) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + for (var k in boneTimelines) { + for (var _e = 0, _f = boneTimelines[k]; _e < _f.length; _e++) { + var timeline = _f[_e]; + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + var slotTimelines = {}; + var ffdFlags = []; + for (var _g = 0, _h = this._slotTimelines; _g < _h.length; _g++) { + var timeline = _h[_g]; + var timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + slotTimelines[timelineName].push(timeline); + } + for (var _j = 0, _k = this._armature.getSlots(); _j < _k.length; _j++) { + var slot = _k[_j]; + var boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + var timelineName = slot.name; + var timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { + delete slotTimelines[timelineName]; + } + else { + var displayIndexFlag = false; + var colorFlag = false; + ffdFlags.length = 0; + if (timelineDatas !== null) { + for (var _l = 0, timelineDatas_2 = timelineDatas; _l < timelineDatas_2.length; _l++) { + var timelineData = timelineDatas_2[_l]; + switch (timelineData.type) { + case 20 /* SlotDisplay */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + case 21 /* SlotColor */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + case 22 /* SlotFFD */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + if (this.resetToPose) { + if (!displayIndexFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + if (!colorFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + for (var _m = 0, _o = slot._rawDisplayDatas; _m < _o.length; _m++) { + var displayData = _o[_m]; + if (displayData !== null && displayData.type === 2 /* Mesh */ && ffdFlags.indexOf(displayData.offset) < 0) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + for (var k in slotTimelines) { + for (var _p = 0, _q = slotTimelines[k]; _p < _q.length; _p++) { + var timeline = _q[_p]; + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.advanceTime = function (passedTime, cacheFrameRate) { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + // Update time. + if (this._playheadState === 3) { + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + this._time += passedTime; + } + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + if (this.weight === 0.0) { + return; + } + var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + var isUpdateTimeline = true; + var isUpdateBoneTimeline = true; + var time = this._time; + this._weightResult = this.weight * this._fadeProgress; + this._actionTimeline.update(time); // Update main timeline. + if (isCacheEnabled) { + var internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.update(time); + } + if (isCacheEnabled) { + var cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { + isUpdateBoneTimeline = false; + } + else { + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { + var bone = null; + var prevTimeline = null; // + for (var i = 0, l = this._boneTimelines.length; i < l; ++i) { + var timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + bone = timeline.bone; + } + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + for (var i = 0, l = this._slotTimelines.length; i < l; ++i) { + var timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + timeline.update(time); + } + } + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { + this.fadeOut(this.autoFadeOutTime); + } + } + } + }; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.play = function () { + this._playheadState = 3; // 11 + }; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.stop = function () { + this._playheadState &= 1; // 0x + }; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) { + if (pausePlayhead === void 0) { pausePlayhead = true; } + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.fadeOut(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.fadeOut(); + } + } + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + }; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.containsBoneMask = function (name) { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + }; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.addBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + if (this._boneMask.indexOf(name) < 0) { + this._boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + this._timelineDirty = true; + }; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this._boneMask.indexOf(name); + if (index >= 0) { + this._boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = this._armature.getBone(name); + if (currentBone !== null) { + var bones = this._armature.getBones(); + if (this._boneMask.length > 0) { + for (var _i = 0, bones_1 = bones; _i < bones_1.length; _i++) { + var bone = bones_1[_i]; + var index_2 = this._boneMask.indexOf(bone.name); + if (index_2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index_2, 1); + } + } + } + else { + for (var _a = 0, bones_2 = bones; _a < bones_2.length; _a++) { + var bone = bones_2[_a]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + this._timelineDirty = true; + }; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeAllBoneMask = function () { + this._boneMask.length = 0; + this._timelineDirty = true; + }; + Object.defineProperty(AnimationState.prototype, "isFadeIn", { + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState < 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeOut", { + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeComplete", { + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState === 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isPlaying", { + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isCompleted", { + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.playState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentPlayTimes", { + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "totalTime", { + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._duration; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentTime", { + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentTime; + }, + set: function (value) { + var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + if (this._time === value) { + return; + } + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.playState = -1; + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.playState = -1; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "clip", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + get: function () { + return this.animationData; + }, + enumerable: true, + configurable: true + }); + return AnimationState; + }(dragonBones.BaseObject)); + dragonBones.AnimationState = AnimationState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var TimelineState = (function (_super) { + __extends(TimelineState, _super); + function TimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineState.prototype._onClear = function () { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + this._tweenState = 0 /* None */; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + }; + TimelineState.prototype._setCurrentTime = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this._actionTimeline !== null && this._frameCount <= 1) { + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { + var playTimes = this._animationState.playTimes; + var totalTime = playTimes * this._duration; + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + this.currentTime += this._position; + } + else { + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + // Clear frame flag when timeline start or loopComplete. + if ((prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes)) { + this._frameIndex = -1; + } + return true; + }; + TimelineState.prototype.init = function (armature, animationState, timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + if (this === this._actionTimeline) { + this._actionTimeline = null; // + } + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + this._frameCount = this._timelineArray[this._timelineData.offset + 2 /* TimelineKeyFrameCount */]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + 4 /* TimelineFrameValueOffset */]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + 0 /* TimelineScale */]; + this._timeOffset = this._timelineArray[this._timelineData.offset + 1 /* TimelineOffset */] * 0.01; + } + }; + TimelineState.prototype.fadeOut = function () { }; + TimelineState.prototype.update = function (passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[this._timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + } + this._onArriveAtFrame(); + } + if (this._tweenState !== 0 /* None */) { + this._onUpdateFrame(); + } + } + }; + return TimelineState; + }(dragonBones.BaseObject)); + dragonBones.TimelineState = TimelineState; + /** + * @internal + * @private + */ + var TweenTimelineState = (function (_super) { + __extends(TweenTimelineState, _super); + function TweenTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TweenTimelineState._getEasingValue = function (tweenType, progress, easing) { + var value = progress; + switch (tweenType) { + case 3 /* QuadIn */: + value = Math.pow(progress, 2.0); + break; + case 4 /* QuadOut */: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + case 5 /* QuadInOut */: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + return (value - progress) * easing + progress; + }; + TweenTimelineState._getEasingCurveValue = function (progress, samples, count, offset) { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + var segmentCount = count + 1; // + 2 - 1 + var valueIndex = Math.floor(progress * segmentCount); + var fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + var toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + }; + TweenTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._tweenType = 0 /* None */; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + }; + TweenTimelineState.prototype._onArriveAtFrame = function () { + if (this._frameCount > 1 && + (this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) { + this._tweenType = this._frameArray[this._frameOffset + 1 /* FrameTweenType */]; // TODO recode ture tween type. + this._tweenState = this._tweenType === 0 /* None */ ? 1 /* Once */ : 2 /* Always */; + if (this._tweenType === 2 /* Curve */) { + this._curveCount = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */]; + } + else if (this._tweenType !== 0 /* None */ && this._tweenType !== 1 /* Line */) { + this._tweenEasing = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] * 0.01; + } + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = 1 /* Once */; + } + }; + TweenTimelineState.prototype._onUpdateFrame = function () { + if (this._tweenState === 2 /* Always */) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === 2 /* Curve */) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + 3 /* FrameCurveSamples */); + } + else if (this._tweenType !== 1 /* Line */) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + }; + return TweenTimelineState; + }(TimelineState)); + dragonBones.TweenTimelineState = TweenTimelineState; + /** + * @internal + * @private + */ + var BoneTimelineState = (function (_super) { + __extends(BoneTimelineState, _super); + function BoneTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bone = null; // + this.bonePose = null; // + }; + return BoneTimelineState; + }(TweenTimelineState)); + dragonBones.BoneTimelineState = BoneTimelineState; + /** + * @internal + * @private + */ + var SlotTimelineState = (function (_super) { + __extends(SlotTimelineState, _super); + function SlotTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.slot = null; // + }; + return SlotTimelineState; + }(TweenTimelineState)); + dragonBones.SlotTimelineState = SlotTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var ActionTimelineState = (function (_super) { + __extends(ActionTimelineState, _super); + function ActionTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ActionTimelineState.toString = function () { + return "[class dragonBones.ActionTimelineState]"; + }; + ActionTimelineState.prototype._onCrossFrame = function (frameIndex) { + var eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + frameIndex]; + var actionCount = this._frameArray[frameOffset + 1]; + var actions = this._armature.armatureData.actions; + for (var i = 0; i < actionCount; ++i) { + var actionIndex = this._frameArray[frameOffset + 2 + i]; + var action = actions[actionIndex]; + if (action.type === 0 /* Play */) { + if (action.slot !== null) { + var slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + var eventType = action.type === 10 /* Frame */ ? dragonBones.EventObject.FRAME_EVENT : dragonBones.EventObject.SOUND_EVENT; + if (action.type === 11 /* Sound */ || eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + }; + ActionTimelineState.prototype._onArriveAtFrame = function () { }; + ActionTimelineState.prototype._onUpdateFrame = function () { }; + ActionTimelineState.prototype.update = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + var eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { + this._armature._sortZOrder(null, 0); + } + prevPlayTimes = this.currentPlayTimes; + if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = dragonBones.EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + var isReverse = this._animationState.timeScale < 0.0; + var loopCompleteEvent = null; + var completeEvent = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + loopCompleteEvent.type = dragonBones.EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + if (this.playState > 0) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) { + completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + completeEvent.type = dragonBones.EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + } + } + if (this._frameCount > 1) { + var timelineData = this._timelineData; + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + var crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { + if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + // Arrive at frame. + var framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { + if (!isReverse && loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + this._onCrossFrame(this._frameIndex); + } + } + } + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + }; + ActionTimelineState.prototype.setCurrentTime = function (value) { + this._setCurrentTime(value); + this._frameIndex = -1; + }; + return ActionTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ActionTimelineState = ActionTimelineState; + /** + * @internal + * @private + */ + var ZOrderTimelineState = (function (_super) { + __extends(ZOrderTimelineState, _super); + function ZOrderTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZOrderTimelineState.toString = function () { + return "[class dragonBones.ZOrderTimelineState]"; + }; + ZOrderTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + }; + ZOrderTimelineState.prototype._onUpdateFrame = function () { }; + return ZOrderTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ZOrderTimelineState = ZOrderTimelineState; + /** + * @internal + * @private + */ + var BoneAllTimelineState = (function (_super) { + __extends(BoneAllTimelineState, _super); + function BoneAllTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneAllTimelineState.toString = function () { + return "[class dragonBones.BoneAllTimelineState]"; + }; + BoneAllTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { + var current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + }; + BoneAllTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var result = this.bonePose.result; + this.bone._transformDirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + var scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + }; + BoneAllTimelineState.prototype.fadeOut = function () { + var result = this.bonePose.result; + result.rotation = dragonBones.Transform.normalizeRadian(result.rotation); + result.skew = dragonBones.Transform.normalizeRadian(result.skew); + }; + return BoneAllTimelineState; + }(dragonBones.BoneTimelineState)); + dragonBones.BoneAllTimelineState = BoneAllTimelineState; + /** + * @internal + * @private + */ + var SlotDislayIndexTimelineState = (function (_super) { + __extends(SlotDislayIndexTimelineState, _super); + function SlotDislayIndexTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotDislayIndexTimelineState.toString = function () { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + }; + SlotDislayIndexTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + }; + return SlotDislayIndexTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotDislayIndexTimelineState = SlotDislayIndexTimelineState; + /** + * @internal + * @private + */ + var SlotColorTimelineState = (function (_super) { + __extends(SlotColorTimelineState, _super); + function SlotColorTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._delta = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._result = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + return _this; + } + SlotColorTimelineState.toString = function () { + return "[class dragonBones.SlotColorTimelineState]"; + }; + SlotColorTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._dirty = false; + }; + SlotColorTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var intArray = this._dragonBonesData.intArray; + var frameIntArray = this._dragonBonesData.frameIntArray; + var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + var colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { + var color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + }; + SlotColorTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + }; + SlotColorTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotColorTimelineState.prototype.update = function (passedTime) { + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._colorTransform; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + this.slot._colorDirty = true; + } + } + } + }; + return SlotColorTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotColorTimelineState = SlotColorTimelineState; + /** + * @internal + * @private + */ + var SlotFFDTimelineState = (function (_super) { + __extends(SlotFFDTimelineState, _super); + function SlotFFDTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = []; + _this._delta = []; + _this._result = []; + return _this; + } + SlotFFDTimelineState.toString = function () { + return "[class dragonBones.SlotFFDTimelineState]"; + }; + SlotFFDTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.meshOffset = 0; + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + }; + SlotFFDTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var isTween = this._tweenState === 2 /* Always */; + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + if (isTween) { + var nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + }; + SlotFFDTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + for (var i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + }; + SlotFFDTimelineState.prototype.init = function (armature, animationState, timelineData) { + _super.prototype.init.call(this, armature, animationState, timelineData); + if (this._timelineData !== null) { + var frameIntArray = this._dragonBonesData.frameIntArray; + var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + 3 /* TimelineFrameValueCount */]; + this.meshOffset = frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */]; + this._ffdCount = frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */]; + this._valueCount = frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */]; + this._valueOffset = frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */]; + this._frameFloatOffset = frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + }; + SlotFFDTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotFFDTimelineState.prototype.update = function (passedTime) { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._ffdVertices; + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + this.slot._meshDirty = true; + } + } + } + }; + return SlotFFDTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotFFDTimelineState = SlotFFDTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EventObject = (function (_super) { + __extends(EventObject, _super); + function EventObject() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EventObject.toString = function () { + return "[class dragonBones.EventObject]"; + }; + /** + * @private + */ + EventObject.prototype._onClear = function () { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + }; + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.START = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.LOOP_COMPLETE = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.COMPLETE = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN_COMPLETE = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT_COMPLETE = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FRAME_EVENT = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.SOUND_EVENT = "soundEvent"; + return EventObject; + }(dragonBones.BaseObject)); + dragonBones.EventObject = EventObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DataParser = (function () { + function DataParser() { + } + DataParser._getArmatureType = function (value) { + switch (value.toLowerCase()) { + case "stage": + return 2 /* Stage */; + case "armature": + return 0 /* Armature */; + case "movieclip": + return 1 /* MovieClip */; + default: + return 0 /* Armature */; + } + }; + DataParser._getDisplayType = function (value) { + switch (value.toLowerCase()) { + case "image": + return 0 /* Image */; + case "mesh": + return 2 /* Mesh */; + case "armature": + return 1 /* Armature */; + case "boundingbox": + return 3 /* BoundingBox */; + default: + return 0 /* Image */; + } + }; + DataParser._getBoundingBoxType = function (value) { + switch (value.toLowerCase()) { + case "rectangle": + return 0 /* Rectangle */; + case "ellipse": + return 1 /* Ellipse */; + case "polygon": + return 2 /* Polygon */; + default: + return 0 /* Rectangle */; + } + }; + DataParser._getActionType = function (value) { + switch (value.toLowerCase()) { + case "play": + return 0 /* Play */; + case "frame": + return 10 /* Frame */; + case "sound": + return 11 /* Sound */; + default: + return 0 /* Play */; + } + }; + DataParser._getBlendMode = function (value) { + switch (value.toLowerCase()) { + case "normal": + return 0 /* Normal */; + case "add": + return 1 /* Add */; + case "alpha": + return 2 /* Alpha */; + case "darken": + return 3 /* Darken */; + case "difference": + return 4 /* Difference */; + case "erase": + return 5 /* Erase */; + case "hardlight": + return 6 /* HardLight */; + case "invert": + return 7 /* Invert */; + case "layer": + return 8 /* Layer */; + case "lighten": + return 9 /* Lighten */; + case "multiply": + return 10 /* Multiply */; + case "overlay": + return 11 /* Overlay */; + case "screen": + return 12 /* Screen */; + case "subtract": + return 13 /* Subtract */; + default: + return 0 /* Normal */; + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + DataParser.parseDragonBonesData = function (rawData) { + if (rawData instanceof ArrayBuffer) { + return dragonBones.BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + DataParser.parseTextureAtlasData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.warn("已废弃,请参考 @see"); + var textureAtlasData = {}; + var subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (var i = 0, len = subTextureList.length; i < len; i++) { + var subTextureObject = subTextureList[i]; + var subTextureName = subTextureObject[DataParser.NAME]; + var subTextureRegion = new dragonBones.Rectangle(); + var subTextureFrame = null; + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new dragonBones.Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + return textureAtlasData; + }; + DataParser.DATA_VERSION_2_3 = "2.3"; + DataParser.DATA_VERSION_3_0 = "3.0"; + DataParser.DATA_VERSION_4_0 = "4.0"; + DataParser.DATA_VERSION_4_5 = "4.5"; + DataParser.DATA_VERSION_5_0 = "5.0"; + DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0; + DataParser.DATA_VERSIONS = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + DataParser.TEXTURE_ATLAS = "textureAtlas"; + DataParser.SUB_TEXTURE = "SubTexture"; + DataParser.FORMAT = "format"; + DataParser.IMAGE_PATH = "imagePath"; + DataParser.WIDTH = "width"; + DataParser.HEIGHT = "height"; + DataParser.ROTATED = "rotated"; + DataParser.FRAME_X = "frameX"; + DataParser.FRAME_Y = "frameY"; + DataParser.FRAME_WIDTH = "frameWidth"; + DataParser.FRAME_HEIGHT = "frameHeight"; + DataParser.DRADON_BONES = "dragonBones"; + DataParser.USER_DATA = "userData"; + DataParser.ARMATURE = "armature"; + DataParser.BONE = "bone"; + DataParser.IK = "ik"; + DataParser.SLOT = "slot"; + DataParser.SKIN = "skin"; + DataParser.DISPLAY = "display"; + DataParser.ANIMATION = "animation"; + DataParser.Z_ORDER = "zOrder"; + DataParser.FFD = "ffd"; + DataParser.FRAME = "frame"; + DataParser.TRANSLATE_FRAME = "translateFrame"; + DataParser.ROTATE_FRAME = "rotateFrame"; + DataParser.SCALE_FRAME = "scaleFrame"; + DataParser.VISIBLE_FRAME = "visibleFrame"; + DataParser.DISPLAY_FRAME = "displayFrame"; + DataParser.COLOR_FRAME = "colorFrame"; + DataParser.DEFAULT_ACTIONS = "defaultActions"; + DataParser.ACTIONS = "actions"; + DataParser.EVENTS = "events"; + DataParser.INTS = "ints"; + DataParser.FLOATS = "floats"; + DataParser.STRINGS = "strings"; + DataParser.CANVAS = "canvas"; + DataParser.TRANSFORM = "transform"; + DataParser.PIVOT = "pivot"; + DataParser.AABB = "aabb"; + DataParser.COLOR = "color"; + DataParser.VERSION = "version"; + DataParser.COMPATIBLE_VERSION = "compatibleVersion"; + DataParser.FRAME_RATE = "frameRate"; + DataParser.TYPE = "type"; + DataParser.SUB_TYPE = "subType"; + DataParser.NAME = "name"; + DataParser.PARENT = "parent"; + DataParser.TARGET = "target"; + DataParser.SHARE = "share"; + DataParser.PATH = "path"; + DataParser.LENGTH = "length"; + DataParser.DISPLAY_INDEX = "displayIndex"; + DataParser.BLEND_MODE = "blendMode"; + DataParser.INHERIT_TRANSLATION = "inheritTranslation"; + DataParser.INHERIT_ROTATION = "inheritRotation"; + DataParser.INHERIT_SCALE = "inheritScale"; + DataParser.INHERIT_REFLECTION = "inheritReflection"; + DataParser.INHERIT_ANIMATION = "inheritAnimation"; + DataParser.INHERIT_FFD = "inheritFFD"; + DataParser.BEND_POSITIVE = "bendPositive"; + DataParser.CHAIN = "chain"; + DataParser.WEIGHT = "weight"; + DataParser.FADE_IN_TIME = "fadeInTime"; + DataParser.PLAY_TIMES = "playTimes"; + DataParser.SCALE = "scale"; + DataParser.OFFSET = "offset"; + DataParser.POSITION = "position"; + DataParser.DURATION = "duration"; + DataParser.TWEEN_TYPE = "tweenType"; + DataParser.TWEEN_EASING = "tweenEasing"; + DataParser.TWEEN_ROTATE = "tweenRotate"; + DataParser.TWEEN_SCALE = "tweenScale"; + DataParser.CURVE = "curve"; + DataParser.SOUND = "sound"; + DataParser.EVENT = "event"; + DataParser.ACTION = "action"; + DataParser.X = "x"; + DataParser.Y = "y"; + DataParser.SKEW_X = "skX"; + DataParser.SKEW_Y = "skY"; + DataParser.SCALE_X = "scX"; + DataParser.SCALE_Y = "scY"; + DataParser.VALUE = "value"; + DataParser.ROTATE = "rotate"; + DataParser.SKEW = "skew"; + DataParser.ALPHA_OFFSET = "aO"; + DataParser.RED_OFFSET = "rO"; + DataParser.GREEN_OFFSET = "gO"; + DataParser.BLUE_OFFSET = "bO"; + DataParser.ALPHA_MULTIPLIER = "aM"; + DataParser.RED_MULTIPLIER = "rM"; + DataParser.GREEN_MULTIPLIER = "gM"; + DataParser.BLUE_MULTIPLIER = "bM"; + DataParser.UVS = "uvs"; + DataParser.VERTICES = "vertices"; + DataParser.TRIANGLES = "triangles"; + DataParser.WEIGHTS = "weights"; + DataParser.SLOT_POSE = "slotPose"; + DataParser.BONE_POSE = "bonePose"; + DataParser.GOTO_AND_PLAY = "gotoAndPlay"; + DataParser.DEFAULT_NAME = "default"; + return DataParser; + }()); + dragonBones.DataParser = DataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ObjectDataParser = (function (_super) { + __extends(ObjectDataParser, _super); + function ObjectDataParser() { + /** + * @private + */ + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._intArrayJson = []; + _this._floatArrayJson = []; + _this._frameIntArrayJson = []; + _this._frameFloatArrayJson = []; + _this._frameArrayJson = []; + _this._timelineArrayJson = []; + _this._rawTextureAtlasIndex = 0; + _this._rawBones = []; + _this._data = null; // + _this._armature = null; // + _this._bone = null; // + _this._slot = null; // + _this._skin = null; // + _this._mesh = null; // + _this._animation = null; // + _this._timeline = null; // + _this._rawTextureAtlases = null; + _this._defalultColorOffset = -1; + _this._prevTweenRotate = 0; + _this._prevRotation = 0.0; + _this._helpMatrixA = new dragonBones.Matrix(); + _this._helpMatrixB = new dragonBones.Matrix(); + _this._helpTransform = new dragonBones.Transform(); + _this._helpColorTransform = new dragonBones.ColorTransform(); + _this._helpPoint = new dragonBones.Point(); + _this._helpArray = []; + _this._actionFrames = []; + _this._weightSlotPose = {}; + _this._weightBonePoses = {}; + _this._weightBoneIndices = {}; + _this._cacheBones = {}; + _this._meshs = {}; + _this._slotChildActions = {}; + return _this; + } + ObjectDataParser._getBoolean = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + default: + return true; + } + } + else { + return !!value; + } + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getNumber = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + return +value || 0; + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getString = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + return value; + } + return String(value); + } + return defaultValue; + }; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + ObjectDataParser.prototype._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) { + var l_t = 1.0 - t; + var powA = l_t * l_t; + var powB = t * t; + var kA = l_t * powA; + var kB = 3.0 * t * powA; + var kC = 3.0 * l_t * powB; + var kD = t * powB; + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + }; + /** + * @private + */ + ObjectDataParser.prototype._samplingEasingCurve = function (curve, samples) { + var curveCount = curve.length; + var stepIndex = -2; + for (var i = 0, l = samples.length; i < l; ++i) { + var t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { + stepIndex += 6; + } + var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + var x1 = isInCurve ? curve[stepIndex] : 0.0; + var y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + var x2 = curve[stepIndex + 2]; + var y2 = curve[stepIndex + 3]; + var x3 = curve[stepIndex + 4]; + var y3 = curve[stepIndex + 5]; + var x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + var y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + var lower = 0.0; + var higher = 1.0; + while (higher - lower > 0.0001) { + var percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + samples[i] = this._helpPoint.y; + } + }; + ObjectDataParser.prototype._sortActionFrame = function (a, b) { + return a.frameStart > b.frameStart ? 1 : -1; + }; + ObjectDataParser.prototype._parseActionDataInFrame = function (rawData, frameStart, bone, slot) { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, 11 /* Sound */, bone, slot); + } + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, 0 /* Play */, bone, slot); + } + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, 0 /* Play */, bone, slot); + } + }; + ObjectDataParser.prototype._mergeActionFrame = function (rawData, frameStart, type, bone, slot) { + var actionOffset = dragonBones.DragonBones.webAssembly ? this._armature.actions.size() : this._armature.actions.length; + var actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + var frame = null; + if (this._actionFrames.length === 0) { + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + for (var _i = 0, _a = this._actionFrames; _i < _a.length; _i++) { + var eachFrame = _a[_i]; + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + if (frame === null) { + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + for (var i = 0; i < actionCount; ++i) { + frame.actions.push(actionOffset + i); + } + }; + ObjectDataParser.prototype._parseCacheActionFrame = function (frame) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = frameArray.length; + var actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + 0 /* FramePosition */] = frame.frameStart; + frameArray[frameOffset + 0 /* FramePosition */ + 1] = actionCount; // Action count. + for (var i = 0; i < actionCount; ++i) { + frameArray[frameOffset + 0 /* FramePosition */ + 2 + i] = frame.actions[i]; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArmature = function (rawData, scale) { + // const armature = BaseObject.borrowObject(ArmatureData); + var armature = dragonBones.DragonBones.webAssembly ? new Module["ArmatureData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */); + } + if (armature.frameRate === 0) { + armature.frameRate = 24; + } + this._armature = armature; + if (ObjectDataParser.AABB in rawData) { + var rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + if (ObjectDataParser.CANVAS in rawData) { + var rawCanvas = rawData[ObjectDataParser.CANVAS]; + var canvas = dragonBones.BaseObject.borrowObject(dragonBones.CanvasData); + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + armature.canvas = canvas; + } + if (ObjectDataParser.BONE in rawData) { + var rawBones = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawBones_1 = rawBones; _i < rawBones_1.length; _i++) { + var rawBone = rawBones_1[_i]; + var parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + var bone = this._parseBone(rawBone); + if (parentName.length > 0) { + var parent_1 = armature.getBone(parentName); + if (parent_1 !== null) { + bone.parent = parent_1; + } + else { + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + if (bone.name in this._cacheBones) { + for (var _a = 0, _b = this._cacheBones[bone.name]; _a < _b.length; _a++) { + var child = _b[_a]; + child.parent = bone; + } + delete this._cacheBones[bone.name]; + } + armature.addBone(bone); + this._rawBones.push(bone); // Raw bone sort. + } + } + if (ObjectDataParser.IK in rawData) { + var rawIKS = rawData[ObjectDataParser.IK]; + for (var _c = 0, rawIKS_1 = rawIKS; _c < rawIKS_1.length; _c++) { + var rawIK = rawIKS_1[_c]; + this._parseIKConstraint(rawIK); + } + } + armature.sortBones(); + if (ObjectDataParser.SLOT in rawData) { + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _d = 0, rawSlots_1 = rawSlots; _d < rawSlots_1.length; _d++) { + var rawSlot = rawSlots_1[_d]; + armature.addSlot(this._parseSlot(rawSlot)); + } + } + if (ObjectDataParser.SKIN in rawData) { + var rawSkins = rawData[ObjectDataParser.SKIN]; + for (var _e = 0, rawSkins_1 = rawSkins; _e < rawSkins_1.length; _e++) { + var rawSkin = rawSkins_1[_e]; + armature.addSkin(this._parseSkin(rawSkin)); + } + } + if (ObjectDataParser.ANIMATION in rawData) { + var rawAnimations = rawData[ObjectDataParser.ANIMATION]; + for (var _f = 0, rawAnimations_1 = rawAnimations; _f < rawAnimations_1.length; _f++) { + var rawAnimation = rawAnimations_1[_f]; + var animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, 0 /* Play */, null, null); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, 0 /* Play */, null, null); + } + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? armature.defaultActions.size() : armature.defaultActions.length); ++i) { + var action = dragonBones.DragonBones.webAssembly ? armature.defaultActions.get(i) : armature.defaultActions[i]; + if (action.type === 0 /* Play */) { + var animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + // Clear helper. + this._rawBones.length = 0; + this._armature = null; + for (var k in this._meshs) { + delete this._meshs[k]; + } + for (var k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (var k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (var k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (var k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (var k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + return armature; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBone = function (rawData) { + // const bone = BaseObject.borrowObject(BoneData); + var bone = dragonBones.DragonBones.webAssembly ? new Module["BoneData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + } + return bone; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseIKConstraint = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + var target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + // const constraint = BaseObject.borrowObject(IKConstraintData); + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraintData"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + var chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (dragonBones.DragonBones.webAssembly) { + bone.constraints.push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlot = function (rawData) { + // const slot = BaseObject.borrowObject(SlotData); + var slot = dragonBones.DragonBones.webAssembly ? new Module["SlotData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = dragonBones.DragonBones.webAssembly ? this._armature.sortedSlots.size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")); // + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */); + } + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].createColor() : dragonBones.SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : dragonBones.SlotData.DEFAULT_COLOR; + } + if (ObjectDataParser.ACTIONS in rawData) { + var actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, 0 /* Play */, null, null); + } + return slot; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSkin = function (rawData) { + // const skin = BaseObject.borrowObject(SkinData); + var skin = dragonBones.DragonBones.webAssembly ? new Module["SkinData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _i = 0, rawSlots_2 = rawSlots; _i < rawSlots_2.length; _i++) { + var rawSlot = rawSlots_2[_i]; + var slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + if (ObjectDataParser.DISPLAY in rawSlot) { + var rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (var _a = 0, rawDisplays_1 = rawDisplays; _a < rawDisplays_1.length; _a++) { + var rawDisplay = rawDisplays_1[_a]; + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + this._slot = null; // + } + } + this._skin = null; // + } + return skin; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseDisplay = function (rawData) { + var display = null; + var name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + var path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + var type = 0 /* Image */; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + switch (type) { + case 0 /* Image */: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + var imageDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ImageDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + case 1 /* Armature */: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + var armatureDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, 0 /* Play */, null, null); + } + else if (this._slot.name in this._slotChildActions) { + var displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (var _i = 0, _a = this._slotChildActions[this._slot.name]; _i < _a.length; _i++) { + var action = _a[_i]; + if (dragonBones.DragonBones.webAssembly) { + armatureDisplay.actions.push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + delete this._slotChildActions[this._slot.name]; + } + } + break; + case 2 /* Mesh */: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + var meshDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["MeshDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + var shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + var shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + case 3 /* BoundingBox */: + var boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + var boundingBoxDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + return display; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePivot = function (rawData, display) { + if (ObjectDataParser.PIVOT in rawData) { + var rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseMesh = function (rawData, mesh) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var rawUVs = rawData[ObjectDataParser.UVS]; + var rawTriangles = rawData[ObjectDataParser.TRIANGLES]; + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + var vertexCount = Math.floor(rawVertices.length / 2); // uint + var triangleCount = Math.floor(rawTriangles.length / 3); // uint + var vertexOffset = floatArray.length; + var uvOffset = vertexOffset + vertexCount * 2; + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + 0 /* MeshVertexCount */] = vertexCount; + intArray[mesh.offset + 1 /* MeshTriangleCount */] = triangleCount; + intArray[mesh.offset + 2 /* MeshFloatOffset */] = vertexOffset; + for (var i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + 4 /* MeshVertexIndices */ + i] = rawTriangles[i]; + } + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + if (ObjectDataParser.WEIGHTS in rawData) { + var rawWeights = rawData[ObjectDataParser.WEIGHTS]; + var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE]; + var rawBonePoses = rawData[ObjectDataParser.BONE_POSE]; + var weightBoneIndices = new Array(); + var weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + var floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + 1 /* WeigthFloatOffset */] = floatOffset; + for (var i = 0; i < weightBoneCount; ++i) { + var rawBoneIndex = rawBonePoses[i * 7]; // uint + var bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + if (dragonBones.DragonBones.webAssembly) { + for (var j = 0; j < this._armature.sortedBones.size(); j++) { + if (this._armature.sortedBones.get(j) === bone) { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = j; + } + } + } + else { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = this._armature.sortedBones.indexOf(bone); + } + } + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + for (var i = 0, iW = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + var iD = i * 2; + var vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + var x = floatArray[vertexOffset + iD]; + var y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var rawBoneIndex = rawWeights[iW++]; // uint + var bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + mesh.weight = weight; + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoundingBox = function (rawData) { + var boundingBox = null; + var type = 0 /* Rectangle */; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + switch (type) { + case 0 /* Rectangle */: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.RectangleBoundingBoxData); + break; + case 1 /* Ellipse */: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.EllipseBoundingBoxData); + break; + case 2 /* Polygon */: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === 0 /* Rectangle */ || boundingBox.type === 1 /* Ellipse */) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + return boundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + for (var i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + var iN = i + 1; + var x = rawVertices[i]; + var y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + return polygonBoundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (dragonBones.DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + this._animation = animation; + if (ObjectDataParser.FRAME in rawData) { + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (var i = 0, frameStart = 0; i < keyFrameCount; ++i) { + var rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], 1 /* ZOrder */, false, false, 0, this._parseZOrderFrame); + } + if (ObjectDataParser.BONE in rawData) { + var rawTimelines = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawTimelines_1 = rawTimelines; _i < rawTimelines_1.length; _i++) { + var rawTimeline = rawTimelines_1[_i]; + this._parseBoneTimeline(rawTimeline); + } + } + if (ObjectDataParser.SLOT in rawData) { + var rawTimelines = rawData[ObjectDataParser.SLOT]; + for (var _a = 0, rawTimelines_2 = rawTimelines; _a < rawTimelines_2.length; _a++) { + var rawTimeline = rawTimelines_2[_a]; + this._parseSlotTimeline(rawTimeline); + } + } + if (ObjectDataParser.FFD in rawData) { + var rawTimelines = rawData[ObjectDataParser.FFD]; + for (var _b = 0, rawTimelines_3 = rawTimelines; _b < rawTimelines_3.length; _b++) { + var rawTimeline = rawTimelines_3[_b]; + var slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + var displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + this._slot = slot; + this._mesh = this._meshs[displayName]; + var timelineFFD = this._parseTimeline(rawTimeline, 22 /* SlotFFD */, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + this._slot = null; // + this._mesh = null; // + } + } + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + var timeline = this._animation.actionTimeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var keyFrameCount = this._actionFrames.length; + timeline.type = 0 /* Action */; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = 100; + timelineArray[timeline.offset + 1 /* TimelineOffset */] = 0; + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = 0; + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + this._actionFrames.length = 0; + } + this._animation = null; // + return animation; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTimeline = function (rawData, type, addIntOffset, addFloatOffset, frameValueCount, frameParser) { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntArrayLength = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + var frameFloatArrayLength = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + var timeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + 1 /* TimelineOffset */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + } + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + var frameIndices = this._data.frameIndices; + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneTimeline = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + var timeline = this._parseTimeline(rawData, 10 /* BoneAll */, false, true, 6, this._parseBoneFrame); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + this._bone = null; // + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotTimeline = function (rawData) { + var slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + this._slot = slot; + var displayIndexTimeline = this._parseTimeline(rawData, 20 /* SlotDisplay */, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + var colorTimeline = this._parseTimeline(rawData, 21 /* SlotColor */, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseFrame = function (rawData, frameStart, frameCount, frameArray) { + rawData; + frameCount; + var frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + 0 /* FramePosition */] = frameStart; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTweenFrame = function (rawData, frameStart, frameCount, frameArray) { + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + var sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + 1 /* FrameTweenType */] = 2 /* Curve */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = sampleCount; + for (var i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + 3 /* FrameCurveSamples */ + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + var noTween = -2.0; + var tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 1 /* Line */; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 3 /* QuadIn */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 4 /* QuadOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 5 /* QuadInOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (ObjectDataParser.Z_ORDER in rawData) { + var rawZOrder = rawData[ObjectDataParser.Z_ORDER]; + if (rawZOrder.length > 0) { + var slotCount = this._armature.sortedSlots.length; + var unchanged = new Array(slotCount - rawZOrder.length / 2); + var zOrders = new Array(slotCount); + for (var i_1 = 0; i_1 < slotCount; ++i_1) { + zOrders[i_1] = -1; + } + var originalIndex = 0; + var unchangedIndex = 0; + for (var i_2 = 0, l = rawZOrder.length; i_2 < l; i_2 += 2) { + var slotIndex = rawZOrder[i_2]; + var zOrderOffset = rawZOrder[i_2 + 1]; + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + var i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + return frameOffset; + } + } + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) { + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + // Modify rotation. + var rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + dragonBones.Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + rotation = this._prevRotation + rotation - this._prevRotation + dragonBones.Transform.PI_D * this._prevTweenRotate; + } + } + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + var frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotDisplayIndexFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotColorFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + var rawColor = rawData[ObjectDataParser.COLOR]; + for (var k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + colorOffset = this._defalultColorOffset; + } + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotFFDFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameFloatOffset = frameFloatArray.length; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] : null; + var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + var vertexCount = intArray[this._mesh.offset + 0 /* MeshVertexCount */]; + var x = 0.0; + var y = 0.0; + var iB = 0; + var iV = 0; + if (this._mesh.weight !== null) { + var rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + 2 /* WeigthBoneIndices */ + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + for (var i = 0; i < vertexCount * 2; i += 2) { + if (rawVertices === null) { + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + if (this._mesh.weight !== null) { + var rawBonePoses = this._weightBonePoses[this._mesh.name]; + var weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + var vertexBoneCount = intArray[iB++]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._mesh.weight.bones[boneIndex]; + var rawBoneIndex = this._rawBones.indexOf(bone); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + if (frameStart === 0) { + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */] = this._mesh.offset; + frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */] = 0; + frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] = frameFloatOffset; + timelineArray[this._timeline.offset + 3 /* TimelineFrameValueCount */] = frameIntOffset - this._animation.frameIntOffset; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseActionData = function (rawData, actions, type, bone, slot) { + var actionCount = 0; + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (var _i = 0, rawData_1 = rawData; _i < rawData_1.length; _i++) { + var rawAction = rawData_1[_i]; + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = 0 /* Play */; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + if (ObjectDataParser.BONE in rawAction) { + var boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + if (ObjectDataParser.SLOT in rawAction) { + var slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawInts = rawAction[ObjectDataParser.INTS]; + for (var _a = 0, rawInts_1 = rawInts; _a < rawInts_1.length; _a++) { + var rawValue = rawInts_1[_a]; + dragonBones.DragonBones.webAssembly ? action.data.ints.push_back(rawValue) : action.data.ints.push(rawValue); + } + } + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawFloats = rawAction[ObjectDataParser.FLOATS]; + for (var _b = 0, rawFloats_1 = rawFloats; _b < rawFloats_1.length; _b++) { + var rawValue = rawFloats_1[_b]; + dragonBones.DragonBones.webAssembly ? action.data.floats.push_back(rawValue) : action.data.floats.push(rawValue); + } + } + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawStrings = rawAction[ObjectDataParser.STRINGS]; + for (var _c = 0, rawStrings_1 = rawStrings; _c < rawStrings_1.length; _c++) { + var rawValue = rawStrings_1[_c]; + dragonBones.DragonBones.webAssembly ? action.data.strings.push_back(rawValue) : action.data.strings.push(rawValue); + } + } + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + } + return actionCount; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTransform = function (rawData, transform, scale) { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * dragonBones.Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.Transform.DEG_RAD) - transform.rotation; + } + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseColorTransform = function (rawData, color) { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArray = function (rawData) { + rawData; + if (dragonBones.DragonBones.webAssembly) { + return; + } + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseWASMArray = function () { + var intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (var i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (var i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (var i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (var i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (var i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (var i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined); + var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) { + // const data = BaseObject.borrowObject(DragonBonesData); + var data = dragonBones.DragonBones.webAssembly ? new Module["DragonBonesData"]() : dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + if (data.frameRate === 0) { + data.frameRate = 24; + } + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + this._parseArray(rawData); + var rawArmatures = rawData[ObjectDataParser.ARMATURE]; + for (var _i = 0, rawArmatures_1 = rawArmatures; _i < rawArmatures_1.length; _i++) { + var rawArmature = rawArmatures_1[_i]; + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + this._data = null; + } + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + return null; + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) { + if (scale === void 0) { scale = 0.0; } + console.assert(rawData !== undefined); + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + var rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + return true; + } + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + if (scale > 0.0) { + textureAtlasData.scale = scale; + } + else { + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + scale = 1.0 / scale; // + if (ObjectDataParser.SUB_TEXTURE in rawData) { + var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE]; + for (var i = 0, l = rawTextures.length; i < l; ++i) { + var rawTexture = rawTextures[i]; + var textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = dragonBones.DragonBones.webAssembly ? Module["TextureData"].createRectangle() : dragonBones.TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + textureAtlasData.addTexture(textureData); + } + } + return true; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + ObjectDataParser.getInstance = function () { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + return ObjectDataParser._objectDataParserInstance; + }; + /** + * @private + */ + ObjectDataParser._objectDataParserInstance = null; + return ObjectDataParser; + }(dragonBones.DataParser)); + dragonBones.ObjectDataParser = ObjectDataParser; + var ActionFrame = (function () { + function ActionFrame() { + this.frameStart = 0; + this.actions = []; + } + return ActionFrame; + }()); +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BinaryDataParser = (function (_super) { + __extends(BinaryDataParser, _super); + function BinaryDataParser() { + return _super !== null && _super.apply(this, arguments) || this; + } + BinaryDataParser.prototype._inRange = function (a, min, max) { + return min <= a && a <= max; + }; + BinaryDataParser.prototype._decodeUTF8 = function (data) { + var EOF_byte = -1; + var EOF_code_point = -1; + var FATAL_POINT = 0xFFFD; + var pos = 0; + var result = ""; + var code_point; + var utf8_code_point = 0; + var utf8_bytes_needed = 0; + var utf8_bytes_seen = 0; + var utf8_lower_boundary = 0; + while (data.length > pos) { + var _byte = data[pos++]; + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + var cp = utf8_code_point; + var lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) + result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + return result; + }; + BinaryDataParser.prototype._getUTF16Key = function (value) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + return value; + }; + BinaryDataParser.prototype._parseBinaryTimeline = function (type, offset, timelineData) { + if (timelineData === void 0) { timelineData = null; } + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + var timeline = timelineData !== null ? timelineData : (dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData)); + timeline.type = type; + timeline.offset = offset; + this._timeline = timeline; + var keyFrameCount = this._timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK + 1]] - frameStart; + } + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseMesh = function (rawData, mesh) { + mesh.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + var weightOffset = this._intArray[mesh.offset + 3 /* MeshWeightOffset */]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + var vertexCount = this._intArray[mesh.offset + 0 /* MeshVertexCount */]; + var boneCount = this._intArray[weightOffset + 0 /* WeigthBoneCount */]; + weight.offset = weightOffset; + if (dragonBones.DragonBones.webAssembly) { + weight.bones.resize(boneCount, null); + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones.set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + var boneIndicesOffset = weightOffset + 2 /* WeigthBoneIndices */ + boneCount; + for (var i = 0, l = vertexCount; i < l; ++i) { + var vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + mesh.weight = weight; + } + }; + /** + * @private + */ + BinaryDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + return polygonBoundingBox; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.DURATION, 1), 1); + animation.playTimes = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.SCALE, 1.0); + animation.name = dragonBones.ObjectDataParser._getString(rawData, dragonBones.ObjectDataParser.NAME, dragonBones.ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = dragonBones.ObjectDataParser.DEFAULT_NAME; + } + // Offsets. + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + this._animation = animation; + if (dragonBones.ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(0 /* Action */, rawData[dragonBones.ObjectDataParser.ACTION]); + } + if (dragonBones.ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(1 /* ZOrder */, rawData[dragonBones.ObjectDataParser.Z_ORDER]); + } + if (dragonBones.ObjectDataParser.BONE in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.BONE]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + if (dragonBones.ObjectDataParser.SLOT in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.SLOT]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + this._animation = null; + return animation; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseArray = function (rawData) { + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + if (dragonBones.DragonBones.webAssembly) { + var tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + var tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + var tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + var tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + var intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + var floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + var frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + var frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + var frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + var timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + for (var i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + for (var i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + for (var i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + for (var i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + for (var i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + for (var i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + }; + /** + * @inheritDoc + */ + BinaryDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + var tag = new Uint8Array(rawData, 0, 8); + if (tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0)) { + console.assert(false, "Nonsupport data."); + return null; + } + var headerLength = new Uint32Array(rawData, 8, 1)[0]; + var headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + var headerString = this._decodeUTF8(headerBytes); + var header = JSON.parse(headerString); + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + return _super.prototype.parseDragonBonesData.call(this, header, scale); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + BinaryDataParser.getInstance = function () { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + return BinaryDataParser._binaryDataParserInstance; + }; + /** + * @private + */ + BinaryDataParser._binaryDataParserInstance = null; + return BinaryDataParser; + }(dragonBones.ObjectDataParser)); + dragonBones.BinaryDataParser = BinaryDataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BuildArmaturePackage = (function () { + function BuildArmaturePackage() { + this.dataName = ""; + this.textureAtlasName = ""; + this.skin = null; + } + return BuildArmaturePackage; + }()); + dragonBones.BuildArmaturePackage = BuildArmaturePackage; + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var BaseFactory = (function () { + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + function BaseFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + this.autoSearch = false; + /** + * @private + */ + this._dragonBonesDataMap = {}; + /** + * @private + */ + this._textureAtlasDataMap = {}; + /** + * @private + */ + this._dragonBones = null; + /** + * @private + */ + this._dataParser = null; + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new dragonBones.ObjectDataParser(); + } + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new dragonBones.BinaryDataParser(); + } + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + BaseFactory.prototype._isSupportMesh = function () { + return true; + }; + /** + * @private + */ + BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) { + if (textureAtlasName in this._textureAtlasDataMap) { + for (var _i = 0, _a = this._textureAtlasDataMap[textureAtlasName]; _i < _a.length; _i++) { + var textureAtlasData = _a[_i]; + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + if (this.autoSearch) { + for (var k in this._textureAtlasDataMap) { + for (var _b = 0, _c = this._textureAtlasDataMap[k]; _b < _c.length; _b++) { + var textureAtlasData = _c[_b]; + if (textureAtlasData.autoSearch) { + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + return null; + }; + /** + * @private + */ + BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) { + var dragonBonesData = null; + var armatureData = null; + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { + for (var k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (var k in this._dragonBonesDataMap) { + var skinDragonBonesData = this._dragonBonesDataMap[k]; + var skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + return true; + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype._buildBones = function (dataPackage, armature) { + var bones = dataPackage.armature.sortedBones; + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? bones.size() : bones.length); ++i) { + var boneData = dragonBones.DragonBones.webAssembly ? bones.get(i) : bones[i]; + var bone = dragonBones.DragonBones.webAssembly ? new Module["Bone"]() : dragonBones.BaseObject.borrowObject(dragonBones.Bone); + bone.init(boneData); + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + var constraints = boneData.constraints; + for (var j = 0; j < (dragonBones.DragonBones.webAssembly ? constraints.size() : constraints.length); ++j) { + var constraintData = dragonBones.DragonBones.webAssembly ? constraints.get(j) : constraints[j]; + var target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + // TODO more constraint type. + var ikConstraintData = constraintData; + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraint"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraint); + var root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + }; + /** + * @private + */ + BaseFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var skinSlots = {}; + for (var k in defaultSkin.displays) { + var displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + if (currentSkin !== defaultSkin) { + for (var k in currentSkin.displays) { + var displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + for (var _i = 0, _a = dataPackage.armature.sortedSlots; _i < _a.length; _i++) { + var slotData = _a[_i]; + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Array(); + for (var _b = 0, displays_1 = displays; _b < displays_1.length; _b++) { + var displayData = displays_1[_b]; + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + BaseFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_2 = actions; _i < actions_2.length; _i++) { + var action = actions_2[_i]; + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * @private + */ + BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + for (var i = 0, l = displayList.length; i < l; ++i) { + if (!displayList[i]) { + displayList[i] = null; + } + } + } + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.displayList = displayList; + }; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 1.0; } + var dragonBonesData = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + while (true) { + var textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + return dragonBonesData; + }; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + var textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + return textureAtlasData; + }; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.updateTextureAtlasData = function (name, textureAtlases) { + var textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (var i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + }; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getDragonBonesData = function (name) { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + }; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addDragonBonesData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + this._dragonBonesDataMap[name] = data; + }; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + delete this._dragonBonesDataMap[name]; + } + }; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getTextureAtlasData = function (name) { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + }; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addTextureAtlasData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + var textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + }; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._textureAtlasDataMap) { + var textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (var _i = 0, textureAtlasDataList_1 = textureAtlasDataList; _i < textureAtlasDataList_1.length; _i++) { + var textureAtlasData = textureAtlasDataList_1[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[name]; + } + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.getArmatureData = function (name, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = ""; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + return dataPackage.armature; + }; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.clear = function (disposeData) { + if (disposeData === void 0) { disposeData = true; } + for (var k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + delete this._dragonBonesDataMap[k]; + } + for (var k in this._textureAtlasDataMap) { + if (disposeData) { + var textureAtlasDataList = this._textureAtlasDataMap[k]; + for (var _i = 0, textureAtlasDataList_2 = textureAtlasDataList; _i < textureAtlasDataList_2.length; _i++) { + var textureAtlasData = textureAtlasDataList_2[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[k]; + } + }; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + var armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + return armature; + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + for (var _i = 0, displays_2 = displays; _i < displays_2.length; _i++) { + var display = displays_2[_i]; + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) { + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + var displayIndex = 0; + for (var _i = 0, displays_3 = displays; _i < displays_3.length; _i++) { + var displayData = displays_3[_i]; + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + }; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + for (var _i = 0, _a = armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays[slot.name]; + var displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (var i = 0, l = displays.length; i < l; ++i) { + var displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + slot.displayList = displayList; + } + }; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) { + if (fromSkinName === void 0) { fromSkinName = null; } + if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; } + if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; } + var dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + var fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + var animations = {}; + for (var animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + for (var animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + toArmature.animation.animations = animations; + } + if (dataPackage.skin) { + var slots = toArmature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var toSlot = slots[i]; + var toSlotDisplayList = toSlot.displayList; + for (var j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + var toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof dragonBones.Armature) { + var displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + var fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === 1 /* Armature */) { + this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + return true; + } + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype.getAllDragonBonesData = function () { + return this._dragonBonesDataMap; + }; + /** + * @private + */ + BaseFactory.prototype.getAllTextureAtlasData = function () { + return this._textureAtlasDataMap; + }; + /** + * @private + */ + BaseFactory._objectParser = null; + /** + * @private + */ + BaseFactory._binaryParser = null; + return BaseFactory; + }()); + dragonBones.BaseFactory = BaseFactory; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretTextureAtlasData = (function (_super) { + __extends(EgretTextureAtlasData, _super); + function EgretTextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._renderTexture = null; // Initial value. + return _this; + } + EgretTextureAtlasData.toString = function () { + return "[class dragonBones.EgretTextureAtlasData]"; + }; + /** + * @private + */ + EgretTextureAtlasData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this._renderTexture !== null) { + //this.texture.dispose(); + } + this._renderTexture = null; + }; + /** + * @private + */ + EgretTextureAtlasData.prototype.createTexture = function () { + return dragonBones.BaseObject.borrowObject(EgretTextureData); + }; + Object.defineProperty(EgretTextureAtlasData.prototype, "renderTexture", { + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._renderTexture; + }, + set: function (value) { + if (this._renderTexture === value) { + return; + } + this._renderTexture = value; + if (this._renderTexture !== null) { + var bitmapData = this._renderTexture.bitmapData; + var textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + var textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + for (var k in this.textures) { + var textureData = this.textures[k]; + var subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + var subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + if (textureData.renderTexture === null) { + textureData.renderTexture = new egret.Texture(); + if (textureData.rotated) { + textureData.renderTexture.$initData(textureData.region.x, textureData.region.y, subTextureHeight, subTextureWidth, 0, 0, subTextureHeight, subTextureWidth, textureAtlasWidth, textureAtlasHeight, textureData.rotated); + } + else { + textureData.renderTexture.$initData(textureData.region.x, textureData.region.y, subTextureWidth, subTextureHeight, 0, 0, subTextureWidth, subTextureHeight, textureAtlasWidth, textureAtlasHeight); + } + } + textureData.renderTexture._bitmapData = bitmapData; + } + } + else { + for (var k in this.textures) { + var textureData = this.textures[k]; + textureData.renderTexture = null; + } + } + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + EgretTextureAtlasData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + Object.defineProperty(EgretTextureAtlasData.prototype, "texture", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + get: function () { + return this.renderTexture; + }, + enumerable: true, + configurable: true + }); + return EgretTextureAtlasData; + }(dragonBones.TextureAtlasData)); + dragonBones.EgretTextureAtlasData = EgretTextureAtlasData; + /** + * @private + */ + var EgretTextureData = (function (_super) { + __extends(EgretTextureData, _super); + function EgretTextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.renderTexture = null; // Initial value. + return _this; + } + EgretTextureData.toString = function () { + return "[class dragonBones.EgretTextureData]"; + }; + EgretTextureData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + this.renderTexture = null; + }; + return EgretTextureData; + }(dragonBones.TextureData)); + dragonBones.EgretTextureData = EgretTextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EgretEvent = (function (_super) { + __extends(EgretEvent, _super); + function EgretEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(EgretEvent.prototype, "eventObject", { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationName", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + var animationState = this.eventObject.animationState; + return animationState !== null ? animationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "armature", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + get: function () { + return this.eventObject.armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "bone", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + get: function () { + return this.eventObject.bone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + get: function () { + return this.eventObject.slot; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationState", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + return this.eventObject.animationState; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "frameLabel", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "sound", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "movementID", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationName + */ + get: function () { + return this.animationName; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + EgretEvent.START = dragonBones.EventObject.START; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + EgretEvent.LOOP_COMPLETE = dragonBones.EventObject.LOOP_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + EgretEvent.COMPLETE = dragonBones.EventObject.COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + EgretEvent.FADE_IN = dragonBones.EventObject.FADE_IN; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + EgretEvent.FADE_IN_COMPLETE = dragonBones.EventObject.FADE_IN_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + EgretEvent.FADE_OUT = dragonBones.EventObject.FADE_OUT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + EgretEvent.FADE_OUT_COMPLETE = dragonBones.EventObject.FADE_OUT_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND_EVENT = dragonBones.EventObject.SOUND_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.ANIMATION_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.BONE_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.MOVEMENT_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND = dragonBones.EventObject.SOUND_EVENT; + return EgretEvent; + }(egret.Event)); + dragonBones.EgretEvent = EgretEvent; + /** + * @inheritDoc + */ + var EgretArmatureDisplay = (function (_super) { + __extends(EgretArmatureDisplay, _super); + function EgretArmatureDisplay() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this._batchEnabled = true; + _this._disposeProxy = false; + _this._armature = null; // + _this._debugDrawer = null; + return _this; + } + EgretArmatureDisplay._cleanBeforeRender = function () { }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.init = function (armature) { + this._armature = armature; + // + this.$renderNode = new egret.sys.GroupNode(); + this.$renderNode.cleanBeforeRender = EgretArmatureDisplay._cleanBeforeRender; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.clear = function () { + this._disposeProxy = false; + this._armature = null; + this._debugDrawer = null; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.dispose = function (disposeProxy) { + if (disposeProxy === void 0) { disposeProxy = true; } + this._disposeProxy = disposeProxy; + if (this._armature !== null) { + this._armature.dispose(); + this._armature = null; + } + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.debugUpdate = function (isEnabled) { + if (isEnabled) { + if (this._debugDrawer === null) { + this._debugDrawer = new egret.Sprite(); + } + this.addChild(this._debugDrawer); + this._debugDrawer.graphics.clear(); + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var boneLength = bone.boneData.length; + var startX = bone.globalTransformMatrix.tx; + var startY = bone.globalTransformMatrix.ty; + var endX = startX + bone.globalTransformMatrix.a * boneLength; + var endY = startY + bone.globalTransformMatrix.b * boneLength; + this._debugDrawer.graphics.lineStyle(2.0, 0x00FFFF, 0.7); + this._debugDrawer.graphics.moveTo(startX, startY); + this._debugDrawer.graphics.lineTo(endX, endY); + this._debugDrawer.graphics.lineStyle(0.0, 0, 0.0); + this._debugDrawer.graphics.beginFill(0x00FFFF, 0.7); + this._debugDrawer.graphics.drawCircle(startX, startY, 3.0); + this._debugDrawer.graphics.endFill(); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var boundingBoxData = slot.boundingBoxData; + if (boundingBoxData !== null) { + var child = this._debugDrawer.getChildByName(slot.name); + if (child === null) { + child = new egret.Shape(); + child.name = slot.name; + this._debugDrawer.addChild(child); + } + child.graphics.clear(); + child.graphics.beginFill(boundingBoxData.color ? boundingBoxData.color : 0xFF00FF, 0.3); + switch (boundingBoxData.type) { + case 0 /* Rectangle */: + child.graphics.drawRect(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 1 /* Ellipse */: + child.graphics.drawEllipse(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 2 /* Polygon */: + var polygon = boundingBoxData; + var vertices = polygon.vertices; + for (var j = 0; j < polygon.count; j += 2) { + if (j === 0) { + child.graphics.moveTo(vertices[polygon.offset + j], vertices[polygon.offset + j + 1]); + } + else { + child.graphics.lineTo(vertices[polygon.offset + j], vertices[polygon.offset + j + 1]); + } + } + break; + default: + break; + } + child.graphics.endFill(); + slot.updateTransformAndMatrix(); + slot.updateGlobalTransform(); + child.$setMatrix(slot.globalTransformMatrix, true); + } + else { + var child = this._debugDrawer.getChildByName(slot.name); + if (child !== null) { + this._debugDrawer.removeChild(child); + } + } + } + } + else if (this._debugDrawer !== null && this._debugDrawer.parent === this) { + this.removeChild(this._debugDrawer); + } + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype._dispatchEvent = function (type, eventObject) { + var event = egret.Event.create(EgretEvent, type); + event.data = eventObject; + _super.prototype.dispatchEvent.call(this, event); + egret.Event.release(event); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.hasEvent = function (type) { + return this.hasEventListener(type); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.addEvent = function (type, listener, target) { + this.addEventListener(type, listener, target); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.removeEvent = function (type, listener, target) { + this.removeEventListener(type, listener, target); + }; + /** + * 关闭批次渲染。(批次渲染处于性能考虑,不会更新渲染对象的边界属性,这样无法正确获得渲染对象的绘制区域,如果需要使用这些属性,可以关闭批次渲染) + * @version DragonBones 5.1 + * @language zh_CN + */ + EgretArmatureDisplay.prototype.disableBatch = function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + // (slot as EgretSlot).transformUpdateEnabled = true; + var display = (slot.rawDisplay || slot.meshDisplay); + var node = display.$renderNode; + // Transform. + if (node.matrix) { + display.$setMatrix(slot.globalTransformMatrix, false); + } + // ZOrder. + this.addChild(display); + } + this._batchEnabled = false; + this.$renderNode.cleanBeforeRender = null; + this.$renderNode = null; + }; + Object.defineProperty(EgretArmatureDisplay.prototype, "armature", { + /** + * @inheritDoc + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretArmatureDisplay.prototype, "animation", { + /** + * @inheritDoc + */ + get: function () { + return this._armature.animation; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + EgretArmatureDisplay.prototype.advanceTimeBySelf = function (on) { + if (on) { + this._armature.clock = dragonBones.EgretFactory.clock; + } + else { + this._armature.clock = null; + } + }; + return EgretArmatureDisplay; + }(egret.DisplayObjectContainer)); + dragonBones.EgretArmatureDisplay = EgretArmatureDisplay; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var Event = (function (_super) { + __extends(Event, _super); + function Event() { + return _super !== null && _super.apply(this, arguments) || this; + } + return Event; + }(EgretEvent)); + dragonBones.Event = Event; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var ArmatureEvent = (function (_super) { + __extends(ArmatureEvent, _super); + function ArmatureEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return ArmatureEvent; + }(EgretEvent)); + dragonBones.ArmatureEvent = ArmatureEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var AnimationEvent = (function (_super) { + __extends(AnimationEvent, _super); + function AnimationEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return AnimationEvent; + }(EgretEvent)); + dragonBones.AnimationEvent = AnimationEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var FrameEvent = (function (_super) { + __extends(FrameEvent, _super); + function FrameEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return FrameEvent; + }(EgretEvent)); + dragonBones.FrameEvent = FrameEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var SoundEvent = (function (_super) { + __extends(SoundEvent, _super); + function SoundEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return SoundEvent; + }(EgretEvent)); + dragonBones.SoundEvent = SoundEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFacory#parseTextureAtlasData() + */ + var EgretTextureAtlas = (function (_super) { + __extends(EgretTextureAtlas, _super); + function EgretTextureAtlas(texture, rawData, scale) { + if (scale === void 0) { scale = 1; } + var _this = _super.call(this) || this; + console.warn("已废弃,请参考 @see"); + _this._onClear(); + dragonBones.ObjectDataParser.getInstance().parseTextureAtlasData(rawData, _this, scale); + _this.renderTexture = texture; + return _this; + } + /** + * @private + */ + EgretTextureAtlas.toString = function () { + return "[class dragonBones.EgretTextureAtlas]"; + }; + return EgretTextureAtlas; + }(dragonBones.EgretTextureAtlasData)); + dragonBones.EgretTextureAtlas = EgretTextureAtlas; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + var EgretSheetAtlas = (function (_super) { + __extends(EgretSheetAtlas, _super); + function EgretSheetAtlas() { + return _super !== null && _super.apply(this, arguments) || this; + } + return EgretSheetAtlas; + }(EgretTextureAtlas)); + dragonBones.EgretSheetAtlas = EgretSheetAtlas; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + var SoundEventManager = (function () { + function SoundEventManager() { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + SoundEventManager.getInstance = function () { + console.warn("已废弃,请参考 @see"); + return dragonBones.EgretFactory.factory.soundEventManager; + }; + return SoundEventManager; + }()); + dragonBones.SoundEventManager = SoundEventManager; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + var AnimationCacheManager = (function () { + function AnimationCacheManager() { + console.warn("已废弃,请参考 @see"); + } + return AnimationCacheManager; + }()); + dragonBones.AnimationCacheManager = AnimationCacheManager; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretSlot = (function (_super) { + __extends(EgretSlot, _super); + function EgretSlot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.transformUpdateEnabled = false; + _this._armatureDisplay = null; + _this._renderDisplay = null; + _this._colorFilter = null; + return _this; + } + EgretSlot.toString = function () { + return "[class dragonBones.EgretSlot]"; + }; + /** + * @private + */ + EgretSlot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._armatureDisplay = null; // + this._renderDisplay = null; // + this._colorFilter = null; + }; + /** + * @private + */ + EgretSlot.prototype._initDisplay = function (value) { + value; + }; + /** + * @private + */ + EgretSlot.prototype._disposeDisplay = function (value) { + value; + }; + /** + * @private + */ + EgretSlot.prototype._onUpdateDisplay = function () { + this._armatureDisplay = this._armature.display; + this._renderDisplay = (this._display !== null ? this._display : this._rawDisplay); + if (this._armatureDisplay._batchEnabled && this._renderDisplay !== this._rawDisplay && this._renderDisplay !== this._meshDisplay) { + this._armatureDisplay.disableBatch(); + } + if (this._armatureDisplay._batchEnabled) { + var node = this._renderDisplay.$renderNode; + if (!node.matrix) { + node.matrix = new egret.Matrix(); + } + } + }; + /** + * @private + */ + EgretSlot.prototype._addDisplay = function () { + if (this._armatureDisplay._batchEnabled) { + this._armatureDisplay.$renderNode.addNode(this._renderDisplay.$renderNode); + } + else { + this._armatureDisplay.addChild(this._renderDisplay); + } + }; + /** + * @private + */ + EgretSlot.prototype._replaceDisplay = function (value) { + var prevDisplay = value; + if (this._armatureDisplay._batchEnabled) { + var nodes = this._armatureDisplay.$renderNode.drawData; + nodes[nodes.indexOf(value.$renderNode)] = this._renderDisplay.$renderNode; + } + else { + this._armatureDisplay.addChild(this._renderDisplay); + this._armatureDisplay.swapChildren(this._renderDisplay, prevDisplay); + this._armatureDisplay.removeChild(prevDisplay); + } + }; + /** + * @private + */ + EgretSlot.prototype._removeDisplay = function () { + if (this._armatureDisplay._batchEnabled) { + var nodes = this._armatureDisplay.$renderNode.drawData; + nodes.splice(nodes.indexOf(this._renderDisplay.$renderNode), 1); + } + else { + this._renderDisplay.parent.removeChild(this._renderDisplay); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateZOrder = function () { + if (this._armatureDisplay._batchEnabled) { + var nodes = this._armatureDisplay.$renderNode.drawData; + nodes[this._zOrder] = this._renderDisplay.$renderNode; + } + else { + var index = this._armatureDisplay.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + this._armatureDisplay.addChildAt(this._renderDisplay, this._zOrder); + } + }; + /** + * @internal + * @private + */ + EgretSlot.prototype._updateVisible = function () { + if (this._armatureDisplay._batchEnabled) { + var node = this._renderDisplay.$renderNode; + node.alpha = this._parent.visible ? 1.0 : 0.0; + } + else { + this._renderDisplay.visible = this._parent.visible; + } + }; + /** + * @private + */ + EgretSlot.prototype._updateBlendMode = function () { + switch (this._blendMode) { + case 0 /* Normal */: + this._renderDisplay.blendMode = egret.BlendMode.NORMAL; + break; + case 1 /* Add */: + this._renderDisplay.blendMode = egret.BlendMode.ADD; + break; + case 5 /* Erase */: + this._renderDisplay.blendMode = egret.BlendMode.ERASE; + break; + default: + break; + } + if (this._armatureDisplay._batchEnabled) { + var node = this._renderDisplay.$renderNode; + node.blendMode = egret.sys.blendModeToNumber(this._renderDisplay.blendMode); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateColor = function () { + if (this._colorTransform.redMultiplier !== 1.0 || + this._colorTransform.greenMultiplier !== 1.0 || + this._colorTransform.blueMultiplier !== 1.0 || + this._colorTransform.redOffset !== 0 || + this._colorTransform.greenOffset !== 0 || + this._colorTransform.blueOffset !== 0 || + this._colorTransform.alphaOffset !== 0) { + if (this._colorFilter === null) { + this._colorFilter = new egret.ColorMatrixFilter(); + } + var colorMatrix = this._colorFilter.matrix; + colorMatrix[0] = this._colorTransform.redMultiplier; + colorMatrix[6] = this._colorTransform.greenMultiplier; + colorMatrix[12] = this._colorTransform.blueMultiplier; + colorMatrix[18] = this._colorTransform.alphaMultiplier; + colorMatrix[4] = this._colorTransform.redOffset; + colorMatrix[9] = this._colorTransform.greenOffset; + colorMatrix[14] = this._colorTransform.blueOffset; + colorMatrix[19] = this._colorTransform.alphaOffset; + this._colorFilter.matrix = colorMatrix; + if (this._armatureDisplay._batchEnabled) { + var node = this._renderDisplay.$renderNode; + node.filter = this._colorFilter; + node.alpha = 1.0; + } + var filters = this._renderDisplay.filters; + if (!filters) { + filters = []; + } + if (filters.indexOf(this._colorFilter) < 0) { + filters.push(this._colorFilter); + } + this._renderDisplay.filters = filters; + this._renderDisplay.$setAlpha(1.0); + } + else { + if (this._armatureDisplay._batchEnabled) { + var node = this._renderDisplay.$renderNode; + node.filter = null; + node.alpha = this._colorTransform.alphaMultiplier; + } + this._renderDisplay.filters = null; + this._renderDisplay.$setAlpha(this._colorTransform.alphaMultiplier); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateFrame = function () { + var meshData = this._display === this._meshDisplay ? this._meshData : null; + var currentTextureData = this._textureData; + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { + var currentTextureAtlasData = currentTextureData.parent; + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.EgretTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData; + } + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name); + } + if (currentTextureData.renderTexture !== null) { + if (meshData !== null) { + var intArray = meshData.parent.parent.intArray; + var floatArray = meshData.parent.parent.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var triangleCount = intArray[meshData.offset + 1 /* MeshTriangleCount */]; + var verticesOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + var uvOffset = verticesOffset + vertexCount * 2; + var meshDisplay = this._renderDisplay; + var meshNode = meshDisplay.$renderNode; + meshNode.uvs.length = vertexCount * 2; + meshNode.vertices.length = vertexCount * 2; + meshNode.indices.length = triangleCount * 3; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[verticesOffset + i]; + meshNode.uvs[i] = floatArray[uvOffset + i]; + } + for (var i = 0; i < triangleCount * 3; ++i) { + meshNode.indices[i] = intArray[meshData.offset + 4 /* MeshVertexIndices */ + i]; + } + if (this._armatureDisplay._batchEnabled) { + var texture = currentTextureData.renderTexture; + var node = this._renderDisplay.$renderNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(this._renderDisplay.$renderNode); + node.image = texture._bitmapData; + node.drawMesh(texture._bitmapX, texture._bitmapY, texture._bitmapWidth, texture._bitmapHeight, texture._offsetX, texture._offsetY, texture.textureWidth, texture.textureHeight); + node.imageWidth = texture._sourceWidth; + node.imageHeight = texture._sourceHeight; + } + meshDisplay.texture = currentTextureData.renderTexture; + meshDisplay.$setAnchorOffsetX(this._pivotX); + meshDisplay.$setAnchorOffsetY(this._pivotY); + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.texture = currentTextureData.renderTexture; + if (this._armatureDisplay._batchEnabled) { + var texture = currentTextureData.renderTexture; + var node = this._renderDisplay.$renderNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(this._renderDisplay.$renderNode); + node.image = texture._bitmapData; + node.drawImage(texture._bitmapX, texture._bitmapY, texture._bitmapWidth, texture._bitmapHeight, texture._offsetX, texture._offsetY, texture.textureWidth, texture.textureHeight); + node.imageWidth = texture._sourceWidth; + node.imageHeight = texture._sourceHeight; + } + normalDisplay.$setAnchorOffsetX(this._pivotX); + normalDisplay.$setAnchorOffsetY(this._pivotY); + } + return; + } + } + if (this._armatureDisplay._batchEnabled) { + this._renderDisplay.$renderNode.image = null; + } + if (meshData !== null) { + var meshDisplay = this._renderDisplay; + meshDisplay.$setBitmapData(null); + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.$setBitmapData(null); + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + } + }; + /** + * @private + */ + EgretSlot.prototype._updateMesh = function () { + var hasFFD = this._ffdVertices.length > 0; + var meshData = this._meshData; + var weight = meshData.weight; + var meshDisplay = this._renderDisplay; + var meshNode = meshDisplay.$renderNode; + if (weight !== null) { + var intArray = meshData.parent.parent.intArray; + var floatArray = meshData.parent.parent.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var weightFloatOffset = intArray[weight.offset + 1 /* WeigthFloatOffset */]; + for (var i = 0, iD = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weight.bones.length, iV = weightFloatOffset, iF = 0; i < vertexCount; ++i) { + var boneCount = intArray[iB++]; + var xG = 0.0, yG = 0.0; + for (var j = 0; j < boneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._meshBones[boneIndex]; + if (bone !== null) { + var matrix = bone.globalTransformMatrix; + var weight_1 = floatArray[iV++]; + var xL = floatArray[iV++]; + var yL = floatArray[iV++]; + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight_1; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight_1; + } + } + meshNode.vertices[iD++] = xG; + meshNode.vertices[iD++] = yG; + } + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + else if (hasFFD) { + var intArray = meshData.parent.parent.intArray; + var floatArray = meshData.parent.parent.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var vertexOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateTransform = function (isSkinnedMesh) { + if (isSkinnedMesh) { + var transformationMatrix = this._renderDisplay.matrix; + transformationMatrix.identity(); + this._renderDisplay.$setMatrix(transformationMatrix, this.transformUpdateEnabled); + } + else { + var globalTransformMatrix = this.globalTransformMatrix; + if (this._armatureDisplay._batchEnabled) { + var displayMatrix = this._renderDisplay.$renderNode.matrix; + displayMatrix.a = globalTransformMatrix.a; + displayMatrix.b = globalTransformMatrix.b; + displayMatrix.c = globalTransformMatrix.c; + displayMatrix.d = globalTransformMatrix.d; + displayMatrix.tx = this.globalTransformMatrix.tx - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + displayMatrix.ty = this.globalTransformMatrix.ty - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + } + else if (this.transformUpdateEnabled) { + this._renderDisplay.$setMatrix(globalTransformMatrix, true); + } + else { + var values = this._renderDisplay.$DisplayObject; + var displayMatrix = values[6]; + displayMatrix.a = this.globalTransformMatrix.a; + displayMatrix.b = this.globalTransformMatrix.b; + displayMatrix.c = this.globalTransformMatrix.c; + displayMatrix.d = this.globalTransformMatrix.d; + displayMatrix.tx = this.globalTransformMatrix.tx; + displayMatrix.ty = this.globalTransformMatrix.ty; + this._renderDisplay.$removeFlags(8); + this._renderDisplay.$invalidatePosition(); + } + } + }; + return EgretSlot; + }(dragonBones.Slot)); + dragonBones.EgretSlot = EgretSlot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretFactory = (function (_super) { + __extends(EgretFactory, _super); + /** + * @inheritDoc + */ + function EgretFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + var _this = _super.call(this, dataParser) || this; + if (EgretFactory._dragonBonesInstance === null) { + var eventManager = new dragonBones.EgretArmatureDisplay(); + EgretFactory._dragonBonesInstance = new dragonBones.DragonBones(eventManager); + EgretFactory._dragonBonesInstance.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + _this._dragonBones = EgretFactory._dragonBonesInstance; + return _this; + } + EgretFactory._clockHandler = function (time) { + time *= 0.001; + var clock = EgretFactory._dragonBonesInstance.clock; + var passedTime = time - clock.time; + EgretFactory._dragonBonesInstance.advanceTime(passedTime); + clock.time = time; + return false; + }; + Object.defineProperty(EgretFactory, "clock", { + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + return EgretFactory._dragonBonesInstance.clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretFactory, "factory", { + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + if (EgretFactory._factory === null) { + EgretFactory._factory = new EgretFactory(); + } + return EgretFactory._factory; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + EgretFactory.prototype._isSupportMesh = function () { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + return false; + }; + /** + * @private + */ + EgretFactory.prototype._buildTextureAtlasData = function (textureAtlasData, textureAtlas) { + if (textureAtlasData !== null) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.EgretTextureAtlasData); + } + return textureAtlasData; + }; + /** + * @private + */ + EgretFactory.prototype._buildArmature = function (dataPackage) { + var armature = dragonBones.BaseObject.borrowObject(dragonBones.Armature); + var armatureDisplay = new dragonBones.EgretArmatureDisplay(); + armature.init(dataPackage.armature, armatureDisplay, armatureDisplay, this._dragonBones); + return armature; + }; + /** + * @private + */ + EgretFactory.prototype._buildSlot = function (dataPackage, slotData, displays, armature) { + dataPackage; + armature; + var slot = dragonBones.BaseObject.borrowObject(dragonBones.EgretSlot); + slot.init(slotData, displays, new egret.Bitmap(), new egret.Mesh()); + return slot; + }; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + EgretFactory.prototype.buildArmatureDisplay = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + return armature.display; + } + return null; + }; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + EgretFactory.prototype.getTextureDisplay = function (textureName, textureAtlasName) { + if (textureAtlasName === void 0) { textureAtlasName = null; } + var textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName); + if (textureData !== null && textureData.renderTexture !== null) { + return new egret.Bitmap(textureData.renderTexture); + } + return null; + }; + Object.defineProperty(EgretFactory.prototype, "soundEventManager", { + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._dragonBones.eventManager; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + EgretFactory.prototype.addSkeletonData = function (dragonBonesData, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + console.warn("已废弃,请参考 @see"); + this.addDragonBonesData(dragonBonesData, dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + EgretFactory.prototype.getSkeletonData = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + return this.getDragonBonesData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + EgretFactory.prototype.removeSkeletonData = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + this.removeDragonBonesData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + EgretFactory.prototype.addTextureAtlas = function (textureAtlasData, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + console.warn("已废弃,请参考 @see"); + this.addTextureAtlasData(textureAtlasData, dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + EgretFactory.prototype.getTextureAtlas = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + return this.getTextureAtlasData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + EgretFactory.prototype.removeTextureAtlas = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + this.removeTextureAtlasData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + EgretFactory.prototype.buildFastArmature = function (armatureName, dragonBonesName, skinName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + console.warn("已废弃,请参考 @see"); + return this.buildArmature(armatureName, dragonBonesName, skinName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + EgretFactory.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.clear(); + }; + Object.defineProperty(EgretFactory.prototype, "soundEventManater", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + get: function () { + return this.soundEventManager; + }, + enumerable: true, + configurable: true + }); + EgretFactory._dragonBonesInstance = null; + EgretFactory._factory = null; + return EgretFactory; + }(dragonBones.BaseFactory)); + dragonBones.EgretFactory = EgretFactory; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var _helpRectangle = new egret.Rectangle(); + /** + * @private + */ + var _helpMatrix = new egret.Matrix(); + /** + * @private + */ + var _groupConfigMap = {}; + /** + * @private + */ + function _findObjectInArray(array, name) { + for (var i = 0, l = array.length; i < l; ++i) { + var data = array[i]; + if (data.name === name) { + return data; + } + } + return null; + } + /** + * @private + */ + function _fillCreateMovieHelper(createMovieHelper) { + if (createMovieHelper.groupName) { + var groupConfig = _groupConfigMap[createMovieHelper.groupName]; + if (groupConfig) { + var movieConfig = _findObjectInArray(groupConfig.movie || groupConfig.animation, createMovieHelper.movieName); + if (movieConfig) { + createMovieHelper.groupConfig = groupConfig; + createMovieHelper.movieConfig = movieConfig; + return true; + } + } + } + if (!createMovieHelper.groupName) { + for (var groupName in _groupConfigMap) { + var groupConfig = _groupConfigMap[groupName]; + if (!createMovieHelper.groupName) { + var movieConfig = _findObjectInArray(groupConfig.movie || groupConfig.animation, createMovieHelper.movieName); + if (movieConfig) { + createMovieHelper.groupName = groupName; + createMovieHelper.groupConfig = groupConfig; + createMovieHelper.movieConfig = movieConfig; + return true; + } + } + } + } + return false; + } + /** + * @language zh_CN + * 是否包含指定名称的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function hasMovieGroup(groupName) { + return groupName in _groupConfigMap; + } + dragonBones.hasMovieGroup = hasMovieGroup; + /** + * @language zh_CN + * 添加动画组。 + * @param groupData 动画二进制数据。 + * @param textureAtlas 贴图集或贴图集列表。 + * @param groupName 为动画组指定一个名称,如果未设置,则使用数据中的名称。 + * @version DragonBones 4.7 + */ + function addMovieGroup(groupData, textureAtlas, groupName) { + if (groupName === void 0) { groupName = null; } + if (groupData) { + var byteArray = new egret.ByteArray(groupData); + byteArray.endian = egret.Endian.LITTLE_ENDIAN; + byteArray.position = 8; // TODO format + var groupConfig = JSON.parse(byteArray.readUTF()); + groupConfig.offset = byteArray.position; + groupConfig.arrayBuffer = groupData; + groupConfig.textures = []; + var p = groupConfig.offset % 4; + if (p) { + groupConfig.offset += 4 - p; + } + for (var i = 0, l = groupConfig.position.length; i < l; i += 3) { + switch (i / 3) { + case 1: + groupConfig.displayFrameArray = new Int16Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 2: + groupConfig.rectangleArray = new Float32Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 3: + groupConfig.transformArray = new Float32Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 4: + groupConfig.colorArray = new Int16Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + } + } + groupName = groupName || groupConfig.name; + if (_groupConfigMap[groupName]) { + console.warn("Replace group: " + groupName); + } + _groupConfigMap[groupName] = groupConfig; + // + if (textureAtlas instanceof Array) { + for (var i = 0, l = textureAtlas.length; i < l; ++i) { + var texture = textureAtlas[i]; + groupConfig.textures.push(texture); + } + } + else { + groupConfig.textures.push(textureAtlas); + } + } + else { + throw new Error(); + } + } + dragonBones.addMovieGroup = addMovieGroup; + /** + * @language zh_CN + * 移除动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function removeMovieGroup(groupName) { + var groupConfig = _groupConfigMap[groupName]; + if (groupConfig) { + delete _groupConfigMap[groupName]; + } + } + dragonBones.removeMovieGroup = removeMovieGroup; + /** + * @language zh_CN + * 移除所有的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function removeAllMovieGroup() { + for (var i in _groupConfigMap) { + delete _groupConfigMap[i]; + } + } + dragonBones.removeAllMovieGroup = removeAllMovieGroup; + /** + * @language zh_CN + * 创建一个动画。 + * @param movieName 动画的名称。 + * @param groupName 动画组的名称,如果未设置,将检索所有的动画组,当多个动画组中包含同名的动画时,可能无法创建出准确的动画。 + * @version DragonBones 4.7 + */ + function buildMovie(movieName, groupName) { + if (groupName === void 0) { groupName = null; } + var createMovieHelper = { movieName: movieName, groupName: groupName }; + if (_fillCreateMovieHelper(createMovieHelper)) { + var movie = new Movie(createMovieHelper); + dragonBones.EgretFactory.factory; + movie.clock = dragonBones.EgretFactory.clock; + return movie; + } + else { + console.warn("No movie named: " + movieName); + } + return null; + } + dragonBones.buildMovie = buildMovie; + /** + * @language zh_CN + * 获取指定动画组内包含的所有动画名称。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + function getMovieNames(groupName) { + var groupConfig = _groupConfigMap[groupName]; + if (groupConfig) { + var movieNameGroup = []; + var movie = groupConfig.movie || groupConfig.animation; + for (var i = 0, l = movie.length; i < l; ++i) { + movieNameGroup.push(movie[i].name); + } + return movieNameGroup; + } + else { + console.warn("No group named: " + groupName); + } + return null; + } + dragonBones.getMovieNames = getMovieNames; + /** + * @language zh_CN + * 动画事件。 + * @version DragonBones 4.7 + */ + var MovieEvent = (function (_super) { + __extends(MovieEvent, _super); + /** + * @private + */ + function MovieEvent(type) { + var _this = _super.call(this, type) || this; + /** + * @language zh_CN + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.7 + */ + _this.name = ""; + /** + * @language zh_CN + * 发出事件的插槽名称。 + * @version DragonBones 4.7 + */ + _this.slotName = ""; + /** + * @language zh_CN + * 发出事件的动画剪辑名称。 + * @version DragonBones 4.7 + */ + _this.clipName = ""; + return _this; + } + Object.defineProperty(MovieEvent.prototype, "armature", { + //========================================= // 兼容旧数据 + /** + * @private + */ + get: function () { + return this.movie; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MovieEvent.prototype, "bone", { + /** + * @private + */ + get: function () { + return null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MovieEvent.prototype, "animationState", { + /** + * @private + */ + get: function () { + return { name: this.clipName }; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MovieEvent.prototype, "frameLabel", { + /** + * @private + */ + get: function () { + return this.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(MovieEvent.prototype, "movementID", { + /** + * @private + */ + get: function () { + return this.clipName; + }, + enumerable: true, + configurable: true + }); + /** + * @language zh_CN + * 动画剪辑开始播放。 + * @version DragonBones 4.7 + */ + MovieEvent.START = "start"; + /** + * @language zh_CN + * 动画剪辑循环播放一次完成。 + * @version DragonBones 4.7 + */ + MovieEvent.LOOP_COMPLETE = "loopComplete"; + /** + * @language zh_CN + * 动画剪辑播放完成。 + * @version DragonBones 4.7 + */ + MovieEvent.COMPLETE = "complete"; + /** + * @language zh_CN + * 动画剪辑帧事件。 + * @version DragonBones 4.7 + */ + MovieEvent.FRAME_EVENT = "frameEvent"; + /** + * @language zh_CN + * 动画剪辑声音事件。 + * @version DragonBones 4.7 + */ + MovieEvent.SOUND_EVENT = "soundEvent"; + return MovieEvent; + }(egret.Event)); + dragonBones.MovieEvent = MovieEvent; + /** + * @private + */ + var MovieSlot = (function (_super) { + __extends(MovieSlot, _super); + function MovieSlot(slotConfig) { + var _this = _super.call(this) || this; + _this.displayIndex = -1; + _this.colorIndex = -1; + _this.transformIndex = -1; + _this.rawDisplay = new egret.Bitmap(); + _this.childMovies = {}; + _this.displayConfig = null; + _this.childMovie = null; + _this.colorFilter = null; + _this.display = _this.rawDisplay; + _this.config = slotConfig; + _this.rawDisplay.name = _this.config.name; + if (!_this.config.blendMode) { + _this.config.blendMode = 0 /* Normal */; + } + return _this; + } + MovieSlot.prototype.dispose = function () { + this.rawDisplay = null; + this.childMovies = null; + this.config = null; + this.displayConfig = null; + this.display = null; + this.childMovie = null; + this.colorFilter = null; + }; + return MovieSlot; + }(egret.HashObject)); + /** + * @language zh_CN + * 通过读取缓存的二进制动画数据来更新动画,具有良好的运行性能,同时对内存的占用也非常低。 + * @see dragonBones.buildMovie + * @version DragonBones 4.7 + */ + var Movie = (function (_super) { + __extends(Movie, _super); + /** + * @internal + * @private + */ + function Movie(createMovieHelper) { + var _this = _super.call(this) || this; + /** + * @language zh_CN + * 动画的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 4.7 + */ + _this.timeScale = 1; + /** + * @language zh_CN + * 动画剪辑的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * (当再次播放其他动画剪辑时,此值将被重置为 1) + * @default 1 + * @version DragonBones 4.7 + */ + _this.clipTimeScale = 1; + _this._batchEnabled = true; + _this._isLockDispose = false; + _this._isDelayDispose = false; + _this._isStarted = false; + _this._isPlaying = false; + _this._isReversing = false; + _this._isCompleted = false; + _this._playTimes = 0; + _this._time = 0; + _this._currentTime = 0; + _this._currentPlayTimes = 0; + _this._cacheFrameIndex = 0; + _this._frameSize = 0; + _this._cacheRectangle = null; + _this._clock = null; + _this._currentFrameConfig = null; + _this._clipNames = []; + _this._slots = []; + _this._childMovies = []; + _this._groupConfig = createMovieHelper.groupConfig; + _this._config = createMovieHelper.movieConfig; + _this._batchEnabled = !(_this._config.isNested || _this._config.hasChildAnimation); + if (_this._batchEnabled) { + _this.$renderNode = new egret.sys.GroupNode(); + _this.$renderNode.cleanBeforeRender = Movie._cleanBeforeRender; + } + _this._clipNames.length = 0; + for (var i = 0, l = _this._config.clip.length; i < l; ++i) { + _this._clipNames.push(_this._config.clip[i].name); + } + for (var i = 0, l = _this._config.slot.length; i < l; ++i) { + var slot = new MovieSlot(_this._config.slot[i]); + _this._updateSlotBlendMode(slot); + _this._slots.push(slot); + if (_this._batchEnabled) { + _this.$renderNode.addNode(slot.rawDisplay.$renderNode); + } + else { + _this.addChild(slot.rawDisplay); + } + } + _this._frameSize = (1 + 1) * _this._slots.length; // displayFrame, transformFrame. + _this.name = _this._config.name; + _this.play(); + _this.advanceTime(0.000001); + _this.stop(); + return _this; + } + Movie._cleanBeforeRender = function () { }; + Movie.prototype._configToEvent = function (config, event) { + event.movie = this; + event.clipName = this._clipConfig.name; + event.name = config.name; + event.slotName = config.slot || ""; + }; + Movie.prototype._onCrossFrame = function (frameConfig) { + for (var i = 0, l = frameConfig.actionAndEvent.length; i < l; ++i) { + var actionAndEvent = frameConfig.actionAndEvent[i]; + if (actionAndEvent) { + switch (actionAndEvent.type) { + case 11 /* Sound */: + if (dragonBones.EgretFactory.factory.soundEventManager.hasEventListener(MovieEvent.SOUND_EVENT)) { + var event_1 = egret.Event.create(MovieEvent, MovieEvent.SOUND_EVENT); + this._configToEvent(actionAndEvent, event_1); + dragonBones.EgretFactory.factory.soundEventManager.dispatchEvent(event_1); + egret.Event.release(event_1); + } + break; + case 10 /* Frame */: + if (this.hasEventListener(MovieEvent.FRAME_EVENT)) { + var event_2 = egret.Event.create(MovieEvent, MovieEvent.FRAME_EVENT); + this._configToEvent(actionAndEvent, event_2); + this.dispatchEvent(event_2); + egret.Event.release(event_2); + } + break; + case 0 /* Play */: + if (actionAndEvent.slot) { + var slot = this._getSlot(actionAndEvent.slot); + if (slot && slot.childMovie) { + slot.childMovie.play(actionAndEvent.name); + } + } + else { + this.play(actionAndEvent.name); + } + break; + } + } + } + }; + Movie.prototype._updateSlotBlendMode = function (slot) { + var blendMode = ""; + switch (slot.config.blendMode) { + case 0 /* Normal */: + blendMode = egret.BlendMode.NORMAL; + break; + case 1 /* Add */: + blendMode = egret.BlendMode.ADD; + break; + case 5 /* Erase */: + blendMode = egret.BlendMode.ERASE; + break; + default: + break; + } + if (blendMode) { + if (this._batchEnabled) { + // RenderNode display. + slot.display.$renderNode.blendMode = egret.sys.blendModeToNumber(blendMode); + } + else { + // Classic display. + slot.display.blendMode = blendMode; + } + } + }; + Movie.prototype._updateSlotColor = function (slot, aM, rM, gM, bM, aO, rO, gO, bO) { + if (rM !== 1 || + gM !== 1 || + bM !== 1 || + rO !== 0 || + gO !== 0 || + bO !== 0 || + aO !== 0) { + if (!slot.colorFilter) { + slot.colorFilter = new egret.ColorMatrixFilter(); + } + var colorMatrix = slot.colorFilter.matrix; + colorMatrix[0] = rM; + colorMatrix[6] = gM; + colorMatrix[12] = bM; + colorMatrix[18] = aM; + colorMatrix[4] = rO; + colorMatrix[9] = gO; + colorMatrix[14] = bO; + colorMatrix[19] = aO; + slot.colorFilter.matrix = colorMatrix; + if (this._batchEnabled) { + // RenderNode display. + slot.display.$renderNode.filter = slot.colorFilter; + slot.display.$renderNode.alpha = 1.0; + } + else { + // Classic display. + var filters = slot.display.filters; + if (!filters) { + filters = []; + } + if (filters.indexOf(slot.colorFilter) < 0) { + filters.push(slot.colorFilter); + } + slot.display.filters = filters; + slot.display.$setAlpha(1.0); + } + } + else { + if (slot.colorFilter) { + slot.colorFilter = null; + } + if (this._batchEnabled) { + // RenderNode display. + slot.display.$renderNode.filter = null; + slot.display.$renderNode.alpha = aM; + } + else { + // Classic display. + slot.display.filters = null; + slot.display.$setAlpha(aM); + } + } + }; + Movie.prototype._updateSlotDisplay = function (slot) { + var prevDisplay = slot.display || slot.rawDisplay; + var prevChildMovie = slot.childMovie; + if (slot.displayIndex >= 0) { + slot.displayConfig = this._groupConfig.display[slot.displayIndex]; + if (slot.displayConfig.type === 1 /* Armature */) { + var childMovie = slot.displayConfig.name in slot.childMovies ? slot.childMovies[slot.displayConfig.name] : null; + if (!childMovie) { + childMovie = buildMovie(slot.displayConfig.name, this._groupConfig.name); + if (childMovie) { + slot.childMovies[slot.displayConfig.name] = childMovie; + } + } + if (childMovie) { + slot.display = childMovie; + slot.childMovie = childMovie; + } + else { + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + } + else { + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + } + else { + slot.displayConfig = null; + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + if (slot.display !== prevDisplay) { + if (prevDisplay) { + this.addChild(slot.display); + this.swapChildren(slot.display, prevDisplay); + this.removeChild(prevDisplay); + } + // Update blendMode. + this._updateSlotBlendMode(slot); + } + // Update frame. + if (slot.display === slot.rawDisplay) { + if (slot.displayConfig && slot.displayConfig.regionIndex !== null && slot.displayConfig.regionIndex !== undefined) { + if (!slot.displayConfig.texture) { + var textureAtlasTexture = this._groupConfig.textures[slot.displayConfig.textureIndex || 0]; + var regionIndex = slot.displayConfig.regionIndex * 4; + var x = this._groupConfig.rectangleArray[regionIndex]; + var y = this._groupConfig.rectangleArray[regionIndex + 1]; + var width = this._groupConfig.rectangleArray[regionIndex + 2]; + var height = this._groupConfig.rectangleArray[regionIndex + 3]; + slot.displayConfig.texture = new egret.Texture(); + slot.displayConfig.texture._bitmapData = textureAtlasTexture._bitmapData; + slot.displayConfig.texture.$initData(x, y, Math.min(width, textureAtlasTexture.textureWidth - x), Math.min(height, textureAtlasTexture.textureHeight - y), 0, 0, Math.min(width, textureAtlasTexture.textureWidth - x), Math.min(height, textureAtlasTexture.textureHeight - y), textureAtlasTexture.textureWidth, textureAtlasTexture.textureHeight); + } + if (this._batchEnabled) { + // RenderNode display. + var texture = slot.displayConfig.texture; + var bitmapNode = slot.rawDisplay.$renderNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(slot.rawDisplay.$renderNode); + bitmapNode.image = texture._bitmapData; + bitmapNode.drawImage(texture._bitmapX, texture._bitmapY, texture._bitmapWidth, texture._bitmapHeight, texture._offsetX, texture._offsetY, texture.textureWidth, texture.textureHeight); + bitmapNode.imageWidth = texture._sourceWidth; + bitmapNode.imageHeight = texture._sourceHeight; + } + else { + // Classic display. + slot.rawDisplay.visible = true; + slot.rawDisplay.$setBitmapData(slot.displayConfig.texture); + } + } + else { + if (this._batchEnabled) { + // RenderNode display. + slot.rawDisplay.$renderNode.image = null; + } + else { + // Classic display. + slot.rawDisplay.visible = false; + slot.rawDisplay.$setBitmapData(null); + } + } + } + // Update child movie. + if (slot.childMovie !== prevChildMovie) { + if (prevChildMovie) { + prevChildMovie.stop(); + this._childMovies.slice(this._childMovies.indexOf(prevChildMovie), 1); + } + if (slot.childMovie) { + if (this._childMovies.indexOf(slot.childMovie) < 0) { + this._childMovies.push(slot.childMovie); + } + if (slot.config.action) { + slot.childMovie.play(slot.config.action); + } + else { + slot.childMovie.play(slot.childMovie._config.action); + } + } + } + }; + Movie.prototype._getSlot = function (name) { + for (var i = 0, l = this._slots.length; i < l; ++i) { + var slot = this._slots[i]; + if (slot.config.name === name) { + return slot; + } + } + return null; + }; + /** + * @inheritDoc + */ + Movie.prototype.$render = function () { + if (this._batchEnabled) { + // RenderNode display. + } + else { + // Classic display. + _super.prototype.$render.call(this); + } + }; + /** + * @inheritDoc + */ + Movie.prototype.$measureContentBounds = function (bounds) { + if (this._batchEnabled && this._cacheRectangle) { + // RenderNode display. + bounds.setTo(this._cacheRectangle.x, this._cacheRectangle.y, this._cacheRectangle.width - this._cacheRectangle.x, this._cacheRectangle.height - this._cacheRectangle.y); + } + else { + // Classic display. + _super.prototype.$measureContentBounds.call(this, bounds); + } + }; + /** + * @inheritDoc + */ + Movie.prototype.$doAddChild = function (child, index, notifyListeners) { + if (this._batchEnabled) { + // RenderNode display. + console.warn("Can not add child."); + return null; + } + // Classic display. + return _super.prototype.$doAddChild.call(this, child, index, notifyListeners); + }; + /** + * @inheritDoc + */ + Movie.prototype.$doRemoveChild = function (index, notifyListeners) { + if (this._batchEnabled) { + // RenderNode display. + console.warn("Can not remove child."); + return null; + } + // Classic display. + return _super.prototype.$doRemoveChild.call(this, index, notifyListeners); + }; + /** + * 释放动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Movie.prototype.dispose = function () { + if (this._isLockDispose) { + this._isDelayDispose = true; + } + else { + if (this._clock) { + this._clock.remove(this); + } + if (this._slots) { + for (var i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].dispose(); + } + } + this._isPlaying = false; + this._cacheRectangle = null; + this._clock = null; + this._groupConfig = null; + this._config = null; + this._clipConfig = null; + this._currentFrameConfig = null; + this._clipArray = null; + this._clipNames = null; + this._slots = null; + this._childMovies = null; + } + }; + /** + * @inheritDoc + */ + Movie.prototype.advanceTime = function (passedTime) { + if (this._isPlaying) { + this._isLockDispose = true; + if (passedTime < 0) { + passedTime = -passedTime; + } + passedTime *= this.timeScale; + this._time += passedTime * this.clipTimeScale; + // Modify time. + var duration = this._clipConfig.duration; + var totalTime = duration * this._playTimes; + var currentTime = this._time; + var currentPlayTimes = this._currentPlayTimes; + if (this._playTimes > 0 && (currentTime >= totalTime || currentTime <= -totalTime)) { + this._isCompleted = true; + currentPlayTimes = this._playTimes; + if (currentTime < 0) { + currentTime = 0; + } + else { + currentTime = duration; + } + } + else { + this._isCompleted = false; + if (currentTime < 0) { + currentPlayTimes = Math.floor(-currentTime / duration); + currentTime = duration - (-currentTime % duration); + } + else { + currentPlayTimes = Math.floor(currentTime / duration); + currentTime %= duration; + } + if (this._playTimes > 0 && currentPlayTimes > this._playTimes) { + currentPlayTimes = this._playTimes; + } + } + if (this._currentTime === currentTime) { + return; + } + var cacheFrameIndex = Math.floor(currentTime * this._clipConfig.cacheTimeToFrameScale); + if (this._cacheFrameIndex !== cacheFrameIndex) { + this._cacheFrameIndex = cacheFrameIndex; + var displayFrameArray = this._groupConfig.displayFrameArray; + var transformArray = this._groupConfig.transformArray; + var colorArray = this._groupConfig.colorArray; + // + var isFirst = true; + var hasDisplay = false; + var needCacheRectangle = false; + var prevCacheRectangle = this._cacheRectangle; + this._cacheRectangle = this._clipConfig.cacheRectangles[this._cacheFrameIndex]; + if (this._batchEnabled && !this._cacheRectangle) { + needCacheRectangle = true; + this._cacheRectangle = new egret.Rectangle(); + this._clipConfig.cacheRectangles[this._cacheFrameIndex] = this._cacheRectangle; + } + // Update slots. + for (var i = 0, l = this._slots.length; i < l; ++i) { + var slot = this._slots[i]; + var clipFrameIndex = this._frameSize * this._cacheFrameIndex + i * 2; + if (clipFrameIndex >= this._clipArray.length) { + clipFrameIndex = this._frameSize * (this._cacheFrameIndex - 1) + i * 2; + } + var displayFrameIndex = this._clipArray[clipFrameIndex] * 2; + if (displayFrameIndex >= 0) { + var displayIndex = displayFrameArray[displayFrameIndex]; + var colorIndex = displayFrameArray[displayFrameIndex + 1] * 8; + var transformIndex = this._clipArray[clipFrameIndex + 1] * 6; + var colorChange = false; + if (slot.displayIndex !== displayIndex) { + slot.displayIndex = displayIndex; + colorChange = true; + this._updateSlotDisplay(slot); + } + if (slot.colorIndex !== colorIndex || colorChange) { + slot.colorIndex = colorIndex; + if (slot.colorIndex >= 0) { + this._updateSlotColor(slot, colorArray[colorIndex] * 0.01, colorArray[colorIndex + 1] * 0.01, colorArray[colorIndex + 2] * 0.01, colorArray[colorIndex + 3] * 0.01, colorArray[colorIndex + 4], colorArray[colorIndex + 5], colorArray[colorIndex + 6], colorArray[colorIndex + 7]); + } + else { + this._updateSlotColor(slot, 1, 1, 1, 1, 0, 0, 0, 0); + } + } + hasDisplay = true; + if (slot.transformIndex !== transformIndex) { + slot.transformIndex = transformIndex; + if (this._batchEnabled) { + // RenderNode display. + var matrix = slot.display.$renderNode.matrix; + if (!matrix) { + matrix = slot.display.$renderNode.matrix = new egret.Matrix(); + } + matrix.a = transformArray[transformIndex]; + matrix.b = transformArray[transformIndex + 1]; + matrix.c = transformArray[transformIndex + 2]; + matrix.d = transformArray[transformIndex + 3]; + matrix.tx = transformArray[transformIndex + 4]; + matrix.ty = transformArray[transformIndex + 5]; + } + else { + // Classic display. + _helpMatrix.a = transformArray[transformIndex]; + _helpMatrix.b = transformArray[transformIndex + 1]; + _helpMatrix.c = transformArray[transformIndex + 2]; + _helpMatrix.d = transformArray[transformIndex + 3]; + _helpMatrix.tx = transformArray[transformIndex + 4]; + _helpMatrix.ty = transformArray[transformIndex + 5]; + slot.display.$setMatrix(_helpMatrix); + } + } + // + if (this._batchEnabled && needCacheRectangle && slot.displayConfig) { + // RenderNode display. + var matrix = slot.display.$renderNode.matrix; + _helpRectangle.x = 0; + _helpRectangle.y = 0; + _helpRectangle.width = slot.displayConfig.texture.textureWidth; + _helpRectangle.height = slot.displayConfig.texture.textureHeight; + matrix.$transformBounds(_helpRectangle); + if (isFirst) { + isFirst = false; + this._cacheRectangle.x = _helpRectangle.x; + this._cacheRectangle.width = _helpRectangle.x + _helpRectangle.width; + this._cacheRectangle.y = _helpRectangle.y; + this._cacheRectangle.height = _helpRectangle.y + _helpRectangle.height; + } + else { + this._cacheRectangle.x = Math.min(this._cacheRectangle.x, _helpRectangle.x); + this._cacheRectangle.width = Math.max(this._cacheRectangle.width, _helpRectangle.x + _helpRectangle.width); + this._cacheRectangle.y = Math.min(this._cacheRectangle.y, _helpRectangle.y); + this._cacheRectangle.height = Math.max(this._cacheRectangle.height, _helpRectangle.y + _helpRectangle.height); + } + } + } + else if (slot.displayIndex !== -1) { + slot.displayIndex = -1; + this._updateSlotDisplay(slot); + } + } + // + if (this._cacheRectangle) { + if (hasDisplay && needCacheRectangle && isFirst && prevCacheRectangle) { + this._cacheRectangle.x = prevCacheRectangle.x; + this._cacheRectangle.y = prevCacheRectangle.y; + this._cacheRectangle.width = prevCacheRectangle.width; + this._cacheRectangle.height = prevCacheRectangle.height; + } + this.$invalidateContentBounds(); + } + } + if (this._isCompleted) { + this._isPlaying = false; + } + if (!this._isStarted) { + this._isStarted = true; + if (this.hasEventListener(MovieEvent.START)) { + var event_3 = egret.Event.create(MovieEvent, MovieEvent.START); + event_3.movie = this; + event_3.clipName = this._clipConfig.name; + event_3.name = ""; + event_3.slotName = ""; + this.dispatchEvent(event_3); + } + } + this._isReversing = this._currentTime > currentTime && this._currentPlayTimes === currentPlayTimes; + this._currentTime = currentTime; + // Action and event. + var frameCount = this._clipConfig.frame ? this._clipConfig.frame.length : 0; + if (frameCount > 0) { + var currentFrameIndex = Math.floor(this._currentTime * this._config.frameRate); + var currentFrameConfig = this._groupConfig.frame[this._clipConfig.frame[currentFrameIndex]]; + if (this._currentFrameConfig !== currentFrameConfig) { + if (frameCount > 1) { + var crossedFrameConfig = this._currentFrameConfig; + this._currentFrameConfig = currentFrameConfig; + if (!crossedFrameConfig) { + var prevFrameIndex = Math.floor(this._currentTime * this._config.frameRate); + crossedFrameConfig = this._groupConfig.frame[this._clipConfig.frame[prevFrameIndex]]; + if (this._isReversing) { + } + else { + if (this._currentTime <= crossedFrameConfig.position || + this._currentPlayTimes !== currentPlayTimes) { + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.prev]; + } + } + } + if (this._isReversing) { + while (crossedFrameConfig !== currentFrameConfig) { + this._onCrossFrame(crossedFrameConfig); + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.prev]; + } + } + else { + while (crossedFrameConfig !== currentFrameConfig) { + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.next]; + this._onCrossFrame(crossedFrameConfig); + } + } + } + else { + this._currentFrameConfig = currentFrameConfig; + if (this._currentFrameConfig) { + this._onCrossFrame(this._currentFrameConfig); + } + } + } + } + if (this._currentPlayTimes !== currentPlayTimes) { + this._currentPlayTimes = currentPlayTimes; + if (this.hasEventListener(MovieEvent.LOOP_COMPLETE)) { + var event_4 = egret.Event.create(MovieEvent, MovieEvent.LOOP_COMPLETE); + event_4.movie = this; + event_4.clipName = this._clipConfig.name; + event_4.name = ""; + event_4.slotName = ""; + this.dispatchEvent(event_4); + egret.Event.release(event_4); + } + if (this._isCompleted && this.hasEventListener(MovieEvent.COMPLETE)) { + var event_5 = egret.Event.create(MovieEvent, MovieEvent.COMPLETE); + event_5.movie = this; + event_5.clipName = this._clipConfig.name; + event_5.name = ""; + event_5.slotName = ""; + this.dispatchEvent(event_5); + egret.Event.release(event_5); + } + } + } + this._isLockDispose = false; + if (this._isDelayDispose) { + this.dispose(); + } + }; + /** + * 播放动画剪辑。 + * @param clipName 动画剪辑的名称,如果未设置,则播放默认动画剪辑,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画剪辑。 + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + Movie.prototype.play = function (clipName, playTimes) { + if (clipName === void 0) { clipName = null; } + if (playTimes === void 0) { playTimes = -1; } + if (clipName) { + var clipConfig = null; + for (var i = 0, l = this._config.clip.length; i < l; ++i) { + var data = this._config.clip[i]; + if (data.name === clipName) { + clipConfig = data; + } + } + if (clipConfig) { + this._clipConfig = clipConfig; + this._clipArray = new Int16Array(this._groupConfig.arrayBuffer, this._groupConfig.offset + this._groupConfig.position[0] + this._clipConfig.p, this._clipConfig.s / this._groupConfig.position[2]); + if (!this._clipConfig.cacheRectangles) { + this._clipConfig.cacheRectangles = []; + } + this._isPlaying = true; + this._isStarted = false; + this._isCompleted = false; + if (playTimes < 0 || playTimes !== playTimes) { + this._playTimes = this._clipConfig.playTimes; + } + else { + this._playTimes = playTimes; + } + this._time = 0; + this._currentTime = 0; + this._currentPlayTimes = 0; + this._cacheFrameIndex = -1; + this._currentFrameConfig = null; + this._cacheRectangle = null; + this.clipTimeScale = 1 / this._clipConfig.scale; + } + else { + console.warn("No clip in movie.", this._config.name, clipName); + } + } + else if (this._clipConfig) { + if (this._isPlaying || this._isCompleted) { + this.play(this._clipConfig.name, this._playTimes); + } + else { + this._isPlaying = true; + } + // playTimes + } + else if (this._config.action) { + this.play(this._config.action, playTimes); + } + }; + /** + * 暂停播放动画。 + * @version DragonBones 4.7 + * @language zh_CN + */ + Movie.prototype.stop = function () { + this._isPlaying = false; + }; + /** + * 从指定时间播放动画。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 5.0 + * @language zh_CN + */ + Movie.prototype.gotoAndPlay = function (clipName, time, playTimes) { + if (clipName === void 0) { clipName = null; } + if (playTimes === void 0) { playTimes = -1; } + time %= this._clipConfig.duration; + if (time < 0) { + time += this._clipConfig.duration; + } + this.play(clipName, playTimes); + this._time = time; + this._currentTime = time; + }; + /** + * 将动画停止到指定时间。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @version DragonBones 5.0 + * @language zh_CN + */ + Movie.prototype.gotoAndStop = function (clipName, time) { + if (clipName === void 0) { clipName = null; } + time %= this._clipConfig.duration; + if (time < 0) { + time += this._clipConfig.duration; + } + this.play(clipName, 1); + this._time = time; + this._currentTime = time; + this.advanceTime(0.001); + this.stop(); + }; + /** + * 是否包含指定动画剪辑。 + * @param clipName 动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + Movie.prototype.hasClip = function (clipName) { + for (var i = 0, l = this._config.clip.length; i < l; ++i) { + var clip = this._config.clip[i]; + if (clip.name === clipName) { + return true; + } + } + return false; + }; + Object.defineProperty(Movie.prototype, "isPlaying", { + /** + * 动画剪辑是否处正在播放。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._isPlaying && !this._isCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "isComplete", { + /** + * 动画剪辑是否均播放完毕。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._isCompleted; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "currentTime", { + /** + * 当前动画剪辑的播放时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._currentTime; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "totalTime", { + /** + * 当前动画剪辑的总时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._clipConfig ? this._clipConfig.duration : 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "currentPlayTimes", { + /** + * 当前动画剪辑的播放次数。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "playTimes", { + /** + * 当前动画剪辑需要播放的次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._playTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "groupName", { + get: function () { + return this._groupConfig.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "clipName", { + /** + * 正在播放的动画剪辑名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._clipConfig ? this._clipConfig.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "clipNames", { + /** + * 所有动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + return this._clipNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + var prevClock = this._clock; + if (prevClock) { + prevClock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Movie#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Movie#timescale + * @see dragonBones.Movie#stop() + */ + Movie.prototype.advanceTimeBySelf = function (on) { + if (on) { + this.clock = dragonBones.EgretFactory.clock; + } + else { + this.clock = null; + } + }; + Object.defineProperty(Movie.prototype, "display", { + //========================================= // 兼容旧数据 + /** + * @private + */ + get: function () { + return this; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "animation", { + /** + * @private + */ + get: function () { + return this; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "armature", { + /** + * @private + */ + get: function () { + return this; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + Movie.prototype.getAnimation = function () { + return this; + }; + /** + * @private + */ + Movie.prototype.getArmature = function () { + return this; + }; + /** + * @private + */ + Movie.prototype.getDisplay = function () { + return this; + }; + /** + * @private + */ + Movie.prototype.hasAnimation = function (name) { + return this.hasClip(name); + }; + /** + * @private + */ + Movie.prototype.invalidUpdate = function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + args; + }; + Object.defineProperty(Movie.prototype, "lastAnimationName", { + /** + * @private + */ + get: function () { + return this.clipName; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "animationNames", { + /** + * @private + */ + get: function () { + return this.clipNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Movie.prototype, "animationList", { + /** + * @private + */ + get: function () { + return this.clipNames; + }, + enumerable: true, + configurable: true + }); + return Movie; + }(egret.DisplayObjectContainer)); + dragonBones.Movie = Movie; +})(dragonBones || (dragonBones = {})); diff --git a/reference/Egret/4.x/out/dragonBones.min.js b/reference/Egret/4.x/out/dragonBones.min.js new file mode 100644 index 0000000..1499e96 --- /dev/null +++ b/reference/Egret/4.x/out/dragonBones.min.js @@ -0,0 +1 @@ +"use strict";var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)if(e.hasOwnProperty(i))t[i]=e[i]};return function(e,i){t(e,i);function a(){this.constructor=e}e.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)}}();var dragonBones;(function(t){var e=function(){function e(e){this._clock=new t.WorldClock;this._events=[];this._objects=[];this._eventManager=null;this._eventManager=e}e.prototype.advanceTime=function(e){if(this._objects.length>0){for(var i=0,a=this._objects;i0){for(var n=0;ni){r.length=i}t._maxCountMap[a]=i}else{t._defaultMaxCount=i;for(var a in t._poolsMap){if(a in t._maxCountMap){continue}var r=t._poolsMap[a];if(r.length>i){r.length=i}t._maxCountMap[a]=i}}};t.clearPool=function(e){if(e===void 0){e=null}if(e!==null){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){a.length=0}}else{for(var r in t._poolsMap){var a=t._poolsMap[r];a.length=0}}};t.borrowObject=function(e){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){var r=a.pop();r._isInPool=false;return r}var n=new e;n._onClear();return n};t.prototype.returnToPool=function(){this._onClear();t._returnObject(this)};t._hashCode=0;t._defaultMaxCount=1e3;t._maxCountMap={};t._poolsMap={};return t}();t.BaseObject=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=1}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}this.a=t;this.b=e;this.c=i;this.d=a;this.tx=r;this.ty=n}t.prototype.toString=function(){return"[object dragonBones.Matrix] a:"+this.a+" b:"+this.b+" c:"+this.c+" d:"+this.d+" tx:"+this.tx+" ty:"+this.ty};t.prototype.copyFrom=function(t){this.a=t.a;this.b=t.b;this.c=t.c;this.d=t.d;this.tx=t.tx;this.ty=t.ty;return this};t.prototype.copyFromArray=function(t,e){if(e===void 0){e=0}this.a=t[e];this.b=t[e+1];this.c=t[e+2];this.d=t[e+3];this.tx=t[e+4];this.ty=t[e+5];return this};t.prototype.identity=function(){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this};t.prototype.concat=function(t){var e=this.a*t.a;var i=0;var a=0;var r=this.d*t.d;var n=this.tx*t.a+t.tx;var s=this.ty*t.d+t.ty;if(this.b!==0||this.c!==0){e+=this.b*t.c;i+=this.b*t.d;a+=this.c*t.a;r+=this.c*t.b}if(t.b!==0||t.c!==0){i+=this.a*t.b;a+=this.d*t.c;n+=this.ty*t.c;s+=this.tx*t.b}this.a=e;this.b=i;this.c=a;this.d=r;this.tx=n;this.ty=s;return this};t.prototype.invert=function(){var t=this.a;var e=this.b;var i=this.c;var a=this.d;var r=this.tx;var n=this.ty;if(e===0&&i===0){this.b=this.c=0;if(t===0||a===0){this.a=this.b=this.tx=this.ty=0}else{t=this.a=1/t;a=this.d=1/a;this.tx=-t*r;this.ty=-a*n}return this}var s=t*a-e*i;if(s===0){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this}s=1/s;var o=this.a=a*s;e=this.b=-e*s;i=this.c=-i*s;a=this.d=t*s;this.tx=-(o*r+i*n);this.ty=-(e*r+a*n);return this};t.prototype.transformPoint=function(t,e,i,a){if(a===void 0){a=false}i.x=this.a*t+this.c*e;i.y=this.b*t+this.d*e;if(!a){i.x+=this.tx;i.y+=this.ty}};return t}();t.Matrix=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}if(r===void 0){r=1}if(n===void 0){n=1}this.x=t;this.y=e;this.skew=i;this.rotation=a;this.scaleX=r;this.scaleY=n}t.normalizeRadian=function(t){t=(t+Math.PI)%(Math.PI*2);t+=t>0?-Math.PI:Math.PI;return t};t.prototype.toString=function(){return"[object dragonBones.Transform] x:"+this.x+" y:"+this.y+" skewX:"+this.skew*180/Math.PI+" skewY:"+this.rotation*180/Math.PI+" scaleX:"+this.scaleX+" scaleY:"+this.scaleY};t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.skew=t.skew;this.rotation=t.rotation;this.scaleX=t.scaleX;this.scaleY=t.scaleY;return this};t.prototype.identity=function(){this.x=this.y=0;this.skew=this.rotation=0;this.scaleX=this.scaleY=1;return this};t.prototype.add=function(t){this.x+=t.x;this.y+=t.y;this.skew+=t.skew;this.rotation+=t.rotation;this.scaleX*=t.scaleX;this.scaleY*=t.scaleY;return this};t.prototype.minus=function(t){this.x-=t.x;this.y-=t.y;this.skew-=t.skew;this.rotation-=t.rotation;this.scaleX/=t.scaleX;this.scaleY/=t.scaleY;return this};t.prototype.fromMatrix=function(e){var i=this.scaleX,a=this.scaleY;var r=t.PI_Q;this.x=e.tx;this.y=e.ty;this.rotation=Math.atan(e.b/e.a);var n=Math.atan(-e.c/e.d);this.scaleX=this.rotation>-r&&this.rotation-r&&n=0&&this.scaleX<0){this.scaleX=-this.scaleX;this.rotation=this.rotation-Math.PI}if(a>=0&&this.scaleY<0){this.scaleY=-this.scaleY;n=n-Math.PI}this.skew=n-this.rotation;return this};t.prototype.toMatrix=function(t){if(this.skew!==0||this.rotation!==0){t.a=Math.cos(this.rotation);t.b=Math.sin(this.rotation);if(this.skew===0){t.c=-t.b;t.d=t.a}else{t.c=-Math.sin(this.skew+this.rotation);t.d=Math.cos(this.skew+this.rotation)}if(this.scaleX!==1){t.a*=this.scaleX;t.b*=this.scaleX}if(this.scaleY!==1){t.c*=this.scaleY;t.d*=this.scaleY}}else{t.a=this.scaleX;t.b=0;t.c=0;t.d=this.scaleY}t.tx=this.x;t.ty=this.y;return this};t.PI_D=Math.PI*2;t.PI_H=Math.PI/2;t.PI_Q=Math.PI/4;t.RAD_DEG=180/Math.PI;t.DEG_RAD=Math.PI/180;return t}();t.Transform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n,s,o){if(t===void 0){t=1}if(e===void 0){e=1}if(i===void 0){i=1}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}if(s===void 0){s=0}if(o===void 0){o=0}this.alphaMultiplier=t;this.redMultiplier=e;this.greenMultiplier=i;this.blueMultiplier=a;this.alphaOffset=r;this.redOffset=n;this.greenOffset=s;this.blueOffset=o}t.prototype.copyFrom=function(t){this.alphaMultiplier=t.alphaMultiplier;this.redMultiplier=t.redMultiplier;this.greenMultiplier=t.greenMultiplier;this.blueMultiplier=t.blueMultiplier;this.alphaOffset=t.alphaOffset;this.redOffset=t.redOffset;this.greenOffset=t.greenOffset;this.blueOffset=t.blueOffset};t.prototype.identity=function(){this.alphaMultiplier=this.redMultiplier=this.greenMultiplier=this.blueMultiplier=1;this.alphaOffset=this.redOffset=this.greenOffset=this.blueOffset=0};return t}();t.ColorTransform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e){if(t===void 0){t=0}if(e===void 0){e=0}this.x=t;this.y=e}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y};t.prototype.clear=function(){this.x=this.y=0};return t}();t.Point=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}this.x=t;this.y=e;this.width=i;this.height=a}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.width=t.width;this.height=t.height};t.prototype.clear=function(){this.x=this.y=0;this.width=this.height=0};return t}();t.Rectangle=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.ints=[];e.floats=[];e.strings=[];return e}e.toString=function(){return"[class dragonBones.UserData]"};e.prototype._onClear=function(){this.ints.length=0;this.floats.length=0;this.strings.length=0};e.prototype.getInt=function(t){if(t===void 0){t=0}return t>=0&&t=0&&t=0&&t=t){i=0}if(this.sortedBones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s0){return}this.cacheFrameRate=t;for(var e in this.animations){this.animations[e].cacheFrames(this.cacheFrameRate)}};i.prototype.setCacheFrame=function(t,e){var i=this.parent.cachedFrames;var a=i.length;i.length+=10;i[a]=t.a;i[a+1]=t.b;i[a+2]=t.c;i[a+3]=t.d;i[a+4]=t.tx;i[a+5]=t.ty;i[a+6]=e.rotation;i[a+7]=e.skew;i[a+8]=e.scaleX;i[a+9]=e.scaleY;return a};i.prototype.getCacheFrame=function(t,e,i){var a=this.parent.cachedFrames;t.a=a[i];t.b=a[i+1];t.c=a[i+2];t.d=a[i+3];t.tx=a[i+4];t.ty=a[i+5];e.rotation=a[i+6];e.skew=a[i+7];e.scaleX=a[i+8];e.scaleY=a[i+9];e.x=t.tx;e.y=t.ty};i.prototype.addBone=function(t){if(t.name in this.bones){console.warn("Replace bone: "+t.name);this.bones[t.name].returnToPool()}this.bones[t.name]=t;this.sortedBones.push(t)};i.prototype.addSlot=function(t){if(t.name in this.slots){console.warn("Replace slot: "+t.name);this.slots[t.name].returnToPool()}this.slots[t.name]=t;this.sortedSlots.push(t)};i.prototype.addSkin=function(t){if(t.name in this.skins){console.warn("Replace skin: "+t.name);this.skins[t.name].returnToPool()}this.skins[t.name]=t;if(this.defaultSkin===null){this.defaultSkin=t}};i.prototype.addAnimation=function(t){if(t.name in this.animations){console.warn("Replace animation: "+t.name);this.animations[t.name].returnToPool()}t.parent=this;this.animations[t.name]=t;this.animationNames.push(t.name);if(this.defaultAnimation===null){this.defaultAnimation=t}};i.prototype.getBone=function(t){return t in this.bones?this.bones[t]:null};i.prototype.getSlot=function(t){return t in this.slots?this.slots[t]:null};i.prototype.getSkin=function(t){return t in this.skins?this.skins[t]:null};i.prototype.getAnimation=function(t){return t in this.animations?this.animations[t]:null};return i}(t.BaseObject);t.ArmatureData=i;var a=function(e){__extends(i,e);function i(){var i=e!==null&&e.apply(this,arguments)||this;i.transform=new t.Transform;i.constraints=[];i.userData=null;return i}i.toString=function(){return"[class dragonBones.BoneData]"};i.prototype._onClear=function(){for(var t=0,e=this.constraints;tr){s|=2}if(en){s|=8}return s};e.rectangleIntersectsSegment=function(t,i,a,r,n,s,o,l,h,u,f){if(h===void 0){h=null}if(u===void 0){u=null}if(f===void 0){f=null}var _=t>n&&ts&&in&&as&&r=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){return true}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=this.width*.5;var h=this.height*.5;var u=e.rectangleIntersectsSegment(t,i,a,r,-l,-h,l,h,n,s,o);return u};return e}(e);t.RectangleBoundingBoxData=i;var a=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.EllipseData]"};e.ellipseIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h,u){if(l===void 0){l=null}if(h===void 0){h=null}if(u===void 0){u=null}var f=s/o;var _=f*f;e*=f;a*=f;var c=i-t;var p=a-e;var m=Math.sqrt(c*c+p*p);var d=c/m;var y=p/m;var g=(r-t)*d+(n-e)*y;var v=g*g;var b=t*t+e*e;var D=s*s;var T=D-b+v;var A=0;if(T>=0){var O=Math.sqrt(T);var x=g-O;var B=g+O;var E=x<0?-1:x<=m?0:1;var S=B<0?-1:B<=m?0:1;var M=E*S;if(M<0){return-1}else if(M===0){if(E===-1){A=2;i=t+B*d;a=(e+B*y)/f;if(l!==null){l.x=i;l.y=a}if(h!==null){h.x=i;h.y=a}if(u!==null){u.x=Math.atan2(a/D*_,i/D);u.y=u.x+Math.PI}}else if(S===1){A=1;t=t+x*d;e=(e+x*y)/f;if(l!==null){l.x=t;l.y=e}if(h!==null){h.x=t;h.y=e}if(u!==null){u.x=Math.atan2(e/D*_,t/D);u.y=u.x+Math.PI}}else{A=3;if(l!==null){l.x=t+x*d;l.y=(e+x*y)/f;if(u!==null){u.x=Math.atan2(l.y/D*_,l.x/D)}}if(h!==null){h.x=t+B*d;h.y=(e+B*y)/f;if(u!==null){u.y=Math.atan2(h.y/D*_,h.x/D)}}}}}return A};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.type=1};e.prototype.containsPoint=function(t,e){var i=this.width*.5;if(t>=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){e*=i/a;return Math.sqrt(t*t+e*e)<=i}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=e.ellipseIntersectsSegment(t,i,a,r,0,0,this.width*.5,this.height*.5,n,s,o);return l};return e}(e);t.EllipseBoundingBoxData=a;var r=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.weight=null;return e}e.toString=function(){return"[class dragonBones.PolygonBoundingBoxData]"};e.polygonIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h){if(o===void 0){o=null}if(l===void 0){l=null}if(h===void 0){h=null}if(t===i){t=i+1e-6}if(e===a){e=a+1e-6}var u=t-i;var f=e-a;var _=t*a-e*i;var c=0;var p=r[n+s-2];var m=r[n+s-1];var d=0;var y=0;var g=0;var v=0;var b=0;var D=0;for(var T=0;T=p&&M<=A||M>=A&&M<=p)&&(u===0||M>=t&&M<=i||M>=i&&M<=t)){var w=(_*B-f*E)/S;if((w>=m&&w<=O||w>=O&&w<=m)&&(f===0||w>=e&&w<=a||w>=a&&w<=e)){if(l!==null){var P=M-t;if(P<0){P=-P}if(c===0){d=P;y=P;g=M;v=w;b=M;D=w;if(h!==null){h.x=Math.atan2(O-m,A-p)-Math.PI*.5;h.y=h.x}}else{if(Py){y=P;b=M;D=w;if(h!==null){h.y=Math.atan2(O-m,A-p)-Math.PI*.5}}}c++}else{g=M;v=w;b=M;D=w;c++;if(h!==null){h.x=Math.atan2(O-m,A-p)-Math.PI*.5;h.y=h.x}break}}}p=A;m=O}if(c===1){if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=g;l.y=v}if(h!==null){h.y=h.x+Math.PI}}else if(c>1){c++;if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=b;l.y=D}}return c};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.weight!==null){this.weight.returnToPool()}this.type=2;this.count=0;this.offset=0;this.x=0;this.y=0;this.vertices=null;this.weight=null};e.prototype.containsPoint=function(t,e){var i=false;if(t>=this.x&&t<=this.width&&e>=this.y&&e<=this.height){for(var a=0,r=this.count,n=r-2;a=e||s=e){var l=this.vertices[this.offset+n];var h=this.vertices[this.offset+a];if((e-o)*(l-h)/(s-o)+h0){return}this.cacheFrameRate=Math.max(Math.ceil(t*this.scale),1);var e=Math.ceil(this.cacheFrameRate*this.duration)+1;this.cachedFrames.length=e;for(var i=0,a=this.cacheFrames.length;i=0};e.prototype.addBoneMask=function(t,e,i){if(i===void 0){i=true}var a=t.getBone(e);if(a===null){return}if(this.boneMask.indexOf(e)<0){this.boneMask.push(e)}if(i){for(var r=0,n=t.getBones();r=0){this.boneMask.splice(a,1)}if(i){var r=t.getBone(e);if(r!==null){if(this.boneMask.length>0){for(var n=0,s=t.getBones();n=0&&r.contains(o)){this.boneMask.splice(l,1)}}}else{for(var h=0,u=t.getBones();he._zOrder?1:-1};i.prototype._onClear=function(){if(this._clock!==null){this._clock.remove(this)}for(var t=0,e=this._bones;t=t){i=0}if(this._bones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s=n){continue}var o=i[s];var l=this.getSlot(o.name);if(l!==null){l._setZorder(r)}}this._slotsDirty=true;this._zOrderDirty=!a}};i.prototype._addBoneToBoneList=function(t){if(this._bones.indexOf(t)<0){this._bonesDirty=true;this._bones.push(t);this._animation._timelineDirty=true}};i.prototype._removeBoneFromBoneList=function(t){var e=this._bones.indexOf(t);if(e>=0){this._bones.splice(e,1);this._animation._timelineDirty=true}};i.prototype._addSlotToSlotList=function(t){if(this._slots.indexOf(t)<0){this._slotsDirty=true;this._slots.push(t);this._animation._timelineDirty=true}};i.prototype._removeSlotFromSlotList=function(t){var e=this._slots.indexOf(t);if(e>=0){this._slots.splice(e,1);this._animation._timelineDirty=true}};i.prototype._bufferAction=function(t,e){if(this._actions.indexOf(t)<0){if(e){this._actions.push(t)}else{this._actions.unshift(t)}}};i.prototype.dispose=function(){if(this.armatureData!==null){this._lockUpdate=true;this._dragonBones.bufferObject(this)}};i.prototype.init=function(e,i,a,r){if(this.armatureData!==null){return}this.armatureData=e;this._animation=t.BaseObject.borrowObject(t.Animation);this._proxy=i;this._display=a;this._dragonBones=r;this._proxy.init(this);this._animation.init(this);this._animation.animations=this.armatureData.animations};i.prototype.advanceTime=function(e){if(this._lockUpdate){return}if(this.armatureData===null){console.assert(false,"The armature has been disposed.");return}else if(this.armatureData.parent===null){console.assert(false,"The armature data has been disposed.");return}var i=this._cacheFrameIndex;this._animation.advanceTime(e);if(this._bonesDirty){this._bonesDirty=false;this._sortBones()}if(this._slotsDirty){this._slotsDirty=false;this._sortSlots()}if(this._cacheFrameIndex<0||this._cacheFrameIndex!==i){var a=0,r=0;for(a=0,r=this._bones.length;a0){this._lockUpdate=true;for(var n=0,s=this._actions;n0){var i=this.getBone(t);if(i!==null){i.invalidUpdate();if(e){for(var a=0,r=this._slots;a0){if(r!==null||n!==null){if(r!==null){var T=o?r.y-e:r.x-t;if(T<0){T=-T}if(d===null||Th){h=T;_=n.x;c=n.y;y=b;if(s!==null){m=s.y}}}}else{d=b;break}}}if(d!==null&&r!==null){r.x=u;r.y=f;if(s!==null){s.x=p}}if(y!==null&&n!==null){n.x=_;n.y=c;if(s!==null){s.y=m}}return d};i.prototype.getBone=function(t){for(var e=0,i=this._bones;e=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else{if(this.constraints.length>0){for(var i=0,a=this.constraints;i=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}}else{if(this.constraints.length>0){for(var n=0,s=this.constraints;n=0;if(this._localDirty){this._updateGlobalTransformMatrix(o)}if(o&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}}else if(this._childrenTransformDirty){this._childrenTransformDirty=false}this._localDirty=true};i.prototype.updateByConstraint=function(){if(this._localDirty){this._localDirty=false;if(this._transformDirty||this._parent!==null&&this._parent._childrenTransformDirty){this._updateGlobalTransformMatrix(true)}this._transformDirty=true}};i.prototype.addConstraint=function(t){if(this.constraints.indexOf(t)<0){this.constraints.push(t)}};i.prototype.invalidUpdate=function(){this._transformDirty=true};i.prototype.contains=function(t){if(t===this){return false}var e=t;while(e!==this&&e!==null){e=e.parent}return e===this};i.prototype.getBones=function(){this._bones.length=0;for(var t=0,e=this._armature.getBones();t=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex0){for(var o=0,l=n;o0){if(this._displayList.length!==e.length){this._displayList.length=e.length}for(var i=0,a=e.length;i0){this._displayList.length=0}if(this._displayIndex>=0&&this._displayIndex=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else if(this._transformDirty||this._parent._childrenTransformDirty){this._transformDirty=true;this._cachedFrameIndex=-1}else if(this._cachedFrameIndex>=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}else if(this._transformDirty||this._parent._childrenTransformDirty){t=-1;this._transformDirty=true;this._cachedFrameIndex=-1}if(this._display===null){return}if(this._blendModeDirty){this._blendModeDirty=false;this._updateBlendMode()}if(this._colorDirty){this._colorDirty=false;this._updateColor()}if(this._meshData!==null&&this._display===this._meshDisplay){var i=this._meshData.weight!==null;if(this._meshDirty||i&&this._isMeshBonesUpdate()){this._meshDirty=false;this._updateMesh()}if(i){if(this._transformDirty){this._transformDirty=false;this._updateTransform(true)}return}}if(this._transformDirty){this._transformDirty=false;if(this._cachedFrameIndex<0){var a=t>=0;this._updateGlobalTransformMatrix(a);if(a&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}this._updateTransform(false)}};i.prototype.updateTransformAndMatrix=function(){if(this._transformDirty){this._transformDirty=false;this._updateGlobalTransformMatrix(false)}};i.prototype.containsPoint=function(t,e){if(this._boundingBoxData===null){return false}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);return this._boundingBoxData.containsPoint(i._helpPoint.x,i._helpPoint.y)};i.prototype.intersectsSegment=function(t,e,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}if(this._boundingBoxData===null){return 0}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);t=i._helpPoint.x;e=i._helpPoint.y;i._helpMatrix.transformPoint(a,r,i._helpPoint);a=i._helpPoint.x;r=i._helpPoint.y;var l=this._boundingBoxData.intersectsSegment(t,e,a,r,n,s,o);if(l>0){if(l===1||l===2){if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n);if(s!==null){s.x=n.x;s.y=n.y}}else if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}else{if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n)}if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}if(o!==null){this.globalTransformMatrix.transformPoint(Math.cos(o.x),Math.sin(o.x),i._helpPoint,true);o.x=Math.atan2(i._helpPoint.y,i._helpPoint.x);this.globalTransformMatrix.transformPoint(Math.cos(o.y),Math.sin(o.y),i._helpPoint,true);o.y=Math.atan2(i._helpPoint.y,i._helpPoint.x)}}return l};i.prototype.invalidUpdate=function(){this._displayDirty=true;this._transformDirty=true};Object.defineProperty(i.prototype,"displayIndex",{get:function(){return this._displayIndex},set:function(t){if(this._setDisplayIndex(t)){this.update(-1)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"displayList",{get:function(){return this._displayList.concat()},set:function(e){var i=this._displayList.concat();var a=new Array;if(this._setDisplayList(e)){this.update(-1)}for(var r=0,n=i;r0){this._animatebles[e-i]=r;this._animatebles[e]=null}r.advanceTime(t)}else{i++}}if(i>0){a=this._animatebles.length;for(;e=0};t.prototype.add=function(t){if(this._animatebles.indexOf(t)<0){this._animatebles.push(t);t.clock=this}};t.prototype.remove=function(t){var e=this._animatebles.indexOf(t);if(e>=0){this._animatebles[e]=null;t.clock=null}};t.prototype.clear=function(){for(var t=0,e=this._animatebles;t0&&i._subFadeState>0){this._armature._dragonBones.bufferObject(i);this._animationStates.length=0;this._lastAnimationState=null}else{var a=i.animationData;var r=a.cacheFrameRate;if(this._animationDirty&&r>0){this._animationDirty=false;for(var n=0,s=this._armature.getBones();n1){for(var f=0,_=0;f0&&i._subFadeState>0){_++;this._armature._dragonBones.bufferObject(i);this._animationDirty=true;if(this._lastAnimationState===i){this._lastAnimationState=null}}else{if(_>0){this._animationStates[f-_]=i}if(this._timelineDirty){i.updateTimelines()}i.advanceTime(t,0)}if(f===e-1&&_>0){this._animationStates.length-=_;if(this._lastAnimationState===null&&this._animationStates.length>0){this._lastAnimationState=this._animationStates[this._animationStates.length-1]}}}this._armature._cacheFrameIndex=-1}else{this._armature._cacheFrameIndex=-1}this._timelineDirty=false};i.prototype.reset=function(){for(var t=0,e=this._animationStates;t1){if(e.position<0){e.position%=a.duration;e.position=a.duration-e.position}else if(e.position===a.duration){e.position-=1e-6}else if(e.position>a.duration){e.position%=a.duration}if(e.duration>0&&e.position+e.duration>a.duration){e.duration=a.duration-e.position}if(e.playTimes<0){e.playTimes=a.playTimes}}else{e.playTimes=1;e.position=0;if(e.duration>0){e.duration=0}}if(e.duration===0){e.duration=-1}this._fadeOut(e);var o=t.BaseObject.borrowObject(t.AnimationState);o.init(this._armature,a,e);this._animationDirty=true;this._armature._cacheFrameIndex=-1;if(this._animationStates.length>0){var l=false;for(var h=0,u=this._animationStates.length;h=this._animationStates[h].layer){}else{l=true;this._animationStates.splice(h+1,0,o);break}}if(!l){this._animationStates.push(o)}}else{this._animationStates.push(o)}for(var f=0,_=this._armature.getSlots();f<_.length;f++){var c=_[f];var p=c.childArmature;if(p!==null&&p.inheritAnimation&&p.animation.hasAnimation(i)&&p.animation.getState(i)===null){p.animation.fadeIn(i)}}if(e.fadeInTime<=0){this._armature.advanceTime(0)}this._lastAnimationState=o;return o};i.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t!==null?t:"";if(t!==null&&t.length>0){this.playConfig(this._animationConfig)}else if(this._lastAnimationState===null){var i=this._armature.armatureData.defaultAnimation;if(i!==null){this._animationConfig.animation=i.name;this.playConfig(this._animationConfig)}}else if(!this._lastAnimationState.isPlaying&&!this._lastAnimationState.isCompleted){this._lastAnimationState.play()}else{this._animationConfig.animation=this._lastAnimationState.name;this.playConfig(this._animationConfig)}return this._lastAnimationState};i.prototype.fadeIn=function(t,e,i,a,r,n){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=0}if(r===void 0){r=null}if(n===void 0){n=3}this._animationConfig.clear();this._animationConfig.fadeOutMode=n;this._animationConfig.playTimes=i;this._animationConfig.layer=a;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=r!==null?r:"";return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByTime=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.position=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByFrame=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*e/a.frameCount}return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByProgress=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*(e>0?e:0)}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStopByTime=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByTime(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByFrame=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByFrame(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByProgress=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByProgress(t,e,1);if(i!==null){i.stop()}return i};i.prototype.getState=function(t){var e=this._animationStates.length;while(e--){var i=this._animationStates[e];if(i.name===t){return i}}return null};i.prototype.hasAnimation=function(t){return t in this._animations};i.prototype.getStates=function(){return this._animationStates};Object.defineProperty(i.prototype,"isPlaying",{get:function(){for(var t=0,e=this._animationStates;t0},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationName",{get:function(){return this._lastAnimationState!==null?this._lastAnimationState.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationNames",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animations",{get:function(){return this._animations},set:function(t){if(this._animations===t){return}this._animationNames.length=0;for(var e in this._animations){delete this._animations[e]}for(var e in t){this._animations[e]=t[e];this._animationNames.push(e)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationConfig",{get:function(){this._animationConfig.clear();return this._animationConfig},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationState",{get:function(){return this._lastAnimationState},enumerable:true,configurable:true});i.prototype.gotoAndPlay=function(t,e,i,a,r,n,s,o,l){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=-1}if(r===void 0){r=0}if(n===void 0){n=null}if(s===void 0){s=3}if(o===void 0){o=true}if(l===void 0){l=true}o;l;this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.fadeOutMode=s;this._animationConfig.playTimes=a;this._animationConfig.layer=r;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=n!==null?n:"";var h=this._animations[t];if(h&&i>0){this._animationConfig.timeScale=h.duration/i}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStop=function(t,e){if(e===void 0){e=0}return this.gotoAndStopByTime(t,e)};Object.defineProperty(i.prototype,"animationList",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationDataList",{get:function(){var t=[];for(var e=0,i=this._animationNames.length;e0;if(this._subFadeState<0){this._subFadeState=0;var a=i?t.EventObject.FADE_OUT:t.EventObject.FADE_IN;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}if(e<0){e=-e}this._fadeTime+=e;if(this._fadeTime>=this.fadeTotalTime){this._subFadeState=1;this._fadeProgress=i?0:1}else if(this._fadeTime>0){this._fadeProgress=i?1-this._fadeTime/this.fadeTotalTime:this._fadeTime/this.fadeTotalTime}else{this._fadeProgress=i?1:0}if(this._subFadeState>0){if(!i){this._playheadState|=1;this._fadeState=0}var a=i?t.EventObject.FADE_OUT_COMPLETE:t.EventObject.FADE_IN_COMPLETE;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}};a.prototype._blendBoneTimline=function(t){var e=t.bone;var i=t.bonePose.result;var a=e.animationPose;var r=this._weightResult>0?this._weightResult:-this._weightResult;if(!e._blendDirty){e._blendDirty=true;e._blendLayer=this.layer;e._blendLayerWeight=r;e._blendLeftWeight=1;a.x=i.x*r;a.y=i.y*r;a.rotation=i.rotation*r;a.skew=i.skew*r;a.scaleX=(i.scaleX-1)*r+1;a.scaleY=(i.scaleY-1)*r+1}else{r*=e._blendLeftWeight;e._blendLayerWeight+=r;a.x+=i.x*r;a.y+=i.y*r;a.rotation+=i.rotation*r;a.skew+=i.skew*r;a.scaleX+=(i.scaleX-1)*r;a.scaleY+=(i.scaleY-1)*r}if(this._fadeState!==0||this._subFadeState!==0){e._transformDirty=true}};a.prototype.init=function(e,i,a){if(this._armature!==null){return}this._armature=e;this.animationData=i;this.resetToPose=a.resetToPose;this.additiveBlending=a.additiveBlending;this.displayControl=a.displayControl;this.actionEnabled=a.actionEnabled;this.layer=a.layer;this.playTimes=a.playTimes;this.timeScale=a.timeScale;this.fadeTotalTime=a.fadeInTime;this.autoFadeOutTime=a.autoFadeOutTime;this.weight=a.weight;this.name=a.name.length>0?a.name:a.animation;this.group=a.group;if(a.pauseFadeIn){this._playheadState=2}else{this._playheadState=3}if(a.duration<0){this._position=0;this._duration=this.animationData.duration;if(a.position!==0){if(this.timeScale>=0){this._time=a.position}else{this._time=a.position-this._duration}}else{this._time=0}}else{this._position=a.position;this._duration=a.duration;this._time=0}if(this.timeScale<0&&this._time===0){this._time=-1e-6}if(this.fadeTotalTime<=0){this._fadeProgress=.999999}if(a.boneMask.length>0){this._boneMask.length=a.boneMask.length;for(var r=0,n=this._boneMask.length;r0;var a=true;var r=true;var n=this._time;this._weightResult=this.weight*this._fadeProgress;this._actionTimeline.update(n);if(i){var s=e*2;this._actionTimeline.currentTime=Math.floor(this._actionTimeline.currentTime*s)/s}if(this._zOrderTimeline!==null){this._zOrderTimeline.update(n)}if(i){var o=Math.floor(this._actionTimeline.currentTime*e);if(this._armature._cacheFrameIndex===o){a=false;r=false}else{this._armature._cacheFrameIndex=o;if(this.animationData.cachedFrames[o]){r=false}else{this.animationData.cachedFrames[o]=true}}}if(a){if(r){var l=null;var h=null;for(var u=0,f=this._boneTimelines.length;u0){if(l._blendLayer!==this.layer){if(l._blendLayerWeight>=l._blendLeftWeight){l._blendLeftWeight=0;l=null}else{l._blendLayer=this.layer;l._blendLeftWeight-=l._blendLayerWeight;l._blendLayerWeight=0}}}else{l=null}}}l=_.bone}if(l!==null){_.update(n);if(u===f-1){this._blendBoneTimline(_)}else{h=_}}}}for(var u=0,f=this._slotTimelines.length;u0){this._subFadeState=0}if(this._actionTimeline.playState>0){if(this.autoFadeOutTime>=0){this.fadeOut(this.autoFadeOutTime)}}}};a.prototype.play=function(){this._playheadState=3};a.prototype.stop=function(){this._playheadState&=1};a.prototype.fadeOut=function(t,e){if(e===void 0){e=true}if(t<0){t=0}if(e){this._playheadState&=2}if(this._fadeState>0){if(t>this.fadeTotalTime-this._fadeTime){return}}else{this._fadeState=1;this._subFadeState=-1;if(t<=0||this._fadeProgress<=0){this._fadeProgress=1e-6}for(var i=0,a=this._boneTimelines;i1e-6?t/this._fadeProgress:0;this._fadeTime=this.fadeTotalTime*(1-this._fadeProgress)};a.prototype.containsBoneMask=function(t){return this._boneMask.length===0||this._boneMask.indexOf(t)>=0};a.prototype.addBoneMask=function(t,e){if(e===void 0){e=true}var i=this._armature.getBone(t);if(i===null){return}if(this._boneMask.indexOf(t)<0){this._boneMask.push(t)}if(e){for(var a=0,r=this._armature.getBones();a=0){this._boneMask.splice(i,1)}if(e){var a=this._armature.getBone(t);if(a!==null){var r=this._armature.getBones();if(this._boneMask.length>0){for(var n=0,s=r;n=0&&a.contains(o)){this._boneMask.splice(l,1)}}}else{for(var h=0,u=r;h0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isFadeComplete",{get:function(){return this._fadeState===0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isPlaying",{get:function(){return(this._playheadState&2)!==0&&this._actionTimeline.playState<=0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isCompleted",{get:function(){return this._actionTimeline.playState>0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentPlayTimes",{get:function(){return this._actionTimeline.currentPlayTimes},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"totalTime",{get:function(){return this._duration},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentTime",{get:function(){return this._actionTimeline.currentTime},set:function(t){var e=this._actionTimeline.currentPlayTimes-(this._actionTimeline.playState>0?1:0);if(t<0||this._duration0&&e===this.playTimes-1&&t===this._duration){t=this._duration-1e-6}if(this._time===t){return}this._time=t;this._actionTimeline.setCurrentTime(this._time);if(this._zOrderTimeline!==null){this._zOrderTimeline.playState=-1}for(var i=0,a=this._boneTimelines;i=0?1:-1;this.currentPlayTimes=1;this.currentTime=this._actionTimeline.currentTime}else if(this._actionTimeline===null||this._timeScale!==1||this._timeOffset!==0){var r=this._animationState.playTimes;var n=r*this._duration;t*=this._timeScale;if(this._timeOffset!==0){t+=this._timeOffset*this._animationData.duration}if(r>0&&(t>=n||t<=-n)){if(this.playState<=0&&this._animationState._playheadState===3){this.playState=1}this.currentPlayTimes=r;if(t<0){this.currentTime=0}else{this.currentTime=this._duration}}else{if(this.playState!==0&&this._animationState._playheadState===3){this.playState=0}if(t<0){t=-t;this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=this._duration-t%this._duration}else{this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=t%this._duration}}this.currentTime+=this._position}else{this.playState=this._actionTimeline.playState;this.currentPlayTimes=this._actionTimeline.currentPlayTimes;this.currentTime=this._actionTimeline.currentTime}if(this.currentPlayTimes===i&&this.currentTime===a){return false}if(e<0&&this.playState!==e||this.playState<=0&&this.currentPlayTimes!==i){this._frameIndex=-1}return true};e.prototype.init=function(t,e,i){this._armature=t;this._animationState=e;this._timelineData=i;this._actionTimeline=this._animationState._actionTimeline;if(this===this._actionTimeline){this._actionTimeline=null}this._frameRate=this._armature.armatureData.frameRate;this._frameRateR=1/this._frameRate;this._position=this._animationState._position;this._duration=this._animationState._duration;this._dragonBonesData=this._armature.armatureData.parent;this._animationData=this._animationState.animationData;if(this._timelineData!==null){this._frameIntArray=this._dragonBonesData.frameIntArray;this._frameFloatArray=this._dragonBonesData.frameFloatArray;this._frameArray=this._dragonBonesData.frameArray;this._timelineArray=this._dragonBonesData.timelineArray;this._frameIndices=this._dragonBonesData.frameIndices;this._frameCount=this._timelineArray[this._timelineData.offset+2];this._frameValueOffset=this._timelineArray[this._timelineData.offset+4];this._timeScale=100/this._timelineArray[this._timelineData.offset+0];this._timeOffset=this._timelineArray[this._timelineData.offset+1]*.01}};e.prototype.fadeOut=function(){};e.prototype.update=function(t){if(this.playState<=0&&this._setCurrentTime(t)){if(this._frameCount>1){var e=Math.floor(this.currentTime*this._frameRate);var i=this._frameIndices[this._timelineData.frameIndicesOffset+e];if(this._frameIndex!==i){this._frameIndex=i;this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5+this._frameIndex];this._onArriveAtFrame()}}else if(this._frameIndex<0){this._frameIndex=0;if(this._timelineData!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5]}this._onArriveAtFrame()}if(this._tweenState!==0){this._onUpdateFrame()}}};return e}(t.BaseObject);t.TimelineState=e;var i=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e._getEasingValue=function(t,e,i){var a=e;switch(t){case 3:a=Math.pow(e,2);break;case 4:a=1-Math.pow(1-e,2);break;case 5:a=.5*(1-Math.cos(e*Math.PI));break}return(a-e)*i+e};e._getEasingCurveValue=function(t,e,i,a){if(t<=0){return 0}else if(t>=1){return 1}var r=i+1;var n=Math.floor(t*r);var s=n===0?0:e[a+n-1];var o=n===r-1?1e4:e[a+n];return(s+(o-s)*(t*r-n))*1e-4};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._tweenType=0;this._curveCount=0;this._framePosition=0;this._frameDurationR=0;this._tweenProgress=0;this._tweenEasing=0};e.prototype._onArriveAtFrame=function(){if(this._frameCount>1&&(this._frameIndex!==this._frameCount-1||this._animationState.playTimes===0||this._animationState.currentPlayTimes0){if(n.hasEvent(t.EventObject.COMPLETE)){h=t.BaseObject.borrowObject(t.EventObject);h.type=t.EventObject.COMPLETE;h.armature=this._armature;h.animationState=this._animationState}}}if(this._frameCount>1){var u=this._timelineData;var f=Math.floor(this.currentTime*this._frameRate);var _=this._frameIndices[u.frameIndicesOffset+f];if(this._frameIndex!==_){var c=this._frameIndex;this._frameIndex=_;if(this._timelineArray!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[u.offset+5+this._frameIndex];if(o){if(c<0){var p=Math.floor(r*this._frameRate);c=this._frameIndices[u.frameIndicesOffset+p];if(this.currentPlayTimes===a){if(c===_){c=-1}}}while(c>=0){var m=this._animationData.frameOffset+this._timelineArray[u.offset+5+c];var d=this._frameArray[m]/this._frameRate;if(this._position<=d&&d<=this._position+this._duration){this._onCrossFrame(c)}if(l!==null&&c===0){this._armature._dragonBones.bufferEvent(l);l=null}if(c>0){c--}else{c=this._frameCount-1}if(c===_){break}}}else{if(c<0){var p=Math.floor(r*this._frameRate);c=this._frameIndices[u.frameIndicesOffset+p];var m=this._animationData.frameOffset+this._timelineArray[u.offset+5+c];var d=this._frameArray[m]/this._frameRate;if(this.currentPlayTimes===a){if(r<=d){if(c>0){c--}else{c=this._frameCount-1}}else if(c===_){c=-1}}}while(c>=0){if(c=0){var t=this._frameArray[this._frameOffset+1];if(t>0){this._armature._sortZOrder(this._frameArray,this._frameOffset+2)}else{this._armature._sortZOrder(null,0)}}};e.prototype._onUpdateFrame=function(){};return e}(t.TimelineState);t.ZOrderTimelineState=i;var a=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.toString=function(){return"[class dragonBones.BoneAllTimelineState]"};i.prototype._onArriveAtFrame=function(){e.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var t=this._dragonBonesData.frameFloatArray;var i=this.bonePose.current;var a=this.bonePose.delta;var r=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*6;i.x=t[r++];i.y=t[r++];i.rotation=t[r++];i.skew=t[r++];i.scaleX=t[r++];i.scaleY=t[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}a.x=t[r++]-i.x;a.y=t[r++]-i.y;a.rotation=t[r++]-i.rotation;a.skew=t[r++]-i.skew;a.scaleX=t[r++]-i.scaleX;a.scaleY=t[r++]-i.scaleY}}else{var i=this.bonePose.current;i.x=0;i.y=0;i.rotation=0;i.skew=0;i.scaleX=1;i.scaleY=1}};i.prototype._onUpdateFrame=function(){e.prototype._onUpdateFrame.call(this);var t=this.bonePose.current;var i=this.bonePose.delta;var a=this.bonePose.result;this.bone._transformDirty=true;if(this._tweenState!==2){this._tweenState=0}var r=this._armature.armatureData.scale;a.x=(t.x+i.x*this._tweenProgress)*r;a.y=(t.y+i.y*this._tweenProgress)*r;a.rotation=t.rotation+i.rotation*this._tweenProgress;a.skew=t.skew+i.skew*this._tweenProgress;a.scaleX=t.scaleX+i.scaleX*this._tweenProgress;a.scaleY=t.scaleY+i.scaleY*this._tweenProgress};i.prototype.fadeOut=function(){var e=this.bonePose.result;e.rotation=t.Transform.normalizeRadian(e.rotation);e.skew=t.Transform.normalizeRadian(e.skew)};return i}(t.BoneTimelineState);t.BoneAllTimelineState=a;var r=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.SlotDislayIndexTimelineState]"};e.prototype._onArriveAtFrame=function(){if(this.playState>=0){var t=this._timelineData!==null?this._frameArray[this._frameOffset+1]:this.slot.slotData.displayIndex;if(this.slot.displayIndex!==t){this.slot._setDisplayIndex(t,true)}}};return e}(t.SlotTimelineState);t.SlotDislayIndexTimelineState=r;var n=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[0,0,0,0,0,0,0,0];e._delta=[0,0,0,0,0,0,0,0];e._result=[0,0,0,0,0,0,0,0];return e}e.toString=function(){return"[class dragonBones.SlotColorTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._dirty=false};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._dragonBonesData.intArray;var i=this._dragonBonesData.frameIntArray;var a=this._animationData.frameIntOffset+this._frameValueOffset+this._frameIndex*1;var r=i[a];this._current[0]=e[r++];this._current[1]=e[r++];this._current[2]=e[r++];this._current[3]=e[r++];this._current[4]=e[r++];this._current[5]=e[r++];this._current[6]=e[r++];this._current[7]=e[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=i[this._animationData.frameIntOffset+this._frameValueOffset]}else{r=i[a+1*1]}this._delta[0]=e[r++]-this._current[0];this._delta[1]=e[r++]-this._current[1];this._delta[2]=e[r++]-this._current[2];this._delta[3]=e[r++]-this._current[3];this._delta[4]=e[r++]-this._current[4];this._delta[5]=e[r++]-this._current[5];this._delta[6]=e[r++]-this._current[6];this._delta[7]=e[r++]-this._current[7]}}else{var n=this.slot.slotData.color;this._current[0]=n.alphaMultiplier*100;this._current[1]=n.redMultiplier*100;this._current[2]=n.greenMultiplier*100;this._current[3]=n.blueMultiplier*100;this._current[4]=n.alphaOffset;this._current[5]=n.redOffset;this._current[6]=n.greenOffset;this._current[7]=n.blueOffset}};e.prototype._onUpdateFrame=function(){t.prototype._onUpdateFrame.call(this);this._dirty=true;if(this._tweenState!==2){this._tweenState=0}this._result[0]=(this._current[0]+this._delta[0]*this._tweenProgress)*.01;this._result[1]=(this._current[1]+this._delta[1]*this._tweenProgress)*.01;this._result[2]=(this._current[2]+this._delta[2]*this._tweenProgress)*.01;this._result[3]=(this._current[3]+this._delta[3]*this._tweenProgress)*.01;this._result[4]=this._current[4]+this._delta[4]*this._tweenProgress;this._result[5]=this._current[5]+this._delta[5]*this._tweenProgress;this._result[6]=this._current[6]+this._delta[6]*this._tweenProgress;this._result[7]=this._current[7]+this._delta[7]*this._tweenProgress};e.prototype.fadeOut=function(){this._tweenState=0;this._dirty=false};e.prototype.update=function(e){t.prototype.update.call(this,e);if(this._tweenState!==0||this._dirty){var i=this.slot._colorTransform;if(this._animationState._fadeState!==0||this._animationState._subFadeState!==0){if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){var a=Math.pow(this._animationState._fadeProgress,4);i.alphaMultiplier+=(this._result[0]-i.alphaMultiplier)*a;i.redMultiplier+=(this._result[1]-i.redMultiplier)*a;i.greenMultiplier+=(this._result[2]-i.greenMultiplier)*a;i.blueMultiplier+=(this._result[3]-i.blueMultiplier)*a;i.alphaOffset+=(this._result[4]-i.alphaOffset)*a;i.redOffset+=(this._result[5]-i.redOffset)*a;i.greenOffset+=(this._result[6]-i.greenOffset)*a;i.blueOffset+=(this._result[7]-i.blueOffset)*a;this.slot._colorDirty=true}}else if(this._dirty){this._dirty=false;if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){i.alphaMultiplier=this._result[0];i.redMultiplier=this._result[1];i.greenMultiplier=this._result[2];i.blueMultiplier=this._result[3];i.alphaOffset=this._result[4];i.redOffset=this._result[5];i.greenOffset=this._result[6];i.blueOffset=this._result[7];this.slot._colorDirty=true}}}};return e}(t.SlotTimelineState);t.SlotColorTimelineState=n;var s=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[];e._delta=[];e._result=[];return e}e.toString=function(){return"[class dragonBones.SlotFFDTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.meshOffset=0;this._dirty=false;this._frameFloatOffset=0;this._valueCount=0;this._ffdCount=0;this._valueOffset=0;this._current.length=0;this._delta.length=0;this._result.length=0};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._tweenState===2;var i=this._dragonBonesData.frameFloatArray;var a=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*this._valueCount;if(e){var r=a+this._valueCount;if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}for(var n=0;n255){return encodeURI(r)}}}return r}return String(r)}return a};a.prototype._getCurvePoint=function(t,e,i,a,r,n,s,o,l,h){var u=1-l;var f=u*u;var _=l*l;var c=u*f;var p=3*l*f;var m=3*u*_;var d=l*_;h.x=c*t+p*i+m*r+d*s;h.y=c*e+p*a+m*n+d*o};a.prototype._samplingEasingCurve=function(t,e){var i=t.length;var a=-2;for(var r=0,n=e.length;r=0&&a+61e-4){var g=(y+d)*.5;this._getCurvePoint(l,h,u,f,_,c,p,m,g,this._helpPoint);if(s-this._helpPoint.x>0){d=g}else{y=g}}e[r]=this._helpPoint.y}};a.prototype._sortActionFrame=function(t,e){return t.frameStart>e.frameStart?1:-1};a.prototype._parseActionDataInFrame=function(t,e,i,r){if(a.EVENT in t){this._mergeActionFrame(t[a.EVENT],e,10,i,r)}if(a.SOUND in t){this._mergeActionFrame(t[a.SOUND],e,11,i,r)}if(a.ACTION in t){this._mergeActionFrame(t[a.ACTION],e,0,i,r)}if(a.EVENTS in t){this._mergeActionFrame(t[a.EVENTS],e,10,i,r)}if(a.ACTIONS in t){this._mergeActionFrame(t[a.ACTIONS],e,0,i,r)}};a.prototype._mergeActionFrame=function(e,a,r,n,s){var o=t.DragonBones.webAssembly?this._armature.actions.size():this._armature.actions.length;var l=this._parseActionData(e,this._armature.actions,r,n,s);var h=null;if(this._actionFrames.length===0){h=new i;h.frameStart=0;this._actionFrames.push(h);h=null}for(var u=0,f=this._actionFrames;u0){var p=r.getBone(_);if(p!==null){c.parent=p}else{(this._cacheBones[_]=this._cacheBones[_]||[]).push(c)}}if(c.name in this._cacheBones){for(var m=0,d=this._cacheBones[c.name];m0){n.root=i.parent}if(t.DragonBones.webAssembly){i.constraints.push_back(n)}else{i.constraints.push(n)}};a.prototype._parseSlot=function(e){var i=t.DragonBones.webAssembly?new Module["SlotData"]:t.BaseObject.borrowObject(t.SlotData);i.displayIndex=a._getNumber(e,a.DISPLAY_INDEX,0);i.zOrder=t.DragonBones.webAssembly?this._armature.sortedSlots.size():this._armature.sortedSlots.length;i.name=a._getString(e,a.NAME,"");i.parent=this._armature.getBone(a._getString(e,a.PARENT,""));if(a.BLEND_MODE in e&&typeof e[a.BLEND_MODE]==="string"){i.blendMode=a._getBlendMode(e[a.BLEND_MODE])}else{i.blendMode=a._getNumber(e,a.BLEND_MODE,0)}if(a.COLOR in e){i.color=t.DragonBones.webAssembly?Module["SlotData"].createColor():t.SlotData.createColor();this._parseColorTransform(e[a.COLOR],i.color)}else{i.color=t.DragonBones.webAssembly?Module["SlotData"].DEFAULT_COLOR:t.SlotData.DEFAULT_COLOR}if(a.ACTIONS in e){var r=this._slotChildActions[i.name]=[];this._parseActionData(e[a.ACTIONS],r,0,null,null)}return i};a.prototype._parseSkin=function(e){var i=t.DragonBones.webAssembly?new Module["SkinData"]:t.BaseObject.borrowObject(t.SkinData);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length===0){i.name=a.DEFAULT_NAME}if(a.SLOT in e){this._skin=i;var r=e[a.SLOT];for(var n=0,s=r;n0?n:r;this._parsePivot(e,o);break;case 1:var l=i=t.DragonBones.webAssembly?new Module["ArmatureDisplayData"]:t.BaseObject.borrowObject(t.ArmatureDisplayData);l.name=r;l.path=n.length>0?n:r;l.inheritAnimation=true;if(a.ACTIONS in e){this._parseActionData(e[a.ACTIONS],l.actions,0,null,null)}else if(this._slot.name in this._slotChildActions){var h=this._skin.getDisplays(this._slot.name);if(h===null?this._slot.displayIndex===0:this._slot.displayIndex===h.length){for(var u=0,f=this._slotChildActions[this._slot.name];u0?n:r;c.inheritAnimation=a._getBoolean(e,a.INHERIT_FFD,true);this._parsePivot(e,c);var p=a._getString(e,a.SHARE,"");if(p.length>0){var m=this._meshs[p];c.offset=m.offset;c.weight=m.weight}else{this._parseMesh(e,c);this._meshs[c.name]=c}break;case 3:var d=this._parseBoundingBox(e);if(d!==null){var y=i=t.DragonBones.webAssembly?new Module["BoundingBoxDisplayData"]:t.BaseObject.borrowObject(t.BoundingBoxDisplayData);y.name=r;y.path=n.length>0?n:r;y.boundingBox=d}break}if(i!==null){i.parent=this._armature;if(a.TRANSFORM in e){this._parseTransform(e[a.TRANSFORM],i.transform,this._armature.scale)}}return i};a.prototype._parsePivot=function(t,e){if(a.PIVOT in t){var i=t[a.PIVOT];e.pivot.x=a._getNumber(i,a.X,0);e.pivot.y=a._getNumber(i,a.Y,0)}else{e.pivot.x=.5;e.pivot.y=.5}};a.prototype._parseMesh=function(e,i){var r=e[a.VERTICES];var n=e[a.UVS];var s=e[a.TRIANGLES];var o=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var l=t.DragonBones.webAssembly?this._floatArrayJson:this._data.floatArray;var h=Math.floor(r.length/2);var u=Math.floor(s.length/3);var f=l.length;var _=f+h*2;i.offset=o.length;o.length+=1+1+1+1+u*3;o[i.offset+0]=h;o[i.offset+1]=u;o[i.offset+2]=f;for(var c=0,p=u*3;cn.width){n.width=h}if(un.height){n.height=u}}}return n};a.prototype._parseAnimation=function(e){var i=t.DragonBones.webAssembly?new Module["AnimationData"]:t.BaseObject.borrowObject(t.AnimationData);i.frameCount=Math.max(a._getNumber(e,a.DURATION,1),1);i.playTimes=a._getNumber(e,a.PLAY_TIMES,1);i.duration=i.frameCount/this._armature.frameRate;i.fadeInTime=a._getNumber(e,a.FADE_IN_TIME,0);i.scale=a._getNumber(e,a.SCALE,1);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length<1){i.name=a.DEFAULT_NAME}if(t.DragonBones.webAssembly){i.frameIntOffset=this._frameIntArrayJson.length;i.frameFloatOffset=this._frameFloatArrayJson.length;i.frameOffset=this._frameArrayJson.length}else{i.frameIntOffset=this._data.frameIntArray.length;i.frameFloatOffset=this._data.frameFloatArray.length;i.frameOffset=this._data.frameArray.length}this._animation=i;if(a.FRAME in e){var r=e[a.FRAME];var n=r.length;if(n>0){for(var s=0,o=0;s0){this._actionFrames.sort(this._sortActionFrame);var D=this._animation.actionTimeline=t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);var T=t.DragonBones.webAssembly?this._timelineArrayJson:this._data.timelineArray;var n=this._actionFrames.length;D.type=0;D.offset=T.length;T.length+=1+1+1+1+1+n;T[D.offset+0]=100;T[D.offset+1]=0;T[D.offset+2]=n;T[D.offset+3]=0;T[D.offset+4]=0;this._timeline=D;if(n===1){D.frameIndicesOffset=-1;T[D.offset+5+0]=this._parseCacheActionFrame(this._actionFrames[0])-this._animation.frameOffset}else{var A=this._animation.frameCount+1;var O=this._data.frameIndices;if(t.DragonBones.webAssembly){D.frameIndicesOffset=O.size();for(var x=0;x0){if(a.CURVE in t){var s=i+1;this._helpArray.length=s;this._samplingEasingCurve(t[a.CURVE],this._helpArray);r.length+=1+1+this._helpArray.length;r[n+1]=2;r[n+2]=s;for(var o=0;o0){var l=this._armature.sortedSlots.length;var h=new Array(l-o.length/2);var u=new Array(l);for(var f=0;f0?l>=this._prevRotation:l<=this._prevRotation){this._prevTweenRotate=this._prevTweenRotate>0?this._prevTweenRotate-1:this._prevTweenRotate+1}l=this._prevRotation+l-this._prevRotation+t.Transform.PI_D*this._prevTweenRotate}}this._prevTweenRotate=a._getNumber(e,a.TWEEN_ROTATE,0);this._prevRotation=l;var h=n.length;n.length+=6;n[h++]=this._helpTransform.x;n[h++]=this._helpTransform.y;n[h++]=l;n[h++]=this._helpTransform.skew;n[h++]=this._helpTransform.scaleX;n[h++]=this._helpTransform.scaleY;this._parseActionDataInFrame(e,i,this._bone,this._slot);return o};a.prototype._parseSlotDisplayIndexFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var s=this._parseFrame(e,i,r,n);n.length+=1;n[s+1]=a._getNumber(e,a.DISPLAY_INDEX,0);this._parseActionDataInFrame(e,i,this._slot.parent,this._slot);return s};a.prototype._parseSlotColorFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameIntArrayJson:this._data.frameIntArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=this._parseTweenFrame(e,i,r,o);var h=-1;if(a.COLOR in e){var u=e[a.COLOR];for(var f in u){f;this._parseColorTransform(u,this._helpColorTransform);h=n.length;n.length+=8;n[h++]=Math.round(this._helpColorTransform.alphaMultiplier*100);n[h++]=Math.round(this._helpColorTransform.redMultiplier*100);n[h++]=Math.round(this._helpColorTransform.greenMultiplier*100);n[h++]=Math.round(this._helpColorTransform.blueMultiplier*100);n[h++]=Math.round(this._helpColorTransform.alphaOffset);n[h++]=Math.round(this._helpColorTransform.redOffset);n[h++]=Math.round(this._helpColorTransform.greenOffset);n[h++]=Math.round(this._helpColorTransform.blueOffset);h-=8;break}}if(h<0){if(this._defalultColorOffset<0){this._defalultColorOffset=h=n.length;n.length+=8;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=0;n[h++]=0;n[h++]=0;n[h++]=0}h=this._defalultColorOffset}var _=s.length;s.length+=1;s[_]=h;return l};a.prototype._parseSlotFFDFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameFloatArrayJson:this._data.frameFloatArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=s.length;var h=this._parseTweenFrame(e,i,r,o);var u=a.VERTICES in e?e[a.VERTICES]:null;var f=a._getNumber(e,a.OFFSET,0);var _=n[this._mesh.offset+0];var c=0;var p=0;var m=0;var d=0;if(this._mesh.weight!==null){var y=this._weightSlotPose[this._mesh.name];this._helpMatrixA.copyFromArray(y,0);s.length+=this._mesh.weight.count*2;m=this._mesh.weight.offset+2+this._mesh.weight.bones.length}else{s.length+=_*2}for(var g=0;g<_*2;g+=2){if(u===null){c=0;p=0}else{if(g=u.length){c=0}else{c=u[g-f]}if(g+1=u.length){p=0}else{p=u[g+1-f]}}if(this._mesh.weight!==null){var v=this._weightBonePoses[this._mesh.name];var b=this._weightBoneIndices[this._mesh.name];var D=n[m++];this._helpMatrixA.transformPoint(c,p,this._helpPoint,true);c=this._helpPoint.x;p=this._helpPoint.y;for(var T=0;T=0||a.DATA_VERSIONS.indexOf(n)>=0){var s=t.DragonBones.webAssembly?new Module["DragonBonesData"]:t.BaseObject.borrowObject(t.DragonBonesData);s.version=r;s.name=a._getString(e,a.NAME,"");s.frameRate=a._getNumber(e,a.FRAME_RATE,24);if(s.frameRate===0){s.frameRate=24}if(a.ARMATURE in e){this._defalultColorOffset=-1;this._data=s;this._parseArray(e);var o=e[a.ARMATURE];for(var l=0,h=o;l0){this._parseWASMArray()}this._data=null}this._rawTextureAtlasIndex=0;if(a.TEXTURE_ATLAS in e){this._rawTextureAtlases=e[a.TEXTURE_ATLAS]}else{this._rawTextureAtlases=null}return s}else{console.assert(false,"Nonsupport data version.")}return null};a.prototype.parseTextureAtlasData=function(e,i,r){if(r===void 0){r=0}console.assert(e!==undefined);if(e===null){if(this._rawTextureAtlases===null){return false}var n=this._rawTextureAtlases[this._rawTextureAtlasIndex++];this.parseTextureAtlasData(n,i,r);if(this._rawTextureAtlasIndex>=this._rawTextureAtlases.length){this._rawTextureAtlasIndex=0;this._rawTextureAtlases=null}return true}i.width=a._getNumber(e,a.WIDTH,0);i.height=a._getNumber(e,a.HEIGHT,0);i.name=a._getString(e,a.NAME,"");i.imagePath=a._getString(e,a.IMAGE_PATH,"");if(r>0){i.scale=r}else{r=i.scale=a._getNumber(e,a.SCALE,i.scale)}r=1/r;if(a.SUB_TEXTURE in e){var s=e[a.SUB_TEXTURE];for(var o=0,l=s.length;o0&&_>0){u.frame=t.DragonBones.webAssembly?Module["TextureData"].createRectangle():t.TextureData.createRectangle();u.frame.x=a._getNumber(h,a.FRAME_X,0)*r;u.frame.y=a._getNumber(h,a.FRAME_Y,0)*r;u.frame.width=f*r;u.frame.height=_*r}i.addTexture(u)}}return true};a.getInstance=function(){if(a._objectDataParserInstance===null){a._objectDataParserInstance=new a}return a._objectDataParserInstance};a._objectDataParserInstance=null;return a}(t.DataParser);t.ObjectDataParser=e;var i=function(){function t(){this.frameStart=0;this.actions=[]}return t}()})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.prototype._inRange=function(t,e,i){return e<=t&&t<=i};i.prototype._decodeUTF8=function(t){var e=-1;var i=-1;var a=65533;var r=0;var n="";var s;var o=0;var l=0;var h=0;var u=0;while(t.length>r){var f=t[r++];if(f===e){if(l!==0){s=a}else{s=i}}else{if(l===0){if(this._inRange(f,0,127)){s=f}else{if(this._inRange(f,194,223)){l=1;u=128;o=f-192}else if(this._inRange(f,224,239)){l=2;u=2048;o=f-224}else if(this._inRange(f,240,244)){l=3;u=65536;o=f-240}else{}o=o*Math.pow(64,l);s=null}}else if(!this._inRange(f,128,191)){o=0;l=0;h=0;u=0;r--;s=f}else{h+=1;o=o+(f-128)*Math.pow(64,l-h);if(h!==l){s=null}else{var _=o;var c=u;o=0;l=0;h=0;u=0;if(this._inRange(_,c,1114111)&&!this._inRange(_,55296,57343)){s=_}else{s=f}}}}if(s!==null&&s!==i){if(s<=65535){if(s>0)n+=String.fromCharCode(s)}else{s-=65536;n+=String.fromCharCode(55296+(s>>10&1023));n+=String.fromCharCode(56320+(s&1023))}}}return n};i.prototype._getUTF16Key=function(t){for(var e=0,i=t.length;e255){return encodeURI(t)}}return t};i.prototype._parseBinaryTimeline=function(e,i,a){if(a===void 0){a=null}var r=a!==null?a:t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);r.type=e;r.offset=i;this._timeline=r;var n=this._timelineArray[r.offset+2];if(n===1){r.frameIndicesOffset=-1}else{var s=this._animation.frameCount+1;var o=this._data.frameIndices;if(t.DragonBones.webAssembly){r.frameIndicesOffset=o.size();for(var l=0;l=0){var r=t.DragonBones.webAssembly?new Module["WeightData"]:t.BaseObject.borrowObject(t.WeightData);var n=this._intArray[i.offset+0];var s=this._intArray[a+0];r.offset=a;if(t.DragonBones.webAssembly){r.bones.resize(s,null);for(var o=0;o0){if(e in this._dragonBonesDataMap){n=this._dragonBonesDataMap[e];s=n.getArmature(i)}}if(s===null&&(e.length===0||this.autoSearch)){for(var o in this._dragonBonesDataMap){n=this._dragonBonesDataMap[o];if(e.length===0||n.autoSearch){s=n.getArmature(i);if(s!==null){e=o;break}}}}if(s!==null){t.dataName=e;t.textureAtlasName=r;t.data=n;t.armature=s;t.skin=null;if(a.length>0){t.skin=s.getSkin(a);if(t.skin===null&&this.autoSearch){for(var o in this._dragonBonesDataMap){var l=this._dragonBonesDataMap[o];var h=l.getArmature(a);if(h!==null){t.skin=h.defaultSkin;break}}}}if(t.skin===null){t.skin=s.defaultSkin}return true}return false};i.prototype._buildBones=function(e,i){var a=e.armature.sortedBones;for(var r=0;r<(t.DragonBones.webAssembly?a.size():a.length);++r){var n=t.DragonBones.webAssembly?a.get(r):a[r];var s=t.DragonBones.webAssembly?new Module["Bone"]:t.BaseObject.borrowObject(t.Bone);s.init(n);if(n.parent!==null){i.addBone(s,n.parent.name)}else{i.addBone(s)}var o=n.constraints;for(var l=0;l<(t.DragonBones.webAssembly?o.size():o.length);++l){var h=t.DragonBones.webAssembly?o.get(l):o[l];var u=i.getBone(h.target.name);if(u===null){continue}var f=h;var _=t.DragonBones.webAssembly?new Module["IKConstraint"]:t.BaseObject.borrowObject(t.IKConstraint);var c=f.root!==null?i.getBone(f.root.name):null;_.target=u;_.bone=s;_.root=c;_.bendPositive=f.bendPositive;_.scaleEnabled=f.scaleEnabled;_.weight=f.weight;if(c!==null){c.addConstraint(_)}else{s.addConstraint(_)}}}};i.prototype._buildSlots=function(t,e){var i=t.skin;var a=t.armature.defaultSkin;if(i===null||a===null){return}var r={};for(var n in a.displays){var s=a.displays[n];r[n]=s}if(i!==a){for(var n in i.displays){var s=i.displays[n];r[n]=s}}for(var o=0,l=t.armature.sortedSlots;o0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var u=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(u.length>0){for(var f=0,_=u;f<_.length;f++){var c=_[f];h._bufferAction(c,true)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype._replaceSlotDisplay=function(t,e,i,a){if(a<0){a=i.displayIndex}if(a<0){a=0}var r=i.displayList;if(r.length<=a){r.length=a+1;for(var n=0,s=r.length;n=0){continue}var s=e.displays[n.name];var o=n.displayList;o.length=s.length;for(var l=0,h=s.length;l0?this.width:e.width;var a=this.height>0?this.height:e.height;for(var r in this.textures){var n=this.textures[r];var s=Math.min(n.region.width,i-n.region.x);var o=Math.min(n.region.height,a-n.region.y);if(n.renderTexture===null){n.renderTexture=new egret.Texture;if(n.rotated){n.renderTexture.$initData(n.region.x,n.region.y,o,s,0,0,o,s,i,a,n.rotated)}else{n.renderTexture.$initData(n.region.x,n.region.y,s,o,0,0,s,o,i,a)}}n.renderTexture._bitmapData=e}}else{for(var r in this.textures){var n=this.textures[r];n.renderTexture=null}}},enumerable:true,configurable:true});a.prototype.dispose=function(){console.warn("已废弃,请参考 @see");this.returnToPool()};Object.defineProperty(a.prototype,"texture",{get:function(){return this.renderTexture},enumerable:true,configurable:true});return a}(t.TextureAtlasData);t.EgretTextureAtlasData=e;var i=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.renderTexture=null;return e}e.toString=function(){return"[class dragonBones.EgretTextureData]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.renderTexture!==null){}this.renderTexture=null};return e}(t.TextureData);t.EgretTextureData=i})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}Object.defineProperty(i.prototype,"eventObject",{get:function(){return this.data},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationName",{get:function(){var t=this.eventObject.animationState;return t!==null?t.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"armature",{get:function(){return this.eventObject.armature},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"bone",{get:function(){return this.eventObject.bone},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"slot",{get:function(){return this.eventObject.slot},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationState",{get:function(){return this.eventObject.animationState},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"frameLabel",{get:function(){return this.eventObject.name},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"sound",{get:function(){return this.eventObject.name},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"movementID",{get:function(){return this.animationName},enumerable:true,configurable:true});i.START=t.EventObject.START;i.LOOP_COMPLETE=t.EventObject.LOOP_COMPLETE;i.COMPLETE=t.EventObject.COMPLETE;i.FADE_IN=t.EventObject.FADE_IN;i.FADE_IN_COMPLETE=t.EventObject.FADE_IN_COMPLETE;i.FADE_OUT=t.EventObject.FADE_OUT;i.FADE_OUT_COMPLETE=t.EventObject.FADE_OUT_COMPLETE;i.FRAME_EVENT=t.EventObject.FRAME_EVENT;i.SOUND_EVENT=t.EventObject.SOUND_EVENT;i.ANIMATION_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.BONE_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.MOVEMENT_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.SOUND=t.EventObject.SOUND_EVENT;return i}(egret.Event);t.EgretEvent=e;var i=function(i){__extends(a,i);function a(){var t=i!==null&&i.apply(this,arguments)||this;t._batchEnabled=true;t._disposeProxy=false;t._armature=null;t._debugDrawer=null;return t}a._cleanBeforeRender=function(){};a.prototype.init=function(t){this._armature=t;this.$renderNode=new egret.sys.GroupNode;this.$renderNode.cleanBeforeRender=a._cleanBeforeRender};a.prototype.clear=function(){this._disposeProxy=false;this._armature=null;this._debugDrawer=null};a.prototype.dispose=function(t){if(t===void 0){t=true}this._disposeProxy=t;if(this._armature!==null){this._armature.dispose();this._armature=null}};a.prototype.debugUpdate=function(t){if(t){if(this._debugDrawer===null){this._debugDrawer=new egret.Sprite}this.addChild(this._debugDrawer);this._debugDrawer.graphics.clear();for(var e=0,i=this._armature.getBones();e=0&&this._display!==null&&i!==null){if(this._armature.replacedTexture!==null&&this._rawDisplayDatas.indexOf(this._displayData)>=0){var a=i.parent;if(this._armature._replaceTextureAtlasData===null){a=t.BaseObject.borrowObject(t.EgretTextureAtlasData);a.copyFrom(i.parent);a.renderTexture=this._armature.replacedTexture;this._armature._replaceTextureAtlasData=a}else{a=this._armature._replaceTextureAtlasData}i=a.getTexture(i.name)}if(i.renderTexture!==null){if(e!==null){var r=e.parent.parent.intArray;var n=e.parent.parent.floatArray;var s=r[e.offset+0];var o=r[e.offset+1];var l=r[e.offset+2];var h=l+s*2;var u=this._renderDisplay;var f=u.$renderNode;f.uvs.length=s*2;f.vertices.length=s*2;f.indices.length=o*3;for(var _=0,c=s*2;_0;var e=this._meshData;var i=e.weight;var a=this._renderDisplay;var r=a.$renderNode;if(i!==null){var n=e.parent.parent.intArray;var s=e.parent.parent.floatArray;var o=n[e.offset+0];var l=n[i.offset+1];for(var h=0,u=0,f=i.offset+2+i.bones.length,_=l,c=0;h=0){t.displayConfig=this._groupConfig.display[t.displayIndex];if(t.displayConfig.type===1){var a=t.displayConfig.name in t.childMovies?t.childMovies[t.displayConfig.name]:null;if(!a){a=u(t.displayConfig.name,this._groupConfig.name);if(a){t.childMovies[t.displayConfig.name]=a}}if(a){t.display=a;t.childMovie=a}else{t.display=t.rawDisplay;t.childMovie=null}}else{t.display=t.rawDisplay;t.childMovie=null}}else{t.displayConfig=null;t.display=t.rawDisplay;t.childMovie=null}if(t.display!==e){if(e){this.addChild(t.display);this.swapChildren(t.display,e);this.removeChild(e)}this._updateSlotBlendMode(t)}if(t.display===t.rawDisplay){if(t.displayConfig&&t.displayConfig.regionIndex!==null&&t.displayConfig.regionIndex!==undefined){if(!t.displayConfig.texture){var r=this._groupConfig.textures[t.displayConfig.textureIndex||0];var n=t.displayConfig.regionIndex*4;var s=this._groupConfig.rectangleArray[n];var o=this._groupConfig.rectangleArray[n+1];var l=this._groupConfig.rectangleArray[n+2];var h=this._groupConfig.rectangleArray[n+3];t.displayConfig.texture=new egret.Texture;t.displayConfig.texture._bitmapData=r._bitmapData;t.displayConfig.texture.$initData(s,o,Math.min(l,r.textureWidth-s),Math.min(h,r.textureHeight-o),0,0,Math.min(l,r.textureWidth-s),Math.min(h,r.textureHeight-o),r.textureWidth,r.textureHeight)}if(this._batchEnabled){var f=t.displayConfig.texture;var _=t.rawDisplay.$renderNode;egret.sys.RenderNode.prototype.cleanBeforeRender.call(t.rawDisplay.$renderNode);_.image=f._bitmapData;_.drawImage(f._bitmapX,f._bitmapY,f._bitmapWidth,f._bitmapHeight,f._offsetX,f._offsetY,f.textureWidth,f.textureHeight);_.imageWidth=f._sourceWidth;_.imageHeight=f._sourceHeight}else{t.rawDisplay.visible=true;t.rawDisplay.$setBitmapData(t.displayConfig.texture)}}else{if(this._batchEnabled){t.rawDisplay.$renderNode.image=null}else{t.rawDisplay.visible=false;t.rawDisplay.$setBitmapData(null)}}}if(t.childMovie!==i){if(i){i.stop();this._childMovies.slice(this._childMovies.indexOf(i),1)}if(t.childMovie){if(this._childMovies.indexOf(t.childMovie)<0){this._childMovies.push(t.childMovie)}if(t.config.action){t.childMovie.play(t.config.action)}else{t.childMovie.play(t.childMovie._config.action)}}}};r.prototype._getSlot=function(t){for(var e=0,i=this._slots.length;e0&&(n>=r||n<=-r)){this._isCompleted=true;s=this._playTimes;if(n<0){n=0}else{n=a}}else{this._isCompleted=false;if(n<0){s=Math.floor(-n/a);n=a- -n%a}else{s=Math.floor(n/a);n%=a}if(this._playTimes>0&&s>this._playTimes){s=this._playTimes}}if(this._currentTime===n){return}var o=Math.floor(n*this._clipConfig.cacheTimeToFrameScale);if(this._cacheFrameIndex!==o){this._cacheFrameIndex=o;var l=this._groupConfig.displayFrameArray;var h=this._groupConfig.transformArray;var u=this._groupConfig.colorArray;var f=true;var c=false;var p=false;var m=this._cacheRectangle;this._cacheRectangle=this._clipConfig.cacheRectangles[this._cacheFrameIndex];if(this._batchEnabled&&!this._cacheRectangle){p=true;this._cacheRectangle=new egret.Rectangle;this._clipConfig.cacheRectangles[this._cacheFrameIndex]=this._cacheRectangle}for(var d=0,y=this._slots.length;d=this._clipArray.length){v=this._frameSize*(this._cacheFrameIndex-1)+d*2}var b=this._clipArray[v]*2;if(b>=0){var D=l[b];var T=l[b+1]*8;var A=this._clipArray[v+1]*6;var O=false;if(g.displayIndex!==D){g.displayIndex=D;O=true;this._updateSlotDisplay(g)}if(g.colorIndex!==T||O){g.colorIndex=T;if(g.colorIndex>=0){this._updateSlotColor(g,u[T]*.01,u[T+1]*.01,u[T+2]*.01,u[T+3]*.01,u[T+4],u[T+5],u[T+6],u[T+7])}else{this._updateSlotColor(g,1,1,1,1,0,0,0,0)}}c=true;if(g.transformIndex!==A){g.transformIndex=A;if(this._batchEnabled){var x=g.display.$renderNode.matrix;if(!x){x=g.display.$renderNode.matrix=new egret.Matrix}x.a=h[A];x.b=h[A+1];x.c=h[A+2];x.d=h[A+3];x.tx=h[A+4];x.ty=h[A+5]}else{i.a=h[A];i.b=h[A+1];i.c=h[A+2];i.d=h[A+3];i.tx=h[A+4];i.ty=h[A+5];g.display.$setMatrix(i)}}if(this._batchEnabled&&p&&g.displayConfig){var x=g.display.$renderNode.matrix;e.x=0;e.y=0;e.width=g.displayConfig.texture.textureWidth;e.height=g.displayConfig.texture.textureHeight;x.$transformBounds(e);if(f){f=false;this._cacheRectangle.x=e.x;this._cacheRectangle.width=e.x+e.width;this._cacheRectangle.y=e.y;this._cacheRectangle.height=e.y+e.height}else{this._cacheRectangle.x=Math.min(this._cacheRectangle.x,e.x);this._cacheRectangle.width=Math.max(this._cacheRectangle.width,e.x+e.width);this._cacheRectangle.y=Math.min(this._cacheRectangle.y,e.y);this._cacheRectangle.height=Math.max(this._cacheRectangle.height,e.y+e.height)}}}else if(g.displayIndex!==-1){g.displayIndex=-1;this._updateSlotDisplay(g)}}if(this._cacheRectangle){if(c&&p&&f&&m){this._cacheRectangle.x=m.x;this._cacheRectangle.y=m.y;this._cacheRectangle.width=m.width;this._cacheRectangle.height=m.height}this.$invalidateContentBounds()}}if(this._isCompleted){this._isPlaying=false}if(!this._isStarted){this._isStarted=true;if(this.hasEventListener(_.START)){var B=egret.Event.create(_,_.START);B.movie=this;B.clipName=this._clipConfig.name;B.name="";B.slotName="";this.dispatchEvent(B)}}this._isReversing=this._currentTime>n&&this._currentPlayTimes===s;this._currentTime=n;var E=this._clipConfig.frame?this._clipConfig.frame.length:0;if(E>0){var S=Math.floor(this._currentTime*this._config.frameRate);var M=this._groupConfig.frame[this._clipConfig.frame[S]];if(this._currentFrameConfig!==M){if(E>1){var w=this._currentFrameConfig;this._currentFrameConfig=M;if(!w){var P=Math.floor(this._currentTime*this._config.frameRate);w=this._groupConfig.frame[this._clipConfig.frame[P]];if(this._isReversing){}else{if(this._currentTime<=w.position||this._currentPlayTimes!==s){w=this._groupConfig.frame[w.prev]}}}if(this._isReversing){while(w!==M){this._onCrossFrame(w);w=this._groupConfig.frame[w.prev]}}else{while(w!==M){w=this._groupConfig.frame[w.next];this._onCrossFrame(w)}}}else{this._currentFrameConfig=M;if(this._currentFrameConfig){this._onCrossFrame(this._currentFrameConfig)}}}}if(this._currentPlayTimes!==s){this._currentPlayTimes=s;if(this.hasEventListener(_.LOOP_COMPLETE)){var C=egret.Event.create(_,_.LOOP_COMPLETE);C.movie=this;C.clipName=this._clipConfig.name;C.name="";C.slotName="";this.dispatchEvent(C);egret.Event.release(C)}if(this._isCompleted&&this.hasEventListener(_.COMPLETE)){var I=egret.Event.create(_,_.COMPLETE);I.movie=this;I.clipName=this._clipConfig.name;I.name="";I.slotName="";this.dispatchEvent(I);egret.Event.release(I)}}}this._isLockDispose=false;if(this._isDelayDispose){this.dispose()}};r.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}if(t){var i=null;for(var a=0,r=this._config.clip.length;a void, target: any): void { + this.addEventListener(type, listener, target); + } + /** + * @inheritDoc + */ + public removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void { + this.removeEventListener(type, listener, target); + } + /** + * 关闭批次渲染。(批次渲染处于性能考虑,不会更新渲染对象的边界属性,这样无法正确获得渲染对象的绘制区域,如果需要使用这些属性,可以关闭批次渲染) + * @version DragonBones 5.1 + * @language zh_CN + */ + public disableBatch(): void { + for (const slot of this._armature.getSlots()) { + // (slot as EgretSlot).transformUpdateEnabled = true; + const display = (slot.rawDisplay || slot.meshDisplay) as (egret.Bitmap | egret.Mesh); + const node = display.$renderNode as (egret.sys.BitmapNode | egret.sys.MeshNode); + + // Transform. + if (node.matrix) { + display.$setMatrix(slot.globalTransformMatrix as any, false); + } + + // ZOrder. + this.addChild(display); + } + + this._batchEnabled = false; + this.$renderNode.cleanBeforeRender = null as any; + this.$renderNode = null as any; + } + /** + * @inheritDoc + */ + public get armature(): Armature { + return this._armature; + } + /** + * @inheritDoc + */ + public get animation(): Animation { + return this._armature.animation; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + public advanceTimeBySelf(on: boolean): void { + if (on) { + this._armature.clock = EgretFactory.clock; + } + else { + this._armature.clock = null; + } + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature + */ + export type FastArmature = Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Bone + */ + export type FastBone = Bone; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Slot + */ + export type FastSlot = Slot; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Animation + */ + export type FastAnimation = Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.AnimationState + */ + export type FastAnimationState = AnimationState; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class Event extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class ArmatureEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class AnimationEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class FrameEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class SoundEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFacory#parseTextureAtlasData() + */ + export class EgretTextureAtlas extends EgretTextureAtlasData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.EgretTextureAtlas]"; + } + + public constructor(texture: egret.Texture, rawData: any, scale: number = 1) { + super(); + console.warn("已废弃,请参考 @see"); + + this._onClear(); + + ObjectDataParser.getInstance().parseTextureAtlasData(rawData, this, scale); + this.renderTexture = texture; + } + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + export class EgretSheetAtlas extends EgretTextureAtlas { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + export class SoundEventManager { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + public static getInstance(): EgretArmatureDisplay { + console.warn("已废弃,请参考 @see"); + return EgretFactory.factory.soundEventManager; + } + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + export class AnimationCacheManager { + public constructor() { + console.warn("已废弃,请参考 @see"); + } + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/src/dragonBones/egret/EgretFactory.ts b/reference/Egret/4.x/src/dragonBones/egret/EgretFactory.ts new file mode 100644 index 0000000..b8168fa --- /dev/null +++ b/reference/Egret/4.x/src/dragonBones/egret/EgretFactory.ts @@ -0,0 +1,232 @@ +namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretFactory extends BaseFactory { + private static _dragonBonesInstance: DragonBones = null as any; + private static _factory: EgretFactory | null = null; + private static _clockHandler(time: number): boolean { + time *= 0.001; + const clock = EgretFactory._dragonBonesInstance.clock; + const passedTime = time - clock.time; + EgretFactory._dragonBonesInstance.advanceTime(passedTime); + clock.time = time; + + return false; + } + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + public static get clock(): WorldClock { + return EgretFactory._dragonBonesInstance.clock; + } + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public static get factory(): EgretFactory { + if (EgretFactory._factory === null) { + EgretFactory._factory = new EgretFactory(); + } + + return EgretFactory._factory; + } + /** + * @inheritDoc + */ + public constructor(dataParser: DataParser | null = null) { + super(dataParser); + + if (EgretFactory._dragonBonesInstance === null) { + const eventManager = new EgretArmatureDisplay(); + EgretFactory._dragonBonesInstance = new DragonBones(eventManager); + EgretFactory._dragonBonesInstance.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + + this._dragonBones = EgretFactory._dragonBonesInstance; + } + /** + * @private + */ + protected _isSupportMesh(): boolean { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + + return false; + } + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: EgretTextureAtlasData | null, textureAtlas: egret.Texture | null): EgretTextureAtlasData { + if (textureAtlasData !== null) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = BaseObject.borrowObject(EgretTextureAtlasData); + } + + return textureAtlasData; + } + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature { + const armature = BaseObject.borrowObject(Armature); + const armatureDisplay = new EgretArmatureDisplay(); + + armature.init( + dataPackage.armature, + armatureDisplay, armatureDisplay, this._dragonBones + ); + + return armature; + } + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot { + dataPackage; + armature; + const slot = BaseObject.borrowObject(EgretSlot); + slot.init( + slotData, displays, + new egret.Bitmap(), new egret.Mesh() + ); + + return slot; + } + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + public buildArmatureDisplay(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null, textureAtlasName: string | null = null): EgretArmatureDisplay | null { + const armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + return armature.display as EgretArmatureDisplay; + } + + return null; + } + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public getTextureDisplay(textureName: string, textureAtlasName: string | null = null): egret.Bitmap | null { + const textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName) as EgretTextureData; + if (textureData !== null && textureData.renderTexture !== null) { + return new egret.Bitmap(textureData.renderTexture); + } + + return null; + } + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public get soundEventManager(): EgretArmatureDisplay { + return this._dragonBones.eventManager as EgretArmatureDisplay; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + public addSkeletonData(dragonBonesData: DragonBonesData, dragonBonesName: string | null = null): void { + console.warn("已废弃,请参考 @see"); + this.addDragonBonesData(dragonBonesData, dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + public getSkeletonData(dragonBonesName: string) { + console.warn("已废弃,请参考 @see"); + return this.getDragonBonesData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + public removeSkeletonData(dragonBonesName: string): void { + console.warn("已废弃,请参考 @see"); + this.removeDragonBonesData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + public addTextureAtlas(textureAtlasData: TextureAtlasData, dragonBonesName: string | null = null): void { + console.warn("已废弃,请参考 @see"); + this.addTextureAtlasData(textureAtlasData, dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + public getTextureAtlas(dragonBonesName: string) { + console.warn("已废弃,请参考 @see"); + return this.getTextureAtlasData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public removeTextureAtlas(dragonBonesName: string): void { + console.warn("已废弃,请参考 @see"); + this.removeTextureAtlasData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + public buildFastArmature(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null): FastArmature | null { + console.warn("已废弃,请参考 @see"); + return this.buildArmature(armatureName, dragonBonesName, skinName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + public dispose(): void { + console.warn("已废弃,请参考 @see"); + this.clear(); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + public get soundEventManater(): EgretArmatureDisplay { + return this.soundEventManager; + } + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/src/dragonBones/egret/EgretSlot.ts b/reference/Egret/4.x/src/dragonBones/egret/EgretSlot.ts new file mode 100644 index 0000000..d413234 --- /dev/null +++ b/reference/Egret/4.x/src/dragonBones/egret/EgretSlot.ts @@ -0,0 +1,436 @@ +namespace dragonBones { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretSlot extends Slot { + public static toString(): string { + return "[class dragonBones.EgretSlot]"; + } + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + public transformUpdateEnabled: boolean = false; + + private _armatureDisplay: EgretArmatureDisplay = null as any; + private _renderDisplay: egret.DisplayObject = null as any; + private _colorFilter: egret.ColorMatrixFilter | null = null; + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + this._armatureDisplay = null as any; // + this._renderDisplay = null as any; // + this._colorFilter = null; + } + /** + * @private + */ + protected _initDisplay(value: any): void { + value; + } + /** + * @private + */ + protected _disposeDisplay(value: any): void { + value; + } + /** + * @private + */ + protected _onUpdateDisplay(): void { + this._armatureDisplay = this._armature.display; + this._renderDisplay = (this._display !== null ? this._display : this._rawDisplay) as egret.DisplayObject; + + if (this._armatureDisplay._batchEnabled && this._renderDisplay !== this._rawDisplay && this._renderDisplay !== this._meshDisplay) { + this._armatureDisplay.disableBatch(); + } + + if (this._armatureDisplay._batchEnabled) { + const node = this._renderDisplay.$renderNode as (egret.sys.BitmapNode | egret.sys.MeshNode); + if (!node.matrix) { + node.matrix = new egret.Matrix(); + } + } + } + /** + * @private + */ + protected _addDisplay(): void { + if (this._armatureDisplay._batchEnabled) { + (this._armatureDisplay.$renderNode as egret.sys.GroupNode).addNode(this._renderDisplay.$renderNode); + } + else { + this._armatureDisplay.addChild(this._renderDisplay); + } + } + /** + * @private + */ + protected _replaceDisplay(value: any): void { + const prevDisplay = value as egret.DisplayObject; + + if (this._armatureDisplay._batchEnabled) { + const nodes = (this._armatureDisplay.$renderNode as egret.sys.GroupNode).drawData; + nodes[nodes.indexOf(value.$renderNode)] = this._renderDisplay.$renderNode; + } + else { + this._armatureDisplay.addChild(this._renderDisplay); + this._armatureDisplay.swapChildren(this._renderDisplay, prevDisplay); + this._armatureDisplay.removeChild(prevDisplay); + } + } + /** + * @private + */ + protected _removeDisplay(): void { + if (this._armatureDisplay._batchEnabled) { + const nodes = (this._armatureDisplay.$renderNode as egret.sys.GroupNode).drawData; + nodes.splice(nodes.indexOf(this._renderDisplay.$renderNode), 1); + } + else { + this._renderDisplay.parent.removeChild(this._renderDisplay); + } + } + /** + * @private + */ + protected _updateZOrder(): void { + if (this._armatureDisplay._batchEnabled) { + const nodes = (this._armatureDisplay.$renderNode as egret.sys.GroupNode).drawData; + nodes[this._zOrder] = this._renderDisplay.$renderNode; + } + else { + const index = this._armatureDisplay.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + + this._armatureDisplay.addChildAt(this._renderDisplay, this._zOrder); + } + } + /** + * @internal + * @private + */ + public _updateVisible(): void { + if (this._armatureDisplay._batchEnabled) { + const node = this._renderDisplay.$renderNode as (egret.sys.BitmapNode); + node.alpha = this._parent.visible ? 1.0 : 0.0; + } + else { + this._renderDisplay.visible = this._parent.visible; + } + } + /** + * @private + */ + protected _updateBlendMode(): void { + switch (this._blendMode) { + case BlendMode.Normal: + this._renderDisplay.blendMode = egret.BlendMode.NORMAL; + break; + + case BlendMode.Add: + this._renderDisplay.blendMode = egret.BlendMode.ADD; + break; + + case BlendMode.Erase: + this._renderDisplay.blendMode = egret.BlendMode.ERASE; + break; + + default: + break; + } + + if (this._armatureDisplay._batchEnabled) { + const node = this._renderDisplay.$renderNode as (egret.sys.BitmapNode); + node.blendMode = egret.sys.blendModeToNumber(this._renderDisplay.blendMode); + } + } + /** + * @private + */ + protected _updateColor(): void { + if ( + this._colorTransform.redMultiplier !== 1.0 || + this._colorTransform.greenMultiplier !== 1.0 || + this._colorTransform.blueMultiplier !== 1.0 || + this._colorTransform.redOffset !== 0 || + this._colorTransform.greenOffset !== 0 || + this._colorTransform.blueOffset !== 0 || + this._colorTransform.alphaOffset !== 0 + ) { + if (this._colorFilter === null) { + this._colorFilter = new egret.ColorMatrixFilter(); + } + + const colorMatrix = this._colorFilter.matrix; + colorMatrix[0] = this._colorTransform.redMultiplier; + colorMatrix[6] = this._colorTransform.greenMultiplier; + colorMatrix[12] = this._colorTransform.blueMultiplier; + colorMatrix[18] = this._colorTransform.alphaMultiplier; + colorMatrix[4] = this._colorTransform.redOffset; + colorMatrix[9] = this._colorTransform.greenOffset; + colorMatrix[14] = this._colorTransform.blueOffset; + colorMatrix[19] = this._colorTransform.alphaOffset; + this._colorFilter.matrix = colorMatrix; + + if (this._armatureDisplay._batchEnabled) { + const node = this._renderDisplay.$renderNode as (egret.sys.BitmapNode); + node.filter = this._colorFilter; + node.alpha = 1.0; + } + + let filters = this._renderDisplay.filters; + if (!filters) { // null or undefined? + filters = []; + } + + if (filters.indexOf(this._colorFilter) < 0) { + filters.push(this._colorFilter); + } + + this._renderDisplay.filters = filters; + this._renderDisplay.$setAlpha(1.0); + } + else { + if (this._armatureDisplay._batchEnabled) { + const node = this._renderDisplay.$renderNode as (egret.sys.BitmapNode); + node.filter = null as any; + node.alpha = this._colorTransform.alphaMultiplier; + } + + this._renderDisplay.filters = null as any; + this._renderDisplay.$setAlpha(this._colorTransform.alphaMultiplier); + } + } + /** + * @private + */ + protected _updateFrame(): void { + const meshData = this._display === this._meshDisplay ? this._meshData : null; + let currentTextureData = this._textureData as (EgretTextureData | null); + + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { // Update replaced texture atlas. + let currentTextureAtlasData = currentTextureData.parent as EgretTextureAtlasData; + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = BaseObject.borrowObject(EgretTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData as EgretTextureAtlasData; + } + + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name) as EgretTextureData; + } + + if (currentTextureData.renderTexture !== null) { + if (meshData !== null) { // Mesh. + const intArray = meshData.parent.parent.intArray; + const floatArray = meshData.parent.parent.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const triangleCount = intArray[meshData.offset + BinaryOffset.MeshTriangleCount]; + const verticesOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + const uvOffset = verticesOffset + vertexCount * 2; + + const meshDisplay = this._renderDisplay as egret.Mesh; + const meshNode = meshDisplay.$renderNode as egret.sys.MeshNode; + + meshNode.uvs.length = vertexCount * 2; + meshNode.vertices.length = vertexCount * 2; + meshNode.indices.length = triangleCount * 3; + + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[verticesOffset + i]; + meshNode.uvs[i] = floatArray[uvOffset + i]; + } + + for (let i = 0; i < triangleCount * 3; ++i) { + meshNode.indices[i] = intArray[meshData.offset + BinaryOffset.MeshVertexIndices + i]; + } + + if (this._armatureDisplay._batchEnabled) { + const texture = currentTextureData.renderTexture; + const node = this._renderDisplay.$renderNode as egret.sys.MeshNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(this._renderDisplay.$renderNode); + node.image = texture._bitmapData; + + node.drawMesh( + texture._bitmapX, texture._bitmapY, + texture._bitmapWidth, texture._bitmapHeight, + texture._offsetX, texture._offsetY, + texture.textureWidth, texture.textureHeight + ); + + node.imageWidth = texture._sourceWidth; + node.imageHeight = texture._sourceHeight; + } + + meshDisplay.texture = currentTextureData.renderTexture; + meshDisplay.$setAnchorOffsetX(this._pivotX); + meshDisplay.$setAnchorOffsetY(this._pivotY); + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + else { // Normal texture. + const normalDisplay = this._renderDisplay as egret.Bitmap; + normalDisplay.texture = currentTextureData.renderTexture; + + if (this._armatureDisplay._batchEnabled) { + const texture = currentTextureData.renderTexture; + const node = this._renderDisplay.$renderNode as egret.sys.BitmapNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(this._renderDisplay.$renderNode); + node.image = texture._bitmapData; + + node.drawImage( + texture._bitmapX, texture._bitmapY, + texture._bitmapWidth, texture._bitmapHeight, + texture._offsetX, texture._offsetY, + texture.textureWidth, texture.textureHeight + ); + + node.imageWidth = texture._sourceWidth; + node.imageHeight = texture._sourceHeight; + } + + normalDisplay.$setAnchorOffsetX(this._pivotX); + normalDisplay.$setAnchorOffsetY(this._pivotY); + } + + return; + } + } + + if (this._armatureDisplay._batchEnabled) { + (this._renderDisplay.$renderNode as egret.sys.BitmapNode).image = null as any; + } + + if (meshData !== null) { + const meshDisplay = this._renderDisplay as egret.Mesh; + meshDisplay.$setBitmapData(null as any); + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + } + else { + const normalDisplay = this._renderDisplay as egret.Bitmap; + normalDisplay.$setBitmapData(null as any); + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + } + } + /** + * @private + */ + protected _updateMesh(): void { + const hasFFD = this._ffdVertices.length > 0; + const meshData = this._meshData as MeshDisplayData; + const weight = meshData.weight; + const meshDisplay = this._renderDisplay as egret.Mesh; + const meshNode = meshDisplay.$renderNode as egret.sys.MeshNode; + + if (weight !== null) { + const intArray = meshData.parent.parent.intArray; + const floatArray = meshData.parent.parent.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const weightFloatOffset = intArray[weight.offset + BinaryOffset.WeigthFloatOffset]; + + for ( + let i = 0, iD = 0, iB = weight.offset + BinaryOffset.WeigthBoneIndices + weight.bones.length, iV = weightFloatOffset, iF = 0; + i < vertexCount; + ++i + ) { + const boneCount = intArray[iB++]; + let xG = 0.0, yG = 0.0; + for (let j = 0; j < boneCount; ++j) { + const boneIndex = intArray[iB++]; + const bone = this._meshBones[boneIndex]; + if (bone !== null) { + const matrix = bone.globalTransformMatrix; + const weight = floatArray[iV++]; + let xL = floatArray[iV++]; + let yL = floatArray[iV++]; + + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight; + } + } + + meshNode.vertices[iD++] = xG; + meshNode.vertices[iD++] = yG; + } + + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + else if (hasFFD) { + const intArray = meshData.parent.parent.intArray; + const floatArray = meshData.parent.parent.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const vertexOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + + meshDisplay.$updateVertices(); + meshDisplay.$invalidateTransform(); + } + } + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void { + if (isSkinnedMesh) { // Identity transform. + const transformationMatrix = this._renderDisplay.matrix; + transformationMatrix.identity(); + this._renderDisplay.$setMatrix(transformationMatrix, this.transformUpdateEnabled); + } + else { + const globalTransformMatrix = this.globalTransformMatrix; + if (this._armatureDisplay._batchEnabled) { + let displayMatrix = (this._renderDisplay.$renderNode as (egret.sys.BitmapNode | egret.sys.MeshNode)).matrix; + displayMatrix.a = globalTransformMatrix.a; + displayMatrix.b = globalTransformMatrix.b; + displayMatrix.c = globalTransformMatrix.c; + displayMatrix.d = globalTransformMatrix.d; + displayMatrix.tx = this.globalTransformMatrix.tx - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + displayMatrix.ty = this.globalTransformMatrix.ty - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + } + else if (this.transformUpdateEnabled) { + this._renderDisplay.$setMatrix((globalTransformMatrix as any) as egret.Matrix, true); + } + else { + const values = this._renderDisplay.$DisplayObject as any; + const displayMatrix = values[6]; + + displayMatrix.a = this.globalTransformMatrix.a; + displayMatrix.b = this.globalTransformMatrix.b; + displayMatrix.c = this.globalTransformMatrix.c; + displayMatrix.d = this.globalTransformMatrix.d; + displayMatrix.tx = this.globalTransformMatrix.tx; + displayMatrix.ty = this.globalTransformMatrix.ty; + + this._renderDisplay.$removeFlags(8); + this._renderDisplay.$invalidatePosition(); + } + } + } + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/src/dragonBones/egret/EgretTextureAtlasData.ts b/reference/Egret/4.x/src/dragonBones/egret/EgretTextureAtlasData.ts new file mode 100644 index 0000000..d72bbe9 --- /dev/null +++ b/reference/Egret/4.x/src/dragonBones/egret/EgretTextureAtlasData.ts @@ -0,0 +1,128 @@ +namespace dragonBones { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretTextureAtlasData extends TextureAtlasData { + public static toString(): string { + return "[class dragonBones.EgretTextureAtlasData]"; + } + + private _renderTexture: egret.Texture | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + if (this._renderTexture !== null) { + //this.texture.dispose(); + } + + this._renderTexture = null; + } + /** + * @private + */ + public createTexture(): TextureData { + return BaseObject.borrowObject(EgretTextureData); + } + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get renderTexture(): egret.Texture | null { + return this._renderTexture; + } + public set renderTexture(value: egret.Texture | null) { + if (this._renderTexture === value) { + return; + } + + this._renderTexture = value; + + if (this._renderTexture !== null) { + const bitmapData = this._renderTexture.bitmapData; + const textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + const textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + + for (let k in this.textures) { + const textureData = this.textures[k] as EgretTextureData; + const subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + const subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + + if (textureData.renderTexture === null) { + textureData.renderTexture = new egret.Texture(); + if (textureData.rotated) { + textureData.renderTexture.$initData( + textureData.region.x, textureData.region.y, + subTextureHeight, subTextureWidth, + 0, 0, + subTextureHeight, subTextureWidth, + textureAtlasWidth, textureAtlasHeight, + textureData.rotated + ); + } + else { + textureData.renderTexture.$initData( + textureData.region.x, textureData.region.y, + subTextureWidth, subTextureHeight, + 0, 0, + subTextureWidth, subTextureHeight, + textureAtlasWidth, textureAtlasHeight + ); + } + } + + textureData.renderTexture._bitmapData = bitmapData; + } + } + else { + for (let k in this.textures) { + const textureData = this.textures[k] as EgretTextureData; + textureData.renderTexture = null; + } + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public dispose(): void { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public get texture() { + return this.renderTexture; + } + } + /** + * @private + */ + export class EgretTextureData extends TextureData { + public static toString(): string { + return "[class dragonBones.EgretTextureData]"; + } + + public renderTexture: egret.Texture | null = null; // Initial value. + + protected _onClear(): void { + super._onClear(); + + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + + this.renderTexture = null; + } + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/src/dragonBones/egret/Movie.ts b/reference/Egret/4.x/src/dragonBones/egret/Movie.ts new file mode 100644 index 0000000..5aaa7ab --- /dev/null +++ b/reference/Egret/4.x/src/dragonBones/egret/Movie.ts @@ -0,0 +1,1474 @@ +namespace dragonBones { + /** + * @private + */ + type GroupConfig = { + name: string, + version: number, + + position: number[], + + display: DisplayConfig[], + frame: FrameConfig[], + movie: MovieConfig[], + animation: MovieConfig[], // 兼容旧数据 + + // Runtime + offset: number, + arrayBuffer: ArrayBuffer, + displayFrameArray: Int16Array, + rectangleArray: Float32Array, + transformArray: Float32Array, + colorArray: Int16Array, + textures: egret.Texture[] + }; + /** + * @private + */ + type DisplayConfig = { + name: string, + type: DisplayType, + textureIndex?: number, + regionIndex?: number, + + // Runtime + texture: egret.Texture + }; + /** + * @private + */ + type ActionAndEventConfig = { + type: ActionType, + name: string, + data?: any, + slot?: string + }; + /** + * @private + */ + type MovieConfig = { + name: string, + frameRate: number, + type?: number, + action?: string, + isNested?: boolean, + hasChildAnimation?: boolean, // 兼容旧数据 + + slot: SlotConfig[], + clip: ClipConfig[] + }; + /** + * @private + */ + type SlotConfig = { + name: string, + blendMode?: BlendMode, + action?: string + }; + /** + * @private + */ + type ClipConfig = { + name: string, + playTimes: number, + duration: number, + scale: number, + cacheTimeToFrameScale: number, + p: number, + s: number, + + frame: number[], + + // Runtime + cacheRectangles: egret.Rectangle[] + }; + /** + * @private + */ + type FrameConfig = { + prev: number, + next: number, + position: number, + actionAndEvent: ActionAndEventConfig[] + }; + /** + * @private + */ + type CreateMovieHelper = { + groupName: string, + movieName: string, + groupConfig: GroupConfig, + movieConfig: MovieConfig + }; + /** + * @private + */ + let _helpRectangle: egret.Rectangle = new egret.Rectangle(); + /** + * @private + */ + let _helpMatrix: egret.Matrix = new egret.Matrix(); + /** + * @private + */ + let _groupConfigMap: Map = {}; + /** + * @private + */ + function _findObjectInArray(array: T[], name: string): T | null { + for (let i = 0, l = array.length; i < l; ++i) { + const data = array[i]; + if (data.name === name) { + return data; + } + } + + return null; + } + /** + * @private + */ + function _fillCreateMovieHelper(createMovieHelper: CreateMovieHelper): boolean { + if (createMovieHelper.groupName) { + const groupConfig = _groupConfigMap[createMovieHelper.groupName]; + if (groupConfig) { + const movieConfig = _findObjectInArray(groupConfig.movie || groupConfig.animation, createMovieHelper.movieName); + if (movieConfig) { + createMovieHelper.groupConfig = groupConfig; + createMovieHelper.movieConfig = movieConfig; + return true; + } + } + } + + if (!createMovieHelper.groupName) { // || autoSearch Will be search all data, if do not give a data name or the autoSearch is true. + for (let groupName in _groupConfigMap) { + const groupConfig = _groupConfigMap[groupName]; + if (!createMovieHelper.groupName) { // || groupConfig.autoSearch + const movieConfig = _findObjectInArray(groupConfig.movie || groupConfig.animation, createMovieHelper.movieName); + if (movieConfig) { + createMovieHelper.groupName = groupName; + createMovieHelper.groupConfig = groupConfig; + createMovieHelper.movieConfig = movieConfig; + return true; + } + } + } + } + + return false; + } + /** + * @language zh_CN + * 是否包含指定名称的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + export function hasMovieGroup(groupName: string): boolean { + return groupName in _groupConfigMap; + } + /** + * @language zh_CN + * 添加动画组。 + * @param groupData 动画二进制数据。 + * @param textureAtlas 贴图集或贴图集列表。 + * @param groupName 为动画组指定一个名称,如果未设置,则使用数据中的名称。 + * @version DragonBones 4.7 + */ + export function addMovieGroup(groupData: ArrayBuffer, textureAtlas: egret.Texture | egret.Texture[], groupName: string | null = null): void { + if (groupData) { + const byteArray = new egret.ByteArray(groupData); + byteArray.endian = egret.Endian.LITTLE_ENDIAN; + byteArray.position = 8; // TODO format + + const groupConfig = JSON.parse(byteArray.readUTF()); + groupConfig.offset = byteArray.position; + groupConfig.arrayBuffer = groupData; + groupConfig.textures = []; + + const p = groupConfig.offset % 4; + if (p) { + groupConfig.offset += 4 - p; + } + + for (let i = 0, l = groupConfig.position.length; i < l; i += 3) { + switch (i / 3) { + case 1: + groupConfig.displayFrameArray = new Int16Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 2: + groupConfig.rectangleArray = new Float32Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 3: + groupConfig.transformArray = new Float32Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + case 4: + groupConfig.colorArray = new Int16Array(groupConfig.arrayBuffer, groupConfig.offset + groupConfig.position[i], groupConfig.position[i + 1] / groupConfig.position[i + 2]); + break; + } + } + + groupName = groupName || groupConfig.name; + if (_groupConfigMap[groupName]) { + console.warn("Replace group: " + groupName); + } + + _groupConfigMap[groupName] = groupConfig; + + // + if (textureAtlas instanceof Array) { + for (let i = 0, l = textureAtlas.length; i < l; ++i) { + const texture = textureAtlas[i]; + groupConfig.textures.push(texture); + } + } + else { + groupConfig.textures.push(textureAtlas); + } + } + else { + throw new Error(); + } + } + /** + * @language zh_CN + * 移除动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + export function removeMovieGroup(groupName: string): void { + const groupConfig = _groupConfigMap[groupName]; + if (groupConfig) { + delete _groupConfigMap[groupName]; + } + } + /** + * @language zh_CN + * 移除所有的动画组。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + export function removeAllMovieGroup(): void { + for (let i in _groupConfigMap) { + delete _groupConfigMap[i]; + } + } + /** + * @language zh_CN + * 创建一个动画。 + * @param movieName 动画的名称。 + * @param groupName 动画组的名称,如果未设置,将检索所有的动画组,当多个动画组中包含同名的动画时,可能无法创建出准确的动画。 + * @version DragonBones 4.7 + */ + export function buildMovie(movieName: string, groupName: string | null = null): Movie | null { + const createMovieHelper = { movieName: movieName, groupName: groupName }; + if (_fillCreateMovieHelper(createMovieHelper)) { + const movie = new Movie(createMovieHelper); + dragonBones.EgretFactory.factory; + movie.clock = dragonBones.EgretFactory.clock; + return movie; + } + else { + console.warn("No movie named: " + movieName); + } + + return null; + } + /** + * @language zh_CN + * 获取指定动画组内包含的所有动画名称。 + * @param groupName 动画组的名称。 + * @version DragonBones 4.7 + */ + export function getMovieNames(groupName: string): string[] | null { + const groupConfig = _groupConfigMap[groupName]; + if (groupConfig) { + const movieNameGroup = []; + const movie = groupConfig.movie || groupConfig.animation; + for (let i = 0, l = movie.length; i < l; ++i) { + movieNameGroup.push(movie[i].name); + } + + return movieNameGroup; + } + else { + console.warn("No group named: " + groupName); + } + + return null; + } + /** + * @language zh_CN + * 动画事件。 + * @version DragonBones 4.7 + */ + export class MovieEvent extends egret.Event { + /** + * @language zh_CN + * 动画剪辑开始播放。 + * @version DragonBones 4.7 + */ + public static START: string = "start"; + /** + * @language zh_CN + * 动画剪辑循环播放一次完成。 + * @version DragonBones 4.7 + */ + public static LOOP_COMPLETE: string = "loopComplete"; + /** + * @language zh_CN + * 动画剪辑播放完成。 + * @version DragonBones 4.7 + */ + public static COMPLETE: string = "complete"; + /** + * @language zh_CN + * 动画剪辑帧事件。 + * @version DragonBones 4.7 + */ + public static FRAME_EVENT: string = "frameEvent"; + /** + * @language zh_CN + * 动画剪辑声音事件。 + * @version DragonBones 4.7 + */ + public static SOUND_EVENT: string = "soundEvent"; + /** + * @language zh_CN + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.7 + */ + public name: string = ""; + /** + * @language zh_CN + * 发出事件的插槽名称。 + * @version DragonBones 4.7 + */ + public slotName: string = ""; + /** + * @language zh_CN + * 发出事件的动画剪辑名称。 + * @version DragonBones 4.7 + */ + public clipName: string = ""; + /** + * @language zh_CN + * 发出事件的动画。 + * @version DragonBones 4.7 + */ + public movie: Movie; + /** + * @private + */ + public constructor(type: string) { + super(type); + } + + //========================================= // 兼容旧数据 + /** + * @private + */ + public get armature(): any { + return this.movie; + } + /** + * @private + */ + public get bone(): any { + return null; + } + /** + * @private + */ + public get animationState(): any { + return { name: this.clipName }; + } + /** + * @private + */ + public get frameLabel(): any { + return this.name; + } + /** + * @private + */ + public get movementID(): any { + return this.clipName; + } + //========================================= + } + /** + * @private + */ + class MovieSlot extends egret.HashObject { + public displayIndex: number = -1; + public colorIndex: number = -1; + public transformIndex: number = -1; + public rawDisplay: egret.Bitmap = new egret.Bitmap(); + public childMovies: Map = {}; + public config: SlotConfig; + public displayConfig: DisplayConfig | null = null; + public display: egret.DisplayObject; + public childMovie: Movie | null = null; + public colorFilter: egret.ColorMatrixFilter | null = null; + + public constructor(slotConfig: SlotConfig) { + super(); + + this.display = this.rawDisplay; + this.config = slotConfig; + this.rawDisplay.name = this.config.name; + + if (!this.config.blendMode) { + this.config.blendMode = BlendMode.Normal; + } + } + + public dispose(): void { + this.rawDisplay = null as any; + this.childMovies = null as any; + this.config = null as any; + this.displayConfig = null as any; + this.display = null as any; + this.childMovie = null as any; + this.colorFilter = null as any; + } + } + /** + * @language zh_CN + * 通过读取缓存的二进制动画数据来更新动画,具有良好的运行性能,同时对内存的占用也非常低。 + * @see dragonBones.buildMovie + * @version DragonBones 4.7 + */ + export class Movie extends egret.DisplayObjectContainer implements IAnimatable { + private static _cleanBeforeRender(): void { } + /** + * @language zh_CN + * 动画的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 4.7 + */ + public timeScale: number = 1; + /** + * @language zh_CN + * 动画剪辑的播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * (当再次播放其他动画剪辑时,此值将被重置为 1) + * @default 1 + * @version DragonBones 4.7 + */ + public clipTimeScale: number = 1; + + private _batchEnabled: boolean = true; + private _isLockDispose: boolean = false; + private _isDelayDispose: boolean = false; + private _isStarted: boolean = false; + private _isPlaying: boolean = false; + private _isReversing: boolean = false; + private _isCompleted: boolean = false; + private _playTimes: number = 0; + private _time: number = 0; + private _currentTime: number = 0; + private _currentPlayTimes: number = 0; + private _cacheFrameIndex: number = 0; + private _frameSize: number = 0; + private _cacheRectangle: egret.Rectangle | null = null; + private _clock: WorldClock | null = null; + + private _groupConfig: GroupConfig; + private _config: MovieConfig; + private _clipConfig: ClipConfig; + private _currentFrameConfig: FrameConfig | null = null; + private _clipArray: Int16Array; + + private _clipNames: string[] = []; + private _slots: MovieSlot[] = []; + private _childMovies: Movie[] = []; + /** + * @internal + * @private + */ + public constructor(createMovieHelper: any) { + super(); + + this._groupConfig = (createMovieHelper as CreateMovieHelper).groupConfig; + this._config = (createMovieHelper as CreateMovieHelper).movieConfig; + + this._batchEnabled = !(this._config.isNested || this._config.hasChildAnimation); + + if (this._batchEnabled) { + this.$renderNode = new egret.sys.GroupNode(); + this.$renderNode.cleanBeforeRender = Movie._cleanBeforeRender; + } + + this._clipNames.length = 0; + for (let i = 0, l = this._config.clip.length; i < l; ++i) { + this._clipNames.push(this._config.clip[i].name); + } + + for (let i = 0, l = this._config.slot.length; i < l; ++i) { + const slot = new MovieSlot(this._config.slot[i]); + this._updateSlotBlendMode(slot); + this._slots.push(slot); + + if (this._batchEnabled) { + (this.$renderNode).addNode(slot.rawDisplay.$renderNode); + } + else { + this.addChild(slot.rawDisplay); + } + } + + this._frameSize = (1 + 1) * this._slots.length; // displayFrame, transformFrame. + this.name = this._config.name; + this.play(); + this.advanceTime(0.000001); + this.stop(); + } + + private _configToEvent(config: ActionAndEventConfig, event: MovieEvent): void { + event.movie = this; + event.clipName = this._clipConfig.name; + event.name = config.name; + event.slotName = config.slot || ""; + } + + private _onCrossFrame(frameConfig: FrameConfig): void { + for (let i = 0, l = frameConfig.actionAndEvent.length; i < l; ++i) { + const actionAndEvent = frameConfig.actionAndEvent[i]; + if (actionAndEvent) { + switch (actionAndEvent.type) { + case ActionType.Sound: + if (EgretFactory.factory.soundEventManager.hasEventListener(MovieEvent.SOUND_EVENT)) { + const event = egret.Event.create(MovieEvent, MovieEvent.SOUND_EVENT); + this._configToEvent(actionAndEvent, event); + EgretFactory.factory.soundEventManager.dispatchEvent(event); + egret.Event.release(event); + } + break; + + case ActionType.Frame: + if (this.hasEventListener(MovieEvent.FRAME_EVENT)) { + const event = egret.Event.create(MovieEvent, MovieEvent.FRAME_EVENT); + this._configToEvent(actionAndEvent, event); + this.dispatchEvent(event); + egret.Event.release(event); + } + break; + + case ActionType.Play: + if (actionAndEvent.slot) { + const slot = this._getSlot(actionAndEvent.slot); + if (slot && slot.childMovie) { + slot.childMovie.play(actionAndEvent.name); + } + } + else { + this.play(actionAndEvent.name); + } + break; + } + } + } + } + + private _updateSlotBlendMode(slot: MovieSlot): void { + let blendMode = ""; + + switch (slot.config.blendMode) { + case BlendMode.Normal: + blendMode = egret.BlendMode.NORMAL; + break; + + case BlendMode.Add: + blendMode = egret.BlendMode.ADD; + break; + + case BlendMode.Erase: + blendMode = egret.BlendMode.ERASE; + break; + + default: + break; + } + + if (blendMode) { + if (this._batchEnabled) { + // RenderNode display. + (slot.display.$renderNode).blendMode = egret.sys.blendModeToNumber(blendMode); + } + else { + // Classic display. + slot.display.blendMode = blendMode; + } + } + } + + private _updateSlotColor(slot: MovieSlot, aM: number, rM: number, gM: number, bM: number, aO: number, rO: number, gO: number, bO: number): void { + if ( + rM !== 1 || + gM !== 1 || + bM !== 1 || + rO !== 0 || + gO !== 0 || + bO !== 0 || + aO !== 0 + ) { + if (!slot.colorFilter) { + slot.colorFilter = new egret.ColorMatrixFilter(); + } + + const colorMatrix = slot.colorFilter.matrix; + colorMatrix[0] = rM; + colorMatrix[6] = gM; + colorMatrix[12] = bM; + colorMatrix[18] = aM; + colorMatrix[4] = rO; + colorMatrix[9] = gO; + colorMatrix[14] = bO; + colorMatrix[19] = aO; + + slot.colorFilter.matrix = colorMatrix; + + if (this._batchEnabled) { + // RenderNode display. + (slot.display.$renderNode).filter = slot.colorFilter; + (slot.display.$renderNode).alpha = 1.0; + } + else { + // Classic display. + let filters = slot.display.filters; + if (!filters) { + filters = []; + } + + if (filters.indexOf(slot.colorFilter) < 0) { + filters.push(slot.colorFilter); + } + + slot.display.filters = filters; + slot.display.$setAlpha(1.0); + } + } + else { + if (slot.colorFilter) { + slot.colorFilter = null; + } + + if (this._batchEnabled) { + // RenderNode display. + (slot.display.$renderNode).filter = null as any; + (slot.display.$renderNode).alpha = aM; + } + else { + // Classic display. + slot.display.filters = null as any; + slot.display.$setAlpha(aM); + } + } + } + + private _updateSlotDisplay(slot: MovieSlot): void { + const prevDisplay = slot.display || slot.rawDisplay; + const prevChildMovie = slot.childMovie; + + if (slot.displayIndex >= 0) { + slot.displayConfig = this._groupConfig.display[slot.displayIndex]; + if (slot.displayConfig.type === DisplayType.Armature) { + let childMovie = slot.displayConfig.name in slot.childMovies ? slot.childMovies[slot.displayConfig.name] : null; + + if (!childMovie) { + childMovie = buildMovie(slot.displayConfig.name, this._groupConfig.name); + if (childMovie) { + slot.childMovies[slot.displayConfig.name] = childMovie; + } + } + + if (childMovie) { + slot.display = childMovie; + slot.childMovie = childMovie; + } + else { + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + } + else { + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + } + else { + slot.displayConfig = null; + slot.display = slot.rawDisplay; + slot.childMovie = null; + } + + if (slot.display !== prevDisplay) { + if (prevDisplay) { + this.addChild(slot.display); + this.swapChildren(slot.display, prevDisplay); + this.removeChild(prevDisplay); + } + + // Update blendMode. + this._updateSlotBlendMode(slot); + } + + // Update frame. + if (slot.display === slot.rawDisplay) { + if (slot.displayConfig && slot.displayConfig.regionIndex !== null && slot.displayConfig.regionIndex !== undefined) { + if (!slot.displayConfig.texture) { + const textureAtlasTexture = this._groupConfig.textures[slot.displayConfig.textureIndex || 0]; + const regionIndex = slot.displayConfig.regionIndex * 4; + const x = this._groupConfig.rectangleArray[regionIndex]; + const y = this._groupConfig.rectangleArray[regionIndex + 1]; + const width = this._groupConfig.rectangleArray[regionIndex + 2]; + const height = this._groupConfig.rectangleArray[regionIndex + 3]; + + slot.displayConfig.texture = new egret.Texture(); + slot.displayConfig.texture._bitmapData = textureAtlasTexture._bitmapData; + slot.displayConfig.texture.$initData( + x, y, + Math.min(width, textureAtlasTexture.textureWidth - x), Math.min(height, textureAtlasTexture.textureHeight - y), + 0, 0, + Math.min(width, textureAtlasTexture.textureWidth - x), Math.min(height, textureAtlasTexture.textureHeight - y), + textureAtlasTexture.textureWidth, textureAtlasTexture.textureHeight + ); + } + if (this._batchEnabled) { + // RenderNode display. + const texture = slot.displayConfig.texture; + const bitmapNode = slot.rawDisplay.$renderNode as egret.sys.BitmapNode; + egret.sys.RenderNode.prototype.cleanBeforeRender.call(slot.rawDisplay.$renderNode); + bitmapNode.image = texture._bitmapData; + + bitmapNode.drawImage( + texture._bitmapX, texture._bitmapY, + texture._bitmapWidth, texture._bitmapHeight, + texture._offsetX, texture._offsetY, + texture.textureWidth, texture.textureHeight + ); + + bitmapNode.imageWidth = texture._sourceWidth; + bitmapNode.imageHeight = texture._sourceHeight; + } + else { + // Classic display. + slot.rawDisplay.visible = true; + slot.rawDisplay.$setBitmapData(slot.displayConfig.texture); + } + } + else { + if (this._batchEnabled) { + // RenderNode display. + (slot.rawDisplay.$renderNode).image = null as any; + } + else { + // Classic display. + slot.rawDisplay.visible = false; + slot.rawDisplay.$setBitmapData(null as any); + } + } + } + + // Update child movie. + if (slot.childMovie !== prevChildMovie) { + if (prevChildMovie) { + prevChildMovie.stop(); + this._childMovies.slice(this._childMovies.indexOf(prevChildMovie), 1); + } + + if (slot.childMovie) { + if (this._childMovies.indexOf(slot.childMovie) < 0) { + this._childMovies.push(slot.childMovie); + } + + if (slot.config.action) { + slot.childMovie.play(slot.config.action); + } + else { + slot.childMovie.play(slot.childMovie._config.action); + } + } + } + } + + private _getSlot(name: string): MovieSlot | null { + for (let i = 0, l = this._slots.length; i < l; ++i) { + const slot = this._slots[i]; + if (slot.config.name === name) { + return slot; + } + } + + return null; + } + /** + * @inheritDoc + */ + $render(): void { + if (this._batchEnabled) { + // RenderNode display. + } + else { + // Classic display. + super.$render(); + } + } + /** + * @inheritDoc + */ + $measureContentBounds(bounds: egret.Rectangle): void { + if (this._batchEnabled && this._cacheRectangle) { + // RenderNode display. + bounds.setTo(this._cacheRectangle.x, this._cacheRectangle.y, this._cacheRectangle.width - this._cacheRectangle.x, this._cacheRectangle.height - this._cacheRectangle.y); + } + else { + // Classic display. + super.$measureContentBounds(bounds); + } + } + /** + * @inheritDoc + */ + $doAddChild(child: egret.DisplayObject, index: number, notifyListeners?: boolean): egret.DisplayObject { + if (this._batchEnabled) { + // RenderNode display. + console.warn("Can not add child."); + return null as any; + } + + // Classic display. + return super.$doAddChild(child, index, notifyListeners); + } + /** + * @inheritDoc + */ + $doRemoveChild(index: number, notifyListeners?: boolean): egret.DisplayObject { + if (this._batchEnabled) { + // RenderNode display. + console.warn("Can not remove child."); + return null as any; + } + + // Classic display. + return super.$doRemoveChild(index, notifyListeners); + } + /** + * 释放动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public dispose(): void { + if (this._isLockDispose) { + this._isDelayDispose = true; + } + else { + if (this._clock) { + this._clock.remove(this); + } + + if (this._slots) { + for (let i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].dispose(); + } + } + + this._isPlaying = false; + this._cacheRectangle = null; + this._clock = null; + this._groupConfig = null as any; + this._config = null as any; + this._clipConfig = null as any; + this._currentFrameConfig = null; + this._clipArray = null as any; + + this._clipNames = null as any; + this._slots = null as any; + this._childMovies = null as any; + } + } + /** + * @inheritDoc + */ + public advanceTime(passedTime: number): void { + if (this._isPlaying) { + this._isLockDispose = true; + if (passedTime < 0) { + passedTime = -passedTime; + } + passedTime *= this.timeScale; + this._time += passedTime * this.clipTimeScale; + + // Modify time. + const duration = this._clipConfig.duration; + const totalTime = duration * this._playTimes; + let currentTime = this._time; + let currentPlayTimes = this._currentPlayTimes; + if (this._playTimes > 0 && (currentTime >= totalTime || currentTime <= -totalTime)) { + this._isCompleted = true; + currentPlayTimes = this._playTimes; + + if (currentTime < 0) { + currentTime = 0; + } + else { + currentTime = duration; + } + } + else { + this._isCompleted = false; + + if (currentTime < 0) { + currentPlayTimes = Math.floor(-currentTime / duration); + currentTime = duration - (-currentTime % duration); + } + else { + currentPlayTimes = Math.floor(currentTime / duration); + currentTime %= duration; + } + + if (this._playTimes > 0 && currentPlayTimes > this._playTimes) { + currentPlayTimes = this._playTimes; + } + } + + if (this._currentTime === currentTime) { + return; + } + + const cacheFrameIndex = Math.floor(currentTime * this._clipConfig.cacheTimeToFrameScale); + if (this._cacheFrameIndex !== cacheFrameIndex) { + this._cacheFrameIndex = cacheFrameIndex; + + const displayFrameArray = this._groupConfig.displayFrameArray; + const transformArray = this._groupConfig.transformArray; + const colorArray = this._groupConfig.colorArray; + + // + let isFirst = true; + let hasDisplay = false; + let needCacheRectangle = false; + const prevCacheRectangle = this._cacheRectangle; + this._cacheRectangle = this._clipConfig.cacheRectangles[this._cacheFrameIndex]; + if (this._batchEnabled && !this._cacheRectangle) { + needCacheRectangle = true; + this._cacheRectangle = new egret.Rectangle(); + this._clipConfig.cacheRectangles[this._cacheFrameIndex] = this._cacheRectangle; + } + + // Update slots. + for (let i = 0, l = this._slots.length; i < l; ++i) { + const slot = this._slots[i]; + let clipFrameIndex = this._frameSize * this._cacheFrameIndex + i * 2; + if (clipFrameIndex >= this._clipArray.length) { + clipFrameIndex = this._frameSize * (this._cacheFrameIndex - 1) + i * 2; + } + const displayFrameIndex = this._clipArray[clipFrameIndex] * 2; + if (displayFrameIndex >= 0) { + const displayIndex = displayFrameArray[displayFrameIndex]; + const colorIndex = displayFrameArray[displayFrameIndex + 1] * 8; + const transformIndex = this._clipArray[clipFrameIndex + 1] * 6; + let colorChange = false; + + if (slot.displayIndex !== displayIndex) { + slot.displayIndex = displayIndex; + colorChange = true; + this._updateSlotDisplay(slot); + } + + if (slot.colorIndex !== colorIndex || colorChange) { + slot.colorIndex = colorIndex; + if (slot.colorIndex >= 0) { + this._updateSlotColor( + slot, + colorArray[colorIndex] * 0.01, + colorArray[colorIndex + 1] * 0.01, + colorArray[colorIndex + 2] * 0.01, + colorArray[colorIndex + 3] * 0.01, + colorArray[colorIndex + 4], + colorArray[colorIndex + 5], + colorArray[colorIndex + 6], + colorArray[colorIndex + 7] + ); + } + else { + this._updateSlotColor(slot, 1, 1, 1, 1, 0, 0, 0, 0); + } + } + + hasDisplay = true; + + if (slot.transformIndex !== transformIndex) { + slot.transformIndex = transformIndex; + + if (this._batchEnabled) { + // RenderNode display. + let matrix = (slot.display.$renderNode).matrix; + if (!matrix) { + matrix = (slot.display.$renderNode).matrix = new egret.Matrix(); + } + + matrix.a = transformArray[transformIndex]; + matrix.b = transformArray[transformIndex + 1]; + matrix.c = transformArray[transformIndex + 2]; + matrix.d = transformArray[transformIndex + 3]; + matrix.tx = transformArray[transformIndex + 4]; + matrix.ty = transformArray[transformIndex + 5]; + } + else { + // Classic display. + _helpMatrix.a = transformArray[transformIndex]; + _helpMatrix.b = transformArray[transformIndex + 1]; + _helpMatrix.c = transformArray[transformIndex + 2]; + _helpMatrix.d = transformArray[transformIndex + 3]; + _helpMatrix.tx = transformArray[transformIndex + 4]; + _helpMatrix.ty = transformArray[transformIndex + 5]; + + slot.display.$setMatrix(_helpMatrix); + } + } + + // + if (this._batchEnabled && needCacheRectangle && slot.displayConfig) { + // RenderNode display. + const matrix = (slot.display.$renderNode).matrix; + + _helpRectangle.x = 0; + _helpRectangle.y = 0; + _helpRectangle.width = slot.displayConfig.texture.textureWidth; + _helpRectangle.height = slot.displayConfig.texture.textureHeight; + matrix.$transformBounds(_helpRectangle); + + if (isFirst) { + isFirst = false; + this._cacheRectangle.x = _helpRectangle.x; + this._cacheRectangle.width = _helpRectangle.x + _helpRectangle.width; + this._cacheRectangle.y = _helpRectangle.y; + this._cacheRectangle.height = _helpRectangle.y + _helpRectangle.height; + } + else { + this._cacheRectangle.x = Math.min(this._cacheRectangle.x, _helpRectangle.x); + this._cacheRectangle.width = Math.max(this._cacheRectangle.width, _helpRectangle.x + _helpRectangle.width); + this._cacheRectangle.y = Math.min(this._cacheRectangle.y, _helpRectangle.y); + this._cacheRectangle.height = Math.max(this._cacheRectangle.height, _helpRectangle.y + _helpRectangle.height); + } + } + } + else if (slot.displayIndex !== -1) { + slot.displayIndex = -1; + this._updateSlotDisplay(slot); + } + } + + // + if (this._cacheRectangle) { + if (hasDisplay && needCacheRectangle && isFirst && prevCacheRectangle) { + this._cacheRectangle.x = prevCacheRectangle.x; + this._cacheRectangle.y = prevCacheRectangle.y; + this._cacheRectangle.width = prevCacheRectangle.width; + this._cacheRectangle.height = prevCacheRectangle.height; + } + + this.$invalidateContentBounds(); + } + } + + if (this._isCompleted) { + this._isPlaying = false; + } + + if (!this._isStarted) { + this._isStarted = true; + if (this.hasEventListener(MovieEvent.START)) { + const event = egret.Event.create(MovieEvent, MovieEvent.START); + event.movie = this; + event.clipName = this._clipConfig.name; + event.name = ""; + event.slotName = ""; + this.dispatchEvent(event); + } + } + + this._isReversing = this._currentTime > currentTime && this._currentPlayTimes === currentPlayTimes; + this._currentTime = currentTime; + + // Action and event. + const frameCount = this._clipConfig.frame ? this._clipConfig.frame.length : 0; + if (frameCount > 0) { + const currentFrameIndex = Math.floor(this._currentTime * this._config.frameRate); + const currentFrameConfig = this._groupConfig.frame[this._clipConfig.frame[currentFrameIndex]]; + if (this._currentFrameConfig !== currentFrameConfig) { + if (frameCount > 1) { + let crossedFrameConfig = this._currentFrameConfig; + this._currentFrameConfig = currentFrameConfig; + + if (!crossedFrameConfig) { + const prevFrameIndex = Math.floor(this._currentTime * this._config.frameRate); + crossedFrameConfig = this._groupConfig.frame[this._clipConfig.frame[prevFrameIndex]]; + + if (this._isReversing) { + + } + else { + if ( + this._currentTime <= crossedFrameConfig.position || + this._currentPlayTimes !== currentPlayTimes + ) { + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.prev]; + } + } + } + + if (this._isReversing) { + while (crossedFrameConfig !== currentFrameConfig) { + this._onCrossFrame(crossedFrameConfig); + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.prev]; + } + } + else { + while (crossedFrameConfig !== currentFrameConfig) { + crossedFrameConfig = this._groupConfig.frame[crossedFrameConfig.next]; + this._onCrossFrame(crossedFrameConfig); + } + } + } + else { + this._currentFrameConfig = currentFrameConfig; + if (this._currentFrameConfig) { + this._onCrossFrame(this._currentFrameConfig); + } + } + } + } + + if (this._currentPlayTimes !== currentPlayTimes) { + this._currentPlayTimes = currentPlayTimes; + if (this.hasEventListener(MovieEvent.LOOP_COMPLETE)) { + const event = egret.Event.create(MovieEvent, MovieEvent.LOOP_COMPLETE); + event.movie = this; + event.clipName = this._clipConfig.name; + event.name = ""; + event.slotName = ""; + this.dispatchEvent(event); + egret.Event.release(event); + } + + if (this._isCompleted && this.hasEventListener(MovieEvent.COMPLETE)) { + const event = egret.Event.create(MovieEvent, MovieEvent.COMPLETE); + event.movie = this; + event.clipName = this._clipConfig.name; + event.name = ""; + event.slotName = ""; + this.dispatchEvent(event); + egret.Event.release(event); + } + } + } + + this._isLockDispose = false; + if (this._isDelayDispose) { + this.dispose(); + } + } + /** + * 播放动画剪辑。 + * @param clipName 动画剪辑的名称,如果未设置,则播放默认动画剪辑,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画剪辑。 + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + public play(clipName: string | null = null, playTimes: number = -1): void { + if (clipName) { + let clipConfig: ClipConfig | null = null; + for (let i = 0, l = this._config.clip.length; i < l; ++i) { + const data = this._config.clip[i]; + if (data.name === clipName) { + clipConfig = data; + } + } + + if (clipConfig) { + this._clipConfig = clipConfig; + this._clipArray = new Int16Array(this._groupConfig.arrayBuffer, this._groupConfig.offset + this._groupConfig.position[0] + this._clipConfig.p, this._clipConfig.s / this._groupConfig.position[2]); + + if (!this._clipConfig.cacheRectangles) { + this._clipConfig.cacheRectangles = []; + } + + this._isPlaying = true; + this._isStarted = false; + this._isCompleted = false; + + if (playTimes < 0 || playTimes !== playTimes) { + this._playTimes = this._clipConfig.playTimes; + } + else { + this._playTimes = playTimes; + } + + this._time = 0; + this._currentTime = 0; + this._currentPlayTimes = 0; + this._cacheFrameIndex = -1; + this._currentFrameConfig = null; + this._cacheRectangle = null; + + this.clipTimeScale = 1 / this._clipConfig.scale; + } + else { + console.warn("No clip in movie.", this._config.name, clipName); + } + } + else if (this._clipConfig) { + if (this._isPlaying || this._isCompleted) { + this.play(this._clipConfig.name, this._playTimes); + } + else { + this._isPlaying = true; + } + // playTimes + } + else if (this._config.action) { + this.play(this._config.action, playTimes); + } + } + /** + * 暂停播放动画。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public stop(): void { + this._isPlaying = false; + } + /** + * 从指定时间播放动画。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @param playTimes 动画剪辑需要播放的次数。 [-1: 使用动画剪辑默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 5.0 + * @language zh_CN + */ + public gotoAndPlay(clipName: string | null = null, time: number, playTimes: number = -1): void { + time %= this._clipConfig.duration; + if (time < 0) { + time += this._clipConfig.duration; + } + + this.play(clipName, playTimes); + this._time = time; + this._currentTime = time; + } + /** + * 将动画停止到指定时间。 + * @param clipName 动画剪辑的名称。 + * @param time 指定时间。(以秒为单位) + * @version DragonBones 5.0 + * @language zh_CN + */ + public gotoAndStop(clipName: string | null = null, time: number): void { + time %= this._clipConfig.duration; + if (time < 0) { + time += this._clipConfig.duration; + } + + this.play(clipName, 1); + this._time = time; + this._currentTime = time; + + this.advanceTime(0.001); + this.stop(); + } + /** + * 是否包含指定动画剪辑。 + * @param clipName 动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public hasClip(clipName: string): boolean { + for (let i = 0, l = this._config.clip.length; i < l; ++i) { + const clip = this._config.clip[i]; + if (clip.name === clipName) { + return true; + } + } + + return false; + } + /** + * 动画剪辑是否处正在播放。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public get isPlaying(): boolean { + return this._isPlaying && !this._isCompleted; + } + /** + * 动画剪辑是否均播放完毕。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public get isComplete(): boolean { + return this._isCompleted; + } + /** + * 当前动画剪辑的播放时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + public get currentTime(): number { + return this._currentTime; + } + /** + * 当前动画剪辑的总时间。 (以秒为单位) + * @version DragonBones 4.7 + * @language zh_CN + */ + public get totalTime(): number { + return this._clipConfig ? this._clipConfig.duration : 0; + } + /** + * 当前动画剪辑的播放次数。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public get currentPlayTimes(): number { + return this._currentPlayTimes; + } + /** + * 当前动画剪辑需要播放的次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 4.7 + * @language zh_CN + */ + public get playTimes(): number { + return this._playTimes; + } + + public get groupName(): string { + return this._groupConfig.name; + } + /** + * 正在播放的动画剪辑名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public get clipName(): string { + return this._clipConfig ? this._clipConfig.name : ""; + } + /** + * 所有动画剪辑的名称。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public get clipNames(): string[] { + return this._clipNames; + } + /** + * @inheritDoc + */ + public get clock(): WorldClock | null { + return this._clock; + } + public set clock(value: WorldClock | null) { + if (this._clock === value) { + return; + } + + const prevClock = this._clock; + if (prevClock) { + prevClock.remove(this); + } + + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Movie#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Movie#timescale + * @see dragonBones.Movie#stop() + */ + public advanceTimeBySelf(on: boolean): void { + if (on) { + this.clock = EgretFactory.clock; + } + else { + this.clock = null; + } + } + + //========================================= // 兼容旧数据 + /** + * @private + */ + public get display(): any { + return this; + } + /** + * @private + */ + public get animation(): any { + return this; + } + /** + * @private + */ + public get armature(): any { + return this; + } + /** + * @private + */ + public getAnimation(): any { + return this; + } + /** + * @private + */ + public getArmature(): any { + return this; + } + /** + * @private + */ + public getDisplay(): any { + return this; + } + /** + * @private + */ + public hasAnimation(name: string): boolean { + return this.hasClip(name); + } + /** + * @private + */ + public invalidUpdate(...args: any[]): void { + args; + } + /** + * @private + */ + public get lastAnimationName(): string { + return this.clipName; + } + /** + * @private + */ + public get animationNames(): string[] { + return this.clipNames; + } + /** + * @private + */ + public get animationList(): string[] { + return this.clipNames; + } + //========================================= + } +} \ No newline at end of file diff --git a/reference/Egret/4.x/tsconfig.json b/reference/Egret/4.x/tsconfig.json new file mode 100644 index 0000000..44d448e --- /dev/null +++ b/reference/Egret/4.x/tsconfig.json @@ -0,0 +1,78 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": true, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "outFile": "out/dragonBones.js", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ], + "files": [ + "./libs/egret.d.ts", + "../../DragonBones/src/dragonBones/modules.ts", + + "../../DragonBones/src/dragonBones/core/DragonBones.ts", + "../../DragonBones/src/dragonBones/core/BaseObject.ts", + + "../../DragonBones/src/dragonBones/geom/Matrix.ts", + "../../DragonBones/src/dragonBones/geom/Transform.ts", + "../../DragonBones/src/dragonBones/geom/ColorTransform.ts", + "../../DragonBones/src/dragonBones/geom/Point.ts", + "../../DragonBones/src/dragonBones/geom/Rectangle.ts", + + "../../DragonBones/src/dragonBones/model/UserData.ts", + "../../DragonBones/src/dragonBones/model/DragonBonesData.ts", + "../../DragonBones/src/dragonBones/model/ArmatureData.ts", + "../../DragonBones/src/dragonBones/model/ConstraintData.ts", + "../../DragonBones/src/dragonBones/model/DisplayData.ts", + "../../DragonBones/src/dragonBones/model/BoundingBoxData.ts", + "../../DragonBones/src/dragonBones/model/AnimationData.ts", + "../../DragonBones/src/dragonBones/model/AnimationConfig.ts", + "../../DragonBones/src/dragonBones/model/TextureAtlasData.ts", + + "../../DragonBones/src/dragonBones/armature/IArmatureProxy.ts", + "../../DragonBones/src/dragonBones/armature/Armature.ts", + "../../DragonBones/src/dragonBones/armature/TransformObject.ts", + "../../DragonBones/src/dragonBones/armature/Bone.ts", + "../../DragonBones/src/dragonBones/armature/Slot.ts", + "../../DragonBones/src/dragonBones/armature/Constraint.ts", + + "../../DragonBones/src/dragonBones/animation/IAnimatable.ts", + "../../DragonBones/src/dragonBones/animation/WorldClock.ts", + "../../DragonBones/src/dragonBones/animation/Animation.ts", + "../../DragonBones/src/dragonBones/animation/AnimationState.ts", + "../../DragonBones/src/dragonBones/animation/BaseTimelineState.ts", + "../../DragonBones/src/dragonBones/animation/TimelineState.ts", + + "../../DragonBones/src/dragonBones/event/EventObject.ts", + "../../DragonBones/src/dragonBones/event/IEventDispatcher.ts", + + "../../DragonBones/src/dragonBones/parser/DataParser.ts", + "../../DragonBones/src/dragonBones/parser/ObjectDataParser.ts", + "../../DragonBones/src/dragonBones/parser/BinaryDataParser.ts", + + "../../DragonBones/src/dragonBones/factory/BaseFactory.ts", + + "./src/dragonBones/egret/EgretTextureAtlasData.ts", + "./src/dragonBones/egret/EgretArmatureDisplay.ts", + "./src/dragonBones/egret/EgretSlot.ts", + "./src/dragonBones/egret/EgretFactory.ts", + "./src/dragonBones/egret/Movie.ts" + ] +} \ No newline at end of file diff --git a/reference/Egret/4.x/tslint.json b/reference/Egret/4.x/tslint.json new file mode 100644 index 0000000..eeb58d1 --- /dev/null +++ b/reference/Egret/4.x/tslint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "no-unused-expression": true, + "no-unreachable": true, + "no-duplicate-variable": true, + "no-duplicate-key": true, + "no-unused-variable": true, + "curly": false, + "class-name": true, + "triple-equals": true, + "semicolon": [ + true + ] + } +} \ No newline at end of file diff --git a/reference/Egret/5.x/README.md b/reference/Egret/5.x/README.md new file mode 100644 index 0000000..161b092 --- /dev/null +++ b/reference/Egret/5.x/README.md @@ -0,0 +1,8 @@ +## How to build +``` +$npm install +$npm run build +``` + +## Egret declaration +[egret.d.ts](https://github.com/egret-labs/egret-core/blob/master/build/egret/egret.d.ts) \ No newline at end of file diff --git a/reference/Egret/5.x/out/dragonBones.d.ts b/reference/Egret/5.x/out/dragonBones.d.ts new file mode 100644 index 0000000..3286440 --- /dev/null +++ b/reference/Egret/5.x/out/dragonBones.d.ts @@ -0,0 +1,4942 @@ +declare namespace dragonBones { + /** + * @private + */ + const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4, + } + /** + * @private + */ + const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2, + } + /** + * @private + */ + const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3, + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2, + } + /** + * @private + */ + const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11, + } + /** + * @private + */ + const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13, + } + /** + * @private + */ + const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5, + } + /** + * @private + */ + const enum TimelineType { + Action = 0, + ZOrder = 1, + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + AnimationTime = 40, + AnimationWeight = 41, + } + /** + * @private + */ + const enum OffsetMode { + None = 0, + Additive = 1, + Override = 2, + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5, + } + /** + * @private + */ + interface Map { + [key: string]: T; + } + /** + * @private + */ + class DragonBones { + static yDown: boolean; + static debug: boolean; + static debugDraw: boolean; + static webAssembly: boolean; + static readonly VERSION: string; + private readonly _clock; + private readonly _events; + private readonly _objects; + private _eventManager; + constructor(eventManager: IEventDispatcher); + advanceTime(passedTime: number): void; + bufferEvent(value: EventObject): void; + bufferObject(object: BaseObject): void; + readonly clock: WorldClock; + readonly eventManager: IEventDispatcher; + } +} +declare namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class BaseObject { + private static _hashCode; + private static _defaultMaxCount; + private static readonly _maxCountMap; + private static readonly _poolsMap; + private static _returnObject(object); + /** + * @private + */ + static toString(): string; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static clearPool(objectConstructor?: (typeof BaseObject) | null): void; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static borrowObject(objectConstructor: { + new (): T; + }): T; + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly hashCode: number; + private _isInPool; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + returnToPool(): void; + } +} +declare namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Matrix { + a: number; + b: number; + c: number; + d: number; + tx: number; + ty: number; + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Matrix): Matrix; + /** + * @private + */ + copyFromArray(value: Array, offset?: number): Matrix; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + identity(): Matrix; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + concat(value: Matrix): Matrix; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + invert(): Matrix; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + transformPoint(x: number, y: number, result: { + x: number; + y: number; + }, delta?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Transform { + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x: number; + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y: number; + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew: number; + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation: number; + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX: number; + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY: number; + /** + * @private + */ + static readonly PI_D: number; + /** + * @private + */ + static readonly PI_H: number; + /** + * @private + */ + static readonly PI_Q: number; + /** + * @private + */ + static readonly RAD_DEG: number; + /** + * @private + */ + static readonly DEG_RAD: number; + /** + * @private + */ + static normalizeRadian(value: number): number; + constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x?: number, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y?: number, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew?: number, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation?: number, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX?: number, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Transform): Transform; + /** + * @private + */ + identity(): Transform; + /** + * @private + */ + add(value: Transform): Transform; + /** + * @private + */ + minus(value: Transform): Transform; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fromMatrix(matrix: Matrix): Transform; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + toMatrix(matrix: Matrix): Transform; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ColorTransform { + alphaMultiplier: number; + redMultiplier: number; + greenMultiplier: number; + blueMultiplier: number; + alphaOffset: number; + redOffset: number; + greenOffset: number; + blueOffset: number; + constructor(alphaMultiplier?: number, redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaOffset?: number, redOffset?: number, greenOffset?: number, blueOffset?: number); + copyFrom(value: ColorTransform): void; + identity(): void; + } +} +declare namespace dragonBones { + class Point { + x: number; + y: number; + constructor(x?: number, y?: number); + copyFrom(value: Point): void; + clear(): void; + } +} +declare namespace dragonBones { + class Rectangle { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + copyFrom(value: Rectangle): void; + clear(): void; + } +} +declare namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + class UserData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly ints: Array; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly floats: Array; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly strings: Array; + /** + * @private + */ + protected _onClear(): void; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getInt(index?: number): number; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getFloat(index?: number): number; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getString(index?: number): string; + } + /** + * @private + */ + class ActionData extends BaseObject { + static toString(): string; + type: ActionType; + name: string; + bone: BoneData | null; + slot: SlotData | null; + data: UserData | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + class DragonBonesData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly frameIndices: Array; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatureNames: Array; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatures: Map; + /** + * @private + */ + intArray: Array | Int16Array; + /** + * @private + */ + floatArray: Array | Float32Array; + /** + * @private + */ + frameIntArray: Array | Int16Array; + /** + * @private + */ + frameFloatArray: Array | Float32Array; + /** + * @private + */ + frameArray: Array | Int16Array; + /** + * @private + */ + timelineArray: Array | Uint16Array; + /** + * @private + */ + userData: UserData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addArmature(value: ArmatureData): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + getArmature(name: string): ArmatureData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + dispose(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + class CanvasData extends BaseObject { + /** + * @private + */ + static toString(): string; + hasBackground: boolean; + color: number; + x: number; + y: number; + width: number; + height: number; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class ArmatureData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * @private + */ + scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly aabb: Rectangle; + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * @private + */ + readonly sortedBones: Array; + /** + * @private + */ + readonly sortedSlots: Array; + /** + * @private + */ + readonly defaultActions: Array; + /** + * @private + */ + readonly actions: Array; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly bones: Map; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly slots: Map; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly skins: Map; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animations: Map; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultAnimation: AnimationData | null; + /** + * @private + */ + canvas: CanvasData | null; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + sortBones(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number; + /** + * @private + */ + getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void; + /** + * @private + */ + addBone(value: BoneData): void; + /** + * @private + */ + addSlot(value: SlotData): void; + /** + * @private + */ + addSkin(value: SkinData): void; + /** + * @private + */ + addAnimation(value: AnimationData): void; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + getBone(name: string): BoneData | null; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + getSlot(name: string): SlotData | null; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + getSkin(name: string): SkinData | null; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + getAnimation(name: string): AnimationData | null; + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class BoneData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + inheritTranslation: boolean; + /** + * @private + */ + inheritRotation: boolean; + /** + * @private + */ + inheritScale: boolean; + /** + * @private + */ + inheritReflection: boolean; + /** + * @private + */ + length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly transform: Transform; + /** + * @private + */ + readonly constraints: Array; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class SlotData extends BaseObject { + /** + * @private + */ + static readonly DEFAULT_COLOR: ColorTransform; + /** + * @private + */ + static createColor(): ColorTransform; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + blendMode: BlendMode; + /** + * @private + */ + displayIndex: number; + /** + * @private + */ + zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + color: ColorTransform; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + class SkinData extends BaseObject { + static toString(): string; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly displays: Map>; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addDisplay(slotName: string, value: DisplayData | null): void; + /** + * @private + */ + getDisplay(slotName: string, displayName: string): DisplayData | null; + /** + * @private + */ + getDisplays(slotName: string): Array | null; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class ConstraintData extends BaseObject { + order: number; + target: BoneData; + bone: BoneData; + root: BoneData | null; + protected _onClear(): void; + } + /** + * @private + */ + class IKConstraintData extends ConstraintData { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DisplayData extends BaseObject { + type: DisplayType; + name: string; + path: string; + readonly transform: Transform; + parent: ArmatureData; + protected _onClear(): void; + } + /** + * @private + */ + class ImageDisplayData extends DisplayData { + static toString(): string; + readonly pivot: Point; + texture: TextureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class ArmatureDisplayData extends DisplayData { + static toString(): string; + inheritAnimation: boolean; + readonly actions: Array; + armature: ArmatureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class MeshDisplayData extends ImageDisplayData { + static toString(): string; + inheritAnimation: boolean; + offset: number; + weight: WeightData | null; + protected _onClear(): void; + } + /** + * @private + */ + class BoundingBoxDisplayData extends DisplayData { + static toString(): string; + boundingBox: BoundingBoxData | null; + protected _onClear(): void; + } + /** + * @private + */ + class WeightData extends BaseObject { + static toString(): string; + count: number; + offset: number; + readonly bones: Array; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + height: number; + /** + * @private + */ + protected _onClear(): void; + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA: { + x: number; + y: number; + } | null, intersectionPointB: { + x: number; + y: number; + } | null, normalRadians: { + x: number; + y: number; + } | null): number; + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x, y, xMin, yMin, xMax, yMax); + /** + * @private + */ + static rectangleIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xMin: number, yMin: number, xMax: number, yMax: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static ellipseIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xC: number, yC: number, widthH: number, heightH: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static polygonIntersectsSegment(xA: number, yA: number, xB: number, yB: number, vertices: Array | Float32Array, offset: number, count: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + count: number; + /** + * @private + */ + offset: number; + /** + * @private + */ + x: number; + /** + * @private + */ + y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + vertices: Array | Float32Array; + /** + * @private + */ + weight: WeightData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } +} +declare namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + frameIntOffset: number; + /** + * @private + */ + frameFloatOffset: number; + /** + * @private + */ + frameOffset: number; + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + duration: number; + /** + * @private + */ + scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * @private + */ + readonly boneTimelines: Map>; + /** + * @private + */ + readonly slotTimelines: Map>; + /** + * @private + */ + readonly boneCachedFrameIndices: Map>; + /** + * @private + */ + readonly slotCachedFrameIndices: Map>; + /** + * @private + */ + actionTimeline: TimelineData | null; + /** + * @private + */ + zOrderTimeline: TimelineData | null; + /** + * @private + */ + parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + addBoneTimeline(bone: BoneData, timeline: TimelineData): void; + /** + * @private + */ + addSlotTimeline(slot: SlotData, timeline: TimelineData): void; + /** + * @private + */ + getBoneTimelines(name: string): Array | null; + /** + * @private + */ + getSlotTimeline(name: string): Array | null; + /** + * @private + */ + getBoneCachedFrameIndices(name: string): Array | null; + /** + * @private + */ + getSlotCachedFrameIndices(name: string): Array | null; + } + /** + * @private + */ + class TimelineData extends BaseObject { + static toString(): string; + type: TimelineType; + offset: number; + frameIndicesOffset: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + class AnimationConfig extends BaseObject { + static toString(): string; + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTime: number; + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly boneMask: Array; + /** + * @private + */ + protected _onClear(): void; + clear(): void; + copyFrom(value: AnimationConfig): void; + containsBoneMask(name: string): boolean; + addBoneMask(armature: Armature, name: string, recursive?: boolean): void; + removeBoneMask(armature: Armature, name: string, recursive?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + width: number; + /** + * @private + */ + height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + imagePath: string; + /** + * @private + */ + readonly textures: Map; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + copyFrom(value: TextureAtlasData): void; + /** + * @private + */ + abstract createTexture(): TextureData; + /** + * @private + */ + addTexture(value: TextureData): void; + /** + * @private + */ + getTexture(name: string): TextureData | null; + } + /** + * @private + */ + abstract class TextureData extends BaseObject { + static createRectangle(): Rectangle; + rotated: boolean; + name: string; + readonly region: Rectangle; + parent: TextureAtlasData; + frame: Rectangle | null; + protected _onClear(): void; + copyFrom(value: TextureData): void; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} +declare namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + class Armature extends BaseObject implements IAnimatable { + static toString(): string; + private static _onSortSlots(a, b); + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + inheritAnimation: boolean; + /** + * @private + */ + debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + private _debugDraw; + private _lockUpdate; + private _bonesDirty; + private _slotsDirty; + private _zOrderDirty; + private _flipX; + private _flipY; + /** + * @internal + * @private + */ + _cacheFrameIndex: number; + private readonly _bones; + private readonly _slots; + private readonly _actions; + private _animation; + private _proxy; + private _display; + /** + * @private + */ + _replaceTextureAtlasData: TextureAtlasData | null; + private _replacedTexture; + /** + * @internal + * @private + */ + _dragonBones: DragonBones; + private _clock; + /** + * @internal + * @private + */ + _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void; + private _sortBones(); + private _sortSlots(); + /** + * @internal + * @private + */ + _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void; + /** + * @internal + * @private + */ + _addBoneToBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _removeBoneFromBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _addSlotToSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _removeSlotFromSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _bufferAction(action: ActionData, append: boolean): void; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @private + */ + init(armatureData: ArmatureData, proxy: IArmatureProxy, display: any, dragonBones: DragonBones): void; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(boneName?: string | null, updateSlotDisplay?: boolean): void; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): Slot | null; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): Slot | null; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBone(name: string): Bone | null; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBoneByDisplay(display: any): Bone | null; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlot(name: string): Slot | null; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlotByDisplay(display: any): Slot | null; + /** + * @deprecated + */ + addBone(value: Bone, parentName?: string | null): void; + /** + * @deprecated + */ + removeBone(value: Bone): void; + /** + * @deprecated + */ + addSlot(value: Slot, parentName: string): void; + /** + * @deprecated + */ + removeSlot(value: Slot): void; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + flipX: boolean; + flipY: boolean; + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + cacheFrameRate: number; + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly name: string; + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animation: Animation; + /** + * @pivate + */ + readonly proxy: IArmatureProxy; + /** + * @pivate + */ + readonly eventDispatcher: IEventDispatcher; + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly display: any; + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + replacedTexture: any; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly parent: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + replaceTexture(texture: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + hasEventListener(type: EventStringType): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + addEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + removeEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + enableAnimationCache(frameRate: number): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + } +} +declare namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix; + /** + * @private + */ + protected static readonly _helpTransform: Transform; + /** + * @private + */ + protected static readonly _helpPoint: Point; + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly globalTransformMatrix: Matrix; + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly global: Transform; + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly offset: Transform; + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + _armature: Armature; + /** + * @private + */ + _parent: Bone; + /** + * @private + */ + protected _onClear(): void; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setParent(value: Bone | null): void; + /** + * @private + */ + updateGlobalTransform(): void; + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armature: Armature; + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly parent: Bone; + } +} +declare namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class Bone extends TransformObject { + static toString(): string; + /** + * @private + */ + offsetMode: OffsetMode; + /** + * @internal + * @private + */ + readonly animationPose: Transform; + /** + * @internal + * @private + */ + readonly constraints: Array; + /** + * @readonly + */ + boneData: BoneData; + /** + * @internal + * @private + */ + _transformDirty: boolean; + /** + * @internal + * @private + */ + _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + _blendDirty: boolean; + private _localDirty; + private _visible; + private _cachedFrameIndex; + /** + * @internal + * @private + */ + _blendLayer: number; + /** + * @internal + * @private + */ + _blendLeftWeight: number; + /** + * @internal + * @private + */ + _blendLayerWeight: number; + private readonly _bones; + private readonly _slots; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache); + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + init(boneData: BoneData): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @internal + * @private + */ + updateByConstraint(): void; + /** + * @internal + * @private + */ + addConstraint(constraint: Constraint): void; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(child: TransformObject): boolean; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + visible: boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + readonly length: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + readonly slot: Slot | null; + } +} +declare namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + displayController: string | null; + /** + * @readonly + */ + slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + _colorDirty: boolean; + /** + * @private + */ + _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + _pivotX: number; + /** + * @private + */ + _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix; + /** + * @private + */ + readonly _colorTransform: ColorTransform; + /** + * @private + */ + readonly _ffdVertices: Array; + /** + * @private + */ + readonly _displayDatas: Array; + /** + * @private + */ + protected readonly _displayList: Array; + /** + * @private + */ + protected readonly _meshBones: Array; + /** + * @internal + * @private + */ + _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any; + /** + * @private + */ + protected _meshDisplay: any; + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void; + /** + * @private + */ + protected _updateDisplay(): void; + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void; + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setDisplayIndex(value: number, isAnimation?: boolean): boolean; + /** + * @internal + * @private + */ + _setZorder(value: number): boolean; + /** + * @internal + * @private + */ + _setColor(value: ColorTransform): boolean; + /** + * @private + */ + _setDisplayList(value: Array | null): boolean; + /** + * @private + */ + init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @private + */ + updateTransformAndMatrix(): void; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): boolean; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + displayIndex: number; + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + displayList: Array; + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + readonly boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + readonly rawDisplay: any; + /** + * @private + */ + readonly meshDisplay: any; + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + display: any; + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + childArmature: Armature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + setDisplay(value: any): void; + } +} +declare namespace dragonBones { + /** + * @private + * @internal + */ + abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix; + protected static readonly _helpTransform: Transform; + protected static readonly _helpPoint: Point; + target: Bone; + bone: Bone; + root: Bone | null; + protected _onClear(): void; + abstract update(): void; + } + /** + * @private + * @internal + */ + class IKConstraint extends Constraint { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + private _computeA(); + private _computeB(); + update(): void; + } +} +declare namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + time: number; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private readonly _animatebles; + private _clock; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(time?: number); + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(value: IAnimatable): boolean; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + add(value: IAnimatable): void; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + remove(value: IAnimatable): void; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + clear(): void; + /** + * @inheritDoc + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + class Animation extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private _animationDirty; + /** + * @internal + * @private + */ + _timelineDirty: boolean; + private readonly _animationNames; + private readonly _animationStates; + private readonly _animations; + private _armature; + private _animationConfig; + private _lastAnimationState; + /** + * @private + */ + protected _onClear(): void; + private _fadeOut(animationConfig); + /** + * @internal + * @private + */ + init(armature: Armature): void; + /** + * @internal + * @private + */ + advanceTime(passedTime: number): void; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + reset(): void; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(animationName?: string | null): void; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + playConfig(animationConfig: AnimationConfig): AnimationState | null; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + play(animationName?: string | null, playTimes?: number): AnimationState | null; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + fadeIn(animationName: string, fadeInTime?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode): AnimationState | null; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByTime(animationName: string, time?: number, playTimes?: number): AnimationState | null; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByFrame(animationName: string, frame?: number, playTimes?: number): AnimationState | null; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByProgress(animationName: string, progress?: number, playTimes?: number): AnimationState | null; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByTime(animationName: string, time?: number): AnimationState | null; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByFrame(animationName: string, frame?: number): AnimationState | null; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByProgress(animationName: string, progress?: number): AnimationState | null; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + getState(animationName: string): AnimationState | null; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + hasAnimation(animationName: string): boolean; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + getStates(): Array; + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationName: string; + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + animations: Map; + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly animationConfig: AnimationConfig; + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + gotoAndPlay(animationName: string, fadeInTime?: number, duration?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode, pauseFadeOut?: boolean, pauseFadeIn?: boolean): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + gotoAndStop(animationName: string, time?: number): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationList: Array; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationDataList: Array; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class BonePose extends BaseObject { + static toString(): string; + readonly current: Transform; + readonly delta: Transform; + readonly result: Transform; + protected _onClear(): void; + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationState extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * @private + */ + fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + animationData: AnimationData; + private _timelineDirty; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + _subFadeState: number; + /** + * @internal + * @private + */ + _position: number; + /** + * @internal + * @private + */ + _duration: number; + private _fadeTime; + private _time; + /** + * @internal + * @private + */ + _fadeProgress: number; + private _weightResult; + private readonly _boneMask; + private readonly _boneTimelines; + private readonly _slotTimelines; + private readonly _bonePoses; + private _armature; + /** + * @internal + * @private + */ + _actionTimeline: ActionTimelineState; + private _zOrderTimeline; + /** + * @private + */ + protected _onClear(): void; + private _isDisabled(slot); + private _advanceFadeTime(passedTime); + private _blendBoneTimline(timeline); + /** + * @private + * @internal + */ + init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void; + /** + * @private + * @internal + */ + updateTimelines(): void; + /** + * @private + * @internal + */ + advanceTime(passedTime: number, cacheFrameRate: number): void; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + play(): void; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(): void; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeOut(fadeOutTime: number, pausePlayhead?: boolean): void; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + containsBoneMask(name: string): boolean; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + addBoneMask(name: string, recursive?: boolean): void; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeBoneMask(name: string, recursive?: boolean): void; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeAllBoneMask(): void; + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeIn: boolean; + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeOut: boolean; + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeComplete: boolean; + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + currentTime: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + readonly clip: AnimationData; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + const enum TweenState { + None = 0, + Once = 1, + Always = 2, + } + /** + * @internal + * @private + */ + abstract class TimelineState extends BaseObject { + playState: number; + currentPlayTimes: number; + currentTime: number; + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + protected _onClear(): void; + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + protected _setCurrentTime(passedTime: number): boolean; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType, progress, easing); + private static _getEasingCurveValue(progress, samples, count, offset); + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + abstract class BoneTimelineState extends TweenTimelineState { + bone: Bone; + bonePose: BonePose; + protected _onClear(): void; + } + /** + * @internal + * @private + */ + abstract class SlotTimelineState extends TweenTimelineState { + slot: Slot; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class ActionTimelineState extends TimelineState { + static toString(): string; + private _onCrossFrame(frameIndex); + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + update(passedTime: number): void; + setCurrentTime(value: number): void; + } + /** + * @internal + * @private + */ + class ZOrderTimelineState extends TimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + class BoneAllTimelineState extends BoneTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + } + /** + * @internal + * @private + */ + class SlotDislayIndexTimelineState extends SlotTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + } + /** + * @internal + * @private + */ + class SlotColorTimelineState extends SlotTimelineState { + static toString(): string; + private _dirty; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + class SlotFFDTimelineState extends SlotTimelineState { + static toString(): string; + meshOffset: number; + private _dirty; + private _frameFloatOffset; + private _valueCount; + private _ffdCount; + private _valueOffset; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } +} +declare namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly START: string; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly LOOP_COMPLETE: string; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly COMPLETE: string; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN: string; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN_COMPLETE: string; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT: string; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT_COMPLETE: string; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FRAME_EVENT: string; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly SOUND_EVENT: string; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + data: UserData | null; + /** + * @private + */ + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + type EventStringType = string | "start" | "loopComplete" | "complete" | "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string; + protected static readonly DATA_VERSION_3_0: string; + protected static readonly DATA_VERSION_4_0: string; + protected static readonly DATA_VERSION_4_5: string; + protected static readonly DATA_VERSION_5_0: string; + protected static readonly DATA_VERSION: string; + protected static readonly DATA_VERSIONS: Array; + protected static readonly TEXTURE_ATLAS: string; + protected static readonly SUB_TEXTURE: string; + protected static readonly FORMAT: string; + protected static readonly IMAGE_PATH: string; + protected static readonly WIDTH: string; + protected static readonly HEIGHT: string; + protected static readonly ROTATED: string; + protected static readonly FRAME_X: string; + protected static readonly FRAME_Y: string; + protected static readonly FRAME_WIDTH: string; + protected static readonly FRAME_HEIGHT: string; + protected static readonly DRADON_BONES: string; + protected static readonly USER_DATA: string; + protected static readonly ARMATURE: string; + protected static readonly BONE: string; + protected static readonly IK: string; + protected static readonly SLOT: string; + protected static readonly SKIN: string; + protected static readonly DISPLAY: string; + protected static readonly ANIMATION: string; + protected static readonly Z_ORDER: string; + protected static readonly FFD: string; + protected static readonly FRAME: string; + protected static readonly TRANSLATE_FRAME: string; + protected static readonly ROTATE_FRAME: string; + protected static readonly SCALE_FRAME: string; + protected static readonly VISIBLE_FRAME: string; + protected static readonly DISPLAY_FRAME: string; + protected static readonly COLOR_FRAME: string; + protected static readonly DEFAULT_ACTIONS: string; + protected static readonly ACTIONS: string; + protected static readonly EVENTS: string; + protected static readonly INTS: string; + protected static readonly FLOATS: string; + protected static readonly STRINGS: string; + protected static readonly CANVAS: string; + protected static readonly TRANSFORM: string; + protected static readonly PIVOT: string; + protected static readonly AABB: string; + protected static readonly COLOR: string; + protected static readonly VERSION: string; + protected static readonly COMPATIBLE_VERSION: string; + protected static readonly FRAME_RATE: string; + protected static readonly TYPE: string; + protected static readonly SUB_TYPE: string; + protected static readonly NAME: string; + protected static readonly PARENT: string; + protected static readonly TARGET: string; + protected static readonly SHARE: string; + protected static readonly PATH: string; + protected static readonly LENGTH: string; + protected static readonly DISPLAY_INDEX: string; + protected static readonly BLEND_MODE: string; + protected static readonly INHERIT_TRANSLATION: string; + protected static readonly INHERIT_ROTATION: string; + protected static readonly INHERIT_SCALE: string; + protected static readonly INHERIT_REFLECTION: string; + protected static readonly INHERIT_ANIMATION: string; + protected static readonly INHERIT_FFD: string; + protected static readonly BEND_POSITIVE: string; + protected static readonly CHAIN: string; + protected static readonly WEIGHT: string; + protected static readonly FADE_IN_TIME: string; + protected static readonly PLAY_TIMES: string; + protected static readonly SCALE: string; + protected static readonly OFFSET: string; + protected static readonly POSITION: string; + protected static readonly DURATION: string; + protected static readonly TWEEN_TYPE: string; + protected static readonly TWEEN_EASING: string; + protected static readonly TWEEN_ROTATE: string; + protected static readonly TWEEN_SCALE: string; + protected static readonly CURVE: string; + protected static readonly SOUND: string; + protected static readonly EVENT: string; + protected static readonly ACTION: string; + protected static readonly X: string; + protected static readonly Y: string; + protected static readonly SKEW_X: string; + protected static readonly SKEW_Y: string; + protected static readonly SCALE_X: string; + protected static readonly SCALE_Y: string; + protected static readonly VALUE: string; + protected static readonly ROTATE: string; + protected static readonly SKEW: string; + protected static readonly ALPHA_OFFSET: string; + protected static readonly RED_OFFSET: string; + protected static readonly GREEN_OFFSET: string; + protected static readonly BLUE_OFFSET: string; + protected static readonly ALPHA_MULTIPLIER: string; + protected static readonly RED_MULTIPLIER: string; + protected static readonly GREEN_MULTIPLIER: string; + protected static readonly BLUE_MULTIPLIER: string; + protected static readonly UVS: string; + protected static readonly VERTICES: string; + protected static readonly TRIANGLES: string; + protected static readonly WEIGHTS: string; + protected static readonly SLOT_POSE: string; + protected static readonly BONE_POSE: string; + protected static readonly GOTO_AND_PLAY: string; + protected static readonly DEFAULT_NAME: string; + protected static _getArmatureType(value: string): ArmatureType; + protected static _getDisplayType(value: string): DisplayType; + protected static _getBoundingBoxType(value: string): BoundingBoxType; + protected static _getActionType(value: string): ActionType; + protected static _getBlendMode(value: string): BlendMode; + /** + * @private + */ + abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static parseDragonBonesData(rawData: any): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + static parseTextureAtlasData(rawData: any, scale?: number): any; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ObjectDataParser extends DataParser { + /** + * @private + */ + private _intArrayJson; + private _floatArrayJson; + private _frameIntArrayJson; + private _frameFloatArrayJson; + private _frameArrayJson; + private _timelineArrayJson; + private _intArrayBuffer; + private _floatArrayBuffer; + private _frameIntArrayBuffer; + private _frameFloatArrayBuffer; + private _frameArrayBuffer; + private _timelineArrayBuffer; + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean; + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number; + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string; + protected _rawTextureAtlasIndex: number; + protected readonly _rawBones: Array; + protected _data: DragonBonesData; + protected _armature: ArmatureData; + protected _bone: BoneData; + protected _slot: SlotData; + protected _skin: SkinData; + protected _mesh: MeshDisplayData; + protected _animation: AnimationData; + protected _timeline: TimelineData; + protected _rawTextureAtlases: Array | null; + private _defalultColorOffset; + private _prevTweenRotate; + private _prevRotation; + private readonly _helpMatrixA; + private readonly _helpMatrixB; + private readonly _helpTransform; + private readonly _helpColorTransform; + private readonly _helpPoint; + private readonly _helpArray; + private readonly _actionFrames; + private readonly _weightSlotPose; + private readonly _weightBonePoses; + private readonly _weightBoneIndices; + private readonly _cacheBones; + private readonly _meshs; + private readonly _slotChildActions; + /** + * @private + */ + private _getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, t, result); + /** + * @private + */ + private _samplingEasingCurve(curve, samples); + private _sortActionFrame(a, b); + private _parseActionDataInFrame(rawData, frameStart, bone, slot); + private _mergeActionFrame(rawData, frameStart, type, bone, slot); + private _parseCacheActionFrame(frame); + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData; + /** + * @private + */ + protected _parseBone(rawData: any): BoneData; + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void; + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData; + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData; + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null; + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void; + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseTimeline(rawData: any, type: TimelineType, addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, frameParser: (rawData: any, frameStart: number, frameCount: number) => number): TimelineData | null; + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void; + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void; + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number; + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void; + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @private + */ + protected _parseWASMArray(): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @inheritDoc + */ + parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale?: number): boolean; + /** + * @private + */ + private static _objectDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): ObjectDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BinaryDataParser extends ObjectDataParser { + private _binary; + private _binaryOffset; + private _intArray; + private _floatArray; + private _frameIntArray; + private _frameFloatArray; + private _frameArray; + private _timelineArray; + private _inRange(a, min, max); + private _decodeUTF8(data); + private _getUTF16Key(value); + private _parseBinaryTimeline(type, offset, timelineData?); + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @private + */ + private static _binaryDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): BinaryDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BuildArmaturePackage { + dataName: string; + textureAtlasName: string; + data: DragonBonesData; + armature: ArmatureData; + skin: SkinData | null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map>; + /** + * @private + */ + protected _dragonBones: DragonBones; + /** + * @private + */ + protected _dataParser: DataParser; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null; + /** + * @private + */ + protected _fillBuildArmaturePackage(dataPackage: BuildArmaturePackage, dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string): boolean; + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseDragonBonesData(rawData: any, name?: string | null, scale?: number): DragonBonesData | null; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + updateTextureAtlasData(name: string, textureAtlases: Array): void; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + getDragonBonesData(name: string): DragonBonesData | null; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + addDragonBonesData(data: DragonBonesData, name?: string | null): void; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeDragonBonesData(name: string, disposeData?: boolean): void; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureAtlasData(name: string): Array | null; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + addTextureAtlasData(data: TextureAtlasData, name?: string | null): void; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeTextureAtlasData(name: string, disposeData?: boolean): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + getArmatureData(name: string, dragonBonesName?: string): ArmatureData | null; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + clear(disposeData?: boolean): void; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + buildArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): Armature | null; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplayList(dragonBonesName: string | null, armatureName: string, slotName: string, slot: Slot): void; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + copyAnimationsToArmature(toArmature: Armature, fromArmatreName: string, fromSkinName?: string | null, fromDragonBonesDataName?: string | null, replaceOriginalAnimation?: boolean): boolean; + /** + * @private + */ + getAllDragonBonesData(): Map; + /** + * @private + */ + getAllTextureAtlasData(): Map>; + } +} +declare namespace dragonBones { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretTextureAtlasData extends TextureAtlasData { + /** + * @private + */ + static toString(): string; + private _renderTexture; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + createTexture(): TextureData; + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + renderTexture: egret.Texture | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + dispose(): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + readonly texture: egret.Texture | null; + } + /** + * @private + */ + class EgretTextureData extends TextureData { + static toString(): string; + renderTexture: egret.Texture | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EgretEvent extends egret.Event { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly eventObject: EventObject; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationName: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + readonly armature: Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + readonly bone: Bone | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + readonly slot: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + readonly frameLabel: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + readonly sound: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationName + */ + readonly movementID: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + static START: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + static LOOP_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + static COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + static FADE_IN: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + static FADE_IN_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + static FADE_OUT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + static FADE_OUT_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static ANIMATION_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static BONE_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static MOVEMENT_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND: string; + } + /** + * @inheritDoc + */ + class EgretArmatureDisplay extends egret.DisplayObjectContainer implements IArmatureProxy, IEventDispatcher { + private _disposeProxy; + private _armature; + private _debugDrawer; + /** + * @inheritDoc + */ + init(armature: Armature): void; + /** + * @inheritDoc + */ + clear(): void; + /** + * @inheritDoc + */ + dispose(disposeProxy?: boolean): void; + /** + * @inheritDoc + */ + debugUpdate(isEnabled: boolean): void; + /** + * @inheritDoc + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * @inheritDoc + */ + hasEvent(type: EventStringType): boolean; + /** + * @inheritDoc + */ + addEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * @inheritDoc + */ + removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * @inheritDoc + */ + readonly armature: Armature; + /** + * @inheritDoc + */ + readonly animation: Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + advanceTimeBySelf(on: boolean): void; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature + */ + type FastArmature = Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Bone + */ + type FastBone = Bone; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Slot + */ + type FastSlot = Slot; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Animation + */ + type FastAnimation = Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.AnimationState + */ + type FastAnimationState = AnimationState; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class Event extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class ArmatureEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class AnimationEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class FrameEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + class SoundEvent extends EgretEvent { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + class EgretTextureAtlas extends EgretTextureAtlasData { + /** + * @private + */ + static toString(): string; + constructor(texture: egret.Texture, rawData: any, scale?: number); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + class EgretSheetAtlas extends EgretTextureAtlas { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + class SoundEventManager { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + static getInstance(): EgretArmatureDisplay; + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + class AnimationCacheManager { + } +} +declare namespace dragonBones { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretSlot extends Slot { + static toString(): string; + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + transformUpdateEnabled: boolean; + private _renderDisplay; + private _colorFilter; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected _initDisplay(value: any): void; + /** + * @private + */ + protected _disposeDisplay(value: any): void; + /** + * @private + */ + protected _onUpdateDisplay(): void; + /** + * @private + */ + protected _addDisplay(): void; + /** + * @private + */ + protected _replaceDisplay(value: any): void; + /** + * @private + */ + protected _removeDisplay(): void; + /** + * @private + */ + protected _updateZOrder(): void; + /** + * @internal + * @private + */ + _updateVisible(): void; + /** + * @private + */ + protected _updateBlendMode(): void; + /** + * @private + */ + protected _updateColor(): void; + /** + * @private + */ + protected _updateFrame(): void; + /** + * @private + */ + protected _updateMesh(): void; + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void; + } +} +declare namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretFactory extends BaseFactory { + private static _time; + private static _dragonBones; + private static _factory; + private static _clockHandler(time); + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + static readonly factory: EgretFactory; + /** + * @inheritDoc + */ + constructor(); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: EgretTextureAtlasData | null, textureAtlas: egret.Texture): EgretTextureAtlasData; + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + buildArmatureDisplay(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): EgretArmatureDisplay | null; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureDisplay(textureName: string, textureAtlasName?: string | null): egret.Bitmap | null; + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly soundEventManager: EgretArmatureDisplay; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + addSkeletonData(dragonBonesData: DragonBonesData, dragonBonesName?: string | null): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + getSkeletonData(dragonBonesName: string): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + removeSkeletonData(dragonBonesName: string): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + addTextureAtlas(textureAtlasData: TextureAtlasData, dragonBonesName?: string | null): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + getTextureAtlas(dragonBonesName: string): TextureAtlasData[] | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + removeTextureAtlas(dragonBonesName: string): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + buildFastArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null): FastArmature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + dispose(): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + readonly soundEventManater: EgretArmatureDisplay; + } +} diff --git a/reference/Egret/5.x/out/dragonBones.js b/reference/Egret/5.x/out/dragonBones.js new file mode 100644 index 0000000..d19fd65 --- /dev/null +++ b/reference/Egret/5.x/out/dragonBones.js @@ -0,0 +1,11720 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DragonBones = (function () { + function DragonBones(eventManager) { + this._clock = new dragonBones.WorldClock(); + this._events = []; + this._objects = []; + this._eventManager = null; + this._eventManager = eventManager; + } + DragonBones.prototype.advanceTime = function (passedTime) { + if (this._objects.length > 0) { + for (var _i = 0, _a = this._objects; _i < _a.length; _i++) { + var object = _a[_i]; + object.returnToPool(); + } + this._objects.length = 0; + } + this._clock.advanceTime(passedTime); + if (this._events.length > 0) { + for (var i = 0; i < this._events.length; ++i) { + var eventObject = this._events[i]; + var armature = eventObject.armature; + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + this.bufferObject(eventObject); + } + this._events.length = 0; + } + }; + DragonBones.prototype.bufferEvent = function (value) { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + }; + DragonBones.prototype.bufferObject = function (object) { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + }; + Object.defineProperty(DragonBones.prototype, "clock", { + get: function () { + return this._clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DragonBones.prototype, "eventManager", { + get: function () { + return this._eventManager; + }, + enumerable: true, + configurable: true + }); + DragonBones.yDown = true; + DragonBones.debug = false; + DragonBones.debugDraw = false; + DragonBones.webAssembly = false; + DragonBones.VERSION = "5.1.0"; + return DragonBones; + }()); + dragonBones.DragonBones = DragonBones; + if (!console.warn) { + console.warn = function () { }; + } + if (!console.assert) { + console.assert = function () { }; + } +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var BaseObject = (function () { + function BaseObject() { + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + this.hashCode = BaseObject._hashCode++; + this._isInPool = false; + } + BaseObject._returnObject = function (object) { + var classType = String(object.constructor); + var maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + }; + /** + * @private + */ + BaseObject.toString = function () { + throw new Error(); + }; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.setMaxCount = function (objectConstructor, maxCount) { + if (maxCount < 0 || maxCount !== maxCount) { + maxCount = 0; + } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (var classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + var pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + } + }; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.clearPool = function (objectConstructor) { + if (objectConstructor === void 0) { objectConstructor = null; } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (var k in BaseObject._poolsMap) { + var pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + }; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.borrowObject = function (objectConstructor) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + var object_1 = pool.pop(); + object_1._isInPool = false; + return object_1; + } + var object = new objectConstructor(); + object._onClear(); + return object; + }; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.prototype.returnToPool = function () { + this._onClear(); + BaseObject._returnObject(this); + }; + BaseObject._hashCode = 0; + BaseObject._defaultMaxCount = 1000; + BaseObject._maxCountMap = {}; + BaseObject._poolsMap = {}; + return BaseObject; + }()); + dragonBones.BaseObject = BaseObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Matrix = (function () { + function Matrix(a, b, c, d, tx, ty) { + if (a === void 0) { a = 1.0; } + if (b === void 0) { b = 0.0; } + if (c === void 0) { c = 0.0; } + if (d === void 0) { d = 1.0; } + if (tx === void 0) { tx = 0.0; } + if (ty === void 0) { ty = 0.0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * @private + */ + Matrix.prototype.toString = function () { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + }; + /** + * @private + */ + Matrix.prototype.copyFrom = function (value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + return this; + }; + /** + * @private + */ + Matrix.prototype.copyFromArray = function (value, offset) { + if (offset === void 0) { offset = 0; } + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + return this; + }; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.identity = function () { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + }; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.concat = function (value) { + var aA = this.a * value.a; + var bA = 0.0; + var cA = 0.0; + var dA = this.d * value.d; + var txA = this.tx * value.a + value.tx; + var tyA = this.ty * value.d + value.ty; + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + return this; + }; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.invert = function () { + var aA = this.a; + var bA = this.b; + var cA = this.c; + var dA = this.d; + var txA = this.tx; + var tyA = this.ty; + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + return this; + } + var determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + } + determinant = 1.0 / determinant; + var k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + return this; + }; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.transformPoint = function (x, y, result, delta) { + if (delta === void 0) { delta = false; } + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + }; + return Matrix; + }()); + dragonBones.Matrix = Matrix; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Transform = (function () { + function Transform( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (skew === void 0) { skew = 0.0; } + if (rotation === void 0) { rotation = 0.0; } + if (scaleX === void 0) { scaleX = 1.0; } + if (scaleY === void 0) { scaleY = 1.0; } + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + /** + * @private + */ + Transform.normalizeRadian = function (value) { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + return value; + }; + /** + * @private + */ + Transform.prototype.toString = function () { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + }; + /** + * @private + */ + Transform.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.identity = function () { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + return this; + }; + /** + * @private + */ + Transform.prototype.add = function (value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.minus = function (value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + return this; + }; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.fromMatrix = function (matrix) { + var backupScaleX = this.scaleX, backupScaleY = this.scaleY; + var PI_Q = Transform.PI_Q; + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + var skewX = Math.atan(-matrix.c / matrix.d); + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + this.skew = skewX - this.rotation; + return this; + }; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.toMatrix = function (matrix) { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + matrix.tx = this.x; + matrix.ty = this.y; + return this; + }; + /** + * @private + */ + Transform.PI_D = Math.PI * 2.0; + /** + * @private + */ + Transform.PI_H = Math.PI / 2.0; + /** + * @private + */ + Transform.PI_Q = Math.PI / 4.0; + /** + * @private + */ + Transform.RAD_DEG = 180.0 / Math.PI; + /** + * @private + */ + Transform.DEG_RAD = Math.PI / 180.0; + return Transform; + }()); + dragonBones.Transform = Transform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ColorTransform = (function () { + function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) { + if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; } + if (redMultiplier === void 0) { redMultiplier = 1.0; } + if (greenMultiplier === void 0) { greenMultiplier = 1.0; } + if (blueMultiplier === void 0) { blueMultiplier = 1.0; } + if (alphaOffset === void 0) { alphaOffset = 0; } + if (redOffset === void 0) { redOffset = 0; } + if (greenOffset === void 0) { greenOffset = 0; } + if (blueOffset === void 0) { blueOffset = 0; } + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + ColorTransform.prototype.copyFrom = function (value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + }; + ColorTransform.prototype.identity = function () { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + }; + return ColorTransform; + }()); + dragonBones.ColorTransform = ColorTransform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Point = (function () { + function Point(x, y) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + this.x = x; + this.y = y; + } + Point.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + }; + Point.prototype.clear = function () { + this.x = this.y = 0.0; + }; + return Point; + }()); + dragonBones.Point = Point; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Rectangle = (function () { + function Rectangle(x, y, width, height) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (width === void 0) { width = 0.0; } + if (height === void 0) { height = 0.0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Rectangle.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + }; + Rectangle.prototype.clear = function () { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + }; + return Rectangle; + }()); + dragonBones.Rectangle = Rectangle; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + var UserData = (function (_super) { + __extends(UserData, _super); + function UserData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.ints = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.floats = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.strings = []; + return _this; + } + /** + * @private + */ + UserData.toString = function () { + return "[class dragonBones.UserData]"; + }; + /** + * @private + */ + UserData.prototype._onClear = function () { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + }; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getInt = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + }; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getFloat = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + }; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getString = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + }; + return UserData; + }(dragonBones.BaseObject)); + dragonBones.UserData = UserData; + /** + * @private + */ + var ActionData = (function (_super) { + __extends(ActionData, _super); + function ActionData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.data = null; // + return _this; + } + ActionData.toString = function () { + return "[class dragonBones.ActionData]"; + }; + ActionData.prototype._onClear = function () { + if (this.data !== null) { + this.data.returnToPool(); + } + this.type = 0 /* Play */; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + }; + return ActionData; + }(dragonBones.BaseObject)); + dragonBones.ActionData = ActionData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + var DragonBonesData = (function (_super) { + __extends(DragonBonesData, _super); + function DragonBonesData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.frameIndices = []; + /** + * @private + */ + _this.cachedFrames = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatureNames = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatures = {}; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + DragonBonesData.toString = function () { + return "[class dragonBones.DragonBonesData]"; + }; + /** + * @private + */ + DragonBonesData.prototype._onClear = function () { + for (var k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + }; + /** + * @private + */ + DragonBonesData.prototype.addArmature = function (value) { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + DragonBonesData.prototype.getArmature = function (name) { + return name in this.armatures ? this.armatures[name] : null; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + DragonBonesData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + return DragonBonesData; + }(dragonBones.BaseObject)); + dragonBones.DragonBonesData = DragonBonesData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var CanvasData = (function (_super) { + __extends(CanvasData, _super); + function CanvasData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + CanvasData.toString = function () { + return "[class dragonBones.CanvasData]"; + }; + /** + * @private + */ + CanvasData.prototype._onClear = function () { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + return CanvasData; + }(dragonBones.BaseObject)); + dragonBones.CanvasData = CanvasData; + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var ArmatureData = (function (_super) { + __extends(ArmatureData, _super); + function ArmatureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.aabb = new dragonBones.Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animationNames = []; + /** + * @private + */ + _this.sortedBones = []; + /** + * @private + */ + _this.sortedSlots = []; + /** + * @private + */ + _this.defaultActions = []; + /** + * @private + */ + _this.actions = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.bones = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.slots = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.skins = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animations = {}; + /** + * @private + */ + _this.canvas = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + ArmatureData.toString = function () { + return "[class dragonBones.ArmatureData]"; + }; + /** + * @private + */ + ArmatureData.prototype._onClear = function () { + for (var _i = 0, _a = this.defaultActions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + for (var _b = 0, _c = this.actions; _b < _c.length; _b++) { + var action = _c[_b]; + action.returnToPool(); + } + for (var k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + for (var k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + for (var k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + for (var k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.type = 0 /* Armature */; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + ArmatureData.prototype.sortBones = function () { + var total = this.sortedBones.length; + if (total <= 0) { + return; + } + var sortHelper = this.sortedBones.concat(); + var index = 0; + var count = 0; + this.sortedBones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { + continue; + } + this.sortedBones.push(bone); + count++; + } + }; + /** + * @private + */ + ArmatureData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0) { + return; + } + this.cacheFrameRate = frameRate; + for (var k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + }; + /** + * @private + */ + ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform) { + var dataArray = this.parent.cachedFrames; + var arrayOffset = dataArray.length; + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + return arrayOffset; + }; + /** + * @private + */ + ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) { + var dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + }; + /** + * @private + */ + ArmatureData.prototype.addBone = function (value) { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + this.bones[value.name] = value; + this.sortedBones.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSlot = function (value) { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + this.slots[value.name] = value; + this.sortedSlots.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSkin = function (value) { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + }; + /** + * @private + */ + ArmatureData.prototype.addAnimation = function (value) { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + }; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + ArmatureData.prototype.getBone = function (name) { + return name in this.bones ? this.bones[name] : null; + }; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + ArmatureData.prototype.getSlot = function (name) { + return name in this.slots ? this.slots[name] : null; + }; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + ArmatureData.prototype.getSkin = function (name) { + return name in this.skins ? this.skins[name] : null; + }; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + ArmatureData.prototype.getAnimation = function (name) { + return name in this.animations ? this.animations[name] : null; + }; + return ArmatureData; + }(dragonBones.BaseObject)); + dragonBones.ArmatureData = ArmatureData; + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var BoneData = (function (_super) { + __extends(BoneData, _super); + function BoneData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.transform = new dragonBones.Transform(); + /** + * @private + */ + _this.constraints = []; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + BoneData.toString = function () { + return "[class dragonBones.BoneData]"; + }; + /** + * @private + */ + BoneData.prototype._onClear = function () { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + }; + return BoneData; + }(dragonBones.BaseObject)); + dragonBones.BoneData = BoneData; + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var SlotData = (function (_super) { + __extends(SlotData, _super); + function SlotData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.color = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + SlotData.createColor = function () { + return new dragonBones.ColorTransform(); + }; + /** + * @private + */ + SlotData.toString = function () { + return "[class dragonBones.SlotData]"; + }; + /** + * @private + */ + SlotData.prototype._onClear = function () { + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.blendMode = 0 /* Normal */; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform(); + return SlotData; + }(dragonBones.BaseObject)); + dragonBones.SlotData = SlotData; + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + var SkinData = (function (_super) { + __extends(SkinData, _super); + function SkinData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.displays = {}; + return _this; + } + SkinData.toString = function () { + return "[class dragonBones.SkinData]"; + }; + /** + * @private + */ + SkinData.prototype._onClear = function () { + for (var k in this.displays) { + var slotDisplays = this.displays[k]; + for (var _i = 0, slotDisplays_1 = slotDisplays; _i < slotDisplays_1.length; _i++) { + var display = slotDisplays_1[_i]; + if (display !== null) { + display.returnToPool(); + } + } + delete this.displays[k]; + } + this.name = ""; + // this.displays.clear(); + }; + /** + * @private + */ + SkinData.prototype.addDisplay = function (slotName, value) { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + var slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + }; + /** + * @private + */ + SkinData.prototype.getDisplay = function (slotName, displayName) { + var slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (var _i = 0, slotDisplays_2 = slotDisplays; _i < slotDisplays_2.length; _i++) { + var display = slotDisplays_2[_i]; + if (display !== null && display.name === displayName) { + return display; + } + } + } + return null; + }; + /** + * @private + */ + SkinData.prototype.getDisplays = function (slotName) { + if (!(slotName in this.displays)) { + return null; + } + return this.displays[slotName]; + }; + return SkinData; + }(dragonBones.BaseObject)); + dragonBones.SkinData = SkinData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ConstraintData = (function (_super) { + __extends(ConstraintData, _super); + function ConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstraintData.prototype._onClear = function () { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + }; + return ConstraintData; + }(dragonBones.BaseObject)); + dragonBones.ConstraintData = ConstraintData; + /** + * @private + */ + var IKConstraintData = (function (_super) { + __extends(IKConstraintData, _super); + function IKConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraintData.toString = function () { + return "[class dragonBones.IKConstraintData]"; + }; + IKConstraintData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + return IKConstraintData; + }(ConstraintData)); + dragonBones.IKConstraintData = IKConstraintData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DisplayData = (function (_super) { + __extends(DisplayData, _super); + function DisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.transform = new dragonBones.Transform(); + return _this; + } + DisplayData.prototype._onClear = function () { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + }; + return DisplayData; + }(dragonBones.BaseObject)); + dragonBones.DisplayData = DisplayData; + /** + * @private + */ + var ImageDisplayData = (function (_super) { + __extends(ImageDisplayData, _super); + function ImageDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pivot = new dragonBones.Point(); + return _this; + } + ImageDisplayData.toString = function () { + return "[class dragonBones.ImageDisplayData]"; + }; + ImageDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Image */; + this.pivot.clear(); + this.texture = null; + }; + return ImageDisplayData; + }(DisplayData)); + dragonBones.ImageDisplayData = ImageDisplayData; + /** + * @private + */ + var ArmatureDisplayData = (function (_super) { + __extends(ArmatureDisplayData, _super); + function ArmatureDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.actions = []; + return _this; + } + ArmatureDisplayData.toString = function () { + return "[class dragonBones.ArmatureDisplayData]"; + }; + ArmatureDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.actions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + this.type = 1 /* Armature */; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + }; + return ArmatureDisplayData; + }(DisplayData)); + dragonBones.ArmatureDisplayData = ArmatureDisplayData; + /** + * @private + */ + var MeshDisplayData = (function (_super) { + __extends(MeshDisplayData, _super); + function MeshDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.weight = null; // Initial value. + return _this; + } + MeshDisplayData.toString = function () { + return "[class dragonBones.MeshDisplayData]"; + }; + MeshDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Mesh */; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + }; + return MeshDisplayData; + }(ImageDisplayData)); + dragonBones.MeshDisplayData = MeshDisplayData; + /** + * @private + */ + var BoundingBoxDisplayData = (function (_super) { + __extends(BoundingBoxDisplayData, _super); + function BoundingBoxDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.boundingBox = null; // Initial value. + return _this; + } + BoundingBoxDisplayData.toString = function () { + return "[class dragonBones.BoundingBoxDisplayData]"; + }; + BoundingBoxDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + this.type = 3 /* BoundingBox */; + this.boundingBox = null; + }; + return BoundingBoxDisplayData; + }(DisplayData)); + dragonBones.BoundingBoxDisplayData = BoundingBoxDisplayData; + /** + * @private + */ + var WeightData = (function (_super) { + __extends(WeightData, _super); + function WeightData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.bones = []; + return _this; + } + WeightData.toString = function () { + return "[class dragonBones.WeightData]"; + }; + WeightData.prototype._onClear = function () { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + }; + return WeightData; + }(dragonBones.BaseObject)); + dragonBones.WeightData = WeightData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + var BoundingBoxData = (function (_super) { + __extends(BoundingBoxData, _super); + function BoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + BoundingBoxData.prototype._onClear = function () { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + }; + return BoundingBoxData; + }(dragonBones.BaseObject)); + dragonBones.BoundingBoxData = BoundingBoxData; + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var RectangleBoundingBoxData = (function (_super) { + __extends(RectangleBoundingBoxData, _super); + function RectangleBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + RectangleBoundingBoxData.toString = function () { + return "[class dragonBones.RectangleBoundingBoxData]"; + }; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + RectangleBoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) { + var code = 0 /* InSide */; // initialised as being inside of [[clip window]] + if (x < xMin) { + code |= 1 /* Left */; + } + else if (x > xMax) { + code |= 2 /* Right */; + } + if (y < yMin) { + code |= 4 /* Top */; + } + else if (y > yMax) { + code |= 8 /* Bottom */; + } + return code; + }; + /** + * @private + */ + RectangleBoundingBoxData.rectangleIntersectsSegment = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + if (inSideA && inSideB) { + return -1; + } + var intersectionCount = 0; + var outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + var outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + while (true) { + if ((outcode0 | outcode1) === 0) { + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { + break; + } + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + var x = 0.0; + var y = 0.0; + var normalRadian = 0.0; + // At least one endpoint is outside the clip rectangle; pick it. + var outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + // Now find the intersection point; + if ((outcodeOut & 4 /* Top */) !== 0) { + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & 8 /* Bottom */) !== 0) { + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & 2 /* Right */) !== 0) { + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & 1 /* Left */) !== 0) { + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + return intersectionCount; + }; + /** + * @private + */ + RectangleBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Rectangle */; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + return false; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var widthH = this.width * 0.5; + var heightH = this.height * 0.5; + var intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return RectangleBoundingBoxData; + }(BoundingBoxData)); + dragonBones.RectangleBoundingBoxData = RectangleBoundingBoxData; + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var EllipseBoundingBoxData = (function (_super) { + __extends(EllipseBoundingBoxData, _super); + function EllipseBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EllipseBoundingBoxData.toString = function () { + return "[class dragonBones.EllipseData]"; + }; + /** + * @private + */ + EllipseBoundingBoxData.ellipseIntersectsSegment = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var d = widthH / heightH; + var dd = d * d; + yA *= d; + yB *= d; + var dX = xB - xA; + var dY = yB - yA; + var lAB = Math.sqrt(dX * dX + dY * dY); + var xD = dX / lAB; + var yD = dY / lAB; + var a = (xC - xA) * xD + (yC - yA) * yD; + var aa = a * a; + var ee = xA * xA + yA * yA; + var rr = widthH * widthH; + var dR = rr - ee + aa; + var intersectionCount = 0; + if (dR >= 0.0) { + var dT = Math.sqrt(dR); + var sA = a - dT; + var sB = a + dT; + var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + var sideAB = inSideA * inSideB; + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + return intersectionCount; + }; + /** + * @private + */ + EllipseBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 1 /* Ellipse */; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + return false; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return EllipseBoundingBoxData; + }(BoundingBoxData)); + dragonBones.EllipseBoundingBoxData = EllipseBoundingBoxData; + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var PolygonBoundingBoxData = (function (_super) { + __extends(PolygonBoundingBoxData, _super); + function PolygonBoundingBoxData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.weight = null; // Initial value. + return _this; + } + /** + * @private + */ + PolygonBoundingBoxData.toString = function () { + return "[class dragonBones.PolygonBoundingBoxData]"; + }; + /** + * @private + */ + PolygonBoundingBoxData.polygonIntersectsSegment = function (xA, yA, xB, yB, vertices, offset, count, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (xA === xB) { + xA = xB + 0.000001; + } + if (yA === yB) { + yA = yB + 0.000001; + } + var dXAB = xA - xB; + var dYAB = yA - yB; + var llAB = xA * yB - yA * xB; + var intersectionCount = 0; + var xC = vertices[offset + count - 2]; + var yC = vertices[offset + count - 1]; + var dMin = 0.0; + var dMax = 0.0; + var xMin = 0.0; + var yMin = 0.0; + var xMax = 0.0; + var yMax = 0.0; + for (var i = 0; i < count; i += 2) { + var xD = vertices[offset + i]; + var yD = vertices[offset + i + 1]; + if (xC === xD) { + xC = xD + 0.0001; + } + if (yC === yD) { + yC = yD + 0.0001; + } + var dXCD = xC - xD; + var dYCD = yC - yD; + var llCD = xC * yD - yC * xD; + var ll = dXAB * dYCD - dYAB * dXCD; + var x = (llAB * dXCD - dXAB * llCD) / ll; + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + var y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + var d = x - xA; + if (d < 0.0) { + d = -d; + } + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + xC = xD; + yC = yD; + } + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + return intersectionCount; + }; + /** + * @private + */ + PolygonBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Polygon */; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null; // + this.weight = null; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (var i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + var yA = this.vertices[this.offset + iP + 1]; + var yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + var xA = this.vertices[this.offset + iP]; + var xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + iP = i; + } + } + return isInSide; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment(xA, yA, xB, yB, this.vertices, this.offset, this.count, intersectionPointA, intersectionPointB, normalRadians); + } + return intersectionCount; + }; + return PolygonBoundingBoxData; + }(BoundingBoxData)); + dragonBones.PolygonBoundingBoxData = PolygonBoundingBoxData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationData = (function (_super) { + __extends(AnimationData, _super); + function AnimationData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.cachedFrames = []; + /** + * @private + */ + _this.boneTimelines = {}; + /** + * @private + */ + _this.slotTimelines = {}; + /** + * @private + */ + _this.boneCachedFrameIndices = {}; + /** + * @private + */ + _this.slotCachedFrameIndices = {}; + /** + * @private + */ + _this.actionTimeline = null; // Initial value. + /** + * @private + */ + _this.zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationData.toString = function () { + return "[class dragonBones.AnimationData]"; + }; + /** + * @private + */ + AnimationData.prototype._onClear = function () { + for (var k in this.boneTimelines) { + for (var kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + delete this.boneTimelines[k]; + } + for (var k in this.slotTimelines) { + for (var kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + delete this.slotTimelines[k]; + } + for (var k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + for (var k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + }; + /** + * @private + */ + AnimationData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0.0) { + return; + } + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + this.cachedFrames.length = cacheFrameCount; + for (var i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + for (var _i = 0, _a = this.parent.sortedBones; _i < _a.length; _i++) { + var bone = _a[_i]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.boneCachedFrameIndices[bone.name] = indices; + } + for (var _b = 0, _c = this.parent.sortedSlots; _b < _c.length; _b++) { + var slot = _c[_b]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.slotCachedFrameIndices[slot.name] = indices; + } + }; + /** + * @private + */ + AnimationData.prototype.addBoneTimeline = function (bone, timeline) { + var timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.addSlotTimeline = function (slot, timeline) { + var timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.getBoneTimelines = function (name) { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotTimeline = function (name) { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getBoneCachedFrameIndices = function (name) { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotCachedFrameIndices = function (name) { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + }; + return AnimationData; + }(dragonBones.BaseObject)); + dragonBones.AnimationData = AnimationData; + /** + * @private + */ + var TimelineData = (function (_super) { + __extends(TimelineData, _super); + function TimelineData() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineData.toString = function () { + return "[class dragonBones.TimelineData]"; + }; + TimelineData.prototype._onClear = function () { + this.type = 10 /* BoneAll */; + this.offset = 0; + this.frameIndicesOffset = -1; + }; + return TimelineData; + }(dragonBones.BaseObject)); + dragonBones.TimelineData = TimelineData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + var AnimationConfig = (function (_super) { + __extends(AnimationConfig, _super); + function AnimationConfig() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.boneMask = []; + return _this; + } + AnimationConfig.toString = function () { + return "[class dragonBones.AnimationConfig]"; + }; + /** + * @private + */ + AnimationConfig.prototype._onClear = function () { + this.pauseFadeOut = true; + this.fadeOutMode = 4 /* All */; + this.fadeOutTweenType = 1 /* Line */; + this.fadeOutTime = -1.0; + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = 1 /* Line */; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + }; + AnimationConfig.prototype.clear = function () { + this._onClear(); + }; + AnimationConfig.prototype.copyFrom = function (value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + this.boneMask.length = value.boneMask.length; + for (var i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + }; + AnimationConfig.prototype.containsBoneMask = function (name) { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + }; + AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + if (this.boneMask.indexOf(name) < 0) { + this.boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + }; + AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this.boneMask.indexOf(name); + if (index >= 0) { + this.boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var index_1 = this.boneMask.indexOf(bone.name); + if (index_1 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index_1, 1); + } + } + } + else { + for (var _b = 0, _c = armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + }; + return AnimationConfig; + }(dragonBones.BaseObject)); + dragonBones.AnimationConfig = AnimationConfig; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var TextureAtlasData = (function (_super) { + __extends(TextureAtlasData, _super); + function TextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.textures = {}; + return _this; + } + /** + * @private + */ + TextureAtlasData.prototype._onClear = function () { + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + }; + /** + * @private + */ + TextureAtlasData.prototype.copyFrom = function (value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + // this.textures.clear(); + for (var k in value.textures) { + var texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + }; + /** + * @private + */ + TextureAtlasData.prototype.addTexture = function (value) { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + value.parent = this; + this.textures[value.name] = value; + }; + /** + * @private + */ + TextureAtlasData.prototype.getTexture = function (name) { + return name in this.textures ? this.textures[name] : null; + }; + return TextureAtlasData; + }(dragonBones.BaseObject)); + dragonBones.TextureAtlasData = TextureAtlasData; + /** + * @private + */ + var TextureData = (function (_super) { + __extends(TextureData, _super); + function TextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = new dragonBones.Rectangle(); + _this.frame = null; // Initial value. + return _this; + } + TextureData.createRectangle = function () { + return new dragonBones.Rectangle(); + }; + TextureData.prototype._onClear = function () { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + }; + TextureData.prototype.copyFrom = function (value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + }; + return TextureData; + }(dragonBones.BaseObject)); + dragonBones.TextureData = TextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones_1) { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + var Armature = (function (_super) { + __extends(Armature, _super); + function Armature() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._bones = []; + _this._slots = []; + _this._actions = []; + _this._animation = null; // Initial value. + _this._proxy = null; // Initial value. + /** + * @private + */ + _this._replaceTextureAtlasData = null; // Initial value. + _this._clock = null; // Initial value. + return _this; + } + Armature.toString = function () { + return "[class dragonBones.Armature]"; + }; + Armature._onSortSlots = function (a, b) { + return a._zOrder > b._zOrder ? 1 : -1; + }; + /** + * @private + */ + Armature.prototype._onClear = function () { + if (this._clock !== null) { + this._clock.remove(this); + } + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + bone.returnToPool(); + } + for (var _b = 0, _c = this._slots; _b < _c.length; _b++) { + var slot = _c[_b]; + slot.returnToPool(); + } + for (var _d = 0, _e = this._actions; _d < _e.length; _d++) { + var action = _e[_d]; + action.returnToPool(); + } + if (this._animation !== null) { + this._animation.returnToPool(); + } + if (this._proxy !== null) { + this._proxy.clear(); + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + }; + Armature.prototype._sortBones = function () { + var total = this._bones.length; + if (total <= 0) { + return; + } + var sortHelper = this._bones.concat(); + var index = 0; + var count = 0; + this._bones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this._bones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { + continue; + } + this._bones.push(bone); + count++; + } + }; + Armature.prototype._sortSlots = function () { + this._slots.sort(Armature._onSortSlots); + }; + /** + * @internal + * @private + */ + Armature.prototype._sortZOrder = function (slotIndices, offset) { + var slotDatas = this.armatureData.sortedSlots; + var isOriginal = slotIndices === null; + if (this._zOrderDirty || !isOriginal) { + for (var i = 0, l = slotDatas.length; i < l; ++i) { + var slotIndex = isOriginal ? i : slotIndices[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + var slotData = slotDatas[slotIndex]; + var slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addBoneToBoneList = function (value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeBoneFromBoneList = function (value) { + var index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addSlotToSlotList = function (value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeSlotFromSlotList = function (value) { + var index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._bufferAction = function (action, append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + }; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.dispose = function () { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + }; + /** + * @private + */ + Armature.prototype.init = function (armatureData, proxy, display, dragonBones) { + if (this.armatureData !== null) { + return; + } + this.armatureData = armatureData; + this._animation = dragonBones_1.BaseObject.borrowObject(dragonBones_1.Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + }; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.advanceTime = function (passedTime) { + if (this._lockUpdate) { + return; + } + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + var prevCacheFrameIndex = this._cacheFrameIndex; + // Update nimation. + this._animation.advanceTime(passedTime); + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + var i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + if (this._actions.length > 0) { + this._lockUpdate = true; + for (var _i = 0, _a = this._actions; _i < _a.length; _i++) { + var action = _a[_i]; + if (action.type === 0 /* Play */) { + this._animation.fadeIn(action.name); + } + } + this._actions.length = 0; + this._lockUpdate = false; + } + // + var drawed = this.debugDraw || dragonBones_1.DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + }; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName !== null && boneName.length > 0) { + var bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + if (updateSlotDisplay) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (var _b = 0, _c = this._bones; _b < _c.length; _b++) { + var bone = _c[_b]; + bone.invalidUpdate(); + } + if (updateSlotDisplay) { + for (var _d = 0, _e = this._slots; _d < _e.length; _d++) { + var slot = _e[_d]; + slot.invalidUpdate(); + } + } + } + }; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.containsPoint = function (x, y) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.containsPoint(x, y)) { + return slot; + } + } + return null; + }; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var isV = xA === xB; + var dMin = 0.0; + var dMax = 0.0; + var intXA = 0.0; + var intYA = 0.0; + var intXB = 0.0; + var intYB = 0.0; + var intAN = 0.0; + var intBN = 0.0; + var intSlotA = null; + var intSlotB = null; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + if (intersectionPointB !== null) { + var d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + return intSlotA; + }; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBone = function (name) { + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.name === name) { + return bone; + } + } + return null; + }; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBoneByDisplay = function (display) { + var slot = this.getSlotByDisplay(display); + return slot !== null ? slot.parent : null; + }; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlot = function (name) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.name === name) { + return slot; + } + } + return null; + }; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlotByDisplay = function (display) { + if (display !== null) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.display === display) { + return slot; + } + } + } + return null; + }; + /** + * @deprecated + */ + Armature.prototype.addBone = function (value, parentName) { + if (parentName === void 0) { parentName = null; } + console.assert(value !== null); + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + }; + /** + * @deprecated + */ + Armature.prototype.removeBone = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * @deprecated + */ + Armature.prototype.addSlot = function (value, parentName) { + var bone = this.getBone(parentName); + console.assert(value !== null && bone !== null); + value._setArmature(this); + value._setParent(bone); + }; + /** + * @deprecated + */ + Armature.prototype.removeSlot = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBones = function () { + return this._bones; + }; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlots = function () { + return this._slots; + }; + Object.defineProperty(Armature.prototype, "flipX", { + get: function () { + return this._flipX; + }, + set: function (value) { + if (this._flipX === value) { + return; + } + this._flipX = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "flipY", { + get: function () { + return this._flipY; + }, + set: function (value) { + if (this._flipY === value) { + return; + } + this._flipY = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "cacheFrameRate", { + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.armatureData.cacheFrameRate; + }, + set: function (value) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + // Set child armature frameRate. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "name", { + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this.armatureData.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "animation", { + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._animation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "proxy", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "eventDispatcher", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "display", { + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "replacedTexture", { + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + get: function () { + return this._replacedTexture; + }, + set: function (value) { + if (this._replacedTexture === value) { + return; + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + this._replacedTexture = value; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + slot.invalidUpdate(); + slot.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + // Update childArmature clock. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "parent", { + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + Armature.prototype.replaceTexture = function (texture) { + this.replacedTexture = texture; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.hasEventListener = function (type) { + return this._proxy.hasEvent(type); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.addEventListener = function (type, listener, target) { + this._proxy.addEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.removeEventListener = function (type, listener, target) { + this._proxy.removeEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + Armature.prototype.enableAnimationCache = function (frameRate) { + this.cacheFrameRate = frameRate; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Armature.prototype.getDisplay = function () { + return this._display; + }; + return Armature; + }(dragonBones_1.BaseObject)); + dragonBones_1.Armature = Armature; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var TransformObject = (function (_super) { + __extends(TransformObject, _super); + function TransformObject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.globalTransformMatrix = new dragonBones.Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.global = new dragonBones.Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.offset = new dragonBones.Transform(); + return _this; + } + /** + * @private + */ + TransformObject.prototype._onClear = function () { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setArmature = function (value) { + this._armature = value; + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setParent = function (value) { + this._parent = value; + }; + /** + * @private + */ + TransformObject.prototype.updateGlobalTransform = function () { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + }; + Object.defineProperty(TransformObject.prototype, "armature", { + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TransformObject.prototype, "parent", { + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + TransformObject._helpMatrix = new dragonBones.Matrix(); + /** + * @private + */ + TransformObject._helpTransform = new dragonBones.Transform(); + /** + * @private + */ + TransformObject._helpPoint = new dragonBones.Point(); + return TransformObject; + }(dragonBones.BaseObject)); + dragonBones.TransformObject = TransformObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var Bone = (function (_super) { + __extends(Bone, _super); + function Bone() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this.animationPose = new dragonBones.Transform(); + /** + * @internal + * @private + */ + _this.constraints = []; + _this._bones = []; + _this._slots = []; + return _this; + } + Bone.toString = function () { + return "[class dragonBones.Bone]"; + }; + /** + * @private + */ + Bone.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + this.offsetMode = 1 /* Additive */; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null; // + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Bone.prototype._updateGlobalTransformMatrix = function (isCache) { + var flipX = this._armature.flipX; + var flipY = this._armature.flipY === dragonBones.DragonBones.yDown; + var global = this.global; + var globalTransformMatrix = this.globalTransformMatrix; + var inherit = this._parent !== null; + var dR = 0.0; + if (this.offsetMode === 1 /* Additive */) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === 0 /* None */) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + if (inherit) { + var parentMatrix = this._parent.globalTransformMatrix; + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + var x = global.x; + var y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + } + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + }; + /** + * @internal + * @private + */ + Bone.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + var oldSlots = null; + var oldBones = null; + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + this._armature = value; // + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + if (oldSlots !== null) { + for (var _i = 0, oldSlots_1 = oldSlots; _i < oldSlots_1.length; _i++) { + var slot = oldSlots_1[_i]; + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + if (oldBones !== null) { + for (var _a = 0, oldBones_1 = oldBones; _a < oldBones_1.length; _a++) { + var bone = oldBones_1[_a]; + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + }; + /** + * @internal + * @private + */ + Bone.prototype.init = function (boneData) { + if (this.boneData !== null) { + return; + } + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + }; + /** + * @internal + * @private + */ + Bone.prototype.update = function (cacheFrameIndex) { + this._blendDirty = false; + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.update(); + } + } + if (this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty)) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { + for (var _b = 0, _c = this.constraints; _b < _c.length; _b++) { + var constraint = _c[_b]; + constraint.update(); + } + } + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + this._localDirty = true; + }; + /** + * @internal + * @private + */ + Bone.prototype.updateByConstraint = function () { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + this._transformDirty = true; + } + }; + /** + * @internal + * @private + */ + Bone.prototype.addConstraint = function (constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + }; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.invalidUpdate = function () { + this._transformDirty = true; + }; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.contains = function (child) { + if (child === this) { + return false; + } + var ancestor = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + return ancestor === this; + }; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getBones = function () { + this._bones.length = 0; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.parent === this) { + this._bones.push(bone); + } + } + return this._bones; + }; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getSlots = function () { + this._slots.length = 0; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + this._slots.push(slot); + } + } + return this._slots; + }; + Object.defineProperty(Bone.prototype, "visible", { + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._visible; + }, + set: function (value) { + if (this._visible === value) { + return; + } + this._visible = value; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot._parent === this) { + slot._updateVisible(); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "length", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + get: function () { + return this.boneData.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + get: function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + return slot; + } + } + return null; + }, + enumerable: true, + configurable: true + }); + return Bone; + }(dragonBones.TransformObject)); + dragonBones.Bone = Bone; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + var Slot = (function (_super) { + __extends(Slot, _super); + function Slot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this._localMatrix = new dragonBones.Matrix(); + /** + * @private + */ + _this._colorTransform = new dragonBones.ColorTransform(); + /** + * @private + */ + _this._ffdVertices = []; + /** + * @private + */ + _this._displayDatas = []; + /** + * @private + */ + _this._displayList = []; + /** + * @private + */ + _this._meshBones = []; + /** + * @private + */ + _this._rawDisplay = null; // Initial value. + /** + * @private + */ + _this._meshDisplay = null; // Initial value. + return _this; + } + /** + * @private + */ + Slot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + var disposeDisplayList = []; + for (var _i = 0, _a = this._displayList; _i < _a.length; _i++) { + var eachDisplay = _a[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _b = 0, disposeDisplayList_1 = disposeDisplayList; _b < disposeDisplayList_1.length; _b++) { + var eachDisplay = disposeDisplayList_1[_b]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { + this._disposeDisplay(this._meshDisplay); + } + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + this.displayController = null; + this.slotData = null; // + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = 0 /* Normal */; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Slot.prototype._updateDisplayData = function () { + var prevDisplayData = this._displayData; + var prevTextureData = this._textureData; + var prevMeshData = this._meshData; + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === 0 /* Image */ || this._displayData.type === 2 /* Mesh */) { + this._textureData = this._displayData.texture; + if (this._displayData.type === 2 /* Mesh */) { + this._meshData = this._displayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */) { + this._meshData = rawDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = this._displayData.boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = rawDisplayData.boundingBox; + } + else { + this._boundingBoxData = null; + } + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + var imageDisplayData = this._displayData; + var scale = this._armature.armatureData.scale; + var frame = this._textureData.frame; + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + var rect = frame !== null ? frame : this._textureData.region; + var width = rect.width * scale; + var height = rect.height * scale; + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + this._pivotX *= width; + this._pivotY *= height; + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + for (var i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + var vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + 0 /* MeshVertexCount */]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + for (var i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { + this._meshDirty = true; + } + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + this._displayDirty = true; + this._transformDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._updateDisplay = function () { + var prevDisplay = this._display !== null ? this._display : this._rawDisplay; + var prevChildArmature = this._childArmature; + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof dragonBones.Armature) { + this._childArmature = this._display; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + // Update display. + var currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { + if (this._childArmature.cacheFrameRate === 0) { + var cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + // Child armature action. + var actions = null; + if (this._displayData !== null && this._displayData.type === 1 /* Armature */) { + actions = this._displayData.actions; + } + else { + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === 1 /* Armature */) { + actions = rawDisplayData.actions; + } + } + if (actions !== null && actions.length > 0) { + for (var _i = 0, actions_1 = actions; _i < actions_1.length; _i++) { + var action = actions_1[_i]; + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + }; + /** + * @private + */ + Slot.prototype._updateGlobalTransformMatrix = function (isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._isMeshBonesUpdate = function () { + for (var _i = 0, _a = this._meshBones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + return false; + }; + /** + * @internal + * @private + */ + Slot.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + this._armature = value; // + this._onUpdateDisplay(); + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + }; + /** + * @internal + * @private + */ + Slot.prototype._setDisplayIndex = function (value, isAnimation) { + if (isAnimation === void 0) { isAnimation = false; } + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + this._animationDisplayIndex = value; + } + if (this._displayIndex === value) { + return false; + } + this._displayIndex = value; + this._displayDirty = true; + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setZorder = function (value) { + if (this._zOrder === value) { + //return false; + } + this._zOrder = value; + this._zOrderDirty = true; + return this._zOrderDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setColor = function (value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + return this._colorDirty; + }; + /** + * @private + */ + Slot.prototype._setDisplayList = function (value) { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + for (var i = 0, l = value.length; i < l; ++i) { + var eachDisplay = value[i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) { + this._initDisplay(eachDisplay); + } + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @private + */ + Slot.prototype.init = function (slotData, displayDatas, rawDisplay, meshDisplay) { + if (this.slotData !== null) { + return; + } + this.slotData = slotData; + this.name = this.slotData.name; + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._displayDatas.length = this._rawDisplayDatas.length; + for (var i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + }; + /** + * @internal + * @private + */ + Slot.prototype.update = function (cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + if (this._transformDirty) { + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + if (this._display === null) { + return; + } + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + if (this._meshData !== null && this._display === this._meshDisplay) { + var isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + return; + } + } + if (this._transformDirty) { + this._transformDirty = false; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + this._updateTransform(false); + } + }; + /** + * @private + */ + Slot.prototype.updateTransformAndMatrix = function () { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + }; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.containsPoint = function (x, y) { + if (this._boundingBoxData === null) { + return false; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + }; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (this._boundingBoxData === null) { + return 0; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + return intersectionCount; + }; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + Slot.prototype.invalidUpdate = function () { + this._displayDirty = true; + this._transformDirty = true; + }; + Object.defineProperty(Slot.prototype, "displayIndex", { + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._displayIndex; + }, + set: function (value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "displayList", { + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._displayList.concat(); + }, + set: function (value) { + var backupDisplayList = this._displayList.concat(); // Copy. + var disposeDisplayList = new Array(); + if (this._setDisplayList(value)) { + this.update(-1); + } + // Release replaced displays. + for (var _i = 0, backupDisplayList_1 = backupDisplayList; _i < backupDisplayList_1.length; _i++) { + var eachDisplay = backupDisplayList_1[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _a = 0, disposeDisplayList_2 = disposeDisplayList; _a < disposeDisplayList_2.length; _a++) { + var eachDisplay = disposeDisplayList_2[_a]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "boundingBoxData", { + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + get: function () { + return this._boundingBoxData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "rawDisplay", { + /** + * @private + */ + get: function () { + return this._rawDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "meshDisplay", { + /** + * @private + */ + get: function () { + return this._meshDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "display", { + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + set: function (value) { + if (this._display === value) { + return; + } + var displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { + this._displayIndex = 0; + } + if (this._displayIndex < 0) { + return; + } + else { + var replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "childArmature", { + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._childArmature; + }, + set: function (value) { + if (this._childArmature === value) { + return; + } + this.display = value; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.getDisplay = function () { + return this._display; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.setDisplay = function (value) { + this.display = value; + }; + return Slot; + }(dragonBones.TransformObject)); + dragonBones.Slot = Slot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + * @internal + */ + var Constraint = (function (_super) { + __extends(Constraint, _super); + function Constraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + Constraint.prototype._onClear = function () { + this.target = null; // + this.bone = null; // + this.root = null; // + }; + Constraint._helpMatrix = new dragonBones.Matrix(); + Constraint._helpTransform = new dragonBones.Transform(); + Constraint._helpPoint = new dragonBones.Point(); + return Constraint; + }(dragonBones.BaseObject)); + dragonBones.Constraint = Constraint; + /** + * @private + * @internal + */ + var IKConstraint = (function (_super) { + __extends(IKConstraint, _super); + function IKConstraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraint.toString = function () { + return "[class dragonBones.IKConstraint]"; + }; + IKConstraint.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + IKConstraint.prototype._computeA = function () { + var ikGlobal = this.target.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + var ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype._computeB = function () { + var boneLength = this.bone.boneData.length; + var parent = this.root; + var ikGlobal = this.target.global; + var parentGlobal = parent.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + var x = globalTransformMatrix.a * boneLength; + var y = globalTransformMatrix.b * boneLength; + var lLL = x * x + y * y; + var lL = Math.sqrt(lLL); + var dX = global.x - parentGlobal.x; + var dY = global.y - parentGlobal.y; + var lPP = dX * dX + dY * dY; + var lP = Math.sqrt(lPP); + var rawRadianA = Math.atan2(dY, dX); + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + var lTT = dX * dX + dY * dY; + var lT = Math.sqrt(lTT); + var ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + var h = (lPP - lLL + lTT) / (2.0 * lTT); + var r = Math.sqrt(lPP - h * h * lTT) / lT; + var hX = parentGlobal.x + (dX * h); + var hY = parentGlobal.y + (dY * h); + var rX = -dY * r; + var rY = dX * r; + var isPPR = false; + if (parent._parent !== null) { + var parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + var dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + var parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + var ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype.update = function () { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + }; + return IKConstraint; + }(Constraint)); + dragonBones.IKConstraint = IKConstraint; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var WorldClock = (function () { + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + function WorldClock(time) { + if (time === void 0) { time = -1.0; } + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + this.time = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + this.timeScale = 1.0; + this._animatebles = []; + this._clock = null; + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.advanceTime = function (passedTime) { + if (passedTime !== passedTime) { + passedTime = 0.0; + } + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + if (passedTime === 0.0) { + return; + } + var i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + var animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + var animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + this._animatebles.length -= r; + } + }; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.contains = function (value) { + return this._animatebles.indexOf(value) >= 0; + }; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.add = function (value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + }; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.remove = function (value) { + var index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + }; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.clear = function () { + for (var _i = 0, _a = this._animatebles; _i < _a.length; _i++) { + var animatable = _a[_i]; + if (animatable !== null) { + animatable.clock = null; + } + } + }; + Object.defineProperty(WorldClock.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock !== null) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.clock = new WorldClock(); + return WorldClock; + }()); + dragonBones.WorldClock = WorldClock; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._animationNames = []; + _this._animationStates = []; + _this._animations = {}; + _this._animationConfig = null; // Initial value. + return _this; + } + /** + * @private + */ + Animation.toString = function () { + return "[class dragonBones.Animation]"; + }; + /** + * @private + */ + Animation.prototype._onClear = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + for (var k in this._animations) { + delete this._animations[k]; + } + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + this.timeScale = 1.0; + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + }; + Animation.prototype._fadeOut = function (animationConfig) { + switch (animationConfig.fadeOutMode) { + case 1 /* SameLayer */: + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 2 /* SameGroup */: + for (var _b = 0, _c = this._animationStates; _b < _c.length; _b++) { + var animationState = _c[_b]; + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 3 /* SameLayerAndGroup */: + for (var _d = 0, _e = this._animationStates; _d < _e.length; _d++) { + var animationState = _e[_d]; + if (animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 4 /* All */: + for (var _f = 0, _g = this._animationStates; _f < _g.length; _f++) { + var animationState = _g[_f]; + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + case 0 /* None */: + case 5 /* Single */: + default: + break; + } + }; + /** + * @internal + * @private + */ + Animation.prototype.init = function (armature) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig); + }; + /** + * @internal + * @private + */ + Animation.prototype.advanceTime = function (passedTime) { + if (passedTime < 0.0) { + passedTime = -passedTime; + } + if (this._armature.inheritAnimation && this._armature._parent !== null) { + passedTime *= this._armature._parent._armature.animation.timeScale; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + var animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + var animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + var animationData = animationState.animationData; + var cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { + this._animationDirty = false; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (var i = 0, r = 0; i < animationStateCount; ++i) { + var animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, 0.0); + } + if (i === animationStateCount - 1 && r > 0) { + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + this._timelineDirty = false; + }; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.reset = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + }; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.stop = function (animationName) { + if (animationName === void 0) { animationName = null; } + if (animationName !== null) { + var animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.stop(); + } + } + }; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + Animation.prototype.playConfig = function (animationConfig) { + var animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName); + return null; + } + var animationData = this._animations[animationName]; + if (animationConfig.fadeOutMode === 5 /* Single */) { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState_1 = _a[_i]; + if (animationState_1.animationData === animationData) { + return animationState_1; + } + } + } + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + this._fadeOut(animationConfig); + var animationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + if (this._animationStates.length > 0) { + var added = false; + for (var i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + // Child armature play same name animation. + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var childArmature = slot.childArmature; + if (childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null) { + childArmature.animation.fadeIn(animationName); // + } + } + if (animationConfig.fadeInTime <= 0.0) { + this._armature.advanceTime(0.0); + } + this._lastAnimationState = animationState; + return animationState; + }; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + var defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + return this._lastAnimationState; + }; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) { + if (time === void 0) { time = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) { + if (frame === void 0) { frame = 0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + return this.playConfig(this._animationConfig); + }; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) { + if (progress === void 0) { progress = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + return this.playConfig(this._animationConfig); + }; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByTime = function (animationName, time) { + if (time === void 0) { time = 0.0; } + var animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByFrame = function (animationName, frame) { + if (frame === void 0) { frame = 0; } + var animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByProgress = function (animationName, progress) { + if (progress === void 0) { progress = 0.0; } + var animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.getState = function (animationName) { + var i = this._animationStates.length; + while (i--) { + var animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + return null; + }; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.hasAnimation = function (animationName) { + return animationName in this._animations; + }; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + Animation.prototype.getStates = function () { + return this._animationStates; + }; + Object.defineProperty(Animation.prototype, "isPlaying", { + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.isPlaying) { + return true; + } + } + return false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "isCompleted", { + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (!animationState.isCompleted) { + return false; + } + } + return this._animationStates.length > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationName", { + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationNames", { + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animations", { + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animations; + }, + set: function (value) { + if (this._animations === value) { + return; + } + this._animationNames.length = 0; + for (var k in this._animations) { + delete this._animations[k]; + } + for (var k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationConfig", { + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + this._animationConfig.clear(); + return this._animationConfig; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationState", { + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) { + if (fadeInTime === void 0) { fadeInTime = -1; } + if (duration === void 0) { duration = -1; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (pauseFadeOut === void 0) { pauseFadeOut = true; } + if (pauseFadeIn === void 0) { pauseFadeIn = true; } + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + var animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + return this.playConfig(this._animationConfig); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + Animation.prototype.gotoAndStop = function (animationName, time) { + if (time === void 0) { time = 0; } + return this.gotoAndStopByTime(animationName, time); + }; + Object.defineProperty(Animation.prototype, "animationList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationDataList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + var list = []; + for (var i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + return list; + }, + enumerable: true, + configurable: true + }); + return Animation; + }(dragonBones.BaseObject)); + dragonBones.Animation = Animation; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var BonePose = (function (_super) { + __extends(BonePose, _super); + function BonePose() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.current = new dragonBones.Transform(); + _this.delta = new dragonBones.Transform(); + _this.result = new dragonBones.Transform(); + return _this; + } + BonePose.toString = function () { + return "[class dragonBones.BonePose]"; + }; + BonePose.prototype._onClear = function () { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + }; + return BonePose; + }(dragonBones.BaseObject)); + dragonBones.BonePose = BonePose; + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationState = (function (_super) { + __extends(AnimationState, _super); + function AnimationState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._boneMask = []; + _this._boneTimelines = []; + _this._slotTimelines = []; + _this._bonePoses = {}; + /** + * @internal + * @private + */ + _this._actionTimeline = null; // Initial value. + _this._zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationState.toString = function () { + return "[class dragonBones.AnimationState]"; + }; + /** + * @private + */ + AnimationState.prototype._onClear = function () { + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.returnToPool(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.returnToPool(); + } + for (var k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null; // + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + }; + AnimationState.prototype._isDisabled = function (slot) { + if (this.displayControl) { + var displayController = slot.displayController; + if (displayController === null || + displayController === this.name || + displayController === this.group) { + return false; + } + } + return true; + }; + AnimationState.prototype._advanceFadeTime = function (passedTime) { + var isFadeOut = this._fadeState > 0; + if (this._subFadeState < 0) { + this._subFadeState = 0; + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + if (passedTime < 0.0) { + passedTime = -passedTime; + } + this._fadeTime += passedTime; + if (this._fadeTime >= this.fadeTotalTime) { + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + if (this._subFadeState > 0) { + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + }; + AnimationState.prototype._blendBoneTimline = function (timeline) { + var bone = timeline.bone; + var bonePose = timeline.bonePose.result; + var animationPose = bone.animationPose; + var boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.init = function (armature, animationData, animationConfig) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (var i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + this._actionTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.updateTimelines = function () { + var boneTimelines = {}; + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + var timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + boneTimelines[timelineName].push(timeline); + } + for (var _b = 0, _c = this._armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + var timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + var timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { + delete boneTimelines[timelineName]; + } + else { + var bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = dragonBones.BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (var _d = 0, timelineDatas_1 = timelineDatas; _d < timelineDatas_1.length; _d++) { + var timelineData = timelineDatas_1[_d]; + switch (timelineData.type) { + case 10 /* BoneAll */: + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + case 11 /* BoneT */: + case 12 /* BoneR */: + case 13 /* BoneS */: + // TODO + break; + case 14 /* BoneX */: + case 15 /* BoneY */: + case 16 /* BoneRotate */: + case 17 /* BoneSkew */: + case 18 /* BoneScaleX */: + case 19 /* BoneScaleY */: + // TODO + break; + } + } + } + else if (this.resetToPose) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + for (var k in boneTimelines) { + for (var _e = 0, _f = boneTimelines[k]; _e < _f.length; _e++) { + var timeline = _f[_e]; + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + var slotTimelines = {}; + var ffdFlags = []; + for (var _g = 0, _h = this._slotTimelines; _g < _h.length; _g++) { + var timeline = _h[_g]; + var timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + slotTimelines[timelineName].push(timeline); + } + for (var _j = 0, _k = this._armature.getSlots(); _j < _k.length; _j++) { + var slot = _k[_j]; + var boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + var timelineName = slot.name; + var timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { + delete slotTimelines[timelineName]; + } + else { + var displayIndexFlag = false; + var colorFlag = false; + ffdFlags.length = 0; + if (timelineDatas !== null) { + for (var _l = 0, timelineDatas_2 = timelineDatas; _l < timelineDatas_2.length; _l++) { + var timelineData = timelineDatas_2[_l]; + switch (timelineData.type) { + case 20 /* SlotDisplay */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + case 21 /* SlotColor */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + case 22 /* SlotFFD */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + if (this.resetToPose) { + if (!displayIndexFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + if (!colorFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + for (var _m = 0, _o = slot._rawDisplayDatas; _m < _o.length; _m++) { + var displayData = _o[_m]; + if (displayData !== null && displayData.type === 2 /* Mesh */ && ffdFlags.indexOf(displayData.offset) < 0) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + for (var k in slotTimelines) { + for (var _p = 0, _q = slotTimelines[k]; _p < _q.length; _p++) { + var timeline = _q[_p]; + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.advanceTime = function (passedTime, cacheFrameRate) { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + // Update time. + if (this._playheadState === 3) { + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + this._time += passedTime; + } + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + if (this.weight === 0.0) { + return; + } + var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + var isUpdateTimeline = true; + var isUpdateBoneTimeline = true; + var time = this._time; + this._weightResult = this.weight * this._fadeProgress; + this._actionTimeline.update(time); // Update main timeline. + if (isCacheEnabled) { + var internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.update(time); + } + if (isCacheEnabled) { + var cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { + isUpdateBoneTimeline = false; + } + else { + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { + var bone = null; + var prevTimeline = null; // + for (var i = 0, l = this._boneTimelines.length; i < l; ++i) { + var timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + bone = timeline.bone; + } + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + for (var i = 0, l = this._slotTimelines.length; i < l; ++i) { + var timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + timeline.update(time); + } + } + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { + this.fadeOut(this.autoFadeOutTime); + } + } + } + }; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.play = function () { + this._playheadState = 3; // 11 + }; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.stop = function () { + this._playheadState &= 1; // 0x + }; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) { + if (pausePlayhead === void 0) { pausePlayhead = true; } + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.fadeOut(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.fadeOut(); + } + } + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + }; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.containsBoneMask = function (name) { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + }; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.addBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + if (this._boneMask.indexOf(name) < 0) { + this._boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + this._timelineDirty = true; + }; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this._boneMask.indexOf(name); + if (index >= 0) { + this._boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = this._armature.getBone(name); + if (currentBone !== null) { + var bones = this._armature.getBones(); + if (this._boneMask.length > 0) { + for (var _i = 0, bones_1 = bones; _i < bones_1.length; _i++) { + var bone = bones_1[_i]; + var index_2 = this._boneMask.indexOf(bone.name); + if (index_2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index_2, 1); + } + } + } + else { + for (var _a = 0, bones_2 = bones; _a < bones_2.length; _a++) { + var bone = bones_2[_a]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + this._timelineDirty = true; + }; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeAllBoneMask = function () { + this._boneMask.length = 0; + this._timelineDirty = true; + }; + Object.defineProperty(AnimationState.prototype, "isFadeIn", { + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState < 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeOut", { + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeComplete", { + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState === 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isPlaying", { + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isCompleted", { + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.playState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentPlayTimes", { + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "totalTime", { + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._duration; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentTime", { + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentTime; + }, + set: function (value) { + var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + if (this._time === value) { + return; + } + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.playState = -1; + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.playState = -1; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "clip", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + get: function () { + return this.animationData; + }, + enumerable: true, + configurable: true + }); + return AnimationState; + }(dragonBones.BaseObject)); + dragonBones.AnimationState = AnimationState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var TimelineState = (function (_super) { + __extends(TimelineState, _super); + function TimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineState.prototype._onClear = function () { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + this._tweenState = 0 /* None */; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + }; + TimelineState.prototype._setCurrentTime = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this._actionTimeline !== null && this._frameCount <= 1) { + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { + var playTimes = this._animationState.playTimes; + var totalTime = playTimes * this._duration; + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + this.currentTime += this._position; + } + else { + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + // Clear frame flag when timeline start or loopComplete. + if ((prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes)) { + this._frameIndex = -1; + } + return true; + }; + TimelineState.prototype.init = function (armature, animationState, timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + if (this === this._actionTimeline) { + this._actionTimeline = null; // + } + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + this._frameCount = this._timelineArray[this._timelineData.offset + 2 /* TimelineKeyFrameCount */]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + 4 /* TimelineFrameValueOffset */]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + 0 /* TimelineScale */]; + this._timeOffset = this._timelineArray[this._timelineData.offset + 1 /* TimelineOffset */] * 0.01; + } + }; + TimelineState.prototype.fadeOut = function () { }; + TimelineState.prototype.update = function (passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[this._timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + } + this._onArriveAtFrame(); + } + if (this._tweenState !== 0 /* None */) { + this._onUpdateFrame(); + } + } + }; + return TimelineState; + }(dragonBones.BaseObject)); + dragonBones.TimelineState = TimelineState; + /** + * @internal + * @private + */ + var TweenTimelineState = (function (_super) { + __extends(TweenTimelineState, _super); + function TweenTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TweenTimelineState._getEasingValue = function (tweenType, progress, easing) { + var value = progress; + switch (tweenType) { + case 3 /* QuadIn */: + value = Math.pow(progress, 2.0); + break; + case 4 /* QuadOut */: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + case 5 /* QuadInOut */: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + return (value - progress) * easing + progress; + }; + TweenTimelineState._getEasingCurveValue = function (progress, samples, count, offset) { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + var segmentCount = count + 1; // + 2 - 1 + var valueIndex = Math.floor(progress * segmentCount); + var fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + var toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + }; + TweenTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._tweenType = 0 /* None */; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + }; + TweenTimelineState.prototype._onArriveAtFrame = function () { + if (this._frameCount > 1 && + (this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) { + this._tweenType = this._frameArray[this._frameOffset + 1 /* FrameTweenType */]; // TODO recode ture tween type. + this._tweenState = this._tweenType === 0 /* None */ ? 1 /* Once */ : 2 /* Always */; + if (this._tweenType === 2 /* Curve */) { + this._curveCount = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */]; + } + else if (this._tweenType !== 0 /* None */ && this._tweenType !== 1 /* Line */) { + this._tweenEasing = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] * 0.01; + } + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = 1 /* Once */; + } + }; + TweenTimelineState.prototype._onUpdateFrame = function () { + if (this._tweenState === 2 /* Always */) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === 2 /* Curve */) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + 3 /* FrameCurveSamples */); + } + else if (this._tweenType !== 1 /* Line */) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + }; + return TweenTimelineState; + }(TimelineState)); + dragonBones.TweenTimelineState = TweenTimelineState; + /** + * @internal + * @private + */ + var BoneTimelineState = (function (_super) { + __extends(BoneTimelineState, _super); + function BoneTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bone = null; // + this.bonePose = null; // + }; + return BoneTimelineState; + }(TweenTimelineState)); + dragonBones.BoneTimelineState = BoneTimelineState; + /** + * @internal + * @private + */ + var SlotTimelineState = (function (_super) { + __extends(SlotTimelineState, _super); + function SlotTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.slot = null; // + }; + return SlotTimelineState; + }(TweenTimelineState)); + dragonBones.SlotTimelineState = SlotTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var ActionTimelineState = (function (_super) { + __extends(ActionTimelineState, _super); + function ActionTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ActionTimelineState.toString = function () { + return "[class dragonBones.ActionTimelineState]"; + }; + ActionTimelineState.prototype._onCrossFrame = function (frameIndex) { + var eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + frameIndex]; + var actionCount = this._frameArray[frameOffset + 1]; + var actions = this._armature.armatureData.actions; + for (var i = 0; i < actionCount; ++i) { + var actionIndex = this._frameArray[frameOffset + 2 + i]; + var action = actions[actionIndex]; + if (action.type === 0 /* Play */) { + if (action.slot !== null) { + var slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + var eventType = action.type === 10 /* Frame */ ? dragonBones.EventObject.FRAME_EVENT : dragonBones.EventObject.SOUND_EVENT; + if (action.type === 11 /* Sound */ || eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + }; + ActionTimelineState.prototype._onArriveAtFrame = function () { }; + ActionTimelineState.prototype._onUpdateFrame = function () { }; + ActionTimelineState.prototype.update = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + var eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { + this._armature._sortZOrder(null, 0); + } + prevPlayTimes = this.currentPlayTimes; + if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = dragonBones.EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + var isReverse = this._animationState.timeScale < 0.0; + var loopCompleteEvent = null; + var completeEvent = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + loopCompleteEvent.type = dragonBones.EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + if (this.playState > 0) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) { + completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + completeEvent.type = dragonBones.EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + } + } + if (this._frameCount > 1) { + var timelineData = this._timelineData; + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + var crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { + if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + // Arrive at frame. + var framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { + if (!isReverse && loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + this._onCrossFrame(this._frameIndex); + } + } + } + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + }; + ActionTimelineState.prototype.setCurrentTime = function (value) { + this._setCurrentTime(value); + this._frameIndex = -1; + }; + return ActionTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ActionTimelineState = ActionTimelineState; + /** + * @internal + * @private + */ + var ZOrderTimelineState = (function (_super) { + __extends(ZOrderTimelineState, _super); + function ZOrderTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZOrderTimelineState.toString = function () { + return "[class dragonBones.ZOrderTimelineState]"; + }; + ZOrderTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + }; + ZOrderTimelineState.prototype._onUpdateFrame = function () { }; + return ZOrderTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ZOrderTimelineState = ZOrderTimelineState; + /** + * @internal + * @private + */ + var BoneAllTimelineState = (function (_super) { + __extends(BoneAllTimelineState, _super); + function BoneAllTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneAllTimelineState.toString = function () { + return "[class dragonBones.BoneAllTimelineState]"; + }; + BoneAllTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { + var current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + }; + BoneAllTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var result = this.bonePose.result; + this.bone._transformDirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + var scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + }; + BoneAllTimelineState.prototype.fadeOut = function () { + var result = this.bonePose.result; + result.rotation = dragonBones.Transform.normalizeRadian(result.rotation); + result.skew = dragonBones.Transform.normalizeRadian(result.skew); + }; + return BoneAllTimelineState; + }(dragonBones.BoneTimelineState)); + dragonBones.BoneAllTimelineState = BoneAllTimelineState; + /** + * @internal + * @private + */ + var SlotDislayIndexTimelineState = (function (_super) { + __extends(SlotDislayIndexTimelineState, _super); + function SlotDislayIndexTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotDislayIndexTimelineState.toString = function () { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + }; + SlotDislayIndexTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + }; + return SlotDislayIndexTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotDislayIndexTimelineState = SlotDislayIndexTimelineState; + /** + * @internal + * @private + */ + var SlotColorTimelineState = (function (_super) { + __extends(SlotColorTimelineState, _super); + function SlotColorTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._delta = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._result = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + return _this; + } + SlotColorTimelineState.toString = function () { + return "[class dragonBones.SlotColorTimelineState]"; + }; + SlotColorTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._dirty = false; + }; + SlotColorTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var intArray = this._dragonBonesData.intArray; + var frameIntArray = this._dragonBonesData.frameIntArray; + var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + var colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { + var color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + }; + SlotColorTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + }; + SlotColorTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotColorTimelineState.prototype.update = function (passedTime) { + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._colorTransform; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + this.slot._colorDirty = true; + } + } + } + }; + return SlotColorTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotColorTimelineState = SlotColorTimelineState; + /** + * @internal + * @private + */ + var SlotFFDTimelineState = (function (_super) { + __extends(SlotFFDTimelineState, _super); + function SlotFFDTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = []; + _this._delta = []; + _this._result = []; + return _this; + } + SlotFFDTimelineState.toString = function () { + return "[class dragonBones.SlotFFDTimelineState]"; + }; + SlotFFDTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.meshOffset = 0; + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + }; + SlotFFDTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var isTween = this._tweenState === 2 /* Always */; + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + if (isTween) { + var nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + }; + SlotFFDTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + for (var i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + }; + SlotFFDTimelineState.prototype.init = function (armature, animationState, timelineData) { + _super.prototype.init.call(this, armature, animationState, timelineData); + if (this._timelineData !== null) { + var frameIntArray = this._dragonBonesData.frameIntArray; + var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + 3 /* TimelineFrameValueCount */]; + this.meshOffset = frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */]; + this._ffdCount = frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */]; + this._valueCount = frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */]; + this._valueOffset = frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */]; + this._frameFloatOffset = frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + }; + SlotFFDTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotFFDTimelineState.prototype.update = function (passedTime) { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._ffdVertices; + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + this.slot._meshDirty = true; + } + } + } + }; + return SlotFFDTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotFFDTimelineState = SlotFFDTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EventObject = (function (_super) { + __extends(EventObject, _super); + function EventObject() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EventObject.toString = function () { + return "[class dragonBones.EventObject]"; + }; + /** + * @private + */ + EventObject.prototype._onClear = function () { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + }; + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.START = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.LOOP_COMPLETE = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.COMPLETE = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN_COMPLETE = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT_COMPLETE = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FRAME_EVENT = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.SOUND_EVENT = "soundEvent"; + return EventObject; + }(dragonBones.BaseObject)); + dragonBones.EventObject = EventObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DataParser = (function () { + function DataParser() { + } + DataParser._getArmatureType = function (value) { + switch (value.toLowerCase()) { + case "stage": + return 2 /* Stage */; + case "armature": + return 0 /* Armature */; + case "movieclip": + return 1 /* MovieClip */; + default: + return 0 /* Armature */; + } + }; + DataParser._getDisplayType = function (value) { + switch (value.toLowerCase()) { + case "image": + return 0 /* Image */; + case "mesh": + return 2 /* Mesh */; + case "armature": + return 1 /* Armature */; + case "boundingbox": + return 3 /* BoundingBox */; + default: + return 0 /* Image */; + } + }; + DataParser._getBoundingBoxType = function (value) { + switch (value.toLowerCase()) { + case "rectangle": + return 0 /* Rectangle */; + case "ellipse": + return 1 /* Ellipse */; + case "polygon": + return 2 /* Polygon */; + default: + return 0 /* Rectangle */; + } + }; + DataParser._getActionType = function (value) { + switch (value.toLowerCase()) { + case "play": + return 0 /* Play */; + case "frame": + return 10 /* Frame */; + case "sound": + return 11 /* Sound */; + default: + return 0 /* Play */; + } + }; + DataParser._getBlendMode = function (value) { + switch (value.toLowerCase()) { + case "normal": + return 0 /* Normal */; + case "add": + return 1 /* Add */; + case "alpha": + return 2 /* Alpha */; + case "darken": + return 3 /* Darken */; + case "difference": + return 4 /* Difference */; + case "erase": + return 5 /* Erase */; + case "hardlight": + return 6 /* HardLight */; + case "invert": + return 7 /* Invert */; + case "layer": + return 8 /* Layer */; + case "lighten": + return 9 /* Lighten */; + case "multiply": + return 10 /* Multiply */; + case "overlay": + return 11 /* Overlay */; + case "screen": + return 12 /* Screen */; + case "subtract": + return 13 /* Subtract */; + default: + return 0 /* Normal */; + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + DataParser.parseDragonBonesData = function (rawData) { + if (rawData instanceof ArrayBuffer) { + return dragonBones.BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + DataParser.parseTextureAtlasData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.warn("已废弃,请参考 @see"); + var textureAtlasData = {}; + var subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (var i = 0, len = subTextureList.length; i < len; i++) { + var subTextureObject = subTextureList[i]; + var subTextureName = subTextureObject[DataParser.NAME]; + var subTextureRegion = new dragonBones.Rectangle(); + var subTextureFrame = null; + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new dragonBones.Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + return textureAtlasData; + }; + DataParser.DATA_VERSION_2_3 = "2.3"; + DataParser.DATA_VERSION_3_0 = "3.0"; + DataParser.DATA_VERSION_4_0 = "4.0"; + DataParser.DATA_VERSION_4_5 = "4.5"; + DataParser.DATA_VERSION_5_0 = "5.0"; + DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0; + DataParser.DATA_VERSIONS = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + DataParser.TEXTURE_ATLAS = "textureAtlas"; + DataParser.SUB_TEXTURE = "SubTexture"; + DataParser.FORMAT = "format"; + DataParser.IMAGE_PATH = "imagePath"; + DataParser.WIDTH = "width"; + DataParser.HEIGHT = "height"; + DataParser.ROTATED = "rotated"; + DataParser.FRAME_X = "frameX"; + DataParser.FRAME_Y = "frameY"; + DataParser.FRAME_WIDTH = "frameWidth"; + DataParser.FRAME_HEIGHT = "frameHeight"; + DataParser.DRADON_BONES = "dragonBones"; + DataParser.USER_DATA = "userData"; + DataParser.ARMATURE = "armature"; + DataParser.BONE = "bone"; + DataParser.IK = "ik"; + DataParser.SLOT = "slot"; + DataParser.SKIN = "skin"; + DataParser.DISPLAY = "display"; + DataParser.ANIMATION = "animation"; + DataParser.Z_ORDER = "zOrder"; + DataParser.FFD = "ffd"; + DataParser.FRAME = "frame"; + DataParser.TRANSLATE_FRAME = "translateFrame"; + DataParser.ROTATE_FRAME = "rotateFrame"; + DataParser.SCALE_FRAME = "scaleFrame"; + DataParser.VISIBLE_FRAME = "visibleFrame"; + DataParser.DISPLAY_FRAME = "displayFrame"; + DataParser.COLOR_FRAME = "colorFrame"; + DataParser.DEFAULT_ACTIONS = "defaultActions"; + DataParser.ACTIONS = "actions"; + DataParser.EVENTS = "events"; + DataParser.INTS = "ints"; + DataParser.FLOATS = "floats"; + DataParser.STRINGS = "strings"; + DataParser.CANVAS = "canvas"; + DataParser.TRANSFORM = "transform"; + DataParser.PIVOT = "pivot"; + DataParser.AABB = "aabb"; + DataParser.COLOR = "color"; + DataParser.VERSION = "version"; + DataParser.COMPATIBLE_VERSION = "compatibleVersion"; + DataParser.FRAME_RATE = "frameRate"; + DataParser.TYPE = "type"; + DataParser.SUB_TYPE = "subType"; + DataParser.NAME = "name"; + DataParser.PARENT = "parent"; + DataParser.TARGET = "target"; + DataParser.SHARE = "share"; + DataParser.PATH = "path"; + DataParser.LENGTH = "length"; + DataParser.DISPLAY_INDEX = "displayIndex"; + DataParser.BLEND_MODE = "blendMode"; + DataParser.INHERIT_TRANSLATION = "inheritTranslation"; + DataParser.INHERIT_ROTATION = "inheritRotation"; + DataParser.INHERIT_SCALE = "inheritScale"; + DataParser.INHERIT_REFLECTION = "inheritReflection"; + DataParser.INHERIT_ANIMATION = "inheritAnimation"; + DataParser.INHERIT_FFD = "inheritFFD"; + DataParser.BEND_POSITIVE = "bendPositive"; + DataParser.CHAIN = "chain"; + DataParser.WEIGHT = "weight"; + DataParser.FADE_IN_TIME = "fadeInTime"; + DataParser.PLAY_TIMES = "playTimes"; + DataParser.SCALE = "scale"; + DataParser.OFFSET = "offset"; + DataParser.POSITION = "position"; + DataParser.DURATION = "duration"; + DataParser.TWEEN_TYPE = "tweenType"; + DataParser.TWEEN_EASING = "tweenEasing"; + DataParser.TWEEN_ROTATE = "tweenRotate"; + DataParser.TWEEN_SCALE = "tweenScale"; + DataParser.CURVE = "curve"; + DataParser.SOUND = "sound"; + DataParser.EVENT = "event"; + DataParser.ACTION = "action"; + DataParser.X = "x"; + DataParser.Y = "y"; + DataParser.SKEW_X = "skX"; + DataParser.SKEW_Y = "skY"; + DataParser.SCALE_X = "scX"; + DataParser.SCALE_Y = "scY"; + DataParser.VALUE = "value"; + DataParser.ROTATE = "rotate"; + DataParser.SKEW = "skew"; + DataParser.ALPHA_OFFSET = "aO"; + DataParser.RED_OFFSET = "rO"; + DataParser.GREEN_OFFSET = "gO"; + DataParser.BLUE_OFFSET = "bO"; + DataParser.ALPHA_MULTIPLIER = "aM"; + DataParser.RED_MULTIPLIER = "rM"; + DataParser.GREEN_MULTIPLIER = "gM"; + DataParser.BLUE_MULTIPLIER = "bM"; + DataParser.UVS = "uvs"; + DataParser.VERTICES = "vertices"; + DataParser.TRIANGLES = "triangles"; + DataParser.WEIGHTS = "weights"; + DataParser.SLOT_POSE = "slotPose"; + DataParser.BONE_POSE = "bonePose"; + DataParser.GOTO_AND_PLAY = "gotoAndPlay"; + DataParser.DEFAULT_NAME = "default"; + return DataParser; + }()); + dragonBones.DataParser = DataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ObjectDataParser = (function (_super) { + __extends(ObjectDataParser, _super); + function ObjectDataParser() { + /** + * @private + */ + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._intArrayJson = []; + _this._floatArrayJson = []; + _this._frameIntArrayJson = []; + _this._frameFloatArrayJson = []; + _this._frameArrayJson = []; + _this._timelineArrayJson = []; + _this._rawTextureAtlasIndex = 0; + _this._rawBones = []; + _this._data = null; // + _this._armature = null; // + _this._bone = null; // + _this._slot = null; // + _this._skin = null; // + _this._mesh = null; // + _this._animation = null; // + _this._timeline = null; // + _this._rawTextureAtlases = null; + _this._defalultColorOffset = -1; + _this._prevTweenRotate = 0; + _this._prevRotation = 0.0; + _this._helpMatrixA = new dragonBones.Matrix(); + _this._helpMatrixB = new dragonBones.Matrix(); + _this._helpTransform = new dragonBones.Transform(); + _this._helpColorTransform = new dragonBones.ColorTransform(); + _this._helpPoint = new dragonBones.Point(); + _this._helpArray = []; + _this._actionFrames = []; + _this._weightSlotPose = {}; + _this._weightBonePoses = {}; + _this._weightBoneIndices = {}; + _this._cacheBones = {}; + _this._meshs = {}; + _this._slotChildActions = {}; + return _this; + } + ObjectDataParser._getBoolean = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + default: + return true; + } + } + else { + return !!value; + } + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getNumber = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + return +value || 0; + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getString = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + return value; + } + return String(value); + } + return defaultValue; + }; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + ObjectDataParser.prototype._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) { + var l_t = 1.0 - t; + var powA = l_t * l_t; + var powB = t * t; + var kA = l_t * powA; + var kB = 3.0 * t * powA; + var kC = 3.0 * l_t * powB; + var kD = t * powB; + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + }; + /** + * @private + */ + ObjectDataParser.prototype._samplingEasingCurve = function (curve, samples) { + var curveCount = curve.length; + var stepIndex = -2; + for (var i = 0, l = samples.length; i < l; ++i) { + var t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { + stepIndex += 6; + } + var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + var x1 = isInCurve ? curve[stepIndex] : 0.0; + var y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + var x2 = curve[stepIndex + 2]; + var y2 = curve[stepIndex + 3]; + var x3 = curve[stepIndex + 4]; + var y3 = curve[stepIndex + 5]; + var x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + var y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + var lower = 0.0; + var higher = 1.0; + while (higher - lower > 0.0001) { + var percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + samples[i] = this._helpPoint.y; + } + }; + ObjectDataParser.prototype._sortActionFrame = function (a, b) { + return a.frameStart > b.frameStart ? 1 : -1; + }; + ObjectDataParser.prototype._parseActionDataInFrame = function (rawData, frameStart, bone, slot) { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, 11 /* Sound */, bone, slot); + } + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, 0 /* Play */, bone, slot); + } + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, 0 /* Play */, bone, slot); + } + }; + ObjectDataParser.prototype._mergeActionFrame = function (rawData, frameStart, type, bone, slot) { + var actionOffset = dragonBones.DragonBones.webAssembly ? this._armature.actions.size() : this._armature.actions.length; + var actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + var frame = null; + if (this._actionFrames.length === 0) { + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + for (var _i = 0, _a = this._actionFrames; _i < _a.length; _i++) { + var eachFrame = _a[_i]; + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + if (frame === null) { + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + for (var i = 0; i < actionCount; ++i) { + frame.actions.push(actionOffset + i); + } + }; + ObjectDataParser.prototype._parseCacheActionFrame = function (frame) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = frameArray.length; + var actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + 0 /* FramePosition */] = frame.frameStart; + frameArray[frameOffset + 0 /* FramePosition */ + 1] = actionCount; // Action count. + for (var i = 0; i < actionCount; ++i) { + frameArray[frameOffset + 0 /* FramePosition */ + 2 + i] = frame.actions[i]; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArmature = function (rawData, scale) { + // const armature = BaseObject.borrowObject(ArmatureData); + var armature = dragonBones.DragonBones.webAssembly ? new Module["ArmatureData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */); + } + if (armature.frameRate === 0) { + armature.frameRate = 24; + } + this._armature = armature; + if (ObjectDataParser.AABB in rawData) { + var rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + if (ObjectDataParser.CANVAS in rawData) { + var rawCanvas = rawData[ObjectDataParser.CANVAS]; + var canvas = dragonBones.BaseObject.borrowObject(dragonBones.CanvasData); + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + armature.canvas = canvas; + } + if (ObjectDataParser.BONE in rawData) { + var rawBones = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawBones_1 = rawBones; _i < rawBones_1.length; _i++) { + var rawBone = rawBones_1[_i]; + var parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + var bone = this._parseBone(rawBone); + if (parentName.length > 0) { + var parent_1 = armature.getBone(parentName); + if (parent_1 !== null) { + bone.parent = parent_1; + } + else { + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + if (bone.name in this._cacheBones) { + for (var _a = 0, _b = this._cacheBones[bone.name]; _a < _b.length; _a++) { + var child = _b[_a]; + child.parent = bone; + } + delete this._cacheBones[bone.name]; + } + armature.addBone(bone); + this._rawBones.push(bone); // Raw bone sort. + } + } + if (ObjectDataParser.IK in rawData) { + var rawIKS = rawData[ObjectDataParser.IK]; + for (var _c = 0, rawIKS_1 = rawIKS; _c < rawIKS_1.length; _c++) { + var rawIK = rawIKS_1[_c]; + this._parseIKConstraint(rawIK); + } + } + armature.sortBones(); + if (ObjectDataParser.SLOT in rawData) { + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _d = 0, rawSlots_1 = rawSlots; _d < rawSlots_1.length; _d++) { + var rawSlot = rawSlots_1[_d]; + armature.addSlot(this._parseSlot(rawSlot)); + } + } + if (ObjectDataParser.SKIN in rawData) { + var rawSkins = rawData[ObjectDataParser.SKIN]; + for (var _e = 0, rawSkins_1 = rawSkins; _e < rawSkins_1.length; _e++) { + var rawSkin = rawSkins_1[_e]; + armature.addSkin(this._parseSkin(rawSkin)); + } + } + if (ObjectDataParser.ANIMATION in rawData) { + var rawAnimations = rawData[ObjectDataParser.ANIMATION]; + for (var _f = 0, rawAnimations_1 = rawAnimations; _f < rawAnimations_1.length; _f++) { + var rawAnimation = rawAnimations_1[_f]; + var animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, 0 /* Play */, null, null); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, 0 /* Play */, null, null); + } + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? armature.defaultActions.size() : armature.defaultActions.length); ++i) { + var action = dragonBones.DragonBones.webAssembly ? armature.defaultActions.get(i) : armature.defaultActions[i]; + if (action.type === 0 /* Play */) { + var animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + // Clear helper. + this._rawBones.length = 0; + this._armature = null; + for (var k in this._meshs) { + delete this._meshs[k]; + } + for (var k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (var k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (var k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (var k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (var k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + return armature; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBone = function (rawData) { + // const bone = BaseObject.borrowObject(BoneData); + var bone = dragonBones.DragonBones.webAssembly ? new Module["BoneData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + } + return bone; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseIKConstraint = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + var target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + // const constraint = BaseObject.borrowObject(IKConstraintData); + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraintData"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + var chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (dragonBones.DragonBones.webAssembly) { + bone.constraints.push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlot = function (rawData) { + // const slot = BaseObject.borrowObject(SlotData); + var slot = dragonBones.DragonBones.webAssembly ? new Module["SlotData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = dragonBones.DragonBones.webAssembly ? this._armature.sortedSlots.size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")); // + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */); + } + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].createColor() : dragonBones.SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : dragonBones.SlotData.DEFAULT_COLOR; + } + if (ObjectDataParser.ACTIONS in rawData) { + var actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, 0 /* Play */, null, null); + } + return slot; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSkin = function (rawData) { + // const skin = BaseObject.borrowObject(SkinData); + var skin = dragonBones.DragonBones.webAssembly ? new Module["SkinData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _i = 0, rawSlots_2 = rawSlots; _i < rawSlots_2.length; _i++) { + var rawSlot = rawSlots_2[_i]; + var slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + if (ObjectDataParser.DISPLAY in rawSlot) { + var rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (var _a = 0, rawDisplays_1 = rawDisplays; _a < rawDisplays_1.length; _a++) { + var rawDisplay = rawDisplays_1[_a]; + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + this._slot = null; // + } + } + this._skin = null; // + } + return skin; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseDisplay = function (rawData) { + var display = null; + var name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + var path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + var type = 0 /* Image */; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + switch (type) { + case 0 /* Image */: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + var imageDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ImageDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + case 1 /* Armature */: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + var armatureDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, 0 /* Play */, null, null); + } + else if (this._slot.name in this._slotChildActions) { + var displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (var _i = 0, _a = this._slotChildActions[this._slot.name]; _i < _a.length; _i++) { + var action = _a[_i]; + if (dragonBones.DragonBones.webAssembly) { + armatureDisplay.actions.push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + delete this._slotChildActions[this._slot.name]; + } + } + break; + case 2 /* Mesh */: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + var meshDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["MeshDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + var shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + var shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + case 3 /* BoundingBox */: + var boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + var boundingBoxDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + return display; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePivot = function (rawData, display) { + if (ObjectDataParser.PIVOT in rawData) { + var rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseMesh = function (rawData, mesh) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var rawUVs = rawData[ObjectDataParser.UVS]; + var rawTriangles = rawData[ObjectDataParser.TRIANGLES]; + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + var vertexCount = Math.floor(rawVertices.length / 2); // uint + var triangleCount = Math.floor(rawTriangles.length / 3); // uint + var vertexOffset = floatArray.length; + var uvOffset = vertexOffset + vertexCount * 2; + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + 0 /* MeshVertexCount */] = vertexCount; + intArray[mesh.offset + 1 /* MeshTriangleCount */] = triangleCount; + intArray[mesh.offset + 2 /* MeshFloatOffset */] = vertexOffset; + for (var i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + 4 /* MeshVertexIndices */ + i] = rawTriangles[i]; + } + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + if (ObjectDataParser.WEIGHTS in rawData) { + var rawWeights = rawData[ObjectDataParser.WEIGHTS]; + var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE]; + var rawBonePoses = rawData[ObjectDataParser.BONE_POSE]; + var weightBoneIndices = new Array(); + var weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + var floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + 1 /* WeigthFloatOffset */] = floatOffset; + for (var i = 0; i < weightBoneCount; ++i) { + var rawBoneIndex = rawBonePoses[i * 7]; // uint + var bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + if (dragonBones.DragonBones.webAssembly) { + for (var j = 0; j < this._armature.sortedBones.size(); j++) { + if (this._armature.sortedBones.get(j) === bone) { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = j; + } + } + } + else { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = this._armature.sortedBones.indexOf(bone); + } + } + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + for (var i = 0, iW = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + var iD = i * 2; + var vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + var x = floatArray[vertexOffset + iD]; + var y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var rawBoneIndex = rawWeights[iW++]; // uint + var bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + mesh.weight = weight; + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoundingBox = function (rawData) { + var boundingBox = null; + var type = 0 /* Rectangle */; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + switch (type) { + case 0 /* Rectangle */: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.RectangleBoundingBoxData); + break; + case 1 /* Ellipse */: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.EllipseBoundingBoxData); + break; + case 2 /* Polygon */: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === 0 /* Rectangle */ || boundingBox.type === 1 /* Ellipse */) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + return boundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + for (var i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + var iN = i + 1; + var x = rawVertices[i]; + var y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + return polygonBoundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (dragonBones.DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + this._animation = animation; + if (ObjectDataParser.FRAME in rawData) { + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (var i = 0, frameStart = 0; i < keyFrameCount; ++i) { + var rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], 1 /* ZOrder */, false, false, 0, this._parseZOrderFrame); + } + if (ObjectDataParser.BONE in rawData) { + var rawTimelines = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawTimelines_1 = rawTimelines; _i < rawTimelines_1.length; _i++) { + var rawTimeline = rawTimelines_1[_i]; + this._parseBoneTimeline(rawTimeline); + } + } + if (ObjectDataParser.SLOT in rawData) { + var rawTimelines = rawData[ObjectDataParser.SLOT]; + for (var _a = 0, rawTimelines_2 = rawTimelines; _a < rawTimelines_2.length; _a++) { + var rawTimeline = rawTimelines_2[_a]; + this._parseSlotTimeline(rawTimeline); + } + } + if (ObjectDataParser.FFD in rawData) { + var rawTimelines = rawData[ObjectDataParser.FFD]; + for (var _b = 0, rawTimelines_3 = rawTimelines; _b < rawTimelines_3.length; _b++) { + var rawTimeline = rawTimelines_3[_b]; + var slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + var displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + this._slot = slot; + this._mesh = this._meshs[displayName]; + var timelineFFD = this._parseTimeline(rawTimeline, 22 /* SlotFFD */, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + this._slot = null; // + this._mesh = null; // + } + } + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + var timeline = this._animation.actionTimeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var keyFrameCount = this._actionFrames.length; + timeline.type = 0 /* Action */; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = 100; + timelineArray[timeline.offset + 1 /* TimelineOffset */] = 0; + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = 0; + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + this._actionFrames.length = 0; + } + this._animation = null; // + return animation; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTimeline = function (rawData, type, addIntOffset, addFloatOffset, frameValueCount, frameParser) { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntArrayLength = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + var frameFloatArrayLength = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + var timeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + 1 /* TimelineOffset */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + } + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + var frameIndices = this._data.frameIndices; + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneTimeline = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + var timeline = this._parseTimeline(rawData, 10 /* BoneAll */, false, true, 6, this._parseBoneFrame); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + this._bone = null; // + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotTimeline = function (rawData) { + var slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + this._slot = slot; + var displayIndexTimeline = this._parseTimeline(rawData, 20 /* SlotDisplay */, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + var colorTimeline = this._parseTimeline(rawData, 21 /* SlotColor */, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseFrame = function (rawData, frameStart, frameCount, frameArray) { + rawData; + frameCount; + var frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + 0 /* FramePosition */] = frameStart; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTweenFrame = function (rawData, frameStart, frameCount, frameArray) { + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + var sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + 1 /* FrameTweenType */] = 2 /* Curve */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = sampleCount; + for (var i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + 3 /* FrameCurveSamples */ + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + var noTween = -2.0; + var tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 1 /* Line */; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 3 /* QuadIn */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 4 /* QuadOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 5 /* QuadInOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (ObjectDataParser.Z_ORDER in rawData) { + var rawZOrder = rawData[ObjectDataParser.Z_ORDER]; + if (rawZOrder.length > 0) { + var slotCount = this._armature.sortedSlots.length; + var unchanged = new Array(slotCount - rawZOrder.length / 2); + var zOrders = new Array(slotCount); + for (var i_1 = 0; i_1 < slotCount; ++i_1) { + zOrders[i_1] = -1; + } + var originalIndex = 0; + var unchangedIndex = 0; + for (var i_2 = 0, l = rawZOrder.length; i_2 < l; i_2 += 2) { + var slotIndex = rawZOrder[i_2]; + var zOrderOffset = rawZOrder[i_2 + 1]; + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + var i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + return frameOffset; + } + } + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) { + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + // Modify rotation. + var rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + dragonBones.Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + rotation = this._prevRotation + rotation - this._prevRotation + dragonBones.Transform.PI_D * this._prevTweenRotate; + } + } + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + var frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotDisplayIndexFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotColorFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + var rawColor = rawData[ObjectDataParser.COLOR]; + for (var k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + colorOffset = this._defalultColorOffset; + } + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotFFDFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameFloatOffset = frameFloatArray.length; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] : null; + var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + var vertexCount = intArray[this._mesh.offset + 0 /* MeshVertexCount */]; + var x = 0.0; + var y = 0.0; + var iB = 0; + var iV = 0; + if (this._mesh.weight !== null) { + var rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + 2 /* WeigthBoneIndices */ + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + for (var i = 0; i < vertexCount * 2; i += 2) { + if (rawVertices === null) { + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + if (this._mesh.weight !== null) { + var rawBonePoses = this._weightBonePoses[this._mesh.name]; + var weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + var vertexBoneCount = intArray[iB++]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._mesh.weight.bones[boneIndex]; + var rawBoneIndex = this._rawBones.indexOf(bone); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + if (frameStart === 0) { + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */] = this._mesh.offset; + frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */] = 0; + frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] = frameFloatOffset; + timelineArray[this._timeline.offset + 3 /* TimelineFrameValueCount */] = frameIntOffset - this._animation.frameIntOffset; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseActionData = function (rawData, actions, type, bone, slot) { + var actionCount = 0; + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (var _i = 0, rawData_1 = rawData; _i < rawData_1.length; _i++) { + var rawAction = rawData_1[_i]; + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = 0 /* Play */; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + if (ObjectDataParser.BONE in rawAction) { + var boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + if (ObjectDataParser.SLOT in rawAction) { + var slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawInts = rawAction[ObjectDataParser.INTS]; + for (var _a = 0, rawInts_1 = rawInts; _a < rawInts_1.length; _a++) { + var rawValue = rawInts_1[_a]; + dragonBones.DragonBones.webAssembly ? action.data.ints.push_back(rawValue) : action.data.ints.push(rawValue); + } + } + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawFloats = rawAction[ObjectDataParser.FLOATS]; + for (var _b = 0, rawFloats_1 = rawFloats; _b < rawFloats_1.length; _b++) { + var rawValue = rawFloats_1[_b]; + dragonBones.DragonBones.webAssembly ? action.data.floats.push_back(rawValue) : action.data.floats.push(rawValue); + } + } + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawStrings = rawAction[ObjectDataParser.STRINGS]; + for (var _c = 0, rawStrings_1 = rawStrings; _c < rawStrings_1.length; _c++) { + var rawValue = rawStrings_1[_c]; + dragonBones.DragonBones.webAssembly ? action.data.strings.push_back(rawValue) : action.data.strings.push(rawValue); + } + } + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + } + return actionCount; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTransform = function (rawData, transform, scale) { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * dragonBones.Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.Transform.DEG_RAD) - transform.rotation; + } + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseColorTransform = function (rawData, color) { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArray = function (rawData) { + rawData; + if (dragonBones.DragonBones.webAssembly) { + return; + } + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseWASMArray = function () { + var intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (var i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (var i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (var i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (var i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (var i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (var i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined); + var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) { + // const data = BaseObject.borrowObject(DragonBonesData); + var data = dragonBones.DragonBones.webAssembly ? new Module["DragonBonesData"]() : dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + if (data.frameRate === 0) { + data.frameRate = 24; + } + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + this._parseArray(rawData); + var rawArmatures = rawData[ObjectDataParser.ARMATURE]; + for (var _i = 0, rawArmatures_1 = rawArmatures; _i < rawArmatures_1.length; _i++) { + var rawArmature = rawArmatures_1[_i]; + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + this._data = null; + } + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + return null; + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) { + if (scale === void 0) { scale = 0.0; } + console.assert(rawData !== undefined); + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + var rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + return true; + } + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + if (scale > 0.0) { + textureAtlasData.scale = scale; + } + else { + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + scale = 1.0 / scale; // + if (ObjectDataParser.SUB_TEXTURE in rawData) { + var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE]; + for (var i = 0, l = rawTextures.length; i < l; ++i) { + var rawTexture = rawTextures[i]; + var textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = dragonBones.DragonBones.webAssembly ? Module["TextureData"].createRectangle() : dragonBones.TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + textureAtlasData.addTexture(textureData); + } + } + return true; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + ObjectDataParser.getInstance = function () { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + return ObjectDataParser._objectDataParserInstance; + }; + /** + * @private + */ + ObjectDataParser._objectDataParserInstance = null; + return ObjectDataParser; + }(dragonBones.DataParser)); + dragonBones.ObjectDataParser = ObjectDataParser; + var ActionFrame = (function () { + function ActionFrame() { + this.frameStart = 0; + this.actions = []; + } + return ActionFrame; + }()); +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BinaryDataParser = (function (_super) { + __extends(BinaryDataParser, _super); + function BinaryDataParser() { + return _super !== null && _super.apply(this, arguments) || this; + } + BinaryDataParser.prototype._inRange = function (a, min, max) { + return min <= a && a <= max; + }; + BinaryDataParser.prototype._decodeUTF8 = function (data) { + var EOF_byte = -1; + var EOF_code_point = -1; + var FATAL_POINT = 0xFFFD; + var pos = 0; + var result = ""; + var code_point; + var utf8_code_point = 0; + var utf8_bytes_needed = 0; + var utf8_bytes_seen = 0; + var utf8_lower_boundary = 0; + while (data.length > pos) { + var _byte = data[pos++]; + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + var cp = utf8_code_point; + var lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) + result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + return result; + }; + BinaryDataParser.prototype._getUTF16Key = function (value) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + return value; + }; + BinaryDataParser.prototype._parseBinaryTimeline = function (type, offset, timelineData) { + if (timelineData === void 0) { timelineData = null; } + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + var timeline = timelineData !== null ? timelineData : (dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData)); + timeline.type = type; + timeline.offset = offset; + this._timeline = timeline; + var keyFrameCount = this._timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK + 1]] - frameStart; + } + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseMesh = function (rawData, mesh) { + mesh.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + var weightOffset = this._intArray[mesh.offset + 3 /* MeshWeightOffset */]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + var vertexCount = this._intArray[mesh.offset + 0 /* MeshVertexCount */]; + var boneCount = this._intArray[weightOffset + 0 /* WeigthBoneCount */]; + weight.offset = weightOffset; + if (dragonBones.DragonBones.webAssembly) { + weight.bones.resize(boneCount, null); + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones.set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + var boneIndicesOffset = weightOffset + 2 /* WeigthBoneIndices */ + boneCount; + for (var i = 0, l = vertexCount; i < l; ++i) { + var vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + mesh.weight = weight; + } + }; + /** + * @private + */ + BinaryDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + return polygonBoundingBox; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.DURATION, 1), 1); + animation.playTimes = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.SCALE, 1.0); + animation.name = dragonBones.ObjectDataParser._getString(rawData, dragonBones.ObjectDataParser.NAME, dragonBones.ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = dragonBones.ObjectDataParser.DEFAULT_NAME; + } + // Offsets. + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + this._animation = animation; + if (dragonBones.ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(0 /* Action */, rawData[dragonBones.ObjectDataParser.ACTION]); + } + if (dragonBones.ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(1 /* ZOrder */, rawData[dragonBones.ObjectDataParser.Z_ORDER]); + } + if (dragonBones.ObjectDataParser.BONE in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.BONE]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + if (dragonBones.ObjectDataParser.SLOT in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.SLOT]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + this._animation = null; + return animation; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseArray = function (rawData) { + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + if (dragonBones.DragonBones.webAssembly) { + var tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + var tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + var tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + var tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + var intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + var floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + var frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + var frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + var frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + var timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + for (var i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + for (var i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + for (var i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + for (var i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + for (var i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + for (var i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + }; + /** + * @inheritDoc + */ + BinaryDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + var tag = new Uint8Array(rawData, 0, 8); + if (tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0)) { + console.assert(false, "Nonsupport data."); + return null; + } + var headerLength = new Uint32Array(rawData, 8, 1)[0]; + var headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + var headerString = this._decodeUTF8(headerBytes); + var header = JSON.parse(headerString); + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + return _super.prototype.parseDragonBonesData.call(this, header, scale); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + BinaryDataParser.getInstance = function () { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + return BinaryDataParser._binaryDataParserInstance; + }; + /** + * @private + */ + BinaryDataParser._binaryDataParserInstance = null; + return BinaryDataParser; + }(dragonBones.ObjectDataParser)); + dragonBones.BinaryDataParser = BinaryDataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BuildArmaturePackage = (function () { + function BuildArmaturePackage() { + this.dataName = ""; + this.textureAtlasName = ""; + this.skin = null; + } + return BuildArmaturePackage; + }()); + dragonBones.BuildArmaturePackage = BuildArmaturePackage; + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var BaseFactory = (function () { + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + function BaseFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + this.autoSearch = false; + /** + * @private + */ + this._dragonBonesDataMap = {}; + /** + * @private + */ + this._textureAtlasDataMap = {}; + /** + * @private + */ + this._dragonBones = null; + /** + * @private + */ + this._dataParser = null; + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new dragonBones.ObjectDataParser(); + } + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new dragonBones.BinaryDataParser(); + } + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + BaseFactory.prototype._isSupportMesh = function () { + return true; + }; + /** + * @private + */ + BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) { + if (textureAtlasName in this._textureAtlasDataMap) { + for (var _i = 0, _a = this._textureAtlasDataMap[textureAtlasName]; _i < _a.length; _i++) { + var textureAtlasData = _a[_i]; + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + if (this.autoSearch) { + for (var k in this._textureAtlasDataMap) { + for (var _b = 0, _c = this._textureAtlasDataMap[k]; _b < _c.length; _b++) { + var textureAtlasData = _c[_b]; + if (textureAtlasData.autoSearch) { + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + return null; + }; + /** + * @private + */ + BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) { + var dragonBonesData = null; + var armatureData = null; + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { + for (var k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (var k in this._dragonBonesDataMap) { + var skinDragonBonesData = this._dragonBonesDataMap[k]; + var skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + return true; + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype._buildBones = function (dataPackage, armature) { + var bones = dataPackage.armature.sortedBones; + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? bones.size() : bones.length); ++i) { + var boneData = dragonBones.DragonBones.webAssembly ? bones.get(i) : bones[i]; + var bone = dragonBones.DragonBones.webAssembly ? new Module["Bone"]() : dragonBones.BaseObject.borrowObject(dragonBones.Bone); + bone.init(boneData); + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + var constraints = boneData.constraints; + for (var j = 0; j < (dragonBones.DragonBones.webAssembly ? constraints.size() : constraints.length); ++j) { + var constraintData = dragonBones.DragonBones.webAssembly ? constraints.get(j) : constraints[j]; + var target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + // TODO more constraint type. + var ikConstraintData = constraintData; + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraint"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraint); + var root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + }; + /** + * @private + */ + BaseFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var skinSlots = {}; + for (var k in defaultSkin.displays) { + var displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + if (currentSkin !== defaultSkin) { + for (var k in currentSkin.displays) { + var displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + for (var _i = 0, _a = dataPackage.armature.sortedSlots; _i < _a.length; _i++) { + var slotData = _a[_i]; + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Array(); + for (var _b = 0, displays_1 = displays; _b < displays_1.length; _b++) { + var displayData = displays_1[_b]; + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + BaseFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_2 = actions; _i < actions_2.length; _i++) { + var action = actions_2[_i]; + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * @private + */ + BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + for (var i = 0, l = displayList.length; i < l; ++i) { + if (!displayList[i]) { + displayList[i] = null; + } + } + } + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.displayList = displayList; + }; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 1.0; } + var dragonBonesData = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + while (true) { + var textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + return dragonBonesData; + }; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + var textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + return textureAtlasData; + }; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.updateTextureAtlasData = function (name, textureAtlases) { + var textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (var i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + }; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getDragonBonesData = function (name) { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + }; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addDragonBonesData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + this._dragonBonesDataMap[name] = data; + }; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + delete this._dragonBonesDataMap[name]; + } + }; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getTextureAtlasData = function (name) { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + }; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addTextureAtlasData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + var textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + }; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._textureAtlasDataMap) { + var textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (var _i = 0, textureAtlasDataList_1 = textureAtlasDataList; _i < textureAtlasDataList_1.length; _i++) { + var textureAtlasData = textureAtlasDataList_1[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[name]; + } + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.getArmatureData = function (name, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = ""; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + return dataPackage.armature; + }; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.clear = function (disposeData) { + if (disposeData === void 0) { disposeData = true; } + for (var k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + delete this._dragonBonesDataMap[k]; + } + for (var k in this._textureAtlasDataMap) { + if (disposeData) { + var textureAtlasDataList = this._textureAtlasDataMap[k]; + for (var _i = 0, textureAtlasDataList_2 = textureAtlasDataList; _i < textureAtlasDataList_2.length; _i++) { + var textureAtlasData = textureAtlasDataList_2[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[k]; + } + }; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + var armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + return armature; + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + for (var _i = 0, displays_2 = displays; _i < displays_2.length; _i++) { + var display = displays_2[_i]; + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) { + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + var displayIndex = 0; + for (var _i = 0, displays_3 = displays; _i < displays_3.length; _i++) { + var displayData = displays_3[_i]; + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + }; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + for (var _i = 0, _a = armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays[slot.name]; + var displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (var i = 0, l = displays.length; i < l; ++i) { + var displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + slot.displayList = displayList; + } + }; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) { + if (fromSkinName === void 0) { fromSkinName = null; } + if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; } + if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; } + var dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + var fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + var animations = {}; + for (var animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + for (var animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + toArmature.animation.animations = animations; + } + if (dataPackage.skin) { + var slots = toArmature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var toSlot = slots[i]; + var toSlotDisplayList = toSlot.displayList; + for (var j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + var toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof dragonBones.Armature) { + var displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + var fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === 1 /* Armature */) { + this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + return true; + } + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype.getAllDragonBonesData = function () { + return this._dragonBonesDataMap; + }; + /** + * @private + */ + BaseFactory.prototype.getAllTextureAtlasData = function () { + return this._textureAtlasDataMap; + }; + /** + * @private + */ + BaseFactory._objectParser = null; + /** + * @private + */ + BaseFactory._binaryParser = null; + return BaseFactory; + }()); + dragonBones.BaseFactory = BaseFactory; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretTextureAtlasData = (function (_super) { + __extends(EgretTextureAtlasData, _super); + function EgretTextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._renderTexture = null; // Initial value. + return _this; + } + /** + * @private + */ + EgretTextureAtlasData.toString = function () { + return "[class dragonBones.EgretTextureAtlasData]"; + }; + /** + * @private + */ + EgretTextureAtlasData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this._renderTexture !== null) { + //this.texture.dispose(); + } + this._renderTexture = null; + }; + /** + * @private + */ + EgretTextureAtlasData.prototype.createTexture = function () { + return dragonBones.BaseObject.borrowObject(EgretTextureData); + }; + Object.defineProperty(EgretTextureAtlasData.prototype, "renderTexture", { + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._renderTexture; + }, + set: function (value) { + if (this._renderTexture === value) { + return; + } + this._renderTexture = value; + if (this._renderTexture !== null) { + var bitmapData = this._renderTexture.bitmapData; + var textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + var textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + for (var k in this.textures) { + var textureData = this.textures[k]; + var subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + var subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + if (textureData.renderTexture === null) { + textureData.renderTexture = new egret.Texture(); + if (textureData.rotated) { + textureData.renderTexture.$initData(textureData.region.x, textureData.region.y, subTextureHeight, subTextureWidth, 0, 0, subTextureHeight, subTextureWidth, textureAtlasWidth, textureAtlasHeight); + } + else { + textureData.renderTexture.$initData(textureData.region.x, textureData.region.y, subTextureWidth, subTextureHeight, 0, 0, subTextureWidth, subTextureHeight, textureAtlasWidth, textureAtlasHeight); + } + } + textureData.renderTexture._bitmapData = bitmapData; + } + } + else { + for (var k in this.textures) { + var textureData = this.textures[k]; + textureData.renderTexture = null; + } + } + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + EgretTextureAtlasData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + Object.defineProperty(EgretTextureAtlasData.prototype, "texture", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + get: function () { + return this.renderTexture; + }, + enumerable: true, + configurable: true + }); + return EgretTextureAtlasData; + }(dragonBones.TextureAtlasData)); + dragonBones.EgretTextureAtlasData = EgretTextureAtlasData; + /** + * @private + */ + var EgretTextureData = (function (_super) { + __extends(EgretTextureData, _super); + function EgretTextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.renderTexture = null; // Initial value. + return _this; + } + EgretTextureData.toString = function () { + return "[class dragonBones.EgretTextureData]"; + }; + EgretTextureData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + this.renderTexture = null; + }; + return EgretTextureData; + }(dragonBones.TextureData)); + dragonBones.EgretTextureData = EgretTextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EgretEvent = (function (_super) { + __extends(EgretEvent, _super); + function EgretEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(EgretEvent.prototype, "eventObject", { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationName", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + var animationState = this.eventObject.animationState; + return animationState !== null ? animationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "armature", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + get: function () { + return this.eventObject.armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "bone", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + get: function () { + return this.eventObject.bone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + get: function () { + return this.eventObject.slot; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationState", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + return this.eventObject.animationState; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "frameLabel", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "sound", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "movementID", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationName + */ + get: function () { + return this.animationName; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + EgretEvent.START = dragonBones.EventObject.START; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + EgretEvent.LOOP_COMPLETE = dragonBones.EventObject.LOOP_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + EgretEvent.COMPLETE = dragonBones.EventObject.COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + EgretEvent.FADE_IN = dragonBones.EventObject.FADE_IN; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + EgretEvent.FADE_IN_COMPLETE = dragonBones.EventObject.FADE_IN_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + EgretEvent.FADE_OUT = dragonBones.EventObject.FADE_OUT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + EgretEvent.FADE_OUT_COMPLETE = dragonBones.EventObject.FADE_OUT_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND_EVENT = dragonBones.EventObject.SOUND_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.ANIMATION_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.BONE_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.MOVEMENT_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND = dragonBones.EventObject.SOUND_EVENT; + return EgretEvent; + }(egret.Event)); + dragonBones.EgretEvent = EgretEvent; + /** + * @inheritDoc + */ + var EgretArmatureDisplay = (function (_super) { + __extends(EgretArmatureDisplay, _super); + function EgretArmatureDisplay() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._disposeProxy = false; + _this._armature = null; // + _this._debugDrawer = null; + return _this; + } + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.init = function (armature) { + this._armature = armature; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.clear = function () { + this._disposeProxy = false; + this._armature = null; + this._debugDrawer = null; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.dispose = function (disposeProxy) { + if (disposeProxy === void 0) { disposeProxy = true; } + this._disposeProxy = disposeProxy; + if (this._armature !== null) { + this._armature.dispose(); + this._armature = null; + } + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.debugUpdate = function (isEnabled) { + if (isEnabled) { + if (this._debugDrawer === null) { + this._debugDrawer = new egret.Sprite(); + } + this.addChild(this._debugDrawer); + this._debugDrawer.graphics.clear(); + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var boneLength = bone.boneData.length; + var startX = bone.globalTransformMatrix.tx; + var startY = bone.globalTransformMatrix.ty; + var endX = startX + bone.globalTransformMatrix.a * boneLength; + var endY = startY + bone.globalTransformMatrix.b * boneLength; + this._debugDrawer.graphics.lineStyle(2.0, 0x00FFFF, 0.7); + this._debugDrawer.graphics.moveTo(startX, startY); + this._debugDrawer.graphics.lineTo(endX, endY); + this._debugDrawer.graphics.lineStyle(0.0, 0, 0); + this._debugDrawer.graphics.beginFill(0x00FFFF, 0.7); + this._debugDrawer.graphics.drawCircle(startX, startY, 3.0); + this._debugDrawer.graphics.endFill(); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var boundingBoxData = slot.boundingBoxData; + if (boundingBoxData !== null) { + var child = this._debugDrawer.getChildByName(slot.name); + if (child === null) { + child = new egret.Shape(); + child.name = slot.name; + this._debugDrawer.addChild(child); + } + child.graphics.clear(); + child.graphics.beginFill(boundingBoxData.color ? boundingBoxData.color : 0xFF00FF, 0.3); + switch (boundingBoxData.type) { + case 0 /* Rectangle */: + child.graphics.drawRect(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 1 /* Ellipse */: + child.graphics.drawEllipse(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 2 /* Polygon */: + var polygon = boundingBoxData; + var vertices = polygon.vertices; + for (var j = 0; j < polygon.count; j += 2) { + if (j === 0) { + child.graphics.moveTo(vertices[polygon.offset + j], vertices[polygon.offset + j + 1]); + } + else { + child.graphics.lineTo(vertices[polygon.offset + j], vertices[polygon.offset + j + 1]); + } + } + break; + default: + break; + } + child.graphics.endFill(); + slot.updateTransformAndMatrix(); + slot.updateGlobalTransform(); + child.$setMatrix(slot.globalTransformMatrix, true); + } + else { + var child = this._debugDrawer.getChildByName(slot.name); + if (child !== null) { + this._debugDrawer.removeChild(child); + } + } + } + } + else if (this._debugDrawer !== null && this._debugDrawer.parent === this) { + this.removeChild(this._debugDrawer); + } + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype._dispatchEvent = function (type, eventObject) { + var event = egret.Event.create(EgretEvent, type); + event.data = eventObject; + _super.prototype.dispatchEvent.call(this, event); + egret.Event.release(event); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.hasEvent = function (type) { + return this.hasEventListener(type); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.addEvent = function (type, listener, target) { + this.addEventListener(type, listener, target); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.removeEvent = function (type, listener, target) { + this.removeEventListener(type, listener, target); + }; + Object.defineProperty(EgretArmatureDisplay.prototype, "armature", { + /** + * @inheritDoc + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretArmatureDisplay.prototype, "animation", { + /** + * @inheritDoc + */ + get: function () { + return this._armature.animation; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + EgretArmatureDisplay.prototype.advanceTimeBySelf = function (on) { + if (on) { + this._armature.clock = dragonBones.EgretFactory.clock; + } + else { + this._armature.clock = null; + } + }; + return EgretArmatureDisplay; + }(egret.DisplayObjectContainer)); + dragonBones.EgretArmatureDisplay = EgretArmatureDisplay; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var Event = (function (_super) { + __extends(Event, _super); + function Event() { + return _super !== null && _super.apply(this, arguments) || this; + } + return Event; + }(EgretEvent)); + dragonBones.Event = Event; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var ArmatureEvent = (function (_super) { + __extends(ArmatureEvent, _super); + function ArmatureEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return ArmatureEvent; + }(EgretEvent)); + dragonBones.ArmatureEvent = ArmatureEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var AnimationEvent = (function (_super) { + __extends(AnimationEvent, _super); + function AnimationEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return AnimationEvent; + }(EgretEvent)); + dragonBones.AnimationEvent = AnimationEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var FrameEvent = (function (_super) { + __extends(FrameEvent, _super); + function FrameEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return FrameEvent; + }(EgretEvent)); + dragonBones.FrameEvent = FrameEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + var SoundEvent = (function (_super) { + __extends(SoundEvent, _super); + function SoundEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + return SoundEvent; + }(EgretEvent)); + dragonBones.SoundEvent = SoundEvent; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + var EgretTextureAtlas = (function (_super) { + __extends(EgretTextureAtlas, _super); + function EgretTextureAtlas(texture, rawData, scale) { + if (scale === void 0) { scale = 1; } + var _this = _super.call(this) || this; + console.warn("已废弃,请参考 @see"); + _this._onClear(); + dragonBones.ObjectDataParser.getInstance().parseTextureAtlasData(rawData, _this, scale); + _this.renderTexture = texture; + return _this; + } + /** + * @private + */ + EgretTextureAtlas.toString = function () { + return "[class dragonBones.EgretTextureAtlas]"; + }; + return EgretTextureAtlas; + }(dragonBones.EgretTextureAtlasData)); + dragonBones.EgretTextureAtlas = EgretTextureAtlas; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + var EgretSheetAtlas = (function (_super) { + __extends(EgretSheetAtlas, _super); + function EgretSheetAtlas() { + return _super !== null && _super.apply(this, arguments) || this; + } + return EgretSheetAtlas; + }(EgretTextureAtlas)); + dragonBones.EgretSheetAtlas = EgretSheetAtlas; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + var SoundEventManager = (function () { + function SoundEventManager() { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + SoundEventManager.getInstance = function () { + console.warn("已废弃,请参考 @see"); + return dragonBones.EgretFactory.factory.soundEventManager; + }; + return SoundEventManager; + }()); + dragonBones.SoundEventManager = SoundEventManager; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + var AnimationCacheManager = (function () { + function AnimationCacheManager() { + } + return AnimationCacheManager; + }()); + dragonBones.AnimationCacheManager = AnimationCacheManager; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretSlot = (function (_super) { + __extends(EgretSlot, _super); + function EgretSlot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.transformUpdateEnabled = false; + _this._renderDisplay = null; + _this._colorFilter = null; + return _this; + } + EgretSlot.toString = function () { + return "[class dragonBones.EgretSlot]"; + }; + /** + * @private + */ + EgretSlot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._renderDisplay = null; // + this._colorFilter = null; + }; + /** + * @private + */ + EgretSlot.prototype._initDisplay = function (value) { + value; + }; + /** + * @private + */ + EgretSlot.prototype._disposeDisplay = function (value) { + value; + }; + /** + * @private + */ + EgretSlot.prototype._onUpdateDisplay = function () { + this._renderDisplay = (this._display !== null ? this._display : this._rawDisplay); + }; + /** + * @private + */ + EgretSlot.prototype._addDisplay = function () { + var container = this._armature.display; + container.addChild(this._renderDisplay); + }; + /** + * @private + */ + EgretSlot.prototype._replaceDisplay = function (value) { + var container = this._armature.display; + var prevDisplay = value; + container.addChild(this._renderDisplay); + container.swapChildren(this._renderDisplay, prevDisplay); + container.removeChild(prevDisplay); + }; + /** + * @private + */ + EgretSlot.prototype._removeDisplay = function () { + this._renderDisplay.parent.removeChild(this._renderDisplay); + }; + /** + * @private + */ + EgretSlot.prototype._updateZOrder = function () { + var container = this._armature.display; + var index = container.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + container.addChildAt(this._renderDisplay, this._zOrder); + }; + /** + * @internal + * @private + */ + EgretSlot.prototype._updateVisible = function () { + this._renderDisplay.visible = this._parent.visible; + }; + /** + * @private + */ + EgretSlot.prototype._updateBlendMode = function () { + switch (this._blendMode) { + case 0 /* Normal */: + this._renderDisplay.blendMode = egret.BlendMode.NORMAL; + break; + case 1 /* Add */: + this._renderDisplay.blendMode = egret.BlendMode.ADD; + break; + case 5 /* Erase */: + this._renderDisplay.blendMode = egret.BlendMode.ERASE; + break; + default: + break; + } + }; + /** + * @private + */ + EgretSlot.prototype._updateColor = function () { + if (this._colorTransform.redMultiplier !== 1.0 || + this._colorTransform.greenMultiplier !== 1.0 || + this._colorTransform.blueMultiplier !== 1.0 || + this._colorTransform.redOffset !== 0 || + this._colorTransform.greenOffset !== 0 || + this._colorTransform.blueOffset !== 0 || + this._colorTransform.alphaOffset !== 0) { + if (this._colorFilter === null) { + this._colorFilter = new egret.ColorMatrixFilter(); + } + var colorMatrix = this._colorFilter.matrix; + colorMatrix[0] = this._colorTransform.redMultiplier; + colorMatrix[6] = this._colorTransform.greenMultiplier; + colorMatrix[12] = this._colorTransform.blueMultiplier; + colorMatrix[18] = this._colorTransform.alphaMultiplier; + colorMatrix[4] = this._colorTransform.redOffset; + colorMatrix[9] = this._colorTransform.greenOffset; + colorMatrix[14] = this._colorTransform.blueOffset; + colorMatrix[19] = this._colorTransform.alphaOffset; + this._colorFilter.matrix = colorMatrix; + var filters = this._renderDisplay.filters; + if (!filters) { + filters = []; + } + if (filters.indexOf(this._colorFilter) < 0) { + filters.push(this._colorFilter); + } + this._renderDisplay.$setAlpha(1.0); + this._renderDisplay.filters = filters; + } + else { + if (this._colorFilter !== null) { + this._colorFilter = null; + this._renderDisplay.filters = null; + } + this._renderDisplay.$setAlpha(this._colorTransform.alphaMultiplier); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateFrame = function () { + var meshData = this._display === this._meshDisplay ? this._meshData : null; + var currentTextureData = this._textureData; + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { + var currentTextureAtlasData = currentTextureData.parent; + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.EgretTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData; + } + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name); + } + if (currentTextureData.renderTexture !== null) { + if (meshData !== null) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var triangleCount = intArray[meshData.offset + 1 /* MeshTriangleCount */]; + var verticesOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + var uvOffset = verticesOffset + vertexCount * 2; + var meshDisplay = this._renderDisplay; + var meshNode = meshDisplay.$renderNode; + meshNode.uvs.length = vertexCount * 2; + meshNode.vertices.length = vertexCount * 2; + meshNode.indices.length = triangleCount * 3; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[verticesOffset + i]; + meshNode.uvs[i] = floatArray[uvOffset + i]; + } + for (var i = 0; i < triangleCount * 3; ++i) { + meshNode.indices[i] = intArray[meshData.offset + 4 /* MeshVertexIndices */ + i]; + } + meshDisplay.texture = currentTextureData.renderTexture; + meshDisplay.$setAnchorOffsetX(this._pivotX); + meshDisplay.$setAnchorOffsetY(this._pivotY); + meshDisplay.$updateVertices(); + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.texture = currentTextureData.renderTexture; + normalDisplay.$setAnchorOffsetX(this._pivotX); + normalDisplay.$setAnchorOffsetY(this._pivotY); + } + return; + } + } + if (meshData !== null) { + var meshDisplay = this._renderDisplay; + meshDisplay.texture = null; + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.texture = null; + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + } + }; + /** + * @private + */ + EgretSlot.prototype._updateMesh = function () { + var hasFFD = this._ffdVertices.length > 0; + var meshData = this._meshData; + var weightData = meshData.weight; + var meshDisplay = this._renderDisplay; + var meshNode = meshDisplay.$renderNode; + if (weightData !== null) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var weightFloatOffset = intArray[weightData.offset + 1 /* WeigthFloatOffset */]; + for (var i = 0, iD = 0, iB = weightData.offset + 2 /* WeigthBoneIndices */ + weightData.bones.length, iV = weightFloatOffset, iF = 0; i < vertexCount; ++i) { + var boneCount = intArray[iB++]; + var xG = 0.0, yG = 0.0; + for (var j = 0; j < boneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._meshBones[boneIndex]; + if (bone !== null) { + var matrix = bone.globalTransformMatrix; + var weight = floatArray[iV++]; + var xL = floatArray[iV++]; + var yL = floatArray[iV++]; + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight; + } + } + meshNode.vertices[iD++] = xG; + meshNode.vertices[iD++] = yG; + } + meshDisplay.$updateVertices(); + } + else if (hasFFD) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var vertexOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + meshDisplay.$updateVertices(); + } + }; + /** + * @private + */ + EgretSlot.prototype._updateTransform = function (isSkinnedMesh) { + if (isSkinnedMesh) { + var transformationMatrix = this._renderDisplay.matrix; + transformationMatrix.identity(); + this._renderDisplay.$setMatrix(transformationMatrix, this.transformUpdateEnabled); + } + else { + var globalTransformMatrix = this.globalTransformMatrix; + this._renderDisplay.$setMatrix(globalTransformMatrix, this.transformUpdateEnabled); + } + }; + return EgretSlot; + }(dragonBones.Slot)); + dragonBones.EgretSlot = EgretSlot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretFactory = (function (_super) { + __extends(EgretFactory, _super); + /** + * @inheritDoc + */ + function EgretFactory() { + var _this = _super.call(this) || this; + if (EgretFactory._dragonBones === null) { + var eventManager = new dragonBones.EgretArmatureDisplay(); + EgretFactory._dragonBones = new dragonBones.DragonBones(eventManager); + EgretFactory._dragonBones.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + _this._dragonBones = EgretFactory._dragonBones; + return _this; + } + EgretFactory._clockHandler = function (time) { + time *= 0.001; + var passedTime = time - EgretFactory._time; + EgretFactory._dragonBones.advanceTime(passedTime); + EgretFactory._time = time; + return false; + }; + Object.defineProperty(EgretFactory, "clock", { + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + return EgretFactory._dragonBones.clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretFactory, "factory", { + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + if (EgretFactory._factory === null) { + EgretFactory._factory = new EgretFactory(); + } + return EgretFactory._factory; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + EgretFactory.prototype._isSupportMesh = function () { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + return false; + }; + /** + * @private + */ + EgretFactory.prototype._buildTextureAtlasData = function (textureAtlasData, textureAtlas) { + if (textureAtlasData !== null) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.EgretTextureAtlasData); + } + return textureAtlasData; + }; + /** + * @private + */ + EgretFactory.prototype._buildArmature = function (dataPackage) { + var armature = dragonBones.BaseObject.borrowObject(dragonBones.Armature); + var armatureDisplay = new dragonBones.EgretArmatureDisplay(); + armature.init(dataPackage.armature, armatureDisplay, armatureDisplay, this._dragonBones); + return armature; + }; + /** + * @private + */ + EgretFactory.prototype._buildSlot = function (dataPackage, slotData, displays, armature) { + dataPackage; + armature; + var slot = dragonBones.BaseObject.borrowObject(dragonBones.EgretSlot); + slot.init(slotData, displays, new egret.Bitmap(), new egret.Mesh()); + return slot; + }; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + EgretFactory.prototype.buildArmatureDisplay = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + return armature.display; + } + return null; + }; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + EgretFactory.prototype.getTextureDisplay = function (textureName, textureAtlasName) { + if (textureAtlasName === void 0) { textureAtlasName = null; } + var textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName); + if (textureData !== null && textureData.renderTexture !== null) { + return new egret.Bitmap(textureData.renderTexture); + } + return null; + }; + Object.defineProperty(EgretFactory.prototype, "soundEventManager", { + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._dragonBones.eventManager; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + EgretFactory.prototype.addSkeletonData = function (dragonBonesData, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + console.warn("已废弃,请参考 @see"); + this.addDragonBonesData(dragonBonesData, dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + EgretFactory.prototype.getSkeletonData = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + return this.getDragonBonesData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + EgretFactory.prototype.removeSkeletonData = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + this.removeDragonBonesData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + EgretFactory.prototype.addTextureAtlas = function (textureAtlasData, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + console.warn("已废弃,请参考 @see"); + this.addTextureAtlasData(textureAtlasData, dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + EgretFactory.prototype.getTextureAtlas = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + return this.getTextureAtlasData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + EgretFactory.prototype.removeTextureAtlas = function (dragonBonesName) { + console.warn("已废弃,请参考 @see"); + this.removeTextureAtlasData(dragonBonesName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + EgretFactory.prototype.buildFastArmature = function (armatureName, dragonBonesName, skinName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + console.warn("已废弃,请参考 @see"); + return this.buildArmature(armatureName, dragonBonesName, skinName); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + EgretFactory.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.clear(); + }; + Object.defineProperty(EgretFactory.prototype, "soundEventManater", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + get: function () { + return this.soundEventManager; + }, + enumerable: true, + configurable: true + }); + EgretFactory._time = 0; + EgretFactory._dragonBones = null; + EgretFactory._factory = null; + return EgretFactory; + }(dragonBones.BaseFactory)); + dragonBones.EgretFactory = EgretFactory; +})(dragonBones || (dragonBones = {})); diff --git a/reference/Egret/5.x/out/dragonBones.min.js b/reference/Egret/5.x/out/dragonBones.min.js new file mode 100644 index 0000000..74f2b97 --- /dev/null +++ b/reference/Egret/5.x/out/dragonBones.min.js @@ -0,0 +1 @@ +"use strict";var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)if(e.hasOwnProperty(i))t[i]=e[i]};return function(e,i){t(e,i);function a(){this.constructor=e}e.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)}}();var dragonBones;(function(t){var e=function(){function e(e){this._clock=new t.WorldClock;this._events=[];this._objects=[];this._eventManager=null;this._eventManager=e}e.prototype.advanceTime=function(e){if(this._objects.length>0){for(var i=0,a=this._objects;i0){for(var n=0;ni){r.length=i}t._maxCountMap[a]=i}else{t._defaultMaxCount=i;for(var a in t._poolsMap){if(a in t._maxCountMap){continue}var r=t._poolsMap[a];if(r.length>i){r.length=i}t._maxCountMap[a]=i}}};t.clearPool=function(e){if(e===void 0){e=null}if(e!==null){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){a.length=0}}else{for(var r in t._poolsMap){var a=t._poolsMap[r];a.length=0}}};t.borrowObject=function(e){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){var r=a.pop();r._isInPool=false;return r}var n=new e;n._onClear();return n};t.prototype.returnToPool=function(){this._onClear();t._returnObject(this)};t._hashCode=0;t._defaultMaxCount=1e3;t._maxCountMap={};t._poolsMap={};return t}();t.BaseObject=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=1}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}this.a=t;this.b=e;this.c=i;this.d=a;this.tx=r;this.ty=n}t.prototype.toString=function(){return"[object dragonBones.Matrix] a:"+this.a+" b:"+this.b+" c:"+this.c+" d:"+this.d+" tx:"+this.tx+" ty:"+this.ty};t.prototype.copyFrom=function(t){this.a=t.a;this.b=t.b;this.c=t.c;this.d=t.d;this.tx=t.tx;this.ty=t.ty;return this};t.prototype.copyFromArray=function(t,e){if(e===void 0){e=0}this.a=t[e];this.b=t[e+1];this.c=t[e+2];this.d=t[e+3];this.tx=t[e+4];this.ty=t[e+5];return this};t.prototype.identity=function(){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this};t.prototype.concat=function(t){var e=this.a*t.a;var i=0;var a=0;var r=this.d*t.d;var n=this.tx*t.a+t.tx;var s=this.ty*t.d+t.ty;if(this.b!==0||this.c!==0){e+=this.b*t.c;i+=this.b*t.d;a+=this.c*t.a;r+=this.c*t.b}if(t.b!==0||t.c!==0){i+=this.a*t.b;a+=this.d*t.c;n+=this.ty*t.c;s+=this.tx*t.b}this.a=e;this.b=i;this.c=a;this.d=r;this.tx=n;this.ty=s;return this};t.prototype.invert=function(){var t=this.a;var e=this.b;var i=this.c;var a=this.d;var r=this.tx;var n=this.ty;if(e===0&&i===0){this.b=this.c=0;if(t===0||a===0){this.a=this.b=this.tx=this.ty=0}else{t=this.a=1/t;a=this.d=1/a;this.tx=-t*r;this.ty=-a*n}return this}var s=t*a-e*i;if(s===0){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this}s=1/s;var o=this.a=a*s;e=this.b=-e*s;i=this.c=-i*s;a=this.d=t*s;this.tx=-(o*r+i*n);this.ty=-(e*r+a*n);return this};t.prototype.transformPoint=function(t,e,i,a){if(a===void 0){a=false}i.x=this.a*t+this.c*e;i.y=this.b*t+this.d*e;if(!a){i.x+=this.tx;i.y+=this.ty}};return t}();t.Matrix=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}if(r===void 0){r=1}if(n===void 0){n=1}this.x=t;this.y=e;this.skew=i;this.rotation=a;this.scaleX=r;this.scaleY=n}t.normalizeRadian=function(t){t=(t+Math.PI)%(Math.PI*2);t+=t>0?-Math.PI:Math.PI;return t};t.prototype.toString=function(){return"[object dragonBones.Transform] x:"+this.x+" y:"+this.y+" skewX:"+this.skew*180/Math.PI+" skewY:"+this.rotation*180/Math.PI+" scaleX:"+this.scaleX+" scaleY:"+this.scaleY};t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.skew=t.skew;this.rotation=t.rotation;this.scaleX=t.scaleX;this.scaleY=t.scaleY;return this};t.prototype.identity=function(){this.x=this.y=0;this.skew=this.rotation=0;this.scaleX=this.scaleY=1;return this};t.prototype.add=function(t){this.x+=t.x;this.y+=t.y;this.skew+=t.skew;this.rotation+=t.rotation;this.scaleX*=t.scaleX;this.scaleY*=t.scaleY;return this};t.prototype.minus=function(t){this.x-=t.x;this.y-=t.y;this.skew-=t.skew;this.rotation-=t.rotation;this.scaleX/=t.scaleX;this.scaleY/=t.scaleY;return this};t.prototype.fromMatrix=function(e){var i=this.scaleX,a=this.scaleY;var r=t.PI_Q;this.x=e.tx;this.y=e.ty;this.rotation=Math.atan(e.b/e.a);var n=Math.atan(-e.c/e.d);this.scaleX=this.rotation>-r&&this.rotation-r&&n=0&&this.scaleX<0){this.scaleX=-this.scaleX;this.rotation=this.rotation-Math.PI}if(a>=0&&this.scaleY<0){this.scaleY=-this.scaleY;n=n-Math.PI}this.skew=n-this.rotation;return this};t.prototype.toMatrix=function(t){if(this.skew!==0||this.rotation!==0){t.a=Math.cos(this.rotation);t.b=Math.sin(this.rotation);if(this.skew===0){t.c=-t.b;t.d=t.a}else{t.c=-Math.sin(this.skew+this.rotation);t.d=Math.cos(this.skew+this.rotation)}if(this.scaleX!==1){t.a*=this.scaleX;t.b*=this.scaleX}if(this.scaleY!==1){t.c*=this.scaleY;t.d*=this.scaleY}}else{t.a=this.scaleX;t.b=0;t.c=0;t.d=this.scaleY}t.tx=this.x;t.ty=this.y;return this};t.PI_D=Math.PI*2;t.PI_H=Math.PI/2;t.PI_Q=Math.PI/4;t.RAD_DEG=180/Math.PI;t.DEG_RAD=Math.PI/180;return t}();t.Transform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n,s,o){if(t===void 0){t=1}if(e===void 0){e=1}if(i===void 0){i=1}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}if(s===void 0){s=0}if(o===void 0){o=0}this.alphaMultiplier=t;this.redMultiplier=e;this.greenMultiplier=i;this.blueMultiplier=a;this.alphaOffset=r;this.redOffset=n;this.greenOffset=s;this.blueOffset=o}t.prototype.copyFrom=function(t){this.alphaMultiplier=t.alphaMultiplier;this.redMultiplier=t.redMultiplier;this.greenMultiplier=t.greenMultiplier;this.blueMultiplier=t.blueMultiplier;this.alphaOffset=t.alphaOffset;this.redOffset=t.redOffset;this.greenOffset=t.greenOffset;this.blueOffset=t.blueOffset};t.prototype.identity=function(){this.alphaMultiplier=this.redMultiplier=this.greenMultiplier=this.blueMultiplier=1;this.alphaOffset=this.redOffset=this.greenOffset=this.blueOffset=0};return t}();t.ColorTransform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e){if(t===void 0){t=0}if(e===void 0){e=0}this.x=t;this.y=e}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y};t.prototype.clear=function(){this.x=this.y=0};return t}();t.Point=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}this.x=t;this.y=e;this.width=i;this.height=a}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.width=t.width;this.height=t.height};t.prototype.clear=function(){this.x=this.y=0;this.width=this.height=0};return t}();t.Rectangle=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.ints=[];e.floats=[];e.strings=[];return e}e.toString=function(){return"[class dragonBones.UserData]"};e.prototype._onClear=function(){this.ints.length=0;this.floats.length=0;this.strings.length=0};e.prototype.getInt=function(t){if(t===void 0){t=0}return t>=0&&t=0&&t=0&&t=t){i=0}if(this.sortedBones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s0){return}this.cacheFrameRate=t;for(var e in this.animations){this.animations[e].cacheFrames(this.cacheFrameRate)}};i.prototype.setCacheFrame=function(t,e){var i=this.parent.cachedFrames;var a=i.length;i.length+=10;i[a]=t.a;i[a+1]=t.b;i[a+2]=t.c;i[a+3]=t.d;i[a+4]=t.tx;i[a+5]=t.ty;i[a+6]=e.rotation;i[a+7]=e.skew;i[a+8]=e.scaleX;i[a+9]=e.scaleY;return a};i.prototype.getCacheFrame=function(t,e,i){var a=this.parent.cachedFrames;t.a=a[i];t.b=a[i+1];t.c=a[i+2];t.d=a[i+3];t.tx=a[i+4];t.ty=a[i+5];e.rotation=a[i+6];e.skew=a[i+7];e.scaleX=a[i+8];e.scaleY=a[i+9];e.x=t.tx;e.y=t.ty};i.prototype.addBone=function(t){if(t.name in this.bones){console.warn("Replace bone: "+t.name);this.bones[t.name].returnToPool()}this.bones[t.name]=t;this.sortedBones.push(t)};i.prototype.addSlot=function(t){if(t.name in this.slots){console.warn("Replace slot: "+t.name);this.slots[t.name].returnToPool()}this.slots[t.name]=t;this.sortedSlots.push(t)};i.prototype.addSkin=function(t){if(t.name in this.skins){console.warn("Replace skin: "+t.name);this.skins[t.name].returnToPool()}this.skins[t.name]=t;if(this.defaultSkin===null){this.defaultSkin=t}};i.prototype.addAnimation=function(t){if(t.name in this.animations){console.warn("Replace animation: "+t.name);this.animations[t.name].returnToPool()}t.parent=this;this.animations[t.name]=t;this.animationNames.push(t.name);if(this.defaultAnimation===null){this.defaultAnimation=t}};i.prototype.getBone=function(t){return t in this.bones?this.bones[t]:null};i.prototype.getSlot=function(t){return t in this.slots?this.slots[t]:null};i.prototype.getSkin=function(t){return t in this.skins?this.skins[t]:null};i.prototype.getAnimation=function(t){return t in this.animations?this.animations[t]:null};return i}(t.BaseObject);t.ArmatureData=i;var a=function(e){__extends(i,e);function i(){var i=e!==null&&e.apply(this,arguments)||this;i.transform=new t.Transform;i.constraints=[];i.userData=null;return i}i.toString=function(){return"[class dragonBones.BoneData]"};i.prototype._onClear=function(){for(var t=0,e=this.constraints;tr){s|=2}if(en){s|=8}return s};e.rectangleIntersectsSegment=function(t,i,a,r,n,s,o,l,h,u,f){if(h===void 0){h=null}if(u===void 0){u=null}if(f===void 0){f=null}var _=t>n&&ts&&in&&as&&r=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){return true}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=this.width*.5;var h=this.height*.5;var u=e.rectangleIntersectsSegment(t,i,a,r,-l,-h,l,h,n,s,o);return u};return e}(e);t.RectangleBoundingBoxData=i;var a=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.EllipseData]"};e.ellipseIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h,u){if(l===void 0){l=null}if(h===void 0){h=null}if(u===void 0){u=null}var f=s/o;var _=f*f;e*=f;a*=f;var m=i-t;var c=a-e;var p=Math.sqrt(m*m+c*c);var d=m/p;var y=c/p;var g=(r-t)*d+(n-e)*y;var v=g*g;var b=t*t+e*e;var D=s*s;var T=D-b+v;var A=0;if(T>=0){var O=Math.sqrt(T);var x=g-O;var B=g+O;var S=x<0?-1:x<=p?0:1;var E=B<0?-1:B<=p?0:1;var M=S*E;if(M<0){return-1}else if(M===0){if(S===-1){A=2;i=t+B*d;a=(e+B*y)/f;if(l!==null){l.x=i;l.y=a}if(h!==null){h.x=i;h.y=a}if(u!==null){u.x=Math.atan2(a/D*_,i/D);u.y=u.x+Math.PI}}else if(E===1){A=1;t=t+x*d;e=(e+x*y)/f;if(l!==null){l.x=t;l.y=e}if(h!==null){h.x=t;h.y=e}if(u!==null){u.x=Math.atan2(e/D*_,t/D);u.y=u.x+Math.PI}}else{A=3;if(l!==null){l.x=t+x*d;l.y=(e+x*y)/f;if(u!==null){u.x=Math.atan2(l.y/D*_,l.x/D)}}if(h!==null){h.x=t+B*d;h.y=(e+B*y)/f;if(u!==null){u.y=Math.atan2(h.y/D*_,h.x/D)}}}}}return A};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.type=1};e.prototype.containsPoint=function(t,e){var i=this.width*.5;if(t>=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){e*=i/a;return Math.sqrt(t*t+e*e)<=i}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=e.ellipseIntersectsSegment(t,i,a,r,0,0,this.width*.5,this.height*.5,n,s,o);return l};return e}(e);t.EllipseBoundingBoxData=a;var r=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.weight=null;return e}e.toString=function(){return"[class dragonBones.PolygonBoundingBoxData]"};e.polygonIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h){if(o===void 0){o=null}if(l===void 0){l=null}if(h===void 0){h=null}if(t===i){t=i+1e-6}if(e===a){e=a+1e-6}var u=t-i;var f=e-a;var _=t*a-e*i;var m=0;var c=r[n+s-2];var p=r[n+s-1];var d=0;var y=0;var g=0;var v=0;var b=0;var D=0;for(var T=0;T=c&&M<=A||M>=A&&M<=c)&&(u===0||M>=t&&M<=i||M>=i&&M<=t)){var w=(_*B-f*S)/E;if((w>=p&&w<=O||w>=O&&w<=p)&&(f===0||w>=e&&w<=a||w>=a&&w<=e)){if(l!==null){var P=M-t;if(P<0){P=-P}if(m===0){d=P;y=P;g=M;v=w;b=M;D=w;if(h!==null){h.x=Math.atan2(O-p,A-c)-Math.PI*.5;h.y=h.x}}else{if(Py){y=P;b=M;D=w;if(h!==null){h.y=Math.atan2(O-p,A-c)-Math.PI*.5}}}m++}else{g=M;v=w;b=M;D=w;m++;if(h!==null){h.x=Math.atan2(O-p,A-c)-Math.PI*.5;h.y=h.x}break}}}c=A;p=O}if(m===1){if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=g;l.y=v}if(h!==null){h.y=h.x+Math.PI}}else if(m>1){m++;if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=b;l.y=D}}return m};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.weight!==null){this.weight.returnToPool()}this.type=2;this.count=0;this.offset=0;this.x=0;this.y=0;this.vertices=null;this.weight=null};e.prototype.containsPoint=function(t,e){var i=false;if(t>=this.x&&t<=this.width&&e>=this.y&&e<=this.height){for(var a=0,r=this.count,n=r-2;a=e||s=e){var l=this.vertices[this.offset+n];var h=this.vertices[this.offset+a];if((e-o)*(l-h)/(s-o)+h0){return}this.cacheFrameRate=Math.max(Math.ceil(t*this.scale),1);var e=Math.ceil(this.cacheFrameRate*this.duration)+1;this.cachedFrames.length=e;for(var i=0,a=this.cacheFrames.length;i=0};e.prototype.addBoneMask=function(t,e,i){if(i===void 0){i=true}var a=t.getBone(e);if(a===null){return}if(this.boneMask.indexOf(e)<0){this.boneMask.push(e)}if(i){for(var r=0,n=t.getBones();r=0){this.boneMask.splice(a,1)}if(i){var r=t.getBone(e);if(r!==null){if(this.boneMask.length>0){for(var n=0,s=t.getBones();n=0&&r.contains(o)){this.boneMask.splice(l,1)}}}else{for(var h=0,u=t.getBones();he._zOrder?1:-1};i.prototype._onClear=function(){if(this._clock!==null){this._clock.remove(this)}for(var t=0,e=this._bones;t=t){i=0}if(this._bones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s=n){continue}var o=i[s];var l=this.getSlot(o.name);if(l!==null){l._setZorder(r)}}this._slotsDirty=true;this._zOrderDirty=!a}};i.prototype._addBoneToBoneList=function(t){if(this._bones.indexOf(t)<0){this._bonesDirty=true;this._bones.push(t);this._animation._timelineDirty=true}};i.prototype._removeBoneFromBoneList=function(t){var e=this._bones.indexOf(t);if(e>=0){this._bones.splice(e,1);this._animation._timelineDirty=true}};i.prototype._addSlotToSlotList=function(t){if(this._slots.indexOf(t)<0){this._slotsDirty=true;this._slots.push(t);this._animation._timelineDirty=true}};i.prototype._removeSlotFromSlotList=function(t){var e=this._slots.indexOf(t);if(e>=0){this._slots.splice(e,1);this._animation._timelineDirty=true}};i.prototype._bufferAction=function(t,e){if(this._actions.indexOf(t)<0){if(e){this._actions.push(t)}else{this._actions.unshift(t)}}};i.prototype.dispose=function(){if(this.armatureData!==null){this._lockUpdate=true;this._dragonBones.bufferObject(this)}};i.prototype.init=function(e,i,a,r){if(this.armatureData!==null){return}this.armatureData=e;this._animation=t.BaseObject.borrowObject(t.Animation);this._proxy=i;this._display=a;this._dragonBones=r;this._proxy.init(this);this._animation.init(this);this._animation.animations=this.armatureData.animations};i.prototype.advanceTime=function(e){if(this._lockUpdate){return}if(this.armatureData===null){console.assert(false,"The armature has been disposed.");return}else if(this.armatureData.parent===null){console.assert(false,"The armature data has been disposed.");return}var i=this._cacheFrameIndex;this._animation.advanceTime(e);if(this._bonesDirty){this._bonesDirty=false;this._sortBones()}if(this._slotsDirty){this._slotsDirty=false;this._sortSlots()}if(this._cacheFrameIndex<0||this._cacheFrameIndex!==i){var a=0,r=0;for(a=0,r=this._bones.length;a0){this._lockUpdate=true;for(var n=0,s=this._actions;n0){var i=this.getBone(t);if(i!==null){i.invalidUpdate();if(e){for(var a=0,r=this._slots;a0){if(r!==null||n!==null){if(r!==null){var T=o?r.y-e:r.x-t;if(T<0){T=-T}if(d===null||Th){h=T;_=n.x;m=n.y;y=b;if(s!==null){p=s.y}}}}else{d=b;break}}}if(d!==null&&r!==null){r.x=u;r.y=f;if(s!==null){s.x=c}}if(y!==null&&n!==null){n.x=_;n.y=m;if(s!==null){s.y=p}}return d};i.prototype.getBone=function(t){for(var e=0,i=this._bones;e=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else{if(this.constraints.length>0){for(var i=0,a=this.constraints;i=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}}else{if(this.constraints.length>0){for(var n=0,s=this.constraints;n=0;if(this._localDirty){this._updateGlobalTransformMatrix(o)}if(o&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}}else if(this._childrenTransformDirty){this._childrenTransformDirty=false}this._localDirty=true};i.prototype.updateByConstraint=function(){if(this._localDirty){this._localDirty=false;if(this._transformDirty||this._parent!==null&&this._parent._childrenTransformDirty){this._updateGlobalTransformMatrix(true)}this._transformDirty=true}};i.prototype.addConstraint=function(t){if(this.constraints.indexOf(t)<0){this.constraints.push(t)}};i.prototype.invalidUpdate=function(){this._transformDirty=true};i.prototype.contains=function(t){if(t===this){return false}var e=t;while(e!==this&&e!==null){e=e.parent}return e===this};i.prototype.getBones=function(){this._bones.length=0;for(var t=0,e=this._armature.getBones();t=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex0){for(var o=0,l=n;o0){if(this._displayList.length!==e.length){this._displayList.length=e.length}for(var i=0,a=e.length;i0){this._displayList.length=0}if(this._displayIndex>=0&&this._displayIndex=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else if(this._transformDirty||this._parent._childrenTransformDirty){this._transformDirty=true;this._cachedFrameIndex=-1}else if(this._cachedFrameIndex>=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}else if(this._transformDirty||this._parent._childrenTransformDirty){t=-1;this._transformDirty=true;this._cachedFrameIndex=-1}if(this._display===null){return}if(this._blendModeDirty){this._blendModeDirty=false;this._updateBlendMode()}if(this._colorDirty){this._colorDirty=false;this._updateColor()}if(this._meshData!==null&&this._display===this._meshDisplay){var i=this._meshData.weight!==null;if(this._meshDirty||i&&this._isMeshBonesUpdate()){this._meshDirty=false;this._updateMesh()}if(i){if(this._transformDirty){this._transformDirty=false;this._updateTransform(true)}return}}if(this._transformDirty){this._transformDirty=false;if(this._cachedFrameIndex<0){var a=t>=0;this._updateGlobalTransformMatrix(a);if(a&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}this._updateTransform(false)}};i.prototype.updateTransformAndMatrix=function(){if(this._transformDirty){this._transformDirty=false;this._updateGlobalTransformMatrix(false)}};i.prototype.containsPoint=function(t,e){if(this._boundingBoxData===null){return false}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);return this._boundingBoxData.containsPoint(i._helpPoint.x,i._helpPoint.y)};i.prototype.intersectsSegment=function(t,e,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}if(this._boundingBoxData===null){return 0}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);t=i._helpPoint.x;e=i._helpPoint.y;i._helpMatrix.transformPoint(a,r,i._helpPoint);a=i._helpPoint.x;r=i._helpPoint.y;var l=this._boundingBoxData.intersectsSegment(t,e,a,r,n,s,o);if(l>0){if(l===1||l===2){if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n);if(s!==null){s.x=n.x;s.y=n.y}}else if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}else{if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n)}if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}if(o!==null){this.globalTransformMatrix.transformPoint(Math.cos(o.x),Math.sin(o.x),i._helpPoint,true);o.x=Math.atan2(i._helpPoint.y,i._helpPoint.x);this.globalTransformMatrix.transformPoint(Math.cos(o.y),Math.sin(o.y),i._helpPoint,true);o.y=Math.atan2(i._helpPoint.y,i._helpPoint.x)}}return l};i.prototype.invalidUpdate=function(){this._displayDirty=true;this._transformDirty=true};Object.defineProperty(i.prototype,"displayIndex",{get:function(){return this._displayIndex},set:function(t){if(this._setDisplayIndex(t)){this.update(-1)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"displayList",{get:function(){return this._displayList.concat()},set:function(e){var i=this._displayList.concat();var a=new Array;if(this._setDisplayList(e)){this.update(-1)}for(var r=0,n=i;r0){this._animatebles[e-i]=r;this._animatebles[e]=null}r.advanceTime(t)}else{i++}}if(i>0){a=this._animatebles.length;for(;e=0};t.prototype.add=function(t){if(this._animatebles.indexOf(t)<0){this._animatebles.push(t);t.clock=this}};t.prototype.remove=function(t){var e=this._animatebles.indexOf(t);if(e>=0){this._animatebles[e]=null;t.clock=null}};t.prototype.clear=function(){for(var t=0,e=this._animatebles;t0&&i._subFadeState>0){this._armature._dragonBones.bufferObject(i);this._animationStates.length=0;this._lastAnimationState=null}else{var a=i.animationData;var r=a.cacheFrameRate;if(this._animationDirty&&r>0){this._animationDirty=false;for(var n=0,s=this._armature.getBones();n1){for(var f=0,_=0;f0&&i._subFadeState>0){_++;this._armature._dragonBones.bufferObject(i);this._animationDirty=true;if(this._lastAnimationState===i){this._lastAnimationState=null}}else{if(_>0){this._animationStates[f-_]=i}if(this._timelineDirty){i.updateTimelines()}i.advanceTime(t,0)}if(f===e-1&&_>0){this._animationStates.length-=_;if(this._lastAnimationState===null&&this._animationStates.length>0){this._lastAnimationState=this._animationStates[this._animationStates.length-1]}}}this._armature._cacheFrameIndex=-1}else{this._armature._cacheFrameIndex=-1}this._timelineDirty=false};i.prototype.reset=function(){for(var t=0,e=this._animationStates;t1){if(e.position<0){e.position%=a.duration;e.position=a.duration-e.position}else if(e.position===a.duration){e.position-=1e-6}else if(e.position>a.duration){e.position%=a.duration}if(e.duration>0&&e.position+e.duration>a.duration){e.duration=a.duration-e.position}if(e.playTimes<0){e.playTimes=a.playTimes}}else{e.playTimes=1;e.position=0;if(e.duration>0){e.duration=0}}if(e.duration===0){e.duration=-1}this._fadeOut(e);var o=t.BaseObject.borrowObject(t.AnimationState);o.init(this._armature,a,e);this._animationDirty=true;this._armature._cacheFrameIndex=-1;if(this._animationStates.length>0){var l=false;for(var h=0,u=this._animationStates.length;h=this._animationStates[h].layer){}else{l=true;this._animationStates.splice(h+1,0,o);break}}if(!l){this._animationStates.push(o)}}else{this._animationStates.push(o)}for(var f=0,_=this._armature.getSlots();f<_.length;f++){var m=_[f];var c=m.childArmature;if(c!==null&&c.inheritAnimation&&c.animation.hasAnimation(i)&&c.animation.getState(i)===null){c.animation.fadeIn(i)}}if(e.fadeInTime<=0){this._armature.advanceTime(0)}this._lastAnimationState=o;return o};i.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t!==null?t:"";if(t!==null&&t.length>0){this.playConfig(this._animationConfig)}else if(this._lastAnimationState===null){var i=this._armature.armatureData.defaultAnimation;if(i!==null){this._animationConfig.animation=i.name;this.playConfig(this._animationConfig)}}else if(!this._lastAnimationState.isPlaying&&!this._lastAnimationState.isCompleted){this._lastAnimationState.play()}else{this._animationConfig.animation=this._lastAnimationState.name;this.playConfig(this._animationConfig)}return this._lastAnimationState};i.prototype.fadeIn=function(t,e,i,a,r,n){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=0}if(r===void 0){r=null}if(n===void 0){n=3}this._animationConfig.clear();this._animationConfig.fadeOutMode=n;this._animationConfig.playTimes=i;this._animationConfig.layer=a;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=r!==null?r:"";return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByTime=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.position=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByFrame=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*e/a.frameCount}return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByProgress=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*(e>0?e:0)}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStopByTime=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByTime(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByFrame=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByFrame(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByProgress=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByProgress(t,e,1);if(i!==null){i.stop()}return i};i.prototype.getState=function(t){var e=this._animationStates.length;while(e--){var i=this._animationStates[e];if(i.name===t){return i}}return null};i.prototype.hasAnimation=function(t){return t in this._animations};i.prototype.getStates=function(){return this._animationStates};Object.defineProperty(i.prototype,"isPlaying",{get:function(){for(var t=0,e=this._animationStates;t0},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationName",{get:function(){return this._lastAnimationState!==null?this._lastAnimationState.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationNames",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animations",{get:function(){return this._animations},set:function(t){if(this._animations===t){return}this._animationNames.length=0;for(var e in this._animations){delete this._animations[e]}for(var e in t){this._animations[e]=t[e];this._animationNames.push(e)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationConfig",{get:function(){this._animationConfig.clear();return this._animationConfig},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationState",{get:function(){return this._lastAnimationState},enumerable:true,configurable:true});i.prototype.gotoAndPlay=function(t,e,i,a,r,n,s,o,l){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=-1}if(r===void 0){r=0}if(n===void 0){n=null}if(s===void 0){s=3}if(o===void 0){o=true}if(l===void 0){l=true}o;l;this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.fadeOutMode=s;this._animationConfig.playTimes=a;this._animationConfig.layer=r;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=n!==null?n:"";var h=this._animations[t];if(h&&i>0){this._animationConfig.timeScale=h.duration/i}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStop=function(t,e){if(e===void 0){e=0}return this.gotoAndStopByTime(t,e)};Object.defineProperty(i.prototype,"animationList",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationDataList",{get:function(){var t=[];for(var e=0,i=this._animationNames.length;e0;if(this._subFadeState<0){this._subFadeState=0;var a=i?t.EventObject.FADE_OUT:t.EventObject.FADE_IN;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}if(e<0){e=-e}this._fadeTime+=e;if(this._fadeTime>=this.fadeTotalTime){this._subFadeState=1;this._fadeProgress=i?0:1}else if(this._fadeTime>0){this._fadeProgress=i?1-this._fadeTime/this.fadeTotalTime:this._fadeTime/this.fadeTotalTime}else{this._fadeProgress=i?1:0}if(this._subFadeState>0){if(!i){this._playheadState|=1;this._fadeState=0}var a=i?t.EventObject.FADE_OUT_COMPLETE:t.EventObject.FADE_IN_COMPLETE;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}};a.prototype._blendBoneTimline=function(t){var e=t.bone;var i=t.bonePose.result;var a=e.animationPose;var r=this._weightResult>0?this._weightResult:-this._weightResult;if(!e._blendDirty){e._blendDirty=true;e._blendLayer=this.layer;e._blendLayerWeight=r;e._blendLeftWeight=1;a.x=i.x*r;a.y=i.y*r;a.rotation=i.rotation*r;a.skew=i.skew*r;a.scaleX=(i.scaleX-1)*r+1;a.scaleY=(i.scaleY-1)*r+1}else{r*=e._blendLeftWeight;e._blendLayerWeight+=r;a.x+=i.x*r;a.y+=i.y*r;a.rotation+=i.rotation*r;a.skew+=i.skew*r;a.scaleX+=(i.scaleX-1)*r;a.scaleY+=(i.scaleY-1)*r}if(this._fadeState!==0||this._subFadeState!==0){e._transformDirty=true}};a.prototype.init=function(e,i,a){if(this._armature!==null){return}this._armature=e;this.animationData=i;this.resetToPose=a.resetToPose;this.additiveBlending=a.additiveBlending;this.displayControl=a.displayControl;this.actionEnabled=a.actionEnabled;this.layer=a.layer;this.playTimes=a.playTimes;this.timeScale=a.timeScale;this.fadeTotalTime=a.fadeInTime;this.autoFadeOutTime=a.autoFadeOutTime;this.weight=a.weight;this.name=a.name.length>0?a.name:a.animation;this.group=a.group;if(a.pauseFadeIn){this._playheadState=2}else{this._playheadState=3}if(a.duration<0){this._position=0;this._duration=this.animationData.duration;if(a.position!==0){if(this.timeScale>=0){this._time=a.position}else{this._time=a.position-this._duration}}else{this._time=0}}else{this._position=a.position;this._duration=a.duration;this._time=0}if(this.timeScale<0&&this._time===0){this._time=-1e-6}if(this.fadeTotalTime<=0){this._fadeProgress=.999999}if(a.boneMask.length>0){this._boneMask.length=a.boneMask.length;for(var r=0,n=this._boneMask.length;r0;var a=true;var r=true;var n=this._time;this._weightResult=this.weight*this._fadeProgress;this._actionTimeline.update(n);if(i){var s=e*2;this._actionTimeline.currentTime=Math.floor(this._actionTimeline.currentTime*s)/s}if(this._zOrderTimeline!==null){this._zOrderTimeline.update(n)}if(i){var o=Math.floor(this._actionTimeline.currentTime*e);if(this._armature._cacheFrameIndex===o){a=false;r=false}else{this._armature._cacheFrameIndex=o;if(this.animationData.cachedFrames[o]){r=false}else{this.animationData.cachedFrames[o]=true}}}if(a){if(r){var l=null;var h=null;for(var u=0,f=this._boneTimelines.length;u0){if(l._blendLayer!==this.layer){if(l._blendLayerWeight>=l._blendLeftWeight){l._blendLeftWeight=0;l=null}else{l._blendLayer=this.layer;l._blendLeftWeight-=l._blendLayerWeight;l._blendLayerWeight=0}}}else{l=null}}}l=_.bone}if(l!==null){_.update(n);if(u===f-1){this._blendBoneTimline(_)}else{h=_}}}}for(var u=0,f=this._slotTimelines.length;u0){this._subFadeState=0}if(this._actionTimeline.playState>0){if(this.autoFadeOutTime>=0){this.fadeOut(this.autoFadeOutTime)}}}};a.prototype.play=function(){this._playheadState=3};a.prototype.stop=function(){this._playheadState&=1};a.prototype.fadeOut=function(t,e){if(e===void 0){e=true}if(t<0){t=0}if(e){this._playheadState&=2}if(this._fadeState>0){if(t>this.fadeTotalTime-this._fadeTime){return}}else{this._fadeState=1;this._subFadeState=-1;if(t<=0||this._fadeProgress<=0){this._fadeProgress=1e-6}for(var i=0,a=this._boneTimelines;i1e-6?t/this._fadeProgress:0;this._fadeTime=this.fadeTotalTime*(1-this._fadeProgress)};a.prototype.containsBoneMask=function(t){return this._boneMask.length===0||this._boneMask.indexOf(t)>=0};a.prototype.addBoneMask=function(t,e){if(e===void 0){e=true}var i=this._armature.getBone(t);if(i===null){return}if(this._boneMask.indexOf(t)<0){this._boneMask.push(t)}if(e){for(var a=0,r=this._armature.getBones();a=0){this._boneMask.splice(i,1)}if(e){var a=this._armature.getBone(t);if(a!==null){var r=this._armature.getBones();if(this._boneMask.length>0){for(var n=0,s=r;n=0&&a.contains(o)){this._boneMask.splice(l,1)}}}else{for(var h=0,u=r;h0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isFadeComplete",{get:function(){return this._fadeState===0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isPlaying",{get:function(){return(this._playheadState&2)!==0&&this._actionTimeline.playState<=0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isCompleted",{get:function(){return this._actionTimeline.playState>0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentPlayTimes",{get:function(){return this._actionTimeline.currentPlayTimes},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"totalTime",{get:function(){return this._duration},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentTime",{get:function(){return this._actionTimeline.currentTime},set:function(t){var e=this._actionTimeline.currentPlayTimes-(this._actionTimeline.playState>0?1:0);if(t<0||this._duration0&&e===this.playTimes-1&&t===this._duration){t=this._duration-1e-6}if(this._time===t){return}this._time=t;this._actionTimeline.setCurrentTime(this._time);if(this._zOrderTimeline!==null){this._zOrderTimeline.playState=-1}for(var i=0,a=this._boneTimelines;i=0?1:-1;this.currentPlayTimes=1;this.currentTime=this._actionTimeline.currentTime}else if(this._actionTimeline===null||this._timeScale!==1||this._timeOffset!==0){var r=this._animationState.playTimes;var n=r*this._duration;t*=this._timeScale;if(this._timeOffset!==0){t+=this._timeOffset*this._animationData.duration}if(r>0&&(t>=n||t<=-n)){if(this.playState<=0&&this._animationState._playheadState===3){this.playState=1}this.currentPlayTimes=r;if(t<0){this.currentTime=0}else{this.currentTime=this._duration}}else{if(this.playState!==0&&this._animationState._playheadState===3){this.playState=0}if(t<0){t=-t;this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=this._duration-t%this._duration}else{this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=t%this._duration}}this.currentTime+=this._position}else{this.playState=this._actionTimeline.playState;this.currentPlayTimes=this._actionTimeline.currentPlayTimes;this.currentTime=this._actionTimeline.currentTime}if(this.currentPlayTimes===i&&this.currentTime===a){return false}if(e<0&&this.playState!==e||this.playState<=0&&this.currentPlayTimes!==i){this._frameIndex=-1}return true};e.prototype.init=function(t,e,i){this._armature=t;this._animationState=e;this._timelineData=i;this._actionTimeline=this._animationState._actionTimeline;if(this===this._actionTimeline){this._actionTimeline=null}this._frameRate=this._armature.armatureData.frameRate;this._frameRateR=1/this._frameRate;this._position=this._animationState._position;this._duration=this._animationState._duration;this._dragonBonesData=this._armature.armatureData.parent;this._animationData=this._animationState.animationData;if(this._timelineData!==null){this._frameIntArray=this._dragonBonesData.frameIntArray;this._frameFloatArray=this._dragonBonesData.frameFloatArray;this._frameArray=this._dragonBonesData.frameArray;this._timelineArray=this._dragonBonesData.timelineArray;this._frameIndices=this._dragonBonesData.frameIndices;this._frameCount=this._timelineArray[this._timelineData.offset+2];this._frameValueOffset=this._timelineArray[this._timelineData.offset+4];this._timeScale=100/this._timelineArray[this._timelineData.offset+0];this._timeOffset=this._timelineArray[this._timelineData.offset+1]*.01}};e.prototype.fadeOut=function(){};e.prototype.update=function(t){if(this.playState<=0&&this._setCurrentTime(t)){if(this._frameCount>1){var e=Math.floor(this.currentTime*this._frameRate);var i=this._frameIndices[this._timelineData.frameIndicesOffset+e];if(this._frameIndex!==i){this._frameIndex=i;this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5+this._frameIndex];this._onArriveAtFrame()}}else if(this._frameIndex<0){this._frameIndex=0;if(this._timelineData!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5]}this._onArriveAtFrame()}if(this._tweenState!==0){this._onUpdateFrame()}}};return e}(t.BaseObject);t.TimelineState=e;var i=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e._getEasingValue=function(t,e,i){var a=e;switch(t){case 3:a=Math.pow(e,2);break;case 4:a=1-Math.pow(1-e,2);break;case 5:a=.5*(1-Math.cos(e*Math.PI));break}return(a-e)*i+e};e._getEasingCurveValue=function(t,e,i,a){if(t<=0){return 0}else if(t>=1){return 1}var r=i+1;var n=Math.floor(t*r);var s=n===0?0:e[a+n-1];var o=n===r-1?1e4:e[a+n];return(s+(o-s)*(t*r-n))*1e-4};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._tweenType=0;this._curveCount=0;this._framePosition=0;this._frameDurationR=0;this._tweenProgress=0;this._tweenEasing=0};e.prototype._onArriveAtFrame=function(){if(this._frameCount>1&&(this._frameIndex!==this._frameCount-1||this._animationState.playTimes===0||this._animationState.currentPlayTimes0){if(n.hasEvent(t.EventObject.COMPLETE)){h=t.BaseObject.borrowObject(t.EventObject);h.type=t.EventObject.COMPLETE;h.armature=this._armature;h.animationState=this._animationState}}}if(this._frameCount>1){var u=this._timelineData;var f=Math.floor(this.currentTime*this._frameRate);var _=this._frameIndices[u.frameIndicesOffset+f];if(this._frameIndex!==_){var m=this._frameIndex;this._frameIndex=_;if(this._timelineArray!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[u.offset+5+this._frameIndex];if(o){if(m<0){var c=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+c];if(this.currentPlayTimes===a){if(m===_){m=-1}}}while(m>=0){var p=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[p]/this._frameRate;if(this._position<=d&&d<=this._position+this._duration){this._onCrossFrame(m)}if(l!==null&&m===0){this._armature._dragonBones.bufferEvent(l);l=null}if(m>0){m--}else{m=this._frameCount-1}if(m===_){break}}}else{if(m<0){var c=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+c];var p=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[p]/this._frameRate;if(this.currentPlayTimes===a){if(r<=d){if(m>0){m--}else{m=this._frameCount-1}}else if(m===_){m=-1}}}while(m>=0){if(m=0){var t=this._frameArray[this._frameOffset+1];if(t>0){this._armature._sortZOrder(this._frameArray,this._frameOffset+2)}else{this._armature._sortZOrder(null,0)}}};e.prototype._onUpdateFrame=function(){};return e}(t.TimelineState);t.ZOrderTimelineState=i;var a=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.toString=function(){return"[class dragonBones.BoneAllTimelineState]"};i.prototype._onArriveAtFrame=function(){e.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var t=this._dragonBonesData.frameFloatArray;var i=this.bonePose.current;var a=this.bonePose.delta;var r=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*6;i.x=t[r++];i.y=t[r++];i.rotation=t[r++];i.skew=t[r++];i.scaleX=t[r++];i.scaleY=t[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}a.x=t[r++]-i.x;a.y=t[r++]-i.y;a.rotation=t[r++]-i.rotation;a.skew=t[r++]-i.skew;a.scaleX=t[r++]-i.scaleX;a.scaleY=t[r++]-i.scaleY}}else{var i=this.bonePose.current;i.x=0;i.y=0;i.rotation=0;i.skew=0;i.scaleX=1;i.scaleY=1}};i.prototype._onUpdateFrame=function(){e.prototype._onUpdateFrame.call(this);var t=this.bonePose.current;var i=this.bonePose.delta;var a=this.bonePose.result;this.bone._transformDirty=true;if(this._tweenState!==2){this._tweenState=0}var r=this._armature.armatureData.scale;a.x=(t.x+i.x*this._tweenProgress)*r;a.y=(t.y+i.y*this._tweenProgress)*r;a.rotation=t.rotation+i.rotation*this._tweenProgress;a.skew=t.skew+i.skew*this._tweenProgress;a.scaleX=t.scaleX+i.scaleX*this._tweenProgress;a.scaleY=t.scaleY+i.scaleY*this._tweenProgress};i.prototype.fadeOut=function(){var e=this.bonePose.result;e.rotation=t.Transform.normalizeRadian(e.rotation);e.skew=t.Transform.normalizeRadian(e.skew)};return i}(t.BoneTimelineState);t.BoneAllTimelineState=a;var r=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.SlotDislayIndexTimelineState]"};e.prototype._onArriveAtFrame=function(){if(this.playState>=0){var t=this._timelineData!==null?this._frameArray[this._frameOffset+1]:this.slot.slotData.displayIndex;if(this.slot.displayIndex!==t){this.slot._setDisplayIndex(t,true)}}};return e}(t.SlotTimelineState);t.SlotDislayIndexTimelineState=r;var n=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[0,0,0,0,0,0,0,0];e._delta=[0,0,0,0,0,0,0,0];e._result=[0,0,0,0,0,0,0,0];return e}e.toString=function(){return"[class dragonBones.SlotColorTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._dirty=false};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._dragonBonesData.intArray;var i=this._dragonBonesData.frameIntArray;var a=this._animationData.frameIntOffset+this._frameValueOffset+this._frameIndex*1;var r=i[a];this._current[0]=e[r++];this._current[1]=e[r++];this._current[2]=e[r++];this._current[3]=e[r++];this._current[4]=e[r++];this._current[5]=e[r++];this._current[6]=e[r++];this._current[7]=e[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=i[this._animationData.frameIntOffset+this._frameValueOffset]}else{r=i[a+1*1]}this._delta[0]=e[r++]-this._current[0];this._delta[1]=e[r++]-this._current[1];this._delta[2]=e[r++]-this._current[2];this._delta[3]=e[r++]-this._current[3];this._delta[4]=e[r++]-this._current[4];this._delta[5]=e[r++]-this._current[5];this._delta[6]=e[r++]-this._current[6];this._delta[7]=e[r++]-this._current[7]}}else{var n=this.slot.slotData.color;this._current[0]=n.alphaMultiplier*100;this._current[1]=n.redMultiplier*100;this._current[2]=n.greenMultiplier*100;this._current[3]=n.blueMultiplier*100;this._current[4]=n.alphaOffset;this._current[5]=n.redOffset;this._current[6]=n.greenOffset;this._current[7]=n.blueOffset}};e.prototype._onUpdateFrame=function(){t.prototype._onUpdateFrame.call(this);this._dirty=true;if(this._tweenState!==2){this._tweenState=0}this._result[0]=(this._current[0]+this._delta[0]*this._tweenProgress)*.01;this._result[1]=(this._current[1]+this._delta[1]*this._tweenProgress)*.01;this._result[2]=(this._current[2]+this._delta[2]*this._tweenProgress)*.01;this._result[3]=(this._current[3]+this._delta[3]*this._tweenProgress)*.01;this._result[4]=this._current[4]+this._delta[4]*this._tweenProgress;this._result[5]=this._current[5]+this._delta[5]*this._tweenProgress;this._result[6]=this._current[6]+this._delta[6]*this._tweenProgress;this._result[7]=this._current[7]+this._delta[7]*this._tweenProgress};e.prototype.fadeOut=function(){this._tweenState=0;this._dirty=false};e.prototype.update=function(e){t.prototype.update.call(this,e);if(this._tweenState!==0||this._dirty){var i=this.slot._colorTransform;if(this._animationState._fadeState!==0||this._animationState._subFadeState!==0){if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){var a=Math.pow(this._animationState._fadeProgress,4);i.alphaMultiplier+=(this._result[0]-i.alphaMultiplier)*a;i.redMultiplier+=(this._result[1]-i.redMultiplier)*a;i.greenMultiplier+=(this._result[2]-i.greenMultiplier)*a;i.blueMultiplier+=(this._result[3]-i.blueMultiplier)*a;i.alphaOffset+=(this._result[4]-i.alphaOffset)*a;i.redOffset+=(this._result[5]-i.redOffset)*a;i.greenOffset+=(this._result[6]-i.greenOffset)*a;i.blueOffset+=(this._result[7]-i.blueOffset)*a;this.slot._colorDirty=true}}else if(this._dirty){this._dirty=false;if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){i.alphaMultiplier=this._result[0];i.redMultiplier=this._result[1];i.greenMultiplier=this._result[2];i.blueMultiplier=this._result[3];i.alphaOffset=this._result[4];i.redOffset=this._result[5];i.greenOffset=this._result[6];i.blueOffset=this._result[7];this.slot._colorDirty=true}}}};return e}(t.SlotTimelineState);t.SlotColorTimelineState=n;var s=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[];e._delta=[];e._result=[];return e}e.toString=function(){return"[class dragonBones.SlotFFDTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.meshOffset=0;this._dirty=false;this._frameFloatOffset=0;this._valueCount=0;this._ffdCount=0;this._valueOffset=0;this._current.length=0;this._delta.length=0;this._result.length=0};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._tweenState===2;var i=this._dragonBonesData.frameFloatArray;var a=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*this._valueCount;if(e){var r=a+this._valueCount;if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}for(var n=0;n255){return encodeURI(r)}}}return r}return String(r)}return a};a.prototype._getCurvePoint=function(t,e,i,a,r,n,s,o,l,h){var u=1-l;var f=u*u;var _=l*l;var m=u*f;var c=3*l*f;var p=3*u*_;var d=l*_;h.x=m*t+c*i+p*r+d*s;h.y=m*e+c*a+p*n+d*o};a.prototype._samplingEasingCurve=function(t,e){var i=t.length;var a=-2;for(var r=0,n=e.length;r=0&&a+61e-4){var g=(y+d)*.5;this._getCurvePoint(l,h,u,f,_,m,c,p,g,this._helpPoint);if(s-this._helpPoint.x>0){d=g}else{y=g}}e[r]=this._helpPoint.y}};a.prototype._sortActionFrame=function(t,e){return t.frameStart>e.frameStart?1:-1};a.prototype._parseActionDataInFrame=function(t,e,i,r){if(a.EVENT in t){this._mergeActionFrame(t[a.EVENT],e,10,i,r)}if(a.SOUND in t){this._mergeActionFrame(t[a.SOUND],e,11,i,r)}if(a.ACTION in t){this._mergeActionFrame(t[a.ACTION],e,0,i,r)}if(a.EVENTS in t){this._mergeActionFrame(t[a.EVENTS],e,10,i,r)}if(a.ACTIONS in t){this._mergeActionFrame(t[a.ACTIONS],e,0,i,r)}};a.prototype._mergeActionFrame=function(e,a,r,n,s){var o=t.DragonBones.webAssembly?this._armature.actions.size():this._armature.actions.length;var l=this._parseActionData(e,this._armature.actions,r,n,s);var h=null;if(this._actionFrames.length===0){h=new i;h.frameStart=0;this._actionFrames.push(h);h=null}for(var u=0,f=this._actionFrames;u0){var c=r.getBone(_);if(c!==null){m.parent=c}else{(this._cacheBones[_]=this._cacheBones[_]||[]).push(m)}}if(m.name in this._cacheBones){for(var p=0,d=this._cacheBones[m.name];p0){n.root=i.parent}if(t.DragonBones.webAssembly){i.constraints.push_back(n)}else{i.constraints.push(n)}};a.prototype._parseSlot=function(e){var i=t.DragonBones.webAssembly?new Module["SlotData"]:t.BaseObject.borrowObject(t.SlotData);i.displayIndex=a._getNumber(e,a.DISPLAY_INDEX,0);i.zOrder=t.DragonBones.webAssembly?this._armature.sortedSlots.size():this._armature.sortedSlots.length;i.name=a._getString(e,a.NAME,"");i.parent=this._armature.getBone(a._getString(e,a.PARENT,""));if(a.BLEND_MODE in e&&typeof e[a.BLEND_MODE]==="string"){i.blendMode=a._getBlendMode(e[a.BLEND_MODE])}else{i.blendMode=a._getNumber(e,a.BLEND_MODE,0)}if(a.COLOR in e){i.color=t.DragonBones.webAssembly?Module["SlotData"].createColor():t.SlotData.createColor();this._parseColorTransform(e[a.COLOR],i.color)}else{i.color=t.DragonBones.webAssembly?Module["SlotData"].DEFAULT_COLOR:t.SlotData.DEFAULT_COLOR}if(a.ACTIONS in e){var r=this._slotChildActions[i.name]=[];this._parseActionData(e[a.ACTIONS],r,0,null,null)}return i};a.prototype._parseSkin=function(e){var i=t.DragonBones.webAssembly?new Module["SkinData"]:t.BaseObject.borrowObject(t.SkinData);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length===0){i.name=a.DEFAULT_NAME}if(a.SLOT in e){this._skin=i;var r=e[a.SLOT];for(var n=0,s=r;n0?n:r;this._parsePivot(e,o);break;case 1:var l=i=t.DragonBones.webAssembly?new Module["ArmatureDisplayData"]:t.BaseObject.borrowObject(t.ArmatureDisplayData);l.name=r;l.path=n.length>0?n:r;l.inheritAnimation=true;if(a.ACTIONS in e){this._parseActionData(e[a.ACTIONS],l.actions,0,null,null)}else if(this._slot.name in this._slotChildActions){var h=this._skin.getDisplays(this._slot.name);if(h===null?this._slot.displayIndex===0:this._slot.displayIndex===h.length){for(var u=0,f=this._slotChildActions[this._slot.name];u0?n:r;m.inheritAnimation=a._getBoolean(e,a.INHERIT_FFD,true);this._parsePivot(e,m);var c=a._getString(e,a.SHARE,"");if(c.length>0){var p=this._meshs[c];m.offset=p.offset;m.weight=p.weight}else{this._parseMesh(e,m);this._meshs[m.name]=m}break;case 3:var d=this._parseBoundingBox(e);if(d!==null){var y=i=t.DragonBones.webAssembly?new Module["BoundingBoxDisplayData"]:t.BaseObject.borrowObject(t.BoundingBoxDisplayData);y.name=r;y.path=n.length>0?n:r;y.boundingBox=d}break}if(i!==null){i.parent=this._armature;if(a.TRANSFORM in e){this._parseTransform(e[a.TRANSFORM],i.transform,this._armature.scale)}}return i};a.prototype._parsePivot=function(t,e){if(a.PIVOT in t){var i=t[a.PIVOT];e.pivot.x=a._getNumber(i,a.X,0);e.pivot.y=a._getNumber(i,a.Y,0)}else{e.pivot.x=.5;e.pivot.y=.5}};a.prototype._parseMesh=function(e,i){var r=e[a.VERTICES];var n=e[a.UVS];var s=e[a.TRIANGLES];var o=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var l=t.DragonBones.webAssembly?this._floatArrayJson:this._data.floatArray;var h=Math.floor(r.length/2);var u=Math.floor(s.length/3);var f=l.length;var _=f+h*2;i.offset=o.length;o.length+=1+1+1+1+u*3;o[i.offset+0]=h;o[i.offset+1]=u;o[i.offset+2]=f;for(var m=0,c=u*3;mn.width){n.width=h}if(un.height){n.height=u}}}return n};a.prototype._parseAnimation=function(e){var i=t.DragonBones.webAssembly?new Module["AnimationData"]:t.BaseObject.borrowObject(t.AnimationData);i.frameCount=Math.max(a._getNumber(e,a.DURATION,1),1);i.playTimes=a._getNumber(e,a.PLAY_TIMES,1);i.duration=i.frameCount/this._armature.frameRate;i.fadeInTime=a._getNumber(e,a.FADE_IN_TIME,0);i.scale=a._getNumber(e,a.SCALE,1);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length<1){i.name=a.DEFAULT_NAME}if(t.DragonBones.webAssembly){i.frameIntOffset=this._frameIntArrayJson.length;i.frameFloatOffset=this._frameFloatArrayJson.length;i.frameOffset=this._frameArrayJson.length}else{i.frameIntOffset=this._data.frameIntArray.length;i.frameFloatOffset=this._data.frameFloatArray.length;i.frameOffset=this._data.frameArray.length}this._animation=i;if(a.FRAME in e){var r=e[a.FRAME];var n=r.length;if(n>0){for(var s=0,o=0;s0){this._actionFrames.sort(this._sortActionFrame);var D=this._animation.actionTimeline=t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);var T=t.DragonBones.webAssembly?this._timelineArrayJson:this._data.timelineArray;var n=this._actionFrames.length;D.type=0;D.offset=T.length;T.length+=1+1+1+1+1+n;T[D.offset+0]=100;T[D.offset+1]=0;T[D.offset+2]=n;T[D.offset+3]=0;T[D.offset+4]=0;this._timeline=D;if(n===1){D.frameIndicesOffset=-1;T[D.offset+5+0]=this._parseCacheActionFrame(this._actionFrames[0])-this._animation.frameOffset}else{var A=this._animation.frameCount+1;var O=this._data.frameIndices;if(t.DragonBones.webAssembly){D.frameIndicesOffset=O.size();for(var x=0;x0){if(a.CURVE in t){var s=i+1;this._helpArray.length=s;this._samplingEasingCurve(t[a.CURVE],this._helpArray);r.length+=1+1+this._helpArray.length;r[n+1]=2;r[n+2]=s;for(var o=0;o0){var l=this._armature.sortedSlots.length;var h=new Array(l-o.length/2);var u=new Array(l);for(var f=0;f0?l>=this._prevRotation:l<=this._prevRotation){this._prevTweenRotate=this._prevTweenRotate>0?this._prevTweenRotate-1:this._prevTweenRotate+1}l=this._prevRotation+l-this._prevRotation+t.Transform.PI_D*this._prevTweenRotate}}this._prevTweenRotate=a._getNumber(e,a.TWEEN_ROTATE,0);this._prevRotation=l;var h=n.length;n.length+=6;n[h++]=this._helpTransform.x;n[h++]=this._helpTransform.y;n[h++]=l;n[h++]=this._helpTransform.skew;n[h++]=this._helpTransform.scaleX;n[h++]=this._helpTransform.scaleY;this._parseActionDataInFrame(e,i,this._bone,this._slot);return o};a.prototype._parseSlotDisplayIndexFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var s=this._parseFrame(e,i,r,n);n.length+=1;n[s+1]=a._getNumber(e,a.DISPLAY_INDEX,0);this._parseActionDataInFrame(e,i,this._slot.parent,this._slot);return s};a.prototype._parseSlotColorFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameIntArrayJson:this._data.frameIntArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=this._parseTweenFrame(e,i,r,o);var h=-1;if(a.COLOR in e){var u=e[a.COLOR];for(var f in u){f;this._parseColorTransform(u,this._helpColorTransform);h=n.length;n.length+=8;n[h++]=Math.round(this._helpColorTransform.alphaMultiplier*100);n[h++]=Math.round(this._helpColorTransform.redMultiplier*100);n[h++]=Math.round(this._helpColorTransform.greenMultiplier*100);n[h++]=Math.round(this._helpColorTransform.blueMultiplier*100);n[h++]=Math.round(this._helpColorTransform.alphaOffset);n[h++]=Math.round(this._helpColorTransform.redOffset);n[h++]=Math.round(this._helpColorTransform.greenOffset);n[h++]=Math.round(this._helpColorTransform.blueOffset);h-=8;break}}if(h<0){if(this._defalultColorOffset<0){this._defalultColorOffset=h=n.length;n.length+=8;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=0;n[h++]=0;n[h++]=0;n[h++]=0}h=this._defalultColorOffset}var _=s.length;s.length+=1;s[_]=h;return l};a.prototype._parseSlotFFDFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameFloatArrayJson:this._data.frameFloatArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=s.length;var h=this._parseTweenFrame(e,i,r,o);var u=a.VERTICES in e?e[a.VERTICES]:null;var f=a._getNumber(e,a.OFFSET,0);var _=n[this._mesh.offset+0];var m=0;var c=0;var p=0;var d=0;if(this._mesh.weight!==null){var y=this._weightSlotPose[this._mesh.name];this._helpMatrixA.copyFromArray(y,0);s.length+=this._mesh.weight.count*2;p=this._mesh.weight.offset+2+this._mesh.weight.bones.length}else{s.length+=_*2}for(var g=0;g<_*2;g+=2){if(u===null){m=0;c=0}else{if(g=u.length){m=0}else{m=u[g-f]}if(g+1=u.length){c=0}else{c=u[g+1-f]}}if(this._mesh.weight!==null){var v=this._weightBonePoses[this._mesh.name];var b=this._weightBoneIndices[this._mesh.name];var D=n[p++];this._helpMatrixA.transformPoint(m,c,this._helpPoint,true);m=this._helpPoint.x;c=this._helpPoint.y;for(var T=0;T=0||a.DATA_VERSIONS.indexOf(n)>=0){var s=t.DragonBones.webAssembly?new Module["DragonBonesData"]:t.BaseObject.borrowObject(t.DragonBonesData);s.version=r;s.name=a._getString(e,a.NAME,"");s.frameRate=a._getNumber(e,a.FRAME_RATE,24);if(s.frameRate===0){s.frameRate=24}if(a.ARMATURE in e){this._defalultColorOffset=-1;this._data=s;this._parseArray(e);var o=e[a.ARMATURE];for(var l=0,h=o;l0){this._parseWASMArray()}this._data=null}this._rawTextureAtlasIndex=0;if(a.TEXTURE_ATLAS in e){this._rawTextureAtlases=e[a.TEXTURE_ATLAS]}else{this._rawTextureAtlases=null}return s}else{console.assert(false,"Nonsupport data version.")}return null};a.prototype.parseTextureAtlasData=function(e,i,r){if(r===void 0){r=0}console.assert(e!==undefined);if(e===null){if(this._rawTextureAtlases===null){return false}var n=this._rawTextureAtlases[this._rawTextureAtlasIndex++];this.parseTextureAtlasData(n,i,r);if(this._rawTextureAtlasIndex>=this._rawTextureAtlases.length){this._rawTextureAtlasIndex=0;this._rawTextureAtlases=null}return true}i.width=a._getNumber(e,a.WIDTH,0);i.height=a._getNumber(e,a.HEIGHT,0);i.name=a._getString(e,a.NAME,"");i.imagePath=a._getString(e,a.IMAGE_PATH,"");if(r>0){i.scale=r}else{r=i.scale=a._getNumber(e,a.SCALE,i.scale)}r=1/r;if(a.SUB_TEXTURE in e){var s=e[a.SUB_TEXTURE];for(var o=0,l=s.length;o0&&_>0){u.frame=t.DragonBones.webAssembly?Module["TextureData"].createRectangle():t.TextureData.createRectangle();u.frame.x=a._getNumber(h,a.FRAME_X,0)*r;u.frame.y=a._getNumber(h,a.FRAME_Y,0)*r;u.frame.width=f*r;u.frame.height=_*r}i.addTexture(u)}}return true};a.getInstance=function(){if(a._objectDataParserInstance===null){a._objectDataParserInstance=new a}return a._objectDataParserInstance};a._objectDataParserInstance=null;return a}(t.DataParser);t.ObjectDataParser=e;var i=function(){function t(){this.frameStart=0;this.actions=[]}return t}()})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.prototype._inRange=function(t,e,i){return e<=t&&t<=i};i.prototype._decodeUTF8=function(t){var e=-1;var i=-1;var a=65533;var r=0;var n="";var s;var o=0;var l=0;var h=0;var u=0;while(t.length>r){var f=t[r++];if(f===e){if(l!==0){s=a}else{s=i}}else{if(l===0){if(this._inRange(f,0,127)){s=f}else{if(this._inRange(f,194,223)){l=1;u=128;o=f-192}else if(this._inRange(f,224,239)){l=2;u=2048;o=f-224}else if(this._inRange(f,240,244)){l=3;u=65536;o=f-240}else{}o=o*Math.pow(64,l);s=null}}else if(!this._inRange(f,128,191)){o=0;l=0;h=0;u=0;r--;s=f}else{h+=1;o=o+(f-128)*Math.pow(64,l-h);if(h!==l){s=null}else{var _=o;var m=u;o=0;l=0;h=0;u=0;if(this._inRange(_,m,1114111)&&!this._inRange(_,55296,57343)){s=_}else{s=f}}}}if(s!==null&&s!==i){if(s<=65535){if(s>0)n+=String.fromCharCode(s)}else{s-=65536;n+=String.fromCharCode(55296+(s>>10&1023));n+=String.fromCharCode(56320+(s&1023))}}}return n};i.prototype._getUTF16Key=function(t){for(var e=0,i=t.length;e255){return encodeURI(t)}}return t};i.prototype._parseBinaryTimeline=function(e,i,a){if(a===void 0){a=null}var r=a!==null?a:t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);r.type=e;r.offset=i;this._timeline=r;var n=this._timelineArray[r.offset+2];if(n===1){r.frameIndicesOffset=-1}else{var s=this._animation.frameCount+1;var o=this._data.frameIndices;if(t.DragonBones.webAssembly){r.frameIndicesOffset=o.size();for(var l=0;l=0){var r=t.DragonBones.webAssembly?new Module["WeightData"]:t.BaseObject.borrowObject(t.WeightData);var n=this._intArray[i.offset+0];var s=this._intArray[a+0];r.offset=a;if(t.DragonBones.webAssembly){r.bones.resize(s,null);for(var o=0;o0){if(e in this._dragonBonesDataMap){n=this._dragonBonesDataMap[e];s=n.getArmature(i)}}if(s===null&&(e.length===0||this.autoSearch)){for(var o in this._dragonBonesDataMap){n=this._dragonBonesDataMap[o];if(e.length===0||n.autoSearch){s=n.getArmature(i);if(s!==null){e=o;break}}}}if(s!==null){t.dataName=e;t.textureAtlasName=r;t.data=n;t.armature=s;t.skin=null;if(a.length>0){t.skin=s.getSkin(a);if(t.skin===null&&this.autoSearch){for(var o in this._dragonBonesDataMap){var l=this._dragonBonesDataMap[o];var h=l.getArmature(a);if(h!==null){t.skin=h.defaultSkin;break}}}}if(t.skin===null){t.skin=s.defaultSkin}return true}return false};i.prototype._buildBones=function(e,i){var a=e.armature.sortedBones;for(var r=0;r<(t.DragonBones.webAssembly?a.size():a.length);++r){var n=t.DragonBones.webAssembly?a.get(r):a[r];var s=t.DragonBones.webAssembly?new Module["Bone"]:t.BaseObject.borrowObject(t.Bone);s.init(n);if(n.parent!==null){i.addBone(s,n.parent.name)}else{i.addBone(s)}var o=n.constraints;for(var l=0;l<(t.DragonBones.webAssembly?o.size():o.length);++l){var h=t.DragonBones.webAssembly?o.get(l):o[l];var u=i.getBone(h.target.name);if(u===null){continue}var f=h;var _=t.DragonBones.webAssembly?new Module["IKConstraint"]:t.BaseObject.borrowObject(t.IKConstraint);var m=f.root!==null?i.getBone(f.root.name):null;_.target=u;_.bone=s;_.root=m;_.bendPositive=f.bendPositive;_.scaleEnabled=f.scaleEnabled;_.weight=f.weight;if(m!==null){m.addConstraint(_)}else{s.addConstraint(_)}}}};i.prototype._buildSlots=function(t,e){var i=t.skin;var a=t.armature.defaultSkin;if(i===null||a===null){return}var r={};for(var n in a.displays){var s=a.displays[n];r[n]=s}if(i!==a){for(var n in i.displays){var s=i.displays[n];r[n]=s}}for(var o=0,l=t.armature.sortedSlots;o0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var u=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(u.length>0){for(var f=0,_=u;f<_.length;f++){var m=_[f];h._bufferAction(m,true)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype._replaceSlotDisplay=function(t,e,i,a){if(a<0){a=i.displayIndex}if(a<0){a=0}var r=i.displayList;if(r.length<=a){r.length=a+1;for(var n=0,s=r.length;n=0){continue}var s=e.displays[n.name];var o=n.displayList;o.length=s.length;for(var l=0,h=s.length;l0?this.width:e.width;var a=this.height>0?this.height:e.height;for(var r in this.textures){var n=this.textures[r];var s=Math.min(n.region.width,i-n.region.x);var o=Math.min(n.region.height,a-n.region.y);if(n.renderTexture===null){n.renderTexture=new egret.Texture;if(n.rotated){n.renderTexture.$initData(n.region.x,n.region.y,o,s,0,0,o,s,i,a)}else{n.renderTexture.$initData(n.region.x,n.region.y,s,o,0,0,s,o,i,a)}}n.renderTexture._bitmapData=e}}else{for(var r in this.textures){var n=this.textures[r];n.renderTexture=null}}},enumerable:true,configurable:true});a.prototype.dispose=function(){console.warn("已废弃,请参考 @see");this.returnToPool()};Object.defineProperty(a.prototype,"texture",{get:function(){return this.renderTexture},enumerable:true,configurable:true});return a}(t.TextureAtlasData);t.EgretTextureAtlasData=e;var i=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.renderTexture=null;return e}e.toString=function(){return"[class dragonBones.EgretTextureData]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.renderTexture!==null){}this.renderTexture=null};return e}(t.TextureData);t.EgretTextureData=i})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}Object.defineProperty(i.prototype,"eventObject",{get:function(){return this.data},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationName",{get:function(){var t=this.eventObject.animationState;return t!==null?t.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"armature",{get:function(){return this.eventObject.armature},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"bone",{get:function(){return this.eventObject.bone},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"slot",{get:function(){return this.eventObject.slot},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationState",{get:function(){return this.eventObject.animationState},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"frameLabel",{get:function(){return this.eventObject.name},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"sound",{get:function(){return this.eventObject.name},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"movementID",{get:function(){return this.animationName},enumerable:true,configurable:true});i.START=t.EventObject.START;i.LOOP_COMPLETE=t.EventObject.LOOP_COMPLETE;i.COMPLETE=t.EventObject.COMPLETE;i.FADE_IN=t.EventObject.FADE_IN;i.FADE_IN_COMPLETE=t.EventObject.FADE_IN_COMPLETE;i.FADE_OUT=t.EventObject.FADE_OUT;i.FADE_OUT_COMPLETE=t.EventObject.FADE_OUT_COMPLETE;i.FRAME_EVENT=t.EventObject.FRAME_EVENT;i.SOUND_EVENT=t.EventObject.SOUND_EVENT;i.ANIMATION_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.BONE_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.MOVEMENT_FRAME_EVENT=t.EventObject.FRAME_EVENT;i.SOUND=t.EventObject.SOUND_EVENT;return i}(egret.Event);t.EgretEvent=e;var i=function(i){__extends(a,i);function a(){var t=i!==null&&i.apply(this,arguments)||this;t._disposeProxy=false;t._armature=null;t._debugDrawer=null;return t}a.prototype.init=function(t){this._armature=t};a.prototype.clear=function(){this._disposeProxy=false;this._armature=null;this._debugDrawer=null};a.prototype.dispose=function(t){if(t===void 0){t=true}this._disposeProxy=t;if(this._armature!==null){this._armature.dispose();this._armature=null}};a.prototype.debugUpdate=function(t){if(t){if(this._debugDrawer===null){this._debugDrawer=new egret.Sprite}this.addChild(this._debugDrawer);this._debugDrawer.graphics.clear();for(var e=0,i=this._armature.getBones();e=0&&this._display!==null&&i!==null){if(this._armature.replacedTexture!==null&&this._rawDisplayDatas.indexOf(this._displayData)>=0){var a=i.parent;if(this._armature._replaceTextureAtlasData===null){a=t.BaseObject.borrowObject(t.EgretTextureAtlasData);a.copyFrom(i.parent);a.renderTexture=this._armature.replacedTexture;this._armature._replaceTextureAtlasData=a}else{a=this._armature._replaceTextureAtlasData}i=a.getTexture(i.name)}if(i.renderTexture!==null){if(e!==null){var r=e.parent.parent;var n=r.intArray;var s=r.floatArray;var o=n[e.offset+0];var l=n[e.offset+1];var h=n[e.offset+2];var u=h+o*2;var f=this._renderDisplay;var _=f.$renderNode;_.uvs.length=o*2;_.vertices.length=o*2;_.indices.length=l*3;for(var m=0,c=o*2;m0;var e=this._meshData;var i=e.weight;var a=this._renderDisplay;var r=a.$renderNode;if(i!==null){var n=e.parent.parent;var s=n.intArray;var o=n.floatArray;var l=s[e.offset+0];var h=s[i.offset+1];for(var u=0,f=0,_=i.offset+2+i.bones.length,m=h,c=0;u void, target: any): void { + this.addEventListener(type, listener, target); + } + /** + * @inheritDoc + */ + public removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void { + this.removeEventListener(type, listener, target); + } + /** + * @inheritDoc + */ + public get armature(): Armature { + return this._armature; + } + /** + * @inheritDoc + */ + public get animation(): Animation { + return this._armature.animation; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.EgretFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + public advanceTimeBySelf(on: boolean): void { + if (on) { + this._armature.clock = EgretFactory.clock; + } + else { + this._armature.clock = null; + } + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature + */ + export type FastArmature = Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Bone + */ + export type FastBone = Bone; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Slot + */ + export type FastSlot = Slot; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Animation + */ + export type FastAnimation = Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.AnimationState + */ + export type FastAnimationState = AnimationState; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class Event extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class ArmatureEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class AnimationEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class FrameEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretEvent + */ + export class SoundEvent extends EgretEvent { } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + export class EgretTextureAtlas extends EgretTextureAtlasData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.EgretTextureAtlas]"; + } + + public constructor(texture: egret.Texture, rawData: any, scale: number = 1) { + super(); + console.warn("已废弃,请参考 @see"); + + this._onClear(); + + ObjectDataParser.getInstance().parseTextureAtlasData(rawData, this, scale); + this.renderTexture = texture; + } + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretTextureAtlasData + */ + export class EgretSheetAtlas extends EgretTextureAtlas { + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + export class SoundEventManager { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager + */ + public static getInstance(): EgretArmatureDisplay { + console.warn("已废弃,请参考 @see"); + return EgretFactory.factory.soundEventManager; + } + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#cacheFrameRate + * @see dragonBones.Armature#enableAnimationCache() + */ + export class AnimationCacheManager { + } +} \ No newline at end of file diff --git a/reference/Egret/5.x/src/dragonBones/egret/EgretFactory.ts b/reference/Egret/5.x/src/dragonBones/egret/EgretFactory.ts new file mode 100644 index 0000000..acc587f --- /dev/null +++ b/reference/Egret/5.x/src/dragonBones/egret/EgretFactory.ts @@ -0,0 +1,232 @@ +namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretFactory extends BaseFactory { + private static _time: number = 0; + private static _dragonBones: DragonBones = null as any; + private static _factory: EgretFactory | null = null; + private static _clockHandler(time: number): boolean { + time *= 0.001; + const passedTime = time - EgretFactory._time; + EgretFactory._dragonBones.advanceTime(passedTime); + EgretFactory._time = time; + + return false; + } + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + public static get clock(): WorldClock { + return EgretFactory._dragonBones.clock; + } + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public static get factory(): EgretFactory { + if (EgretFactory._factory === null) { + EgretFactory._factory = new EgretFactory(); + } + + return EgretFactory._factory; + } + /** + * @inheritDoc + */ + public constructor() { + super(); + + if (EgretFactory._dragonBones === null) { + const eventManager = new EgretArmatureDisplay(); + EgretFactory._dragonBones = new DragonBones(eventManager); + EgretFactory._dragonBones.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + + this._dragonBones = EgretFactory._dragonBones; + } + /** + * @private + */ + protected _isSupportMesh(): boolean { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + + return false; + } + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: EgretTextureAtlasData | null, textureAtlas: egret.Texture): EgretTextureAtlasData { + if (textureAtlasData !== null) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = BaseObject.borrowObject(EgretTextureAtlasData); + } + + return textureAtlasData; + } + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature { + const armature = BaseObject.borrowObject(Armature); + const armatureDisplay = new EgretArmatureDisplay(); + + armature.init( + dataPackage.armature, + armatureDisplay, armatureDisplay, this._dragonBones + ); + + return armature; + } + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot { + dataPackage; + armature; + const slot = BaseObject.borrowObject(EgretSlot); + slot.init( + slotData, displays, + new egret.Bitmap(), new egret.Mesh() + ); + + return slot; + } + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + public buildArmatureDisplay(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null, textureAtlasName: string | null = null): EgretArmatureDisplay | null { + const armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + return armature.display as EgretArmatureDisplay; + } + + return null; + } + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public getTextureDisplay(textureName: string, textureAtlasName: string | null = null): egret.Bitmap | null { + const textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName) as EgretTextureData; + if (textureData !== null && textureData.renderTexture !== null) { + return new egret.Bitmap(textureData.renderTexture); + } + + return null; + } + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public get soundEventManager(): EgretArmatureDisplay { + return this._dragonBones.eventManager as EgretArmatureDisplay; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addDragonBonesData() + */ + public addSkeletonData(dragonBonesData: DragonBonesData, dragonBonesName: string | null = null): void { + console.warn("已废弃,请参考 @see"); + this.addDragonBonesData(dragonBonesData, dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getDragonBonesData() + */ + public getSkeletonData(dragonBonesName: string) { + console.warn("已废弃,请参考 @see"); + return this.getDragonBonesData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + public removeSkeletonData(dragonBonesName: string): void { + console.warn("已废弃,请参考 @see"); + this.removeDragonBonesData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#addTextureAtlasData() + */ + public addTextureAtlas(textureAtlasData: TextureAtlasData, dragonBonesName: string | null = null): void { + console.warn("已废弃,请参考 @see"); + this.addTextureAtlasData(textureAtlasData, dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#getTextureAtlasData() + */ + public getTextureAtlas(dragonBonesName: string) { + console.warn("已废弃,请参考 @see"); + return this.getTextureAtlasData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public removeTextureAtlas(dragonBonesName: string): void { + console.warn("已废弃,请参考 @see"); + this.removeTextureAtlasData(dragonBonesName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#buildArmature() + */ + public buildFastArmature(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null): FastArmature | null { + console.warn("已废弃,请参考 @see"); + return this.buildArmature(armatureName, dragonBonesName, skinName); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#clear() + */ + public dispose(): void { + console.warn("已废弃,请参考 @see"); + this.clear(); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EgretFactory#soundEventManager() + */ + public get soundEventManater(): EgretArmatureDisplay { + return this.soundEventManager; + } + } +} \ No newline at end of file diff --git a/reference/Egret/5.x/src/dragonBones/egret/EgretSlot.ts b/reference/Egret/5.x/src/dragonBones/egret/EgretSlot.ts new file mode 100644 index 0000000..f36c5d5 --- /dev/null +++ b/reference/Egret/5.x/src/dragonBones/egret/EgretSlot.ts @@ -0,0 +1,317 @@ +namespace dragonBones { + /** + * Egret 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretSlot extends Slot { + public static toString(): string { + return "[class dragonBones.EgretSlot]"; + } + /** + * 是否更新显示对象的变换属性。 + * 为了更好的性能, 并不会更新 display 的变换属性 (x, y, rotation, scaleX, scaleX), 如果需要正确访问这些属性, 则需要设置为 true 。 + * @default false + * @version DragonBones 3.0 + * @language zh_CN + */ + public transformUpdateEnabled: boolean = false; + + private _renderDisplay: egret.DisplayObject = null as any; + private _colorFilter: egret.ColorMatrixFilter | null = null; + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + this._renderDisplay = null as any; // + this._colorFilter = null; + } + /** + * @private + */ + protected _initDisplay(value: any): void { + value; + } + /** + * @private + */ + protected _disposeDisplay(value: any): void { + value; + } + /** + * @private + */ + protected _onUpdateDisplay(): void { + this._renderDisplay = (this._display !== null ? this._display : this._rawDisplay) as egret.DisplayObject; + } + /** + * @private + */ + protected _addDisplay(): void { + const container = this._armature.display as EgretArmatureDisplay; + container.addChild(this._renderDisplay); + } + /** + * @private + */ + protected _replaceDisplay(value: any): void { + const container = this._armature.display as EgretArmatureDisplay; + const prevDisplay = value as egret.DisplayObject; + container.addChild(this._renderDisplay); + container.swapChildren(this._renderDisplay, prevDisplay); + container.removeChild(prevDisplay); + } + /** + * @private + */ + protected _removeDisplay(): void { + this._renderDisplay.parent.removeChild(this._renderDisplay); + } + /** + * @private + */ + protected _updateZOrder(): void { + const container = this._armature.display as EgretArmatureDisplay; + const index = container.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + + container.addChildAt(this._renderDisplay, this._zOrder); + } + /** + * @internal + * @private + */ + public _updateVisible(): void { + this._renderDisplay.visible = this._parent.visible; + } + /** + * @private + */ + protected _updateBlendMode(): void { + switch (this._blendMode) { + case BlendMode.Normal: + this._renderDisplay.blendMode = egret.BlendMode.NORMAL; + break; + + case BlendMode.Add: + this._renderDisplay.blendMode = egret.BlendMode.ADD; + break; + + case BlendMode.Erase: + this._renderDisplay.blendMode = egret.BlendMode.ERASE; + break; + + default: + break; + } + } + /** + * @private + */ + protected _updateColor(): void { + if ( + this._colorTransform.redMultiplier !== 1.0 || + this._colorTransform.greenMultiplier !== 1.0 || + this._colorTransform.blueMultiplier !== 1.0 || + this._colorTransform.redOffset !== 0 || + this._colorTransform.greenOffset !== 0 || + this._colorTransform.blueOffset !== 0 || + this._colorTransform.alphaOffset !== 0 + ) { + if (this._colorFilter === null) { + this._colorFilter = new egret.ColorMatrixFilter(); + } + + const colorMatrix = this._colorFilter.matrix; + colorMatrix[0] = this._colorTransform.redMultiplier; + colorMatrix[6] = this._colorTransform.greenMultiplier; + colorMatrix[12] = this._colorTransform.blueMultiplier; + colorMatrix[18] = this._colorTransform.alphaMultiplier; + colorMatrix[4] = this._colorTransform.redOffset; + colorMatrix[9] = this._colorTransform.greenOffset; + colorMatrix[14] = this._colorTransform.blueOffset; + colorMatrix[19] = this._colorTransform.alphaOffset; + this._colorFilter.matrix = colorMatrix; + + let filters = this._renderDisplay.filters; + if (!filters) { // null or undefined? + filters = []; + } + + if (filters.indexOf(this._colorFilter) < 0) { + filters.push(this._colorFilter); + } + + this._renderDisplay.$setAlpha(1.0); + this._renderDisplay.filters = filters; + } + else { + if (this._colorFilter !== null) { + this._colorFilter = null; + this._renderDisplay.filters = null as any; + } + + this._renderDisplay.$setAlpha(this._colorTransform.alphaMultiplier); + } + } + /** + * @private + */ + protected _updateFrame(): void { + const meshData = this._display === this._meshDisplay ? this._meshData : null; + let currentTextureData = this._textureData as (EgretTextureData | null); + + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { // Update replaced texture atlas. + let currentTextureAtlasData = currentTextureData.parent as EgretTextureAtlasData; + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = BaseObject.borrowObject(EgretTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData as EgretTextureAtlasData; + } + + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name) as EgretTextureData; + } + + if (currentTextureData.renderTexture !== null) { + if (meshData !== null) { // Mesh. + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const triangleCount = intArray[meshData.offset + BinaryOffset.MeshTriangleCount]; + const verticesOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + const uvOffset = verticesOffset + vertexCount * 2; + + const meshDisplay = this._renderDisplay as egret.Mesh; + const meshNode = meshDisplay.$renderNode as egret.sys.MeshNode; + + meshNode.uvs.length = vertexCount * 2; + meshNode.vertices.length = vertexCount * 2; + meshNode.indices.length = triangleCount * 3; + + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[verticesOffset + i]; + meshNode.uvs[i] = floatArray[uvOffset + i]; + } + + for (let i = 0; i < triangleCount * 3; ++i) { + meshNode.indices[i] = intArray[meshData.offset + BinaryOffset.MeshVertexIndices + i]; + } + + meshDisplay.texture = currentTextureData.renderTexture; + meshDisplay.$setAnchorOffsetX(this._pivotX); + meshDisplay.$setAnchorOffsetY(this._pivotY); + meshDisplay.$updateVertices(); + } + else { // Normal texture. + const normalDisplay = this._renderDisplay as egret.Bitmap; + normalDisplay.texture = currentTextureData.renderTexture; + normalDisplay.$setAnchorOffsetX(this._pivotX); + normalDisplay.$setAnchorOffsetY(this._pivotY); + } + + return; + } + } + + if (meshData !== null) { + const meshDisplay = this._renderDisplay as egret.Mesh; + meshDisplay.texture = null as any; + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + } + else { + const normalDisplay = this._renderDisplay as egret.Bitmap; + normalDisplay.texture = null as any; + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + } + } + /** + * @private + */ + protected _updateMesh(): void { + const hasFFD = this._ffdVertices.length > 0; + const meshData = this._meshData as MeshDisplayData; + const weightData = meshData.weight; + const meshDisplay = this._renderDisplay as egret.Mesh; + const meshNode = meshDisplay.$renderNode as egret.sys.MeshNode; + + if (weightData !== null) { + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const weightFloatOffset = intArray[weightData.offset + BinaryOffset.WeigthFloatOffset]; + + for ( + let i = 0, iD = 0, iB = weightData.offset + BinaryOffset.WeigthBoneIndices + weightData.bones.length, iV = weightFloatOffset, iF = 0; + i < vertexCount; + ++i + ) { + const boneCount = intArray[iB++]; + let xG = 0.0, yG = 0.0; + for (let j = 0; j < boneCount; ++j) { + const boneIndex = intArray[iB++]; + const bone = this._meshBones[boneIndex]; + if (bone !== null) { + const matrix = bone.globalTransformMatrix; + const weight = floatArray[iV++]; + let xL = floatArray[iV++]; + let yL = floatArray[iV++]; + + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight; + } + } + + meshNode.vertices[iD++] = xG; + meshNode.vertices[iD++] = yG; + } + + meshDisplay.$updateVertices(); + } + else if (hasFFD) { + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const vertexOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshNode.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + + meshDisplay.$updateVertices(); + } + } + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void { + if (isSkinnedMesh) { // Identity transform. + const transformationMatrix = this._renderDisplay.matrix; + transformationMatrix.identity(); + this._renderDisplay.$setMatrix(transformationMatrix, this.transformUpdateEnabled); + } + else { + const globalTransformMatrix = this.globalTransformMatrix; + this._renderDisplay.$setMatrix((globalTransformMatrix as any) as egret.Matrix, this.transformUpdateEnabled); + } + } + } +} \ No newline at end of file diff --git a/reference/Egret/5.x/src/dragonBones/egret/EgretTextureAtlasData.ts b/reference/Egret/5.x/src/dragonBones/egret/EgretTextureAtlasData.ts new file mode 100644 index 0000000..9edff5b --- /dev/null +++ b/reference/Egret/5.x/src/dragonBones/egret/EgretTextureAtlasData.ts @@ -0,0 +1,130 @@ +namespace dragonBones { + /** + * Egret 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretTextureAtlasData extends TextureAtlasData { + /** + * @private + */ + public static toString(): string { + return "[class dragonBones.EgretTextureAtlasData]"; + } + + private _renderTexture: egret.Texture | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + if (this._renderTexture !== null) { + //this.texture.dispose(); + } + + this._renderTexture = null; + } + /** + * @private + */ + public createTexture(): TextureData { + return BaseObject.borrowObject(EgretTextureData); + } + /** + * Egret 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get renderTexture(): egret.Texture | null { + return this._renderTexture; + } + public set renderTexture(value: egret.Texture | null) { + if (this._renderTexture === value) { + return; + } + + this._renderTexture = value; + + if (this._renderTexture !== null) { + const bitmapData = this._renderTexture.bitmapData; + const textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + const textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + + for (let k in this.textures) { + const textureData = this.textures[k] as EgretTextureData; + const subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + const subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + + if (textureData.renderTexture === null) { + textureData.renderTexture = new egret.Texture(); + if (textureData.rotated) { + textureData.renderTexture.$initData( + textureData.region.x, textureData.region.y, + subTextureHeight, subTextureWidth, + 0, 0, + subTextureHeight, subTextureWidth, + textureAtlasWidth, textureAtlasHeight + ); + } + else { + textureData.renderTexture.$initData( + textureData.region.x, textureData.region.y, + subTextureWidth, subTextureHeight, + 0, 0, + subTextureWidth, subTextureHeight, + textureAtlasWidth, textureAtlasHeight + ); + } + } + + textureData.renderTexture._bitmapData = bitmapData; + } + } + else { + for (let k in this.textures) { + const textureData = this.textures[k] as EgretTextureData; + textureData.renderTexture = null; + } + } + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public dispose(): void { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + } + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeTextureAtlasData() + */ + public get texture() { + return this.renderTexture; + } + } + /** + * @private + */ + export class EgretTextureData extends TextureData { + public static toString(): string { + return "[class dragonBones.EgretTextureData]"; + } + + public renderTexture: egret.Texture | null = null; // Initial value. + + protected _onClear(): void { + super._onClear(); + + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + + this.renderTexture = null; + } + } +} \ No newline at end of file diff --git a/reference/Egret/5.x/tsconfig.json b/reference/Egret/5.x/tsconfig.json new file mode 100644 index 0000000..19797f3 --- /dev/null +++ b/reference/Egret/5.x/tsconfig.json @@ -0,0 +1,76 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": true, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "outFile": "out/dragonBones.js", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ], + "files": [ + "./libs/egret-wasm.d.ts", + + "../../DragonBones/src/dragonBones/core/DragonBones.ts", + "../../DragonBones/src/dragonBones/core/BaseObject.ts", + + "../../DragonBones/src/dragonBones/geom/Matrix.ts", + "../../DragonBones/src/dragonBones/geom/Transform.ts", + "../../DragonBones/src/dragonBones/geom/ColorTransform.ts", + "../../DragonBones/src/dragonBones/geom/Point.ts", + "../../DragonBones/src/dragonBones/geom/Rectangle.ts", + + "../../DragonBones/src/dragonBones/model/UserData.ts", + "../../DragonBones/src/dragonBones/model/DragonBonesData.ts", + "../../DragonBones/src/dragonBones/model/ArmatureData.ts", + "../../DragonBones/src/dragonBones/model/ConstraintData.ts", + "../../DragonBones/src/dragonBones/model/DisplayData.ts", + "../../DragonBones/src/dragonBones/model/BoundingBoxData.ts", + "../../DragonBones/src/dragonBones/model/AnimationData.ts", + "../../DragonBones/src/dragonBones/model/AnimationConfig.ts", + "../../DragonBones/src/dragonBones/model/TextureAtlasData.ts", + + "../../DragonBones/src/dragonBones/armature/IArmatureProxy.ts", + "../../DragonBones/src/dragonBones/armature/Armature.ts", + "../../DragonBones/src/dragonBones/armature/TransformObject.ts", + "../../DragonBones/src/dragonBones/armature/Bone.ts", + "../../DragonBones/src/dragonBones/armature/Slot.ts", + "../../DragonBones/src/dragonBones/armature/Constraint.ts", + + "../../DragonBones/src/dragonBones/animation/IAnimatable.ts", + "../../DragonBones/src/dragonBones/animation/WorldClock.ts", + "../../DragonBones/src/dragonBones/animation/Animation.ts", + "../../DragonBones/src/dragonBones/animation/AnimationState.ts", + "../../DragonBones/src/dragonBones/animation/BaseTimelineState.ts", + "../../DragonBones/src/dragonBones/animation/TimelineState.ts", + + "../../DragonBones/src/dragonBones/event/EventObject.ts", + "../../DragonBones/src/dragonBones/event/IEventDispatcher.ts", + + "../../DragonBones/src/dragonBones/parser/DataParser.ts", + "../../DragonBones/src/dragonBones/parser/ObjectDataParser.ts", + "../../DragonBones/src/dragonBones/parser/BinaryDataParser.ts", + + "../../DragonBones/src/dragonBones/factory/BaseFactory.ts", + + "./src/dragonBones/egret/EgretTextureAtlasData.ts", + "./src/dragonBones/egret/EgretArmatureDisplay.ts", + "./src/dragonBones/egret/EgretSlot.ts", + "./src/dragonBones/egret/EgretFactory.ts" + ] +} \ No newline at end of file diff --git a/reference/Egret/5.x/tslint.json b/reference/Egret/5.x/tslint.json new file mode 100644 index 0000000..eeb58d1 --- /dev/null +++ b/reference/Egret/5.x/tslint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "no-unused-expression": true, + "no-unreachable": true, + "no-duplicate-variable": true, + "no-duplicate-key": true, + "no-unused-variable": true, + "curly": false, + "class-name": true, + "triple-equals": true, + "semicolon": [ + true + ] + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/.wing/launch.json b/reference/Egret/Demos/.wing/launch.json new file mode 100644 index 0000000..2c157d6 --- /dev/null +++ b/reference/Egret/Demos/.wing/launch.json @@ -0,0 +1,30 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Wing 内置播放器调试", + "type": "chrome", + "request": "launch", + "file": "index.html", + //"url": "http://mysite.com/index.html", + "runtimeExecutable": "${execPath}", + "sourceMaps": true, + "webRoot": "${workspaceRoot}", + "preLaunchTask":"build", + "port":5010 + }, + { + "name": "使用本机 Chrome 调试", + "type": "chrome", + "request": "launch", + "file": "index.html", + //"url": "http://mysite.com/index.html", + "runtimeExecutable": "", + "sourceMaps": true, + "webRoot": "${workspaceRoot}", + "preLaunchTask":"build", + "userDataDir":"${tmpdir}", + "port":5010 + } + ] +} \ No newline at end of file diff --git a/reference/Egret/Demos/.wing/settings.json b/reference/Egret/Demos/.wing/settings.json new file mode 100644 index 0000000..ccdda08 --- /dev/null +++ b/reference/Egret/Demos/.wing/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.check.workspaceVersion": false +} \ No newline at end of file diff --git a/reference/Egret/Demos/.wing/tasks.json b/reference/Egret/Demos/.wing/tasks.json new file mode 100644 index 0000000..efae716 --- /dev/null +++ b/reference/Egret/Demos/.wing/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "0.1.0", + "command": "egret", + "isShellCommand": true, + "tasks": [ + { + "taskName": "build", + "showOutput": "always", + "args": [ + "build", + "-sourcemap" + ], + "problemMatcher": "$tsc" + }, + { + "taskName": "clean", + "showOutput": "always", + "args": [ + "build", + "-e" + ], + "problemMatcher": "$tsc" + }, + { + "taskName": "publish", + "showOutput": "always", + "args": [ + "publish" + ], + "problemMatcher": "$tsc" + } + ] +} \ No newline at end of file diff --git a/reference/Egret/Demos/README.md b/reference/Egret/Demos/README.md new file mode 100644 index 0000000..1fb3a4c --- /dev/null +++ b/reference/Egret/Demos/README.md @@ -0,0 +1,4 @@ +## How to run +1. Make sure you have installed Egret Wing(3.0) and EgretLauncher (installed Egret engine such as 5.0.4). +2. Open the demo with Egret wing. +3. Build project and have fun. \ No newline at end of file diff --git a/reference/Egret/Demos/egretProperties.json b/reference/Egret/Demos/egretProperties.json new file mode 100644 index 0000000..d56e463 --- /dev/null +++ b/reference/Egret/Demos/egretProperties.json @@ -0,0 +1,27 @@ +{ + "native": { + "path_ignore": [] + }, + "publish": { + "web": 0, + "native": 1, + "path": "bin-release" + }, + "egret_version": "5.0.2", + "modules": [ + { + "name": "egret" + }, + { + "name": "dragonBones", + "path": "../4.x/out/" + }, + { + "name": "res" + }, + { + "name": "promise", + "path": "./libs/promise/" + } + ] +} \ No newline at end of file diff --git a/reference/Egret/Demos/index.html b/reference/Egret/Demos/index.html new file mode 100644 index 0000000..bda5bcd --- /dev/null +++ b/reference/Egret/Demos/index.html @@ -0,0 +1,88 @@ + + + + + + Egret + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/animation_base_test_ske.json b/reference/Egret/Demos/resource/assets/animation_base_test_ske.json new file mode 100644 index 0000000..067c964 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/animation_base_test_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"aabb":{"width":611,"y":-82.37399983406067,"height":97.37399983406067,"x":-300},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"idle"}],"skin":[{"name":"","slot":[{"display":[{"path":"_texture/track","type":"image","name":"_texture/track","transform":{}}],"name":"track"},{"display":[{"path":"_texture/thrmb","type":"image","name":"_texture/thrmb","transform":{"x":-33}}],"name":"thrmb"},{"display":[{"transform":{"skX":-0.8115,"skY":-0.8115},"path":"loading","type":"armature","name":"loading","filterType":"armature"}],"name":"loading"},{"display":[{"path":"_texture/bar","type":"image","name":"_texture/bar","transform":{"x":300}}],"name":"bar"}]}],"bone":[{"name":"root","transform":{}},{"inheritScale":0,"transform":{},"name":"track","parent":"root"},{"inheritScale":0,"transform":{"x":-300},"name":"bar","parent":"root"},{"inheritScale":0,"transform":{"x":300},"name":"thrmb","parent":"root"},{"transform":{"skX":0.8115,"y":-50,"skY":0.8115},"name":"loading","parent":"root"}],"slot":[{"name":"track","parent":"track","color":{}},{"z":1,"name":"bar","parent":"bar","color":{}},{"z":2,"name":"thrmb","parent":"thrmb","color":{}},{"z":3,"name":"loading","parent":"loading","color":{}}],"animation":[{"frame":[{"duration":50,"tweenEasing":null,"events":[{"name":"startEvent"}]},{"duration":50,"tweenEasing":null,"events":[{"name":"middleEvent"}]},{"duration":0,"tweenEasing":null,"events":[{"name":"completeEvent"}]}],"duration":100,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"track"},{"frame":[{"transform":{"scX":0.01},"tweenEasing":0,"duration":100},{"transform":{},"tweenEasing":null,"duration":0}],"name":"bar"},{"frame":[{"transform":{"scX":0.5,"scY":0.5,"x":-600},"tweenEasing":0,"duration":5},{"transform":{"x":-565},"tweenEasing":0,"duration":90},{"transform":{"x":-30},"tweenEasing":0,"duration":5},{"transform":{"scX":0.5,"scY":0.5},"tweenEasing":null,"duration":0}],"name":"thrmb"},{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"root"},{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"loading"}],"slot":[{"frame":[{"tweenEasing":null,"duration":100}],"name":"track"},{"frame":[{"tweenEasing":null,"duration":100}],"name":"bar"},{"frame":[{"color":{"aM":0},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":90},{"tweenEasing":0,"duration":5},{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"thrmb"},{"frame":[{"duration":100,"actions":[{"gotoAndPlay":"idle"}],"tweenEasing":0},{"duration":0,"actions":[{"gotoAndPlay":"hide"}],"tweenEasing":null}],"name":"loading"}],"ffd":[],"name":"idle"}],"frameRate":24,"name":"progressBar"},{"aabb":{"width":108,"y":-51.950005000000004,"height":104,"x":-54},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"idle"}],"skin":[{"name":"","slot":[{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"1"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"3"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"4"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"6"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"5"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"2"}]}],"bone":[{"name":"root","transform":{}},{"inheritScale":0,"transform":{"y":-11,"scX":0.3329,"scY":0.3333,"x":-19},"name":"6","parent":"root"},{"inheritScale":0,"transform":{"y":11,"scX":0.3329,"scY":0.3333,"x":-19},"name":"5","parent":"root"},{"inheritScale":0,"transform":{"y":22,"scX":0.3329,"scY":0.3333},"name":"4","parent":"root"},{"inheritScale":0,"transform":{"y":11,"scX":0.3329,"scY":0.3333,"x":19},"name":"3","parent":"root"},{"inheritScale":0,"transform":{"y":-11,"scX":0.3329,"scY":0.3333,"x":19},"name":"2","parent":"root"},{"inheritScale":0,"transform":{"y":-22,"scX":0.3329,"scY":0.3333},"name":"1","parent":"root"}],"slot":[{"name":"6","parent":"6","color":{}},{"z":1,"name":"5","parent":"5","color":{}},{"z":2,"name":"4","parent":"4","color":{}},{"z":3,"name":"3","parent":"3","color":{}},{"z":4,"name":"2","parent":"2","color":{}},{"z":5,"name":"1","parent":"1","color":{}}],"animation":[{"playTimes":0,"frame":[],"duration":30,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":30}],"name":"root"},{"frame":[{"transform":{"y":-2,"x":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-2,"x":-4},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":3,"x":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"transform":{},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":2,"x":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-2,"x":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":null,"duration":0}],"name":"1"}],"slot":[{"frame":[{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":0,"duration":20},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":20},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":15},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":5}],"name":"4"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":10},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":10}],"name":"3"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":15}],"name":"2"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":20}],"name":"1"}],"ffd":[],"name":"idle","fadeInTime":0.2},{"playTimes":0,"frame":[],"duration":0,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":0}],"name":"root"},{"frame":[{"transform":{"y":11,"x":19},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"transform":{"y":-11,"x":19},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"transform":{"y":-22},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"transform":{"y":-11,"x":-19},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"transform":{"y":11,"x":-19},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"transform":{"y":22},"tweenEasing":null,"duration":0}],"name":"1"}],"slot":[{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"1"}],"ffd":[],"name":"hide","fadeInTime":0.2}],"frameRate":24,"name":"loading"}],"name":"AnimationBaseTest","version":"5.0"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/animation_base_test_tex.json b/reference/Egret/Demos/resource/assets/animation_base_test_tex.json new file mode 100644 index 0000000..e53778e --- /dev/null +++ b/reference/Egret/Demos/resource/assets/animation_base_test_tex.json @@ -0,0 +1 @@ +{"imagePath":"animation_base_test_tex.png","width":1024,"SubTexture":[{"width":600,"y":1,"height":4,"name":"_texture/track","x":73},{"width":600,"y":7,"height":4,"name":"_texture/bar","x":73},{"width":88,"y":1,"height":30,"name":"_texture/thrmb","x":675},{"width":70,"y":1,"height":60,"name":"_texture/_diamond","x":1}],"height":64,"name":"AnimationBaseTest"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/animation_base_test_tex.png b/reference/Egret/Demos/resource/assets/animation_base_test_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..f24f5ee4109e073df7c9df61cd6f4bf57551c879 GIT binary patch literal 6700 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 bGdVBi``3gCs968_Gsxo9S(D0>@aX>oe`W`p literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_ske.json b/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_ske.json new file mode 100644 index 0000000..8d98c7e --- /dev/null +++ b/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_ske.json @@ -0,0 +1,7232 @@ +{ + "frameRate": 24, + "isGlobal": 0, + "armature": [ + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "bullet_01_f/bullet_01", + "transform": { + "x": -27 + } + } + ], + "name": "b" + } + ] + } + ], + "bone": [ + { + "inheritScale": 0, + "length": 20, + "name": "b", + "transform": {} + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 74, + "y": -10, + "height": 20, + "x": -64 + }, + "slot": [ + { + "name": "b", + "parent": "b", + "color": { + "aM": 50 + } + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "bullet_01", + "ik": [], + "animation": [ + { + "duration": 4, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 4, + "transform": { + "scX": 0.1, + "scY": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "scX": 1.8 + }, + "tweenEasing": null + } + ], + "name": "b" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 4, + "tweenEasing": 0, + "color": { + "aM": 50 + } + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "b" + } + ], + "name": "idle" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "fire_effect_01_f/fireEffect", + "transform": { + "scX": 1.5, + "x": 21 + } + } + ], + "name": "root" + } + ] + } + ], + "bone": [ + { + "inheritScale": 0, + "length": 30, + "name": "root", + "transform": {} + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 48, + "y": -19, + "height": 38, + "x": -3 + }, + "slot": [ + { + "name": "root", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "fire_effect_01", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "name": "idle" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "flame_01_f/bbb", + "transform": { + "skX": -90, + "skY": -90, + "x": 95 + } + } + ], + "blendMode": "add", + "name": "b2" + }, + { + "display": [ + { + "type": "image", + "name": "flame_01_f/ba_bu_flame1", + "transform": { + "y": 85, + "skX": -90, + "skY": -90 + } + } + ], + "name": "b1" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "length": 30, + "transform": { + "skX": 90, + "skY": 90 + }, + "parent": "root", + "inheritScale": 0, + "name": "b2" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 180, + "y": -22, + "height": 234, + "x": -90 + }, + "slot": [ + { + "name": "b1", + "parent": "root", + "color": {} + }, + { + "blendMode": "add", + "z": 1, + "parent": "b2", + "name": "b2", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "flame_01", + "ik": [], + "animation": [ + { + "duration": 2, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "b2" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": 0 + }, + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 30 + } + } + ], + "name": "b2" + } + ], + "name": "idle", + "playTimes": 0 + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/calf_r", + "transform": { + "y": 2.05, + "skX": 0.1784, + "skY": 0.1784, + "x": 16.95 + } + } + ], + "name": "calf_r" + }, + { + "display": [ + { + "transform": { + "skX": -90, + "skY": -90, + "scX": 0.8, + "scY": 0.8 + }, + "type": "armature", + "name": "flame_01", + "filterType": null + } + ], + "name": "effects_f" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/foot_l_0", + "transform": { + "y": 6.4707, + "skX": 89.9982, + "skY": 89.9982, + "scX": 0.9955, + "scY": 1.0045, + "x": 0.0002 + } + } + ], + "name": "foot_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/shouder_r_1", + "transform": { + "y": -3.0591, + "skX": -50.3304, + "skY": -50.3127, + "scX": 0.9998, + "scY": 1.0002, + "x": 1.8548 + } + } + ], + "name": "shouder_r" + }, + { + "display": [ + { + "transform": { + "skX": -90, + "skY": -90 + }, + "type": "armature", + "name": "flame_01", + "filterType": null + } + ], + "name": "effects_b" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/calf_l", + "transform": { + "y": 0.95, + "skX": -0.1967, + "skY": -0.1976, + "x": 15 + } + } + ], + "name": "calf_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_1_r_1", + "transform": { + "y": -1.9, + "skX": 0.438, + "skY": 0.438, + "x": 21.55 + } + } + ], + "name": "thigh_1_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/pelvis", + "transform": { + "y": 7.5, + "x": 3.5 + } + } + ], + "name": "pelvis" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/shouder_l_0", + "transform": { + "y": -3.2345, + "skX": 129.6702, + "skY": 129.6875, + "scX": 0.9998, + "scY": 1.0002, + "x": 0.7822 + } + } + ], + "name": "shouder_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_r", + "transform": { + "y": -11.55, + "skX": -0.1635, + "skY": -0.1626, + "x": 12.45 + } + } + ], + "name": "thigh_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/chest", + "transform": { + "y": 29.4658, + "skX": 89.9994, + "skY": 90.0004, + "x": -17.0277 + } + } + ], + "name": "chest" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_1_l_0", + "transform": { + "y": -2.95, + "skX": 0.1119, + "skY": 0.1128, + "x": 23 + } + } + ], + "name": "thigh_1_l" + }, + { + "display": [ + { + "transform": {}, + "type": "armature", + "name": "weapon_1502b_r", + "filterType": null + } + ], + "name": "weapon_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/foot_r", + "transform": { + "y": 7.4165, + "skX": 89.9982, + "skY": 89.9982, + "scX": 0.9955, + "scY": 1.0045, + "x": -0.502 + } + } + ], + "name": "foot_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_l", + "transform": { + "y": -5.55, + "skX": 0.0463, + "skY": 0.0455, + "x": 13.45 + } + } + ], + "name": "thigh_l" + }, + { + "display": [ + { + "transform": {}, + "type": "armature", + "name": "weapon_1502b_l", + "filterType": null + } + ], + "name": "weapon_l" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "length": 20, + "transform": { + "y": -25, + "scX": 0.9955, + "x": 62.85 + }, + "parent": "root", + "inheritScale": 0, + "name": "foot_l" + }, + { + "length": 40, + "transform": { + "y": -133.55, + "skX": 21.9887, + "skY": 21.9887, + "scX": 0.9995, + "scY": 0.9977, + "x": 8.3 + }, + "parent": "root", + "inheritScale": 0, + "name": "thigh_l" + }, + { + "length": 42, + "transform": { + "y": -112.45, + "skX": 69.8809, + "skY": 69.8854, + "scX": 0.9876, + "scY": 0.9979, + "x": -8.55 + }, + "parent": "root", + "inheritScale": 0, + "name": "thigh_r" + }, + { + "length": 20, + "transform": { + "y": -123.15, + "skX": -89.9991, + "skY": -89.9991 + }, + "parent": "root", + "inheritScale": 0, + "name": "pelvis" + }, + { + "length": 20, + "transform": { + "y": -4, + "scX": 0.9955, + "x": -43.8 + }, + "parent": "root", + "inheritScale": 0, + "name": "foot_r" + }, + { + "length": 50, + "transform": { + "y": -0.04, + "skX": 97.9614, + "skY": 97.9621, + "scX": 0.9894, + "scY": 0.9971, + "x": 40.11 + }, + "parent": "thigh_l", + "inheritScale": 0, + "name": "thigh_1_l" + }, + { + "length": 20, + "transform": { + "skX": -90, + "skY": -90, + "x": 13.75 + }, + "parent": "pelvis", + "inheritScale": 0, + "name": "chest" + }, + { + "length": 53, + "transform": { + "y": -0.01, + "skX": 105.4235, + "skY": 105.423, + "scX": 0.9984, + "scY": 0.9995, + "x": 41.52 + }, + "parent": "thigh_r", + "inheritScale": 0, + "name": "thigh_1_r" + }, + { + "length": 20, + "transform": { + "y": 31.28, + "scX": 0.9965, + "scY": 0.9969, + "x": 13.74 + }, + "parent": "chest", + "inheritScale": 0, + "name": "shouder_r" + }, + { + "length": 20, + "transform": { + "y": 46.59, + "scX": 0.9965, + "scY": 0.9969, + "x": -2.41 + }, + "parent": "chest", + "inheritScale": 0, + "name": "shouder_l" + }, + { + "inheritRotation": 0, + "length": 100, + "transform": { + "y": 3.13, + "skX": 130, + "skY": 130, + "x": 11.65 + }, + "parent": "chest", + "inheritScale": 0, + "name": "effects_b" + }, + { + "length": 64, + "transform": { + "y": 0.01, + "skX": -70.8583, + "skY": -70.864, + "scX": 1.0149, + "scY": 0.9967, + "x": 50.91 + }, + "parent": "thigh_1_l", + "inheritScale": 0, + "name": "calf_l" + }, + { + "inheritRotation": 0, + "length": 100, + "transform": { + "y": -13.37, + "skX": 90, + "skY": 90, + "x": -20.82 + }, + "parent": "chest", + "inheritScale": 0, + "name": "effects_f" + }, + { + "length": 66, + "transform": { + "y": -0.02, + "skX": -88.4874, + "skY": -88.4933, + "scX": 0.9852, + "scY": 0.9996, + "x": 53.26 + }, + "parent": "thigh_1_r", + "inheritScale": 0, + "name": "calf_r" + }, + { + "length": 100, + "transform": { + "skX": 180, + "skY": 180, + "scX": 0.9982, + "scY": 0.9994, + "x": 5.98 + }, + "parent": "shouder_r", + "inheritScale": 0, + "name": "weapon_r" + }, + { + "length": 100, + "transform": { + "y": 0.04, + "skX": 180, + "skY": 180, + "scX": 0.998, + "scY": 0.9993, + "x": 5.6 + }, + "parent": "shouder_l", + "inheritScale": 0, + "name": "weapon_l" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 202.6571337556091, + "y": -262.3655325241823, + "height": 320.2820325241823, + "x": -111.39678584090109 + }, + "slot": [ + { + "name": "weapon_l", + "parent": "weapon_l", + "color": {} + }, + { + "z": 1, + "name": "shouder_l", + "parent": "shouder_l", + "color": {} + }, + { + "z": 2, + "name": "foot_l", + "parent": "foot_l", + "color": {} + }, + { + "z": 3, + "name": "thigh_1_l", + "parent": "thigh_1_l", + "color": {} + }, + { + "z": 4, + "name": "calf_l", + "parent": "calf_l", + "color": {} + }, + { + "z": 5, + "name": "thigh_l", + "parent": "thigh_l", + "color": {} + }, + { + "z": 6, + "name": "pelvis", + "parent": "pelvis", + "color": {} + }, + { + "z": 7, + "name": "effects_f", + "parent": "effects_f", + "color": { + "aM": 0 + } + }, + { + "z": 8, + "name": "chest", + "parent": "chest", + "color": {} + }, + { + "z": 9, + "name": "effects_b", + "parent": "effects_b", + "color": { + "aM": 0 + } + }, + { + "z": 10, + "name": "foot_r", + "parent": "foot_r", + "color": {} + }, + { + "z": 11, + "name": "thigh_1_r", + "parent": "thigh_1_r", + "color": {} + }, + { + "z": 12, + "name": "calf_r", + "parent": "calf_r", + "color": {} + }, + { + "z": 13, + "name": "thigh_r", + "parent": "thigh_r", + "color": {} + }, + { + "z": 14, + "name": "shouder_r", + "parent": "shouder_r", + "color": {} + }, + { + "z": 15, + "name": "weapon_r", + "parent": "weapon_r", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "mecha_1502b", + "ik": [ + { + "bone": "calf_l", + "chain": 1, + "bendPositive": "false", + "name": "calf_l", + "target": "foot_l" + }, + { + "bone": "calf_r", + "chain": 1, + "bendPositive": "false", + "name": "calf_r", + "target": "foot_r" + } + ], + "animation": [ + { + "duration": 60, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -0.04, + "skY": 0.0009, + "scX": 1.0004, + "x": -0.01 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -0.61, + "skX": 3.5176, + "skY": 3.5176, + "x": -0.46 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -3.95, + "skX": 3.2612, + "skY": 3.2619, + "scX": 1.0008, + "scY": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -4 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "skX": -3.4867, + "skY": -3.5176, + "scX": 0.9996, + "scY": 1.0027 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -4.05, + "skX": 2.2559, + "skY": 2.2558, + "scX": 0.9985, + "scY": 1.0002 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": 0.55, + "skX": 3.5176, + "skY": 3.5176, + "x": 0.49 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": 0.06, + "skY": -0.0009, + "scX": 1.0002, + "x": 0.01 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.2, + "name": "idle", + "playTimes": 0 + }, + { + "duration": 30, + "frame": [ + { + "duration": 14, + "tweenEasing": null + }, + { + "duration": 16, + "tweenEasing": null, + "events": [ + { + "name": "step", + "bone": "foot_r" + } + ] + }, + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "step" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.21, + "skX": -13.2798, + "skY": -13.279, + "x": 0.32 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.2, + "skX": -12.4984, + "skY": -12.4984, + "scX": 0.9998, + "x": 0.25 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.28, + "skX": -12.29, + "skY": -12.2892, + "scX": 0.9997, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.21, + "skX": -16.0776, + "skY": -16.0767, + "scX": 0.9996, + "scY": 0.9998, + "x": 0.33 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.14, + "skX": -15.1996, + "skY": -15.1996, + "scX": 0.9997, + "x": 0.52 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.15, + "skX": -13.4429, + "skY": -13.442, + "x": 0.87 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.21, + "skX": -13.2798, + "skY": -13.279, + "x": 0.32 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -0.49, + "skX": 11.6982, + "skY": 10.0384, + "scX": 1.1315, + "scY": 1.0017, + "x": -1.93 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -1.58, + "skX": 9.3988, + "skY": 9.2902, + "scX": 1.0079, + "x": -0.43 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -2.37, + "skX": 8.1528, + "skY": 9.1018, + "scX": 0.9313, + "scY": 0.9988, + "x": 0.46 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.99, + "skX": 13.6189, + "skY": 13.1293, + "scX": 1.037, + "scY": 1.0004, + "x": -1.3 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.1, + "skX": 14.9031, + "skY": 12.4457, + "scX": 1.2006, + "scY": 1.0028, + "x": -3.33 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 1.08, + "skX": 13.1082, + "skY": 10.6515, + "scX": 1.2005, + "scY": 1.0028, + "x": -3.69 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.49, + "skX": 11.6982, + "skY": 10.0384, + "scX": 1.1315, + "scY": 1.0017, + "x": -1.93 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.3, + "scX": 0.999, + "x": 16.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.3, + "scX": 0.9981, + "x": 12.15 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -1.15, + "scX": 0.9994, + "x": -7.15 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -2.5, + "scX": 1.0021, + "x": -39.35 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -5.1, + "skX": 1.0018, + "skY": 1.0018, + "scX": 1.0028, + "x": -81.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -10.25, + "skX": 8.0065, + "skY": 8.0073, + "scX": 0.9898, + "scY": 0.9991, + "x": -102.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -13.45, + "skX": 14.0174, + "skY": 14.0174, + "scX": 1.0146, + "scY": 0.9985, + "x": -108.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -20.4, + "skX": 28.3082, + "skY": 28.3075, + "scX": 0.9856, + "scY": 0.9973, + "x": -111.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -29.65, + "skX": 37.8443, + "skY": 37.847, + "scX": 0.9987, + "scY": 0.9968, + "x": -86.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -33.25, + "skX": 38.3489, + "skY": 38.3494, + "scX": 1.0058, + "scY": 0.9968, + "x": -71.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -35.1, + "skX": 26.0511, + "skY": 26.0511, + "scX": 1.004, + "scY": 0.9974, + "x": -49.45 + }, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -33.55, + "skX": 18.2766, + "skY": 18.2774, + "scX": 1.0066, + "scY": 0.998, + "x": -39.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -12.45, + "skX": -15.7668, + "skY": -15.7676, + "scX": 1.0049, + "scY": 0.9982, + "x": 14.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.3, + "scX": 0.999, + "x": 16.75 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -10.85, + "skX": 1.7556, + "skY": 1.7583, + "scX": 1.0008, + "x": -4.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.8, + "skX": 8.7821, + "skY": 8.7805, + "scX": 0.9991, + "scY": 0.9994, + "x": -5.75 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -8.05, + "skX": 15.0552, + "skY": 15.0559, + "scX": 0.9974, + "scY": 0.9992, + "x": -7.55 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -17.85, + "skX": 28.8664, + "skY": 28.8666, + "scX": 0.9897, + "scY": 0.9991, + "x": -10.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -24.1, + "skX": 47.6881, + "skY": 47.6814, + "scX": 0.9656, + "scY": 1.0002, + "x": -15.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -14.5, + "skX": 56.4569, + "skY": 56.4521, + "scX": 0.9566, + "scY": 1.001, + "x": -15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -10.05, + "skX": 54.9538, + "skY": 54.9501, + "scX": 0.9602, + "scY": 1.0009, + "x": -15.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 1.6, + "skX": 48.189, + "skY": 48.1838, + "scX": 0.9672, + "scY": 1.0002, + "x": -14.9 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.85, + "skX": 39.9103, + "skY": 39.9075, + "scX": 0.9635, + "scY": 0.9996, + "x": -14.4 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.75, + "skX": 32.1298, + "skY": 32.1271, + "scX": 0.971, + "scY": 0.9992, + "x": -13.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -6.1, + "skX": 12.5454, + "skY": 12.5447, + "scX": 0.993, + "scY": 0.9993, + "x": -11.95 + }, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -9.45, + "skX": 5.0166, + "skY": 5.0169, + "scX": 0.9989, + "scY": 0.9996, + "x": -10.85 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -15.3, + "skX": -4.2618, + "skY": -4.2608, + "scX": 1.0018, + "scY": 1.0004, + "x": -4.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -10.85, + "skX": 1.7556, + "skY": 1.7583, + "scX": 1.0008, + "x": -4.15 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -11.35, + "skX": 8.7547, + "skY": 8.7549, + "scX": 0.9864, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -6.75, + "skX": 8.5031, + "skY": 8.5048, + "scX": 0.9816, + "scY": 0.999, + "x": -9.3 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -16.4, + "skX": 8.7549, + "skY": 8.7555, + "scX": 0.984, + "scY": 0.999, + "x": -8.75 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -11.35, + "skX": 9.0056, + "skY": 9.0057, + "scX": 1.0044, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -2.3, + "skX": 9.2556, + "skY": 9.2542, + "scX": 1.0118, + "scY": 0.999, + "x": -12.45 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -9.95, + "skX": 9.5045, + "skY": 9.5052, + "scX": 1.0123, + "scY": 0.9989, + "x": -12.45 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -11.35, + "skX": 8.7547, + "skY": 8.7549, + "scX": 0.9864, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -0.18, + "skX": -5.5, + "skY": -5.5135, + "scX": 0.9997, + "scY": 1.001, + "x": -0.09 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.05, + "skX": -5.2163, + "skY": -5.2966, + "scX": 0.9997, + "scY": 1.0072, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.03, + "skX": -5.4472, + "skY": -5.5673, + "scX": 0.9998, + "scY": 1.0109, + "x": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.01, + "skX": -5.9558, + "skY": -6.0573, + "scX": 0.9997, + "scY": 1.0092, + "x": 0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.12, + "skX": -6.5087, + "skY": -6.5003, + "scX": 0.9997, + "scY": 0.9991, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -0.25, + "skX": -6.7986, + "skY": -6.7138, + "scX": 0.9996, + "scY": 0.992, + "x": -0.27 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.18, + "skX": -5.5, + "skY": -5.5135, + "scX": 0.9997, + "scY": 1.001, + "x": -0.09 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.4, + "skX": 7.0054, + "skY": 7.0071, + "scX": 0.9748, + "scY": 0.9992, + "x": -16.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -17.5, + "skX": 28.5597, + "skY": 28.5583, + "scX": 1.0043, + "scY": 0.9972, + "x": -20.95 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -24.25, + "skX": 21.5371, + "skY": 21.5363, + "scX": 1.0169, + "scY": 0.9977, + "x": 2.05 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -26.2, + "skX": 16.5221, + "skY": 16.5229, + "scX": 1.0189, + "scY": 0.9982, + "x": 15.95 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -30.85, + "skX": 11.2628, + "skY": 11.2628, + "scX": 1.0148, + "scY": 0.9987, + "x": 43.9 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -30.5, + "skX": 8.2592, + "skY": 8.2575, + "scX": 1.0131, + "scY": 0.9991, + "x": 56 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -6.25, + "skX": -15.0159, + "skY": -15.0143, + "scX": 1.017, + "scY": 0.9984, + "x": 101.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 7.85, + "skX": -1.25, + "skY": -1.2509, + "scX": 1.0029, + "scY": 0.9998, + "x": 102.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 7.8, + "skX": -0.625, + "skY": -0.6254, + "scX": 1.0016, + "x": 101.125 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 7.75, + "scX": 1.0003, + "x": 99.65 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 7.05, + "skX": 0.0035, + "skY": 0.0035, + "scX": 0.9988, + "x": 76.2 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 6.35, + "scX": 0.9979, + "x": 50.75 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 4.35, + "skX": 0.7527, + "skY": 0.7518, + "scX": 0.9933, + "x": 7.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.4, + "skX": 7.0054, + "skY": 7.0071, + "scX": 0.9748, + "scY": 0.9992, + "x": -16.75 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -11.8, + "skX": 23.2823, + "skY": 23.2807, + "scX": 1.0012, + "scY": 1.0018, + "x": -17.1 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.75, + "skX": 12.2765, + "skY": 12.2735, + "scX": 1.0078, + "scY": 1.0012, + "x": -14.2 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -5.4, + "skX": 5.5145, + "skY": 5.5127, + "scX": 1.0083, + "scY": 1.0005, + "x": -11.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -8.25, + "skX": -1.0013, + "skY": -1.0056, + "scX": 1.0099, + "scY": 0.9998, + "x": -9.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -14.85, + "skX": -15.3018, + "skY": -15.3079, + "scX": 1.0115, + "scY": 0.999, + "x": -6.85 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -18.05, + "skX": -21.8297, + "skY": -21.8354, + "scX": 1.0114, + "scY": 0.9988, + "x": -5.75 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -21.25, + "skX": -32.626, + "skY": -32.632, + "scX": 1.0082, + "scY": 0.999, + "x": -3.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -17, + "skX": -20.5755, + "skY": -20.5791, + "scX": 1.0115, + "scY": 0.9988, + "x": -4.5 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -12.7, + "skX": -15.0502, + "skY": -15.0562, + "scX": 1.0109, + "scY": 0.999, + "x": -5.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -6.3, + "skX": -20.0717, + "skY": -20.0779, + "scX": 1.0114, + "scY": 0.9989, + "x": -6.7 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -5.55, + "skX": -19.0685, + "skY": -19.0725, + "scX": 1.0093, + "scY": 0.9989, + "x": -10.45 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -13.95, + "skX": -5.767, + "skY": -5.77, + "scX": 1.0024, + "scY": 0.9995, + "x": -13 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -22.55, + "skX": 15.5262, + "skY": 15.5271, + "scX": 0.9958, + "scY": 1.0016, + "x": -16.3 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -11.8, + "skX": 23.2823, + "skY": 23.2807, + "scX": 1.0012, + "scY": 1.0018, + "x": -17.1 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.66, + "skX": 9.4644, + "skY": 9.6617, + "scX": 0.9857, + "scY": 0.9996, + "x": 1.86 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 1.24, + "skX": 6.8557, + "skY": 8.4041, + "scX": 0.8951, + "scY": 0.9983, + "x": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 1.82, + "skX": 5.8718, + "skY": 7.4208, + "scX": 0.8951, + "scY": 0.9983, + "x": -0.57 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 1.85, + "skX": 11.6349, + "skY": 13.1834, + "scX": 0.8952, + "scY": 0.9984, + "x": 1.19 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.6, + "skX": 13.0119, + "skY": 12.1388, + "scX": 1.0644, + "scY": 1.0008, + "x": 3.01 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -0.16, + "skX": 11.7217, + "skY": 9.922, + "scX": 1.1373, + "scY": 1.0019, + "x": 3.6 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.66, + "skX": 9.4644, + "skY": 9.6617, + "scX": 0.9857, + "scY": 0.9996, + "x": 1.86 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.27, + "skX": -12.9031, + "skY": -12.9031, + "scX": 0.9997, + "x": 0.2 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.3, + "skX": -11.6123, + "skY": -11.6123, + "scX": 0.9996, + "scY": 0.9998, + "x": -0.16 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.42, + "skX": -10.609, + "skY": -10.6081, + "scX": 0.9995, + "scY": 0.9998, + "x": -0.9 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.35, + "skX": -16.1317, + "skY": -16.1317, + "scX": 0.9993, + "scY": 0.9998, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.17, + "skX": -14.8927, + "skY": -14.8927, + "scX": 0.9995, + "scY": 0.9998, + "x": 0.41 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.19, + "skX": -12.7133, + "skY": -12.7133, + "scX": 0.9996, + "x": 0.41 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.27, + "skX": -12.9031, + "skY": -12.9031, + "scX": 0.9997, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.2, + "name": "walk", + "playTimes": 0 + }, + { + "duration": 3, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.08, + "skX": -0.0054, + "skY": -0.0046, + "scX": 1.002, + "scY": 1.0006, + "x": 0.19 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.1, + "skX": -0.0054, + "skY": -0.0046, + "scX": 1.002, + "scY": 1.0006, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.48, + "skX": 4.4951, + "skY": 4.5075, + "scX": 1.0004, + "scY": 1.0015, + "x": -0.78 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.86, + "skX": 7.4976, + "skY": 7.5101, + "scX": 1.0004, + "scY": 1.0015, + "x": -1.1 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 13.534, + "skX": -7.269, + "skY": -7.269, + "scX": 0.9988, + "scY": 1.0015, + "x": -17.524 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 15.434, + "skX": -7.269, + "skY": -7.269, + "scX": 0.9988, + "scY": 1.0015, + "x": -17.524 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 13.834, + "skX": -1.7543, + "skY": -1.7543, + "scX": 0.9998, + "x": -17.574 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 15.734, + "skX": -1.7543, + "skY": -1.7543, + "scX": 0.9998, + "x": -17.574 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.1, + "skX": -4.5063, + "skY": -4.5021, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.05 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.33, + "skX": -5.7548, + "skY": -5.7494, + "scX": 0.9996, + "scY": 0.9992, + "x": -0.03 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 14.134, + "skX": 8.2707, + "skY": 8.2663, + "scX": 1.0112, + "scY": 1.0015, + "x": -17.674 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 16.034, + "skX": 8.2707, + "skY": 8.2663, + "scX": 1.0112, + "scY": 1.0015, + "x": -17.674 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.37, + "skX": 4.4953, + "skY": 4.5082, + "scX": 1.0005, + "scY": 1.0015, + "x": 0.66 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.89, + "skX": 7.4979, + "skY": 7.5107, + "scX": 1.0005, + "scY": 1.0015, + "x": 1.13 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.05, + "skX": -0.0061, + "skY": -0.0061, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.15 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.06, + "skX": -0.0061, + "skY": -0.0061, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.2, + "name": "attack_01", + "playTimes": 5 + }, + { + "duration": 9, + "frame": [ + { + "duration": 4, + "tweenEasing": null + }, + { + "duration": 5, + "tweenEasing": null, + "events": [ + { + "name": "step", + "bone": "foot_l" + } + ] + }, + { + "duration": 0, + "action": "attack_02_1", + "tweenEasing": null + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.19, + "skY": 0.0009, + "scX": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.19, + "skY": 0.0009, + "scX": 1.0011, + "scY": 1.0003, + "x": 0.37 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.34 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.27, + "skX": 6.0331, + "skY": 6.0331, + "x": -0.86 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.89, + "skX": 4.524, + "skY": 4.524, + "x": -1.17 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.16, + "skX": 0.0044, + "skY": 0.0044, + "x": -0.45 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -15.75, + "x": -60.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -28.65, + "skX": 47.9363, + "skY": 47.934, + "scX": 0.9793, + "scY": 1.0002, + "x": -19.85 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -17.3, + "skX": 92.2581, + "skY": 92.2557, + "scX": 0.9465, + "x": -39.65 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 18.95, + "skX": 48.1876, + "skY": 48.1844, + "scX": 0.9767, + "scY": 1.0002, + "x": -55.2 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 19.15, + "x": -56 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.55, + "skX": -5.9764, + "skY": -6.0331, + "scX": 0.9994, + "scY": 1.0047, + "x": 35.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.1, + "skX": -4.4827, + "skY": -4.524, + "scX": 0.9995, + "scY": 1.0035, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.1, + "skX": -0.0026, + "skY": -0.0044, + "scY": 1.0002, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -29.5, + "skX": 9.5199, + "skY": 9.5204, + "scX": 0.9925, + "scY": 1.0009, + "x": -20.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 19.4, + "skX": -35.3872, + "skY": -35.392, + "scX": 1.0113, + "scY": 0.999, + "x": -56.8 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 1.38, + "skX": 6.0331, + "skY": 6.0331, + "x": 1.16 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.32, + "skX": 4.524, + "skY": 4.524, + "x": 1.44 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.43, + "skX": 0.0044, + "skY": 0.0044, + "x": 0.93 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.23, + "skY": -0.0009, + "scX": 0.9996, + "scY": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.22, + "scX": 1.0008, + "scY": 1.0003, + "x": 0.38 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.24, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.37 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 9, + "actions": [ + { + "gotoAndPlay": "prepare_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 9, + "actions": [ + { + "gotoAndPlay": "prepare_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.2, + "name": "attack_02" + }, + { + "duration": 3, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.34 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "action": "fire_01", + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.33 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.16, + "skX": 0.0044, + "skY": 0.0044, + "x": -0.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.72, + "skX": 3.5184, + "skY": 3.5184, + "x": -0.9 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 18.95, + "skX": 48.1876, + "skY": 48.1844, + "scX": 0.9767, + "scY": 1.0002, + "x": -55.2 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22, + "skX": 46.6831, + "skY": 46.6806, + "scX": 0.9778, + "x": -56.4 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 19.15, + "x": -56 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22.25, + "x": -57.2 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.1, + "skX": -0.0026, + "skY": -0.0044, + "scY": 1.0002, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.1, + "skX": -3.4856, + "skY": -3.5184, + "scX": 0.9996, + "scY": 1.0029, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 19.4, + "skX": -35.3872, + "skY": -35.392, + "scX": 1.0113, + "scY": 0.999, + "x": -56.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22.55, + "skX": -39.4031, + "skY": -39.4078, + "scX": 1.0107, + "scY": 0.9992, + "x": -58 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.43, + "skX": 0.0044, + "skY": 0.0044, + "x": 0.93 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.12, + "skX": 3.5184, + "skY": 3.5184, + "x": 1.51 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.24, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.37 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "action": "fire_01", + "transform": { + "y": 0.18, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.39 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.1, + "name": "attack_02_1", + "playTimes": 10 + }, + { + "duration": 10, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.04, + "scX": 1.0015, + "scY": 1.0005, + "x": -0.02 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.36, + "skX": -20.7464, + "skY": -20.7456, + "scX": 0.9988, + "scY": 0.9996, + "x": 0.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.14, + "skX": 8.9426, + "skY": 8.9434, + "scX": 0.9982, + "scY": 0.9994, + "x": 0.44 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.19, + "skX": 5.5746, + "skY": 5.5754, + "scX": 0.9974, + "scY": 0.9991, + "x": 0.49 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.13, + "skX": 47.427, + "skY": 47.4278, + "scX": 0.9977, + "scY": 0.9992, + "x": 0.56 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.09, + "skX": 52.6335, + "skY": 52.6343, + "scX": 0.9973, + "scY": 0.9991, + "x": 0.51 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -2.07, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.5, + "skX": -1.9074, + "skY": -1.9139, + "x": -1.87 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 2.88, + "skX": -8.0387, + "skY": -8.0452, + "x": 3.68 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 1.72, + "skX": -1.6311, + "skY": -1.6376, + "x": 1.42 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 3.09, + "skX": -28.3747, + "skY": -28.3747, + "x": 4.47 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 3.2, + "skX": -16.7919, + "skY": -16.7984, + "x": 5.39 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -5, + "x": -114.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -5, + "x": -114.2 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.05, + "skX": 10.0352, + "skY": 10.0352, + "scX": 1.0014, + "scY": 0.9993, + "x": 15.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -24.4, + "skX": 54.7039, + "skY": 54.6998, + "scX": 0.9738, + "scY": 1.0008, + "x": -51.9 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45, + "skX": 31.1254, + "skY": 31.1262, + "scX": 0.9895, + "scY": 0.9991, + "x": -81.7 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 35.8, + "skX": 28.1119, + "skY": 28.1111, + "scX": 0.993, + "scY": 0.9991, + "x": -81.75 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 44.8, + "skX": 17.8174, + "skY": 17.8178, + "scX": 0.9986, + "scY": 0.9991, + "x": -87.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45.8, + "skX": 16.3115, + "skY": 16.3114, + "scX": 0.9993, + "scY": 0.9991, + "x": -87.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 44.8, + "skX": 16.8133, + "skY": 16.8129, + "scX": 0.9992, + "scY": 0.9991, + "x": -87.3 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.25, + "skX": -1.7519, + "skY": -1.7533, + "scX": 1.0015, + "scY": 0.9997, + "x": 15.55 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -24.75, + "skX": 12.2581, + "skY": 12.2593, + "scX": 0.9907, + "scY": 0.9986, + "x": -52.7 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45.6, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -82.85 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 36.25, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -82.9 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 45.35, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -88.5 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.08, + "skX": -10.2014, + "skY": -10.3185, + "scX": 0.9988, + "scY": 1.0096 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.12, + "skX": -24.2129, + "skY": -24.3318, + "scX": 0.9988, + "scY": 1.0097, + "x": 0.06 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.13, + "skX": 30.9807, + "skY": 31.1144, + "scX": 0.9974, + "scY": 0.985, + "x": -0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.17, + "skX": 19.224, + "skY": 19.3108, + "scX": 0.9985, + "scY": 0.9906, + "x": -0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": 25.9728, + "skY": 26.0924, + "scX": 0.9978, + "scY": 0.9869, + "x": -0.09 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.84, + "skX": 34.7399, + "skY": 34.8805, + "scX": 0.9972, + "scY": 0.9841, + "x": -1.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.07, + "skX": 38.5028, + "skY": 38.6462, + "scX": 0.9969, + "scY": 0.9836, + "x": -0.09 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.2, + "x": -26.7 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -2, + "x": -43.6 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2, + "x": -43.6 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": { + "y": -0.21, + "skX": -23.7864, + "skY": -23.7989, + "scX": 0.9872, + "scY": 0.9984, + "x": 0.12 + }, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": { + "y": -0.04, + "skX": 28.5439, + "skY": 28.5391, + "scX": 0.9903, + "scY": 0.9993, + "x": 0.32 + }, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.4, + "skX": 7.7667, + "skY": 7.7665, + "scX": 0.9946, + "scY": 1.0007, + "x": 15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -25.15, + "skX": -4.7653, + "skY": -4.7658, + "scX": 1.0019, + "scY": 0.9996, + "x": -53.5 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 46.15, + "skX": 8.5209, + "skY": 8.5185, + "scX": 0.9989, + "scY": 1.0008, + "x": -84 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 36.7, + "skX": -12.0389, + "skY": -12.0428, + "scX": 1.008, + "scY": 0.9992, + "x": -84.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 45.95, + "skX": -5.2656, + "skY": -5.2681, + "scX": 1.0059, + "scY": 0.9996, + "x": -89.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 46.95, + "skX": 0.7538, + "skY": 0.7506, + "scX": 1.0032, + "x": -90.35 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 45.95, + "skX": 0.5035, + "skY": 0.5004, + "scX": 1.0031, + "x": -89.75 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 1.98, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.21 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 2.32, + "skX": -26.7681, + "skY": -26.7747, + "scX": 0.7204, + "scY": 0.9983, + "x": 2.18 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.33, + "skX": 1.9651, + "skY": 1.9585, + "scX": 0.8952, + "scY": 0.9985, + "x": -2.87 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.65, + "skX": -10.8838, + "skY": -10.8904, + "scX": 0.9907, + "scY": 1.0009, + "x": -0.64 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.74, + "skX": -32.6458, + "skY": -32.6387, + "scX": 0.9997, + "scY": 1.0002, + "x": -3.51 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -5.12, + "skX": -24.7198, + "skY": -24.7264, + "scX": 1.0003, + "x": -4.15 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.02, + "skY": -0.0009, + "scX": 1.0013, + "scY": 1.0004, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.22, + "skX": 11.8408, + "skY": 11.8408, + "scX": 0.9986, + "scY": 0.9996, + "x": 9.24 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.14, + "skX": 7.9952, + "skY": 7.9952, + "scX": 0.9993, + "scY": 0.9998, + "x": 0.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.56, + "skX": 19.4318, + "skY": 19.4318, + "scX": 0.9968, + "scY": 0.999, + "x": 11.53 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.54, + "skX": 48.2468, + "skY": 48.2468, + "scX": 0.9976, + "scY": 0.9992, + "x": 11.64 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -1.55, + "skX": 57.4615, + "skY": 57.4615, + "scX": 0.9969, + "scY": 0.999, + "x": 11.65 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "death" + }, + { + "duration": 8, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.04, + "scX": 0.9989, + "scY": 0.9996, + "x": -0.02 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.17, + "skY": 0.0009, + "scX": 1.0013, + "scY": 1.0004, + "x": 0.26 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.23, + "skY": 0.0017, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.28 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.07, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.35 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.18, + "skX": -3.0111, + "skY": -3.0111, + "x": 0.04 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.36, + "skX": -9.4689, + "skY": -9.4689, + "x": 9.94 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 1.45, + "skX": -12.052, + "skY": -12.052, + "x": 1.5 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -8.45, + "x": -53 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -1.25, + "x": -78.8 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.05, + "skX": 10.0352, + "skY": 10.0352, + "scX": 1.0014, + "scY": 0.9993, + "x": 15.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.35, + "skX": -8.0191, + "skY": -8.0191, + "scX": 0.9964, + "scY": 1.0008, + "x": -51.85 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 2, + "skX": 1.003, + "skY": 1.0023, + "scX": 1.0002, + "x": -61.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.1, + "skX": 6.0193, + "skY": 6.02, + "scX": 1.0013, + "scY": 0.9996, + "x": -54.65 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.25, + "skX": -1.7519, + "skY": -1.7533, + "scX": 1.0015, + "scY": 0.9997, + "x": 15.55 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.4, + "skX": 12.2581, + "skY": 12.2593, + "scX": 0.9907, + "scY": 0.9986, + "x": -52.6 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.15, + "skX": 10.5078, + "skY": 10.507, + "scX": 0.9919, + "scY": 0.9989, + "x": -55.45 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.08, + "skX": -10.2014, + "skY": -10.3185, + "scX": 0.9988, + "scY": 1.0096 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -0.09, + "skX": -9.2713, + "skY": -9.2481, + "scX": 0.9996, + "scY": 0.9976, + "x": -0.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.09, + "skX": 1.4611, + "skY": 1.5451, + "scX": 0.9986, + "scY": 0.991, + "x": -0.05 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.2, + "x": -26.7 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.4, + "skX": 7.7667, + "skY": 7.7665, + "scX": 0.9946, + "scY": 1.0007, + "x": 15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.45, + "skX": -7.5225, + "skY": -7.525, + "scX": 1.0041, + "scY": 0.9994, + "x": -53.35 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.25, + "skX": -1.0033, + "skY": -1.0035, + "scX": 1.0007, + "scY": 0.9998, + "x": -56.25 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.98, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.21 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -0.54, + "skX": -3.0111, + "skY": -3.0111, + "x": 0.42 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -3.08, + "skX": -9.4689, + "skY": -9.4689, + "x": 8.58 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -1.98, + "skX": -12.052, + "skY": -12.052, + "x": -0.92 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.02, + "skY": -0.0009, + "scX": 0.9986, + "scY": 0.9995, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.24, + "scX": 1.001, + "scY": 1.0004, + "x": 0.17 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.29, + "scX": 1.0014, + "scY": 1.0005, + "x": 0.27 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.18, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.26 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "hit" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.24, + "skY": 0.0009, + "scX": 0.9983, + "scY": 0.9994, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.18, + "skX": -17.0743, + "skY": -17.0743, + "x": 3.04 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.25, + "x": -51.4 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 32.95, + "skX": 28.6151, + "skY": 28.6146, + "scX": 0.9929, + "scY": 0.9991, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 33.35, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": 16.9669, + "skY": 17.0743, + "scX": 0.9981, + "scY": 0.9882, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -23.137, + "skY": -23.137, + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.95, + "x": 20.4 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 33.85, + "skX": -1.0021, + "skY": -1.0039, + "scX": 1.002, + "scY": 0.9998, + "x": -6 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.82, + "skX": -17.0743, + "skY": -17.0743, + "x": -2.45 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.18, + "skY": 0.0009, + "scX": 0.9985, + "scY": 0.9995, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_1" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.01, + "skY": 0.0009, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.03, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.6 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 10.8, + "skX": 57.6806, + "skY": 57.68, + "scX": 0.9907, + "scY": 0.997, + "x": -83.05 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.2, + "skX": 46.6827, + "skY": 46.6812, + "scX": 0.9819, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 25.2948, + "skY": 25.2935, + "scX": 0.9847, + "scY": 0.9974, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.71, + "skX": -37.2482, + "skY": -37.3652, + "scX": 0.9988, + "scY": 1.0096, + "x": -0.2 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": 1.2365, + "skY": 1.2365 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -8.75, + "skX": 57.68, + "skY": 57.6793, + "scX": 0.9908, + "scY": 0.997, + "x": -44.3 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 31.0364, + "skY": 31.0434, + "scX": 0.9759, + "scY": 1.0009, + "x": -6.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.82, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.49 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.08, + "scX": 0.9997, + "x": 0.11 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_2" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 3.11, + "skX": -29.9982, + "skY": -29.9974, + "scX": 1.002, + "scY": 1.0007, + "x": -2.66 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.01, + "skX": 12.0701, + "skY": 12.0703, + "x": -1.62 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 29.9, + "skX": -16.3344, + "skY": -16.3344, + "scX": 0.9907, + "scY": 0.997, + "x": -20.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.2, + "skX": 27.2191, + "skY": 27.2173, + "scX": 0.9818, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 25.2948, + "skY": 25.2935, + "scX": 0.9847, + "scY": 0.9974, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -16.22, + "skY": -16.22 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.71, + "skX": -7.25, + "skY": -7.3656, + "scX": 0.9988, + "scY": 1.0096, + "x": -0.2 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -11.7614, + "skY": -11.7614 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 34.35, + "skX": -17.8725, + "skY": -17.8709, + "scX": 0.9908, + "scY": 0.997, + "x": 29.95 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": -6.4479, + "skY": -6.4395, + "scX": 0.9759, + "scY": 1.0009, + "x": -6.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.84, + "skX": 12.0708, + "skY": 12.071, + "x": 1.48 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.28, + "skX": -29.9989, + "skY": -29.9989, + "scX": 1.0018, + "scY": 1.0006, + "x": 2.58 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_3" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.26, + "skX": -24.1896, + "skY": -24.1887, + "scX": 1.002, + "scY": 1.0007, + "x": -2.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.91, + "skX": -5.0202, + "skY": -5.0216, + "x": 0.77 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 37.6, + "skX": 7.7638, + "skY": 7.7638, + "scX": 0.9429, + "scY": 0.9992, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.1, + "x": 0.1 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.05, + "skX": 29.1728, + "skY": 29.2112, + "scX": 0.9994, + "scY": 0.9959, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -22.362, + "skY": -22.362, + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.65, + "skX": 11.7477, + "skY": 11.7432, + "scX": 0.9828, + "scY": 1.0009, + "x": 0.15 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -1.46, + "skX": -5.0204, + "skY": -5.0211, + "x": -0.78 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.18, + "skX": -24.1901, + "skY": -24.1901, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_4" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.16, + "skY": 0.0009, + "scX": 1.0015, + "scY": 1.0004, + "x": 0.19 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.9, + "skX": -5.0198, + "skY": -5.0198, + "x": 0.83 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 37.6, + "skX": -6.3646, + "skY": -6.3646, + "scX": 0.9429, + "scY": 0.9992, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.1, + "x": 0.1 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.05, + "skX": 5.0015, + "skY": 5.0013, + "scX": 0.9994, + "scY": 0.9959, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 22.4, + "skX": 19.7978, + "skY": 19.7933, + "scX": 1.0112, + "scY": 1.0015, + "x": -6.7 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -1.38, + "skX": -5.0198, + "skY": -5.0198, + "x": -0.75 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.22, + "scX": 1.001, + "scY": 1.0002, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "squat" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.09, + "skX": -20.5765, + "skY": -20.5756, + "scX": 1.002, + "scY": 1.0007, + "x": 0.13 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.41, + "skX": -16.7092, + "skY": -16.695, + "scX": 1.0004, + "scY": 1.0015, + "x": -0.79 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 20.85, + "skX": -5.0134, + "skY": -5.0141, + "scX": 0.9986, + "scY": 1.0014, + "x": -6.55 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.15, + "skX": -23.2231, + "skY": -23.2231, + "x": -6.6 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.11, + "skX": -29.5028, + "skY": -29.5002, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.06 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.45, + "skX": 7.2697, + "skY": 7.2648, + "scX": 1.011, + "scY": 1.0014, + "x": -6.7 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.44, + "skX": -16.7003, + "skY": -16.6872, + "scX": 1.0004, + "scY": 1.0015, + "x": 0.69 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": -20.5843, + "skY": -20.5843, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "aim_up" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 7.3, + "skX": 13.8338, + "skY": 13.8346, + "scX": 1.002, + "scY": 1.0007, + "x": -14.03 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.72, + "skX": 19.4945, + "skY": 19.5066, + "scX": 1.0004, + "scY": 1.0015, + "x": 9.53 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 29.0164, + "skX": -5.0138, + "skY": -5.0138, + "scX": 0.9986, + "scY": 1.0014, + "x": -3.8279 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.15, + "skX": 35.6959, + "skY": 35.6959, + "x": -6.6 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.12, + "skX": 20.9537, + "skY": 20.9586, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 11.9358, + "skX": 0.0022, + "skY": -0.0022, + "x": -9.3081 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.7, + "skX": 19.494, + "skY": 19.5068, + "scX": 1.0004, + "scY": 1.0015, + "x": -9.69 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": 13.8335, + "skY": 13.8335, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.14 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "aim_down" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/back_l", + "transform": { + "y": 0.9655, + "skX": -1.9759, + "skY": -1.9759, + "x": -10.0006 + } + } + ], + "name": "back" + }, + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0001", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0002", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0003", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + } + ], + "name": "front" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "inheritScale": 0, + "transform": { + "y": -8, + "x": 81 + }, + "name": "fire", + "parent": "root" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 151.9727, + "y": -21.0345, + "height": 44, + "x": -68.0006 + }, + "slot": [ + { + "name": "back", + "parent": "root", + "color": {} + }, + { + "z": 1, + "name": "front", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "weapon_1502b_l", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [], + "name": "idle" + }, + { + "duration": 2, + "frame": [ + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "fire", + "bone": "fire" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 1, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": 2, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "fire_01" + }, + { + "duration": 6, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 2, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 2, + "tweenEasing": null + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "prepare_01", + "playTimes": 0 + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/back_r", + "transform": { + "y": 1.5324, + "skX": -1.9759, + "skY": -1.9759, + "x": -10.4813 + } + } + ], + "name": "back" + }, + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0001", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0002", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0003", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + } + ], + "name": "front" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "inheritScale": 0, + "transform": { + "y": -7, + "x": 81 + }, + "name": "fire", + "parent": "root" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 154.9534, + "y": -20.9676, + "height": 45, + "x": -70.9813 + }, + "slot": [ + { + "name": "back", + "parent": "root", + "color": {} + }, + { + "z": 1, + "name": "front", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "weapon_1502b_r", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [], + "name": "idle" + }, + { + "duration": 2, + "frame": [ + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "fire", + "bone": "fire" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 1, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": 2, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "fire_01" + }, + { + "duration": 6, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 2, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 2, + "tweenEasing": null + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "prepare_01", + "playTimes": 0 + } + ] + } + ], + "name": "mecha_1502b", + "version": "5.0" +} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.json b/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.json new file mode 100644 index 0000000..9452b23 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.json @@ -0,0 +1 @@ +{"width":512,"SubTexture":[{"width":74,"y":93,"height":20,"name":"bullet_01_f/bullet_01","x":307},{"width":48,"y":1,"height":38,"name":"fire_effect_01_f/fireEffect","x":212},{"width":180,"y":430,"height":52,"name":"flame_01_f/ba_bu_flame1","x":1},{"frameY":0,"y":1,"frameWidth":86,"frameX":-2,"frameHeight":234,"width":81,"height":233,"name":"flame_01_f/bbb","x":1},{"width":44,"y":1,"height":39,"name":"mecha_1502b_folder/shouder_l_0","x":319},{"width":29,"y":77,"height":106,"name":"mecha_1502b_folder/foot_l_0","x":434},{"width":50,"y":185,"height":32,"name":"mecha_1502b_folder/thigh_1_l_0","x":434},{"width":122,"y":177,"height":46,"name":"mecha_1502b_folder/calf_l","x":84},{"width":101,"y":118,"height":57,"name":"mecha_1502b_folder/thigh_l","x":84},{"width":41,"y":77,"height":65,"name":"mecha_1502b_folder/pelvis","x":465},{"width":89,"y":236,"height":192,"name":"mecha_1502b_folder/chest","x":1},{"width":29,"y":77,"height":109,"name":"mecha_1502b_folder/foot_r","x":403},{"width":55,"y":1,"height":32,"name":"mecha_1502b_folder/thigh_1_r_1","x":262},{"width":126,"y":1,"height":52,"name":"mecha_1502b_folder/calf_r","x":84},{"width":103,"y":55,"height":61,"name":"mecha_1502b_folder/thigh_r","x":84},{"width":43,"y":144,"height":39,"name":"mecha_1502b_folder/shouder_r_1","x":465},{"width":116,"y":55,"height":44,"name":"weapon_1502b_folder/back_l","x":189},{"frameY":0,"y":39,"frameWidth":94,"frameX":0,"frameHeight":36,"width":93,"height":36,"name":"weapon_1502b_folder/image/paoguan_0002","x":403},{"width":94,"y":1,"height":36,"name":"weapon_1502b_folder/image/paoguan_0003","x":403},{"width":94,"y":55,"height":36,"name":"weapon_1502b_folder/image/paoguan_0001","x":307},{"width":121,"y":118,"height":45,"name":"weapon_1502b_folder/back_r","x":187}],"height":512,"name":"mecha_1502b","imagePath":"mecha_1502b_tex.png"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.png b/reference/Egret/Demos/resource/assets/core_element/mecha_1502b_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..368d0f3a0301bb58241614e964bdaf2dd803dce9 GIT binary patch literal 190205 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

Ru*jgBKwJ0yN%H^zU|SF4e{6~Wr*9pL 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

Wxxh!tx# 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 literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/resource/assets/core_element/skin_1502b_ske.json b/reference/Egret/Demos/resource/assets/core_element/skin_1502b_ske.json new file mode 100644 index 0000000..532c09f --- /dev/null +++ b/reference/Egret/Demos/resource/assets/core_element/skin_1502b_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003_folder/calf_r_0","transform":{"y":1.8721,"x":27.7907}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1003d_folder/thigh_l_0","transform":{"y":2.8796,"x":19.1837}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1002_folder/upperarm_r_2","transform":{"y":2.5661,"skX":-99.6918,"skY":-99.6918}}],"name":"shouder_r"},{"display":[{"type":"image","name":"mecha_1004_folder/chest_1","transform":{"y":46.4064,"skX":89.5694,"skY":89.5694,"x":-8.7784}}],"name":"chest"},{"display":[{"type":"image","name":"mecha_1004d_folder/foot_l_0","transform":{"y":7.7385,"skX":90,"skY":90,"x":2.3128}}],"name":"foot_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1003_folder/calf_l_0","transform":{"y":4.1499,"x":26.8604}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1003d_folder/thigh_r_0","transform":{"y":-7.6009,"x":15.0357}}],"name":"thigh_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1002_folder/upperarm_l_2","transform":{"y":-3.8492,"skX":-105.7978,"skY":-105.7978,"x":-0.8558}}],"name":"shouder_l"},{"display":[{"type":"image","name":"mecha_1004d_folder/foot_r_1","transform":{"y":9.2478,"skX":90,"skY":90,"x":2.5697}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":176.64362862645802,"y":-233.80623389915854,"height":281.5540549156089,"x":-95.10679917154837},"slot":[{"name":"shouder_l","parent":"shouder_l","color":{}},{"z":1,"name":"foot_l","parent":"foot_l","color":{}},{"z":2,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":3,"name":"calf_l","parent":"calf_l","color":{}},{"z":4,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":5,"name":"pelvis","parent":"pelvis","color":{}},{"z":6,"name":"chest","parent":"chest","color":{}},{"z":7,"name":"foot_r","parent":"foot_r","color":{}},{"z":8,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":9,"name":"calf_r","parent":"calf_r","color":{}},{"z":10,"name":"thigh_r","parent":"thigh_r","color":{}},{"z":11,"name":"shouder_r","parent":"shouder_r","color":{}}],"defaultActions":[{"gotoAndPlay":"empty"}],"name":"skin_a","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"empty","playTimes":0}]},{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003_folder/calf_r_0","transform":{"y":2.1179,"x":27.5723}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1008d_folder/thigh_r_0","transform":{"y":0.8121,"x":21.8806}}],"name":"thigh_r"},{"display":[{"type":"image","name":"mecha_1003_folder/foot_r_0","transform":{"y":10.5628,"skX":90,"skY":90}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1008d_folder/thigh_l_0","transform":{"y":-0.794,"x":21.2746}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1003_folder/calf_l_0","transform":{"y":3.7974,"x":25.8031}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1003_folder/foot_l_0","transform":{"y":10.132,"skX":90,"skY":90,"x":-0.2792}}],"name":"foot_l"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":181.67820326799887,"y":-159.1498821898437,"height":216.2126923697017,"x":-95.3644576640574},"slot":[{"name":"foot_l","parent":"foot_l","color":{}},{"z":1,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":2,"name":"calf_l","parent":"calf_l","color":{}},{"z":3,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":4,"name":"pelvis","parent":"pelvis","color":{}},{"z":5,"name":"foot_r","parent":"foot_r","color":{}},{"z":6,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":7,"name":"calf_r","parent":"calf_r","color":{}},{"z":8,"name":"thigh_r","parent":"thigh_r","color":{}}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"name":"skin_b","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"newAnimation","playTimes":0}]},{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003d_folder/calf_l_0","transform":{"y":1.8851,"x":27.6888}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1007d_folder/foot_l_1","transform":{"y":9.6443,"skX":90,"skY":90,"x":6.2003}}],"name":"foot_l"},{"display":[{"type":"image","name":"mecha_1004d_folder/chest_1","transform":{"y":52.0796,"skX":90,"skY":90,"x":-10.0293}}],"name":"chest"},{"display":[{"type":"image","name":"mecha_1004d_folder/shouder_r_2","transform":{"y":-3.0957,"skX":-90,"skY":-90,"x":-5.4198}}],"name":"shouder_r"},{"display":[{"type":"image","name":"mecha_1007d_folder/thigh_l_0","transform":{"y":-0.447,"x":26.8758}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1003d_folder/calf_r_0","transform":{"y":1.2965,"x":29.7327}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"},{"display":[{"type":"image","name":"mecha_1007d_folder/foot_r_0","transform":{"y":11.1489,"skX":90,"skY":90,"x":7.3628}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1004d_folder/shouder_l_2","transform":{"y":-1.1608,"skX":-90,"skY":-90,"x":-7.7426}}],"name":"shouder_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1007d_folder/thigh_r_0","transform":{"y":1.6378,"x":22.6896}}],"name":"thigh_r"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":187.45307710983226,"y":-280.97944052980597,"height":328.6282985398831,"x":-95.92274665260345},"slot":[{"name":"shouder_l","parent":"shouder_l","color":{}},{"z":1,"name":"foot_l","parent":"foot_l","color":{}},{"z":2,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":3,"name":"calf_l","parent":"calf_l","color":{}},{"z":4,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":5,"name":"pelvis","parent":"pelvis","color":{}},{"z":6,"name":"chest","parent":"chest","color":{}},{"z":7,"name":"foot_r","parent":"foot_r","color":{}},{"z":8,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":9,"name":"calf_r","parent":"calf_r","color":{}},{"z":10,"name":"thigh_r","parent":"thigh_r","color":{}},{"z":11,"name":"shouder_r","parent":"shouder_r","color":{}}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"name":"skin_c","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"newAnimation","playTimes":0}]}],"name":"skin_1502b","version":"5.0"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.json b/reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.json new file mode 100644 index 0000000..2e82d63 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.json @@ -0,0 +1 @@ +{"width":512,"SubTexture":[{"width":63,"y":240,"height":42,"name":"mecha_1002_folder/upperarm_l_2","x":121},{"width":29,"y":88,"height":83,"name":"mecha_1004d_folder/foot_l_0","x":360},{"width":50,"y":348,"height":32,"name":"mecha_1502b_folder/thigh_1_l_0","x":101},{"width":92,"y":187,"height":51,"name":"mecha_1003_folder/calf_l_0","x":121},{"frameY":0,"y":449,"frameWidth":103,"frameX":-1,"frameHeight":57,"width":102,"height":56,"name":"mecha_1003d_folder/thigh_l_0","x":308},{"width":41,"y":245,"height":65,"name":"mecha_1502b_folder/pelvis","x":341},{"width":118,"y":187,"height":101,"name":"mecha_1004_folder/chest_1","x":1},{"width":30,"y":1,"height":85,"name":"mecha_1004d_folder/foot_r_1","x":360},{"width":55,"y":478,"height":32,"name":"mecha_1502b_folder/thigh_1_r_1","x":1},{"frameY":-1,"y":346,"frameWidth":95,"frameX":0,"frameHeight":52,"width":95,"height":51,"name":"mecha_1003_folder/calf_r_0","x":208},{"width":105,"y":449,"height":58,"name":"mecha_1003d_folder/thigh_r_0","x":98},{"width":67,"y":399,"height":38,"name":"mecha_1002_folder/upperarm_r_2","x":208},{"width":32,"y":348,"height":98,"name":"mecha_1003_folder/foot_l_0","x":390},{"frameY":0,"y":384,"frameWidth":116,"frameX":-3,"frameHeight":63,"width":108,"height":63,"name":"mecha_1008d_folder/thigh_l_0","x":98},{"width":34,"y":245,"height":101,"name":"mecha_1003_folder/foot_r_0","x":305},{"frameY":0,"y":290,"frameWidth":96,"frameX":-3,"frameHeight":54,"width":92,"height":54,"name":"mecha_1008d_folder/thigh_r_0","x":203},{"width":69,"y":187,"height":56,"name":"mecha_1004d_folder/shouder_l_2","x":289},{"width":40,"y":348,"height":80,"name":"mecha_1007d_folder/foot_l_1","x":348},{"frameY":0,"y":384,"frameWidth":96,"frameX":0,"frameHeight":92,"width":95,"height":92,"name":"mecha_1003d_folder/calf_l_0","x":1},{"width":100,"y":290,"height":56,"name":"mecha_1007d_folder/thigh_l_0","x":101},{"width":163,"y":1,"height":184,"name":"mecha_1004d_folder/chest_1","x":1},{"width":41,"y":348,"height":81,"name":"mecha_1007d_folder/foot_r_0","x":305},{"width":98,"y":290,"height":92,"name":"mecha_1003d_folder/calf_r_0","x":1},{"width":101,"y":449,"height":58,"name":"mecha_1007d_folder/thigh_r_0","x":205},{"width":72,"y":187,"height":59,"name":"mecha_1004d_folder/shouder_r_2","x":215}],"height":512,"name":"skin_1502b","imagePath":"skin_1502b_tex.png"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.png b/reference/Egret/Demos/resource/assets/core_element/skin_1502b_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1afbbedf94d065aef05f3f8457a9474555c318 GIT binary patch literal 257183 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

p`aguwV|rh0qi;=pKP+v{nZ-!ks0`cS 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

6A7-O$mFh1bgF{N|6z1co)^ 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�DU^{WI-@ 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 WO_juzLf6#0e14bD|3COF#Qy*#if9l3 literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/resource/assets/dragon_boy_ske.json b/reference/Egret/Demos/resource/assets/dragon_boy_ske.json new file mode 100644 index 0000000..5d2ce0d --- /dev/null +++ b/reference/Egret/Demos/resource/assets/dragon_boy_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"aabb":{"width":693.2805749826739,"y":-702.3605101048755,"height":769.5863484320666,"x":-240.9677870990554},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"stand"}],"skin":[{"name":"","slot":[{"display":[{"path":"parts/tail","type":"image","name":"parts/tail","transform":{"skX":45.2229,"y":-0.0768,"skY":45.2229,"x":30.247025}}],"name":"tail"},{"display":[{"path":"parts/armUpperR","type":"image","name":"parts/armUpperR","transform":{"skX":13.9232,"y":1.1848,"skY":13.9232,"x":14.130075}}],"name":"armUpperR"},{"display":[{"path":"parts/beardL","type":"image","name":"parts/beardL","transform":{"skX":-174.0434,"y":-1.088575,"skY":-174.0434,"x":12.496175}}],"name":"beardL"},{"display":[{"path":"parts/eyeL","type":"image","name":"parts/eyeL","transform":{"y":0.1,"x":0.075}}],"name":"eyeL"},{"display":[{"path":"parts/armL","type":"image","name":"parts/armL","transform":{"skX":98.2989,"y":-0.719275,"skY":98.2989,"x":6.6737}}],"name":"armL"},{"display":[{"path":"parts/body","type":"image","name":"parts/body","transform":{"skX":94.9653,"y":0.154875,"skY":94.9653,"x":-0.2393}}],"name":"body"},{"display":[{"path":"parts/armR","type":"image","name":"parts/armR","transform":{"skX":-85.2356,"y":0.697625,"skY":-85.2356,"x":3.554325}}],"name":"armR"},{"display":[{"path":"parts/clothes1","type":"image","name":"parts/clothes1","transform":{"skX":132.4995,"y":4.012475,"skY":132.4995,"x":8.099525}}],"name":"clothes"},{"display":[{"path":"parts/legR","type":"image","name":"parts/legR","transform":{"skX":-94.0239,"y":-1.50245,"skY":-94.0239,"x":20.645475}}],"name":"legR"},{"display":[{"path":"parts/handL","type":"image","name":"parts/handL","transform":{"skX":146.6156,"y":-0.362775,"skY":146.6156,"x":8.683125}}],"name":"handL"},{"display":[{"path":"parts/tailTip","type":"image","name":"parts/tailTip","transform":{"skX":82.7421,"y":-0.205475,"skY":82.7421,"x":20.4126}}],"name":"tailTip"},{"display":[{"path":"parts/hair","type":"image","name":"parts/hair","transform":{"skX":-4.9086,"y":0.099375,"skY":-4.9086,"x":0.01125}}],"name":"hair"},{"display":[{"path":"parts/eyeR","type":"image","name":"parts/eyeR","transform":{"y":-0.125,"x":0.375}}],"name":"eyeR"},{"display":[{"path":"parts/legL","type":"image","name":"parts/legL","transform":{"skX":-146.9135,"y":-1.6115,"skY":-146.9135,"x":25.27875}}],"name":"legL"},{"display":[{"path":"parts/handR","type":"image","name":"parts/handR","transform":{"skX":-88.1106,"y":1.26565,"skY":-88.1106,"x":5.7614}}],"name":"handR"},{"display":[{"path":"parts/head","type":"image","name":"parts/head","transform":{"skX":80.4531,"y":-2.634675,"skY":80.4531,"x":30.73875}}],"name":"head"},{"display":[{"path":"parts/armUpperL","type":"image","name":"parts/armUpperL","transform":{"skX":-148.2623,"y":1.080425,"skY":-148.2623,"x":6.9746}}],"name":"armUpperL"},{"display":[{"path":"parts/beardR","type":"image","name":"parts/beardR","transform":{"y":0.05,"x":15.4}}],"name":"beardR"}]}],"bone":[{"name":"root","transform":{"y":-67.63665,"x":-1.639675}},{"length":37.5,"transform":{"skX":-94.9653,"y":12.635475,"skY":-94.9653,"x":6.523525},"parent":"root","name":"body"},{"length":30,"transform":{"skX":-156.0107,"y":11.725,"skY":-156.0107,"x":-23.90455},"parent":"body","name":"legR"},{"length":37.5,"transform":{"skX":159.9921,"y":7.848175,"skY":159.9921,"x":20.146325},"parent":"body","name":"armUpperR"},{"length":37.5,"transform":{"skX":-154.3312,"y":-15.06895,"skY":-154.3312,"x":-17.7624},"parent":"body","name":"legL"},{"length":37.5,"transform":{"skX":11.4957,"y":-1.450925,"skY":11.4957,"x":40.778625},"parent":"body","name":"head"},{"length":17.5,"transform":{"skX":-171.7742,"y":-23.401175,"skY":-171.7742,"x":18.620325},"parent":"body","name":"armUpperL"},{"length":62.5,"transform":{"skX":79.7425,"y":17.53175,"skY":79.7425,"x":-29.2773},"parent":"body","name":"tail"},{"length":20,"transform":{"skX":-37.5342,"y":-7.9354,"skY":-37.5342,"x":0.35575},"parent":"body","name":"clothes"},{"length":15,"transform":{"skX":30.7088,"y":0.5564,"skY":30.7088,"x":16.6908},"parent":"armUpperL","name":"armL"},{"transform":{"skX":80.4531,"y":-5.998925,"skY":80.4531,"x":35.0657},"name":"eyeR","parent":"head"},{"length":37.5,"transform":{"skX":-37.5192,"y":-0.7752,"skY":-37.5192,"x":64.465525},"parent":"tail","name":"tailTip"},{"transform":{"skX":80.4531,"y":-25.297,"skY":80.4531,"x":33.442525},"name":"eyeL","parent":"head"},{"length":20,"transform":{"skX":-105.5036,"y":-33.4062,"skY":-105.5036,"x":1.8647},"parent":"head","name":"beardL"},{"length":12.5,"transform":{"skX":35.2088,"y":0.132125,"skY":35.2088,"x":34.6873},"parent":"armUpperR","name":"armR"},{"length":20,"transform":{"skX":80.4531,"y":-8.96425,"skY":80.4531,"x":5.818825},"parent":"head","name":"beardR"},{"length":12.5,"transform":{"skX":86.9099,"y":20.157725,"skY":86.9099,"x":26.206225},"parent":"head","name":"hair"},{"length":10,"transform":{"skX":17.875,"y":0.276975,"skY":17.875,"x":10.84685},"parent":"armR","name":"handR"},{"length":20,"transform":{"skX":4.4133,"y":-0.106825,"skY":4.4133,"x":16.657725},"parent":"armL","name":"handL"}],"slot":[{"name":"tailTip","parent":"tailTip","color":{}},{"z":1,"name":"armUpperL","parent":"armUpperL","color":{}},{"z":2,"name":"armL","parent":"armL","color":{}},{"z":3,"name":"handL","parent":"handL","color":{}},{"z":4,"name":"legL","parent":"legL","color":{}},{"z":5,"name":"body","parent":"body","color":{}},{"z":6,"name":"tail","parent":"tail","color":{}},{"z":7,"name":"clothes","parent":"clothes","color":{}},{"z":8,"name":"hair","parent":"hair","color":{}},{"z":9,"name":"head","parent":"head","color":{}},{"z":10,"name":"eyeL","parent":"eyeL","color":{}},{"z":11,"name":"eyeR","parent":"eyeR","color":{}},{"z":12,"name":"legR","parent":"legR","color":{}},{"z":13,"name":"armUpperR","parent":"armUpperR","color":{}},{"z":14,"name":"armR","parent":"armR","color":{}},{"z":15,"name":"handR","parent":"handR","color":{}},{"z":16,"name":"beardL","parent":"beardL","color":{}},{"z":17,"name":"beardR","parent":"beardR","color":{}}],"animation":[{"playTimes":0,"frame":[],"duration":30,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":30}],"name":"root"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"skX":4.95,"skY":4.95,"x":-1},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{},"tweenEasing":0,"duration":12},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":18},{"transform":{},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"y":-0.5},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"skX":-12.64,"y":-2.01435,"skY":-12.64,"x":1.2837},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"y":-0.5},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":9.6205,"skY":9.6205},"tweenEasing":0,"duration":15},{"transform":{"skX":-1.4848,"skY":-1.4848},"tweenEasing":0,"duration":15},{"transform":{"skX":9.6205,"skY":9.6205},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":15},{"transform":{"skX":5.44,"skY":5.44},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":12},{"transform":{"y":-1,"x":0.5},"tweenEasing":0,"duration":18},{"transform":{},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":17},{"tweenEasing":null,"duration":1},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"stand"},{"playTimes":0,"frame":[],"duration":20,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":20},{"transform":{},"tweenEasing":null,"duration":0}],"name":"root"},{"frame":[{"transform":{"y":-1},"tweenEasing":0,"duration":10},{"transform":{"y":-0.5},"tweenEasing":0,"duration":10},{"transform":{"y":-1},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":-30,"y":-3.5,"skY":-30,"x":-1.5},"tweenEasing":0,"duration":10},{"transform":{"skX":30,"y":-0.5,"skY":30,"x":-0.975},"tweenEasing":0,"duration":10},{"transform":{"skX":-30,"y":-3.5,"skY":-30,"x":-1.5},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":45.5,"y":3.5,"skY":45.5,"x":-1.5},"tweenEasing":0,"duration":10},{"transform":{"skX":-22.15,"y":0.5,"skY":-22.15},"tweenEasing":0,"duration":10},{"transform":{"skX":45.5,"y":3.5,"skY":45.5,"x":-1.5},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":49.67,"y":7.100275,"skY":49.67,"x":-10.08605},"tweenEasing":0,"duration":10},{"transform":{"skX":-19.23,"y":-2.23195,"skY":-19.23,"x":-5.63015},"tweenEasing":0,"duration":10},{"transform":{"skX":49.67,"y":7.100275,"skY":49.67,"x":-10.08605},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"y":1},"tweenEasing":0,"duration":10},{"transform":{"skX":2.95,"y":0.5,"skY":2.95},"tweenEasing":0,"duration":10},{"transform":{"y":1},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":-21.2,"y":1,"skY":-21.2},"tweenEasing":0,"duration":10},{"transform":{"skX":30,"y":0.5,"skY":30},"tweenEasing":0,"duration":10},{"transform":{"skX":-21.2,"y":1,"skY":-21.2},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"x":-2},"tweenEasing":0,"duration":10},{"transform":{"skX":-8.7,"y":-1.5,"skY":-8.7,"x":-3},"tweenEasing":0,"duration":10},{"transform":{"x":-2},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":-38.8,"y":-0.5503,"skY":-38.8,"x":-3.259675},"tweenEasing":0,"duration":10},{"transform":{"skX":38.55,"y":-1.461275,"skY":38.55,"x":0.976075},"tweenEasing":0,"duration":10},{"transform":{"skX":-38.8,"y":-0.5503,"skY":-38.8,"x":-3.259675},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"y":0.125,"x":0.425},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":-0.069325,"skY":-2.95,"x":-1.0284},"tweenEasing":0,"duration":10},{"transform":{"y":0.125,"x":0.425},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"y":-0.133975,"x":2.23205},"tweenEasing":0,"duration":10},{"transform":{"skX":17.93,"y":2.519025,"skY":17.93,"x":-0.749225},"tweenEasing":0,"duration":10},{"transform":{"y":-0.133975,"x":2.23205},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":1.047675,"skY":-2.95,"x":-1.887475},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":6.04,"y":-1.37935,"skY":6.04,"x":-0.879675},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":21.72,"y":2.488875,"skY":21.72,"x":-0.64355},"tweenEasing":0,"duration":5},{"transform":{"skX":31.7897,"y":1.249725,"skY":31.7897,"x":-0.683125},"tweenEasing":0,"duration":5},{"transform":{"skX":-15.63,"y":0.0106,"skY":-15.63,"x":-0.722675},"tweenEasing":0,"duration":5},{"transform":{"skX":-19.6672,"y":-1.40275,"skY":-19.6672,"x":-0.056175},"tweenEasing":0,"duration":5},{"transform":{"skX":21.72,"y":2.488875,"skY":21.72,"x":-0.64355},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-10.45,"y":0.41485,"skY":-10.45,"x":-0.3614},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":-1.79345,"skY":-2.95,"x":0.282225},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":-45.48,"y":0.506125,"skY":-45.48,"x":-4.066475},"tweenEasing":0,"duration":10},{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":0,"duration":10},{"transform":{"skX":-45.48,"y":0.506125,"skY":-45.48,"x":-4.066475},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":15,"y":0.225675,"skY":15,"x":-0.416425},"tweenEasing":0,"duration":10},{"transform":{"skX":6.45,"y":0.8498,"skY":6.45,"x":-0.69405},"tweenEasing":0,"duration":10},{"transform":{"skX":15,"y":0.225675,"skY":15,"x":-0.416425},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"walk"},{"playTimes":0,"frame":[],"duration":5,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":5}],"name":"root"},{"frame":[{"transform":{"y":-16.5},"tweenEasing":0,"duration":5},{"transform":{"y":-16.5},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":-27.69,"y":0.2582,"skY":-27.69,"x":0.293925},"tweenEasing":0,"duration":2},{"transform":{"skX":-27.69,"y":0.16485,"skY":-27.69,"x":-0.7805},"tweenEasing":0,"duration":3},{"transform":{"skX":-27.69,"y":0.2582,"skY":-27.69,"x":0.293925},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":-24.65,"y":2.5,"skY":-24.65},"tweenEasing":0,"duration":2},{"transform":{"skX":-23.1904,"y":2.437775,"skY":-23.1904,"x":-0.716275},"tweenEasing":0,"duration":3},{"transform":{"skX":-24.65,"y":2.5,"skY":-24.65},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":-15.2954,"y":9.571825,"skY":-15.2954,"x":-5.1551},"tweenEasing":0,"duration":2},{"transform":{"skX":-15.2954,"y":9.44735,"skY":-15.2954,"x":-6.587675},"tweenEasing":0,"duration":3},{"transform":{"skX":-15.2954,"y":9.571825,"skY":-15.2954,"x":-5.1551},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"skX":10,"y":0.475,"skY":10,"x":0.9},"tweenEasing":0,"duration":5},{"transform":{"skX":10,"y":0.475,"skY":10,"x":0.9},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":15,"y":1,"skY":15},"tweenEasing":0,"duration":2},{"transform":{"skX":15,"y":0.90665,"skY":15,"x":-1.074425},"tweenEasing":0,"duration":3},{"transform":{"skX":15,"y":1,"skY":15},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"skX":9.3457,"y":-2.5,"skY":9.3457,"x":-6},"tweenEasing":0,"duration":2},{"transform":{"skX":13.7283,"y":-2.5,"skY":13.7283,"x":-6},"tweenEasing":0,"duration":3},{"transform":{"skX":9.3457,"y":-2.5,"skY":9.3457,"x":-6},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{"y":-1.1277,"x":-1.19205},"tweenEasing":0,"duration":2},{"transform":{"y":-1.22105,"x":-2.266475},"tweenEasing":0,"duration":3},{"transform":{"y":-1.1277,"x":-1.19205},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":8.55,"y":0.6382,"skY":8.55,"x":-0.149475},"tweenEasing":0,"duration":5},{"transform":{"skX":8.55,"y":0.6382,"skY":8.55,"x":-0.149475},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"skX":-10,"y":-2.1757,"skY":-10,"x":2.220375},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-2.264625,"skY":-10,"x":2.0302},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.931525,"skY":-10,"x":2.25325},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"skX":2.89,"y":1.575025,"skY":2.89,"x":0.54245},"tweenEasing":0,"duration":2},{"transform":{"skX":8.91,"y":-0.224,"skY":8.91,"x":0.159375},"tweenEasing":0,"duration":3},{"transform":{"skX":2.89,"y":1.575025,"skY":2.89,"x":0.54245},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{"skX":-10,"y":-1.57535,"skY":-10,"x":2.234775},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-2.264625,"skY":-10,"x":2.0302},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.57535,"skY":-10,"x":2.234775},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":-50.29,"y":4.806675,"skY":-50.29,"x":-4.944425},"tweenEasing":0,"duration":2},{"transform":{"skX":-58.5649,"y":4.806675,"skY":-58.5649,"x":-4.944425},"tweenEasing":0,"duration":3},{"transform":{"skX":-50.29,"y":4.806675,"skY":-50.29,"x":-4.944425},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":-13.13,"y":0.289775,"skY":-13.13,"x":-2.020225},"tweenEasing":0,"duration":5},{"transform":{"skX":-13.13,"y":0.289775,"skY":-13.13,"x":-2.020225},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{"skX":42.5,"y":1.6871,"skY":42.5,"x":-2.037225},"tweenEasing":0,"duration":2},{"transform":{"skX":50.23,"y":1.707375,"skY":50.23,"x":-2.008275},"tweenEasing":0,"duration":3},{"transform":{"skX":42.5,"y":1.6871,"skY":42.5,"x":-2.037225},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{"skX":-10,"y":-1.5109,"skY":-10,"x":-0.204525},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-0.699725,"skY":-10,"x":0.953925},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.5109,"skY":-10,"x":-0.204525},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":0,"duration":5},{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":-8.55,"y":-0.962825,"skY":-8.55,"x":-3.527325},"tweenEasing":0,"duration":5},{"transform":{"skX":-8.55,"y":-0.962825,"skY":-8.55,"x":-3.527325},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"jump"},{"playTimes":0,"frame":[],"duration":5,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":5}],"name":"root"},{"frame":[{"transform":{"y":-16.5},"tweenEasing":0,"duration":5},{"transform":{"y":-16.5},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":27.76,"y":2.2411,"skY":27.76,"x":1.544925},"tweenEasing":0,"duration":2},{"transform":{"skX":27.76,"y":2.144,"skY":27.76,"x":0.427375},"tweenEasing":0,"duration":3},{"transform":{"skX":27.76,"y":2.2411,"skY":27.76,"x":1.544925},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":-69.64,"y":2.5,"skY":-69.64},"tweenEasing":0,"duration":2},{"transform":{"skX":-66.683,"y":2.467625,"skY":-66.683,"x":-0.3725},"tweenEasing":0,"duration":3},{"transform":{"skX":-69.64,"y":2.5,"skY":-69.64},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":50.73,"y":1.975,"skY":50.73,"x":5.65},"tweenEasing":0,"duration":2},{"transform":{"skX":50.73,"y":1.910275,"skY":50.73,"x":4.904975},"tweenEasing":0,"duration":3},{"transform":{"skX":50.73,"y":1.975,"skY":50.73,"x":5.65},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"skX":-8.73,"y":-0.85,"skY":-8.73,"x":2.75},"tweenEasing":0,"duration":5},{"transform":{"skX":-8.73,"y":-0.85,"skY":-8.73,"x":2.75},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":92.45,"y":1,"skY":92.45},"tweenEasing":0,"duration":2},{"transform":{"skX":89.9735,"y":1.064725,"skY":89.9735,"x":0.745025},"tweenEasing":0,"duration":3},{"transform":{"skX":92.45,"y":1,"skY":92.45},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"skX":-18.47,"y":-1.525,"skY":-18.47,"x":-0.975},"tweenEasing":0,"duration":2},{"transform":{"skX":-22.44,"y":-1.525,"skY":-22.44,"x":-0.975},"tweenEasing":0,"duration":3},{"transform":{"skX":-18.47,"y":-1.525,"skY":-18.47,"x":-0.975},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{"y":-1.215525,"x":-1.50165},"tweenEasing":0,"duration":2},{"transform":{"y":-1.118425,"x":-0.384125},"tweenEasing":0,"duration":3},{"transform":{"y":-1.215525,"x":-1.50165},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":-53.9,"y":1.45345,"skY":-53.9,"x":1.087275},"tweenEasing":0,"duration":5},{"transform":{"skX":-53.9,"y":1.45345,"skY":-53.9,"x":1.087275},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"skX":8.73,"y":-1.153625,"skY":8.73,"x":-4.44015},"tweenEasing":0,"duration":2},{"transform":{"skX":8.73,"y":-0.7513,"skY":8.73,"x":-3.707225},"tweenEasing":0,"duration":3},{"transform":{"skX":8.73,"y":-1.153625,"skY":8.73,"x":-4.44015},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"skX":0.14,"y":-0.289,"skY":0.14,"x":0.699575},"tweenEasing":0,"duration":2},{"transform":{"skX":-0.83,"y":0.44715,"skY":-0.83,"x":0.45425},"tweenEasing":0,"duration":3},{"transform":{"skX":0.14,"y":-0.289,"skY":0.14,"x":0.699575},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{"skX":8.73,"y":-2.0383,"skY":8.73,"x":-3.25035},"tweenEasing":0,"duration":2},{"transform":{"skX":8.73,"y":-1.484225,"skY":8.73,"x":-3.304875},"tweenEasing":0,"duration":3},{"transform":{"skX":8.73,"y":-2.0383,"skY":8.73,"x":-3.25035},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":-2.54,"y":1.945425,"skY":-2.54,"x":0.081175},"tweenEasing":0,"duration":2},{"transform":{"skX":25.1339,"y":1.945425,"skY":25.1339,"x":0.081175},"tweenEasing":0,"duration":3},{"transform":{"skX":-2.54,"y":1.945425,"skY":-2.54,"x":0.081175},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":-13.14,"y":-0.799125,"skY":-13.14,"x":-2.801725},"tweenEasing":0,"duration":5},{"transform":{"skX":-13.14,"y":-0.799125,"skY":-13.14,"x":-2.801725},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{"skX":8.96,"y":1.31275,"skY":8.96,"x":-1.966675},"tweenEasing":0,"duration":2},{"transform":{"skX":-6.04,"y":1.31275,"skY":-6.04,"x":-1.966675},"tweenEasing":0,"duration":3},{"transform":{"skX":8.96,"y":1.31275,"skY":8.96,"x":-1.966675},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{"skX":-6.27,"y":1.80955,"skY":-6.27,"x":0.147725},"tweenEasing":0,"duration":2},{"transform":{"skX":-7.09,"y":0.051875,"skY":-7.09,"x":-1.580525},"tweenEasing":0,"duration":3},{"transform":{"skX":-6.27,"y":1.80955,"skY":-6.27,"x":0.147725},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":29.52,"y":-0.3423,"skY":29.52,"x":-0.984675},"tweenEasing":0,"duration":5},{"transform":{"skX":29.52,"y":-0.3423,"skY":29.52,"x":-0.984675},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":21.45,"y":0.367025,"skY":21.45,"x":-0.899625},"tweenEasing":0,"duration":5},{"transform":{"skX":21.45,"y":0.367025,"skY":21.45,"x":-0.899625},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"fall"}],"frameRate":24,"name":"DragonBoy"}],"name":"Dragon_1","version":"5.0"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/dragon_boy_tex.json b/reference/Egret/Demos/resource/assets/dragon_boy_tex.json new file mode 100644 index 0000000..9021b7b --- /dev/null +++ b/reference/Egret/Demos/resource/assets/dragon_boy_tex.json @@ -0,0 +1 @@ +{"imagePath":"dragon_boy_tex.png","width":256,"SubTexture":[{"frameX":0,"y":174,"frameY":0,"frameWidth":28,"width":28,"frameHeight":53,"height":52,"name":"parts/tailTip","x":196},{"width":28,"y":174,"height":22,"name":"parts/armUpperL","x":226},{"width":12,"y":234,"height":20,"name":"parts/armL","x":90},{"width":24,"y":198,"height":20,"name":"parts/handL","x":226},{"frameX":0,"y":191,"frameY":0,"frameWidth":51,"width":51,"frameHeight":45,"height":45,"name":"parts/legL","x":1},{"frameX":0,"y":102,"frameY":0,"frameWidth":59,"width":59,"frameHeight":87,"height":87,"name":"parts/body","x":1},{"width":54,"y":102,"height":70,"name":"parts/tail","x":62},{"width":52,"y":174,"height":44,"name":"parts/clothes1","x":109},{"width":31,"y":174,"height":71,"name":"parts/hair","x":163},{"frameX":0,"y":1,"frameY":0,"frameWidth":85,"width":84,"frameHeight":99,"height":99,"name":"parts/head","x":1},{"width":7,"y":241,"height":12,"name":"parts/eyeL","x":238},{"frameX":0,"y":220,"frameY":0,"frameWidth":10,"width":9,"frameHeight":15,"height":15,"name":"parts/eyeR","x":136},{"frameX":0,"y":174,"frameY":0,"frameWidth":45,"width":45,"frameHeight":58,"height":58,"name":"parts/legR","x":62},{"width":40,"y":228,"height":24,"name":"parts/armUpperR","x":196},{"frameX":0,"y":220,"frameY":0,"frameWidth":12,"width":11,"frameHeight":20,"height":19,"name":"parts/armR","x":238},{"width":25,"y":220,"height":15,"name":"parts/handR","x":109},{"frameX":0,"y":245,"frameY":0,"frameWidth":30,"width":30,"frameHeight":9,"height":9,"name":"parts/beardL","x":54},{"width":34,"y":234,"height":9,"name":"parts/beardR","x":54}],"height":256,"name":"Dragon_1"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/dragon_boy_tex.png b/reference/Egret/Demos/resource/assets/dragon_boy_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..02c8677ff1090a3dbb8fb09eabdef30c0353aaff GIT binary patch literal 31667 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

Uan5rsr0@){GlFf|1Lm#Pl^af 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 literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/main_ske.json b/reference/Egret/Demos/resource/assets/replace_slot_display/main_ske.json new file mode 100644 index 0000000..30eb04e --- /dev/null +++ b/reference/Egret/Demos/resource/assets/replace_slot_display/main_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"name":"main","version":"5.0","armature":[{"animation":[{"slot":[],"playTimes":0,"duration":30,"frame":[],"name":"idle","bone":[{"frame":[{"duration":30,"tweenEasing":null,"transform":{}}],"name":"root"},{"frame":[{"duration":10,"tweenEasing":0,"transform":{}},{"duration":10,"tweenEasing":0,"transform":{"skX":120,"skY":120}},{"duration":10,"tweenEasing":0,"transform":{"skX":-120,"skY":-120}},{"duration":0,"tweenEasing":null,"transform":{}}],"name":"ball"},{"frame":[{"duration":10,"tweenEasing":0,"transform":{}},{"duration":10,"tweenEasing":0,"transform":{"skX":120,"skY":120}},{"duration":10,"tweenEasing":0,"transform":{"skX":-120,"skY":-120}},{"duration":0,"tweenEasing":null,"transform":{}}],"name":"point"}],"ffd":[{"frame":[{"duration":10,"tweenEasing":0,"offset":0,"vertices":[]},{"duration":10,"tweenEasing":0,"offset":0,"vertices":[115.61,54.15,0,0,120.7,-60.04,0,0,0,0,0,0,0,0,0,0,113.3,49.94,119.03,-55.73,1,-5.66,-1.29,7.67,0,0,0,0,0,0,0,0]},{"duration":10,"tweenEasing":0,"offset":0,"vertices":[-36.97,-85.96,0,0,-21.37,108.42,0,0,0,0,0,0,0,0,0,0,-39.88,-82.14,-19.5,95.39,2.53,5.56,0.38,-2.85,0,0,0,0,0,0,0,0]},{"duration":0,"tweenEasing":null,"offset":0,"vertices":[]}],"scale":1,"skin":"","offset":0,"name":"display0005","slot":"mesh"}]}],"defaultActions":[{"gotoAndPlay":"idle"}],"type":"Armature","name":"MyArmature","slot":[{"color":{},"name":"point","parent":"point"},{"z":1,"color":{},"name":"mesh","parent":"point"},{"z":2,"color":{},"name":"ball","parent":"ball"},{"z":3,"color":{},"name":"weapon","parent":"ball"}],"ik":[],"aabb":{"width":674.9445000000001,"y":-80.1317,"height":160.1317,"x":-335},"bone":[{"name":"root","transform":{}},{"length":100,"transform":{},"parent":"root","name":"point"},{"length":100,"transform":{"x":100},"parent":"point","name":"ball"}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"width":270,"userEdges":[6,7,7,13,13,4,6,15,15,5,9,10,10,6,7,11,11,8,8,9],"type":"mesh","vertices":[-135,-80,135,-80,-135,80,135,80,134.95,-31.85,134.95,31.45,73.3,31.25,73.2,-31.65,-121.4,-67.5,-122.1,66.7,88.45,66.3,89.25,-65.95,107.1,-80,106.3,-31.76,106.5,80,106.3,31.36],"transform":{"x":-200},"height":160,"edges":[2,0,1,4,4,5,5,3,0,12,12,1,3,14,14,2],"path":"display0005","uvs":[0,0,1,0,0,1,1,1,0.99981,0.30094,0.99981,0.69656,0.77148,0.69531,0.77111,0.30219,0.05037,0.07813,0.04778,0.91687,0.82759,0.91438,0.83056,0.08781,0.89667,0,0.89369,0.30152,0.89444,1,0.89369,0.69598],"name":"display0005","triangles":[9,2,10,0,8,11,0,11,12,10,2,14,15,10,14,12,11,13,12,13,4,12,4,1,14,3,5,15,14,5,4,13,5,13,15,5,6,10,15,11,7,13,6,15,13,7,6,13,6,9,10,8,7,11,8,9,6,8,6,7,8,0,9,0,2,9]}],"name":"mesh"},{"display":[{"path":"weapon_1004_1","type":"image","name":"weapon_1004_1","transform":{"y":5,"x":65}}],"name":"weapon"},{"display":[{"path":"display0001","type":"image","name":"display0001","transform":{}}],"name":"point"},{"display":[{"path":"display0009","type":"image","name":"display0009","transform":{"y":-0.1317,"x":104.9445}}],"name":"ball"}]}]}]} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.json b/reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.json new file mode 100644 index 0000000..e114583 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.json @@ -0,0 +1 @@ +{"imagePath":"main_tex.png","width":512,"SubTexture":[{"width":60,"y":325,"height":60,"name":"display0001","x":206},{"width":270,"y":1,"height":160,"name":"display0005","x":1},{"width":270,"y":163,"height":160,"name":"display0009","x":1},{"width":203,"y":325,"height":29,"name":"weapon_1004_1","x":1}],"height":512,"name":"main"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.png b/reference/Egret/Demos/resource/assets/replace_slot_display/main_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6d6b2811c0b37caf26debfa81944e5af0fa255 GIT binary patch literal 26260 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 X>vn$vI|KhVqjvJxnWOk4K{x*gzMv<3 literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/replace_ske.json b/reference/Egret/Demos/resource/assets/replace_slot_display/replace_ske.json new file mode 100644 index 0000000..092f090 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/replace_slot_display/replace_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"name":"replace","version":"5.0","armature":[{"animation":[{"slot":[],"playTimes":0,"duration":0,"frame":[],"name":"newAnimation","bone":[{"frame":[{"duration":0,"tweenEasing":null,"transform":{}}],"name":"root"}],"ffd":[]}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"type":"Armature","name":"MyMesh","slot":[{"color":{},"name":"meshA","parent":"root"},{"z":1,"color":{},"name":"meshB","parent":"root"},{"z":2,"color":{},"name":"mesh","parent":"root"}],"ik":[],"aabb":{"width":203,"y":-9.5,"height":29,"x":-36.5},"bone":[{"length":100,"name":"root","transform":{}}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"path":"weapon_1004_1","type":"image","name":"weapon_1004_1","transform":{"y":5,"x":65}}],"name":"mesh"},{"display":[{"width":203,"userEdges":[7,4,4,5,5,6,6,7,12,11,10,11,10,13,14,6,7,15,14,15],"type":"mesh","vertices":[-101.35,-12.8,143.75,-70.95,-101.45,6.15,123.05,20,103.85,7,126.85,-44,13.75,-17.9,11.9,7.05,-46.25,-21.7,-44.75,20.2,-47.75,-9.4,-48.35,2.95,-101.5,5.9,-101.5,-12.15,-46.3,-10.75,-45.8,12.95,13.9,-25.51,26.61,16.69],"transform":{"y":5,"x":65},"height":29,"edges":[1,3,0,8,9,2,2,12,12,13,13,0,8,16,16,1,3,17,17,9],"path":"weapon_1004_1","uvs":[0,0,1,0,0,1,1,1,0.84852,0.6931,0.91256,0.26207,0.66034,0.2,0.59384,0.71379,0.27438,0.00172,0.26453,1,0.26478,0.17586,0.26182,0.60172,0,0.70345,0,0.08103,0.27685,0.2569,0.27906,0.67586,0.5734,0.00101,0.58153,1],"name":"weapon_1004_1","triangles":[6,5,1,16,6,1,4,17,3,1,5,3,5,4,3,6,4,5,6,7,4,7,17,4,15,9,17,8,14,16,11,9,15,11,15,14,10,11,14,0,10,8,10,14,8,12,2,9,0,13,10,12,9,11,10,13,11,13,12,11,14,7,6,15,17,7,14,15,7,16,14,6]}],"name":"meshB"},{"display":[{"width":203,"userEdges":[],"type":"mesh","vertices":[-101.5,-14.5,297.95,-14.5,-101.5,14.5,296.75,14.5,29.55,-14.5,29.1,14.5,262.95,-14.5,261.75,14.5],"transform":{"y":5,"x":65},"height":29,"edges":[1,3,2,0,0,4,5,2,4,6,6,1,3,7,7,5],"path":"weapon_1004_1","uvs":[0,0,1,0,0,1,1,1,0.64557,0,0.64335,1,0.83793,0,0.84384,1],"name":"weapon_1004_1","triangles":[6,7,1,1,7,3,4,5,6,6,5,7,0,2,5,0,5,4]}],"name":"meshA"}]}]},{"animation":[{"slot":[{"frame":[{"duration":1,"tweenEasing":null},{"duration":1,"tweenEasing":null,"displayIndex":6},{"duration":1,"tweenEasing":null,"displayIndex":1},{"duration":2,"tweenEasing":null,"displayIndex":5},{"duration":1,"tweenEasing":null,"displayIndex":7},{"duration":1,"tweenEasing":null,"displayIndex":8},{"duration":1,"tweenEasing":null,"displayIndex":2},{"duration":9,"tweenEasing":null,"displayIndex":4},{"duration":0,"tweenEasing":null,"displayIndex":3}],"name":"ball"}],"playTimes":0,"duration":17,"frame":[],"name":"newAnimation","bone":[{"frame":[{"duration":17,"tweenEasing":null,"transform":{}}],"name":"root"},{"frame":[{"duration":1,"tweenEasing":null,"transform":{"y":-70.4221,"x":-83.5006}},{"duration":1,"tweenEasing":null,"transform":{"y":-64.552,"x":0.4446}},{"duration":1,"tweenEasing":null,"transform":{"y":-65.0185,"x":105.0759}},{"duration":2,"tweenEasing":null,"transform":{"y":0.8148,"x":105.4037}},{"duration":1,"tweenEasing":null,"transform":{"y":65.3926,"x":0.2229}},{"duration":1,"tweenEasing":null,"transform":{"y":65.4336,"x":-105.0409}},{"duration":1,"tweenEasing":null,"transform":{"y":0.5252,"x":-104.8163}},{"duration":9,"tweenEasing":null,"transform":{}},{"duration":0,"tweenEasing":null,"transform":{"y":65.668,"x":105.3589}}],"name":"ball"}],"ffd":[]}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"type":"MovieClip","name":"MyDisplay","slot":[{"color":{},"name":"ball","parent":"ball","displayIndex":-1}],"ik":[],"aabb":{"width":270,"y":-151.2369,"height":160,"x":-323.90430000000003},"bone":[{"name":"root","transform":{}},{"transform":{},"name":"ball","parent":"root"}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"path":"display0002","type":"image","name":"display0002","transform":{"y":64.6363,"x":104.7465}},{"path":"display0004","type":"image","name":"display0004","transform":{"y":65.0185,"x":-105.0759}},{"path":"display0009","type":"image","name":"display0009","transform":{"y":-0.5252,"x":104.8163}},{"path":"display0006","type":"image","name":"display0006","transform":{"y":-65.668,"x":-105.3589}},{"path":"display0010","type":"image","name":"display0010","transform":{}},{"path":"display0005","type":"image","name":"display0005","transform":{"y":-0.8148,"x":-105.4037}},{"path":"display0003","type":"image","name":"display0003","transform":{"y":64.552,"x":-0.4446}},{"path":"display0007","type":"image","name":"display0007","transform":{"y":-65.3926,"x":-0.2229}},{"path":"display0008","type":"image","name":"display0008","transform":{"y":-65.4336,"x":105.0409}},{"filterType":null,"path":"MyArmature","type":"armature","name":"MyArmature","transform":{}}],"name":"ball"}]}]}]} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.json b/reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.json new file mode 100644 index 0000000..fdc44d1 --- /dev/null +++ b/reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.json @@ -0,0 +1 @@ +{"imagePath":"replace_tex.png","width":1024,"SubTexture":[{"width":203,"y":1,"height":29,"name":"weapon_1004_1","x":817},{"width":270,"y":1,"height":190,"name":"display0004","x":1},{"width":240,"y":193,"height":160,"name":"display0010","x":757},{"width":240,"y":193,"height":190,"name":"display0003","x":515},{"width":270,"y":1,"height":190,"name":"display0002","x":545},{"width":1,"y":1,"height":1,"name":"MyArmature","x":1022},{"width":270,"y":193,"height":190,"name":"display0008","x":1},{"width":270,"y":385,"height":160,"name":"display0009","x":1},{"width":240,"y":193,"height":190,"name":"display0007","x":273},{"width":270,"y":1,"height":190,"name":"display0006","x":273},{"width":270,"y":385,"height":160,"name":"display0005","x":273}],"height":1024,"name":"replace"} \ No newline at end of file diff --git a/reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.png b/reference/Egret/Demos/resource/assets/replace_slot_display/replace_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..0c85ad08b6a1f6235009d721edd1fbcbcd77aa43 GIT binary patch literal 60291 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 Zgxd~0Xi=9`{RLh0`n!yG=4#u9{1*#rE297a literal 0 HcmV?d00001 diff --git a/reference/Egret/Demos/src/Main.ts b/reference/Egret/Demos/src/Main.ts new file mode 100644 index 0000000..00e8f43 --- /dev/null +++ b/reference/Egret/Demos/src/Main.ts @@ -0,0 +1,12 @@ +class Main extends egret.DisplayObjectContainer { + public constructor() { + super(); + + this.addChild(new HelloDragonBones()); + // this.addChild(new ReplaceSlotDisplay()); + // this.addChild(new coreElement.Game()); + + // this.addChild(new PerformanceTest()); + // this.addChild(new AnimationBaseTest()); + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/AnimationBaseTest.ts b/reference/Egret/Demos/src/demo/AnimationBaseTest.ts new file mode 100644 index 0000000..d07da44 --- /dev/null +++ b/reference/Egret/Demos/src/demo/AnimationBaseTest.ts @@ -0,0 +1,103 @@ +class AnimationBaseTest extends BaseTest { + private _armatureDisplay: dragonBones.EgretArmatureDisplay; + + public constructor() { + super(); + + this._resources.push( + "resource/assets/animation_base_test_ske.json", + "resource/assets/animation_base_test_tex.json", + "resource/assets/animation_base_test_tex.png" + ); + } + + protected _onStart(): void { + const factory = dragonBones.EgretFactory.factory; + factory.parseDragonBonesData(RES.getRes("resource/assets/animation_base_test_ske.json")); + factory.parseTextureAtlasData(RES.getRes("resource/assets/animation_base_test_tex.json"), RES.getRes("resource/assets/animation_base_test_tex.png")); + + this._armatureDisplay = factory.buildArmatureDisplay("progressBar"); + this._armatureDisplay.x = this.stage.stageWidth * 0.5; + this._armatureDisplay.y = this.stage.stageHeight * 0.5; + this._armatureDisplay.scaleX = this._armatureDisplay.scaleY = this.stage.stageWidth >= 300 ? 1 : this.stage.stageWidth / 330; + this.addChild(this._armatureDisplay); + + // Test animation event + this._armatureDisplay.addEventListener(dragonBones.EventObject.START, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.LOOP_COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.FADE_IN, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.FADE_IN_COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.FADE_OUT, this._animationEventHandler, this); + this._armatureDisplay.addEventListener(dragonBones.EventObject.FADE_OUT_COMPLETE, this._animationEventHandler, this); + + // Test frame event + this._armatureDisplay.addEventListener(dragonBones.EventObject.FRAME_EVENT, this._animationEventHandler, this); + + // Test animation config. + // const animaitonConfig = this._armatureDisplay.animation.animationConfig; + // animaitonConfig.name = "test"; // Animation state name. + // animaitonConfig.animation = "idle"; // Animation name. + + // animaitonConfig.playTimes = 1; // Play one time. + // animaitonConfig.playTimes = 3; // Play several times. + // animaitonConfig.playTimes = 0; // Loop play. + + // animaitonConfig.timeScale = 1.0; // Play speed. + // animaitonConfig.timeScale = -1.0; // Reverse play. + + // animaitonConfig.position = 1.0; // Goto and play. + // animaitonConfig.duration = 0.0; // Goto and stop. + // animaitonConfig.duration = 3.0; // Interval play. + // this._armatureDisplay.animation.playConfig(animaitonConfig); + + this._armatureDisplay.animation.play("idle", 1); + + // + this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this._touchHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_END, this._touchHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_MOVE, this._touchHandler, this); + + const text = new egret.TextField(); + text.size = 20; + text.textAlign = egret.HorizontalAlign.CENTER; + text.text = "Click to control animation play progress."; + text.width = this.stage.stageWidth; + text.x = 0; + text.y = this.stage.stageHeight - 60; + this.addChild(text); + } + + private _touchHandler(event: egret.TouchEvent): void { + const progress = Math.min(Math.max((event.stageX - this._armatureDisplay.x + 300 * this._armatureDisplay.scaleX) / 600 * this._armatureDisplay.scaleX, 0), 1); + switch (event.type) { + case egret.TouchEvent.TOUCH_BEGIN: + // this._armatureDisplay.animation.gotoAndPlayByTime("idle", 0.5, 1); + // this._armatureDisplay.animation.gotoAndStopByTime("idle", 1); + + // this._armatureDisplay.animation.gotoAndPlayByFrame("idle", 25, 2); + // this._armatureDisplay.animation.gotoAndStopByFrame("idle", 50); + + // this._armatureDisplay.animation.gotoAndPlayByProgress("idle", progress, 3); + this._armatureDisplay.animation.gotoAndStopByProgress("idle", progress); + break; + + case egret.TouchEvent.TOUCH_END: + this._armatureDisplay.animation.play(); + break; + + case egret.TouchEvent.TOUCH_MOVE: + if (event.touchDown) { + const animationState = this._armatureDisplay.animation.getState("idle"); + if (animationState) { + animationState.currentTime = animationState.totalTime * progress; + } + } + break; + } + } + + private _animationEventHandler(event: dragonBones.EgretEvent): void { + console.log(event.eventObject.animationState.name, event.type, event.eventObject.name ? event.eventObject.name : ""); + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/BaseTest.ts b/reference/Egret/Demos/src/demo/BaseTest.ts new file mode 100644 index 0000000..4d1ef46 --- /dev/null +++ b/reference/Egret/Demos/src/demo/BaseTest.ts @@ -0,0 +1,41 @@ +abstract class BaseTest extends egret.DisplayObjectContainer { + private _loadCount: number; + protected readonly _background: egret.Shape = new egret.Shape(); + protected readonly _resources: string[] = []; + protected readonly _resourceMap: any = {}; + + public constructor() { + super(); + + this.addEventListener(egret.Event.ADDED_TO_STAGE, () => { + this._background.graphics.beginFill(0x666666, 1.0); + this._background.graphics.drawRect(0.0, 0.0, this.stage.stageWidth, this.stage.stageHeight); + this.addChild(this._background); + + this._loadResources(); + }, this); + } + + protected abstract _onStart(): void; + + protected _loadResources(): void { + this._loadCount = this._resources.length; + for (const resource of this._resources) { + RES.getResByUrl( + resource, + (data: any, key: string) => { + this._resourceMap[key] = data; + + this._loadCount--; + if (this._loadCount === 0) { + RES.getRes = (name: string) => { // Modify res bug. + return this._resourceMap[name]; + }; + this._onStart(); + } + }, + this, resource.indexOf(".dbbin") > 0 ? RES.ResourceItem.TYPE_BIN : null + ); + } + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/CoreElement.ts b/reference/Egret/Demos/src/demo/CoreElement.ts new file mode 100644 index 0000000..9605465 --- /dev/null +++ b/reference/Egret/Demos/src/demo/CoreElement.ts @@ -0,0 +1,562 @@ +namespace coreElement { + type PointType = egret.Point; + type ArmatureDisplayType = dragonBones.EgretArmatureDisplay; + type EventType = dragonBones.EgretEvent; + + export class Game extends BaseTest { + public static STAGE_WIDTH: number; + public static STAGE_HEIGHT: number; + public static GROUND: number; + public static G: number = 0.6; + public static instance: Game; + + private _left: boolean = false; + private _right: boolean = false; + private _player: Mecha; + private readonly _bullets: Array = []; + + public constructor() { + super(); + + this._resources.push( + "resource/assets/core_element/mecha_1502b_ske.json", + "resource/assets/core_element/mecha_1502b_tex.json", + "resource/assets/core_element/mecha_1502b_tex.png", + "resource/assets/core_element/skin_1502b_ske.json", + "resource/assets/core_element/skin_1502b_tex.json", + "resource/assets/core_element/skin_1502b_tex.png", + "resource/assets/core_element/weapon_1000_ske.json", + "resource/assets/core_element/weapon_1000_tex.json", + "resource/assets/core_element/weapon_1000_tex.png" + ); + } + + protected _onStart(): void { + Game.STAGE_WIDTH = this.stage.stageWidth; + Game.STAGE_HEIGHT = this.stage.stageHeight; + Game.GROUND = Game.STAGE_HEIGHT - 150; + Game.instance = this; + + const factory = dragonBones.EgretFactory.factory; + factory.parseDragonBonesData(RES.getRes("resource/assets/core_element/mecha_1502b_ske.json")); + factory.parseTextureAtlasData(RES.getRes("resource/assets/core_element/mecha_1502b_tex.json"), RES.getRes("resource/assets/core_element/mecha_1502b_tex.png")); + factory.parseDragonBonesData(RES.getRes("resource/assets/core_element/skin_1502b_ske.json")); + factory.parseTextureAtlasData(RES.getRes("resource/assets/core_element/skin_1502b_tex.json"), RES.getRes("resource/assets/core_element/skin_1502b_tex.png")); + factory.parseDragonBonesData(RES.getRes("resource/assets/core_element/weapon_1000_ske.json")); + factory.parseTextureAtlasData(RES.getRes("resource/assets/core_element/weapon_1000_tex.json"), RES.getRes("resource/assets/core_element/weapon_1000_tex.png")); + + this._player = new Mecha(); + + // Listener. + this.stage.addEventListener(egret.Event.ENTER_FRAME, this._enterFrameHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this._touchHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_END, this._touchHandler, this); + document.addEventListener("keydown", this._keyHandler); + document.addEventListener("keyup", this._keyHandler); + const onTouchMove = egret.sys.TouchHandler.prototype.onTouchMove; + egret.sys.TouchHandler.prototype.onTouchMove = function (this: any, x: number, y: number, touchPointID: number): void { + onTouchMove.call(this, x, y, touchPointID); + + Game.instance._player.aim(x, y); + } + + // Info. + const text = new egret.TextField(); + text.size = 20; + text.textAlign = egret.HorizontalAlign.CENTER; + text.text = "Press W/A/S/D to move. Press Q/E to switch weapons. Press SPACE to switch skin.\nMouse Move to aim. Click to fire."; + text.width = Game.STAGE_WIDTH; + text.x = 0; + text.y = Game.STAGE_HEIGHT - 60; + this.addChild(text); + } + + private _touchHandler(event: egret.TouchEvent): void { + this._player.aim(event.stageX, event.stageY); + if (event.type === egret.TouchEvent.TOUCH_BEGIN) { + this._player.attack(true); + } + else { + this._player.attack(false); + } + } + + private _keyHandler(event: KeyboardEvent): void { + const isDown = event.type === "keydown"; + switch (event.keyCode) { + case 37: + case 65: + Game.instance._left = isDown; + Game.instance._updateMove(-1); + break; + + case 39: + case 68: + Game.instance._right = isDown; + Game.instance._updateMove(1); + break; + + case 38: + case 87: + if (isDown) { + Game.instance._player.jump(); + } + break; + + case 83: + case 40: + Game.instance._player.squat(isDown); + break; + + case 81: + if (isDown) { + Game.instance._player.switchWeaponR(); + } + break; + + case 69: + if (isDown) { + Game.instance._player.switchWeaponL(); + } + break; + + case 32: + if (isDown) { + Game.instance._player.switchSkin(); + } + break; + } + } + + private _enterFrameHandler(event: egret.Event): void { + this._player.update(); + + let i = this._bullets.length; + while (i--) { + const bullet = this._bullets[i]; + if (bullet.update()) { + this._bullets.splice(i, 1); + } + } + } + + private _updateMove(dir: number): void { + if (this._left && this._right) { + this._player.move(dir); + } + else if (this._left) { + this._player.move(-1); + } + else if (this._right) { + this._player.move(1); + } + else { + this._player.move(0); + } + } + + public addBullet(bullet: Bullet): void { + this._bullets.push(bullet); + } + } + + class Mecha { + private static readonly JUMP_SPEED: number = 20; + private static readonly NORMALIZE_MOVE_SPEED: number = 3.6; + private static readonly MAX_MOVE_SPEED_FRONT: number = Mecha.NORMALIZE_MOVE_SPEED * 1.4; + private static readonly MAX_MOVE_SPEED_BACK: number = Mecha.NORMALIZE_MOVE_SPEED * 1.0; + private static readonly NORMAL_ANIMATION_GROUP: string = "normal"; + private static readonly AIM_ANIMATION_GROUP: string = "aim"; + private static readonly ATTACK_ANIMATION_GROUP: string = "attack"; + private static readonly WEAPON_L_LIST: Array = ["weapon_1502b_l", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d", "weapon_1005e"]; + private static readonly WEAPON_R_LIST: Array = ["weapon_1502b_r", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d"]; + private static readonly SKINS: Array = ["mecha_1502b", "skin_a", "skin_b", "skin_c"]; + + private _isJumpingA: boolean = false; + private _isJumpingB: boolean = false; + private _isSquating: boolean = false; + private _isAttackingA: boolean = false; + private _isAttackingB: boolean = false; + private _weaponRIndex: number = 0; + private _weaponLIndex: number = 0; + private _skinIndex: number = 0; + private _faceDir: number = 1; + private _aimDir: number = 0; + private _moveDir: number = 0; + private _aimRadian: number = 0.0; + private _speedX: number = 0.0; + private _speedY: number = 0.0; + private _armature: dragonBones.Armature; + private _armatureDisplay: ArmatureDisplayType; + private _weaponL: dragonBones.Armature; + private _weaponR: dragonBones.Armature; + private _aimState: dragonBones.AnimationState | null = null; + private _walkState: dragonBones.AnimationState | null = null; + private _attackState: dragonBones.AnimationState | null = null; + private readonly _target: PointType = new egret.Point(); + private readonly _helpPoint: PointType = new egret.Point(); + + public constructor() { + this._armatureDisplay = dragonBones.EgretFactory.factory.buildArmatureDisplay("mecha_1502b"); + this._armatureDisplay.x = Game.STAGE_WIDTH * 0.5; + this._armatureDisplay.y = Game.GROUND; + this._armature = this._armatureDisplay.armature; + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_IN_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_OUT_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.COMPLETE, this._animationEventHandler, this); + + // Get weapon childArmature. + this._weaponL = this._armature.getSlot("weapon_l").childArmature; + this._weaponR = this._armature.getSlot("weapon_r").childArmature; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + Game.instance.addChild(this._armatureDisplay); + this._updateAnimation(); + } + + public move(dir: number): void { + if (this._moveDir === dir) { + return; + } + + this._moveDir = dir; + this._updateAnimation(); + } + + public jump(): void { + if (this._isJumpingA) { + return; + } + + this._isJumpingA = true; + this._armature.animation.fadeIn( + "jump_1", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + } + + public squat(isSquating: boolean): void { + if (this._isSquating === isSquating) { + return; + } + + this._isSquating = isSquating; + this._updateAnimation(); + } + + public attack(isAttacking: boolean): void { + if (this._isAttackingA === isAttacking) { + return; + } + + this._isAttackingA = isAttacking; + } + + public switchWeaponL(): void { + this._weaponL.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + this._weaponLIndex++; + this._weaponLIndex %= Mecha.WEAPON_L_LIST.length; + const weaponName = Mecha.WEAPON_L_LIST[this._weaponLIndex]; + this._weaponL = dragonBones.EgretFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_l").childArmature = this._weaponL; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + } + + public switchWeaponR(): void { + this._weaponR.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + this._weaponRIndex++; + this._weaponRIndex %= Mecha.WEAPON_R_LIST.length; + const weaponName = Mecha.WEAPON_R_LIST[this._weaponRIndex]; + this._weaponR = dragonBones.EgretFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_r").childArmature = this._weaponR; + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + } + + public switchSkin(): void { + this._skinIndex++; + this._skinIndex %= Mecha.SKINS.length; + const skinName = Mecha.SKINS[this._skinIndex]; + const skinData = dragonBones.EgretFactory.factory.getArmatureData(skinName).defaultSkin; + dragonBones.EgretFactory.factory.changeSkin(this._armature, skinData, ["weapon_l", "weapon_r"]); + } + + public aim(x: number, y: number): void { + this._target.x = x; + this._target.y = y; + } + + public update(): void { + this._updatePosition(); + this._updateAim(); + this._updateAttack(); + } + + private _animationEventHandler(event: EventType): void { + switch (event.type) { + case dragonBones.EventObject.FADE_IN_COMPLETE: + if (event.eventObject.animationState.name === "jump_1") { + this._isJumpingB = true; + this._speedY = -Mecha.JUMP_SPEED; + + if (this._moveDir !== 0) { + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + + this._armature.animation.fadeIn( + "jump_2", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + break; + + case dragonBones.EventObject.FADE_OUT_COMPLETE: + if (event.eventObject.animationState.name === "attack_01") { + this._isAttackingB = false; + this._attackState = null; + } + break; + + case dragonBones.EventObject.COMPLETE: + if (event.eventObject.animationState.name === "jump_4") { + this._isJumpingA = false; + this._isJumpingB = false; + this._updateAnimation(); + } + break; + } + } + + private _frameEventHandler(event: EventType): void { + if (event.eventObject.name === "fire") { + (event.eventObject.armature.display as ArmatureDisplayType).localToGlobal(event.eventObject.bone.global.x, event.eventObject.bone.global.y, this._helpPoint); + this._fire(this._helpPoint); + } + } + + private _fire(firePoint: PointType): void { + const radian = this._faceDir < 0 ? Math.PI - this._aimRadian : this._aimRadian; + const bullet = new Bullet("bullet_01", "fire_effect_01", radian + Math.random() * 0.02 - 0.01, 40, firePoint); + Game.instance.addBullet(bullet); + } + + private _updateAnimation(): void { + if (this._isJumpingA) { + return; + } + + if (this._isSquating) { + this._speedX = 0; + this._armature.animation.fadeIn( + "squat", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + return; + } + + if (this._moveDir === 0) { + this._speedX = 0; + this._armature.animation.fadeIn( + "idle", -1.0, -1, 0, + Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + } + else { + if (this._walkState === null) { + this._walkState = this._armature.animation.fadeIn( + "walk", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ); + + this._walkState.resetToPose = false; + } + + if (this._moveDir * this._faceDir > 0) { + this._walkState.timeScale = Mecha.MAX_MOVE_SPEED_FRONT / Mecha.NORMALIZE_MOVE_SPEED; + } + else { + this._walkState.timeScale = -Mecha.MAX_MOVE_SPEED_BACK / Mecha.NORMALIZE_MOVE_SPEED; + } + + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + } + + private _updatePosition(): void { + if (this._speedX !== 0.0) { + this._armatureDisplay.x += this._speedX; + if (this._armatureDisplay.x < 0) { + this._armatureDisplay.x = 0; + } + else if (this._armatureDisplay.x > Game.STAGE_WIDTH) { + this._armatureDisplay.x = Game.STAGE_WIDTH; + } + } + + if (this._speedY !== 0.0) { + if (this._speedY < 5.0 && this._speedY + Game.G >= 5.0) { + this._armature.animation.fadeIn( + "jump_3", -1.0, -1, 0 + , Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + + this._speedY += Game.G; + this._armatureDisplay.y += this._speedY; + + if (this._armatureDisplay.y > Game.GROUND) { + this._armatureDisplay.y = Game.GROUND; + this._speedY = 0.0; + this._armature.animation.fadeIn( + "jump_4", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + } + } + + private _updateAim(): void { + this._faceDir = this._target.x > this._armatureDisplay.x ? 1 : -1; + if (this._armatureDisplay.armature.flipX !== this._faceDir < 0) { + this._armatureDisplay.armature.flipX = !this._armatureDisplay.armature.flipX; + + if (this._moveDir !== 0) { + this._updateAnimation(); + } + } + + const aimOffsetY = this._armature.getBone("chest").global.y * this._armatureDisplay.scaleY; + if (this._faceDir > 0) { + this._aimRadian = Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + } + else { + this._aimRadian = Math.PI - Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + if (this._aimRadian > Math.PI) { + this._aimRadian -= Math.PI * 2.0; + } + } + + let aimDir = 0; + if (this._aimRadian > 0.0) { + aimDir = -1; + } + else { + aimDir = 1; + } + + if (this._aimState === null || this._aimDir !== aimDir) { + this._aimDir = aimDir; + + // Animation mixing. + if (this._aimDir >= 0) { + this._aimState = this._armature.animation.fadeIn( + "aim_up", -1.0, -1, + 0, Mecha.AIM_ANIMATION_GROUP + ); + } + else { + this._aimState = this._armature.animation.fadeIn( + "aim_down", -1.0, -1, + 0, Mecha.AIM_ANIMATION_GROUP + ); + } + + this._aimState.resetToPose = false; + } + + this._aimState.weight = Math.abs(this._aimRadian / Math.PI * 2); + this._armature.invalidUpdate(); + } + + private _updateAttack(): void { + if (!this._isAttackingA || this._isAttackingB) { + return; + } + + this._isAttackingB = true; + this._attackState = this._armature.animation.fadeIn( + "attack_01", -1.0, -1, + 0, Mecha.ATTACK_ANIMATION_GROUP + ); + + this._attackState.resetToPose = false; + this._attackState.autoFadeOutTime = this._attackState.fadeTotalTime; + } + } + + class Bullet { + private _speedX: number = 0.0; + private _speedY: number = 0.0; + + private _armatureDisplay: ArmatureDisplayType; + private _effecDisplay: ArmatureDisplayType | null = null; + + public constructor(armatureName: string, effectArmatureName: string | null, radian: number, speed: number, position: PointType) { + this._speedX = Math.cos(radian) * speed; + this._speedY = Math.sin(radian) * speed; + + this._armatureDisplay = dragonBones.EgretFactory.factory.buildArmatureDisplay(armatureName); + this._armatureDisplay.x = position.x + Math.random() * 2 - 1; + this._armatureDisplay.y = position.y + Math.random() * 2 - 1; + this._armatureDisplay.rotation = radian * 180.0 / Math.PI; + + if (effectArmatureName !== null) { + this._effecDisplay = dragonBones.EgretFactory.factory.buildArmatureDisplay(effectArmatureName); + this._effecDisplay.rotation = radian * 180.0 / Math.PI; + this._effecDisplay.x = this._armatureDisplay.x; + this._effecDisplay.y = this._armatureDisplay.y; + this._effecDisplay.scaleX = 1.0 + Math.random() * 1.0; + this._effecDisplay.scaleY = 1.0 + Math.random() * 0.5; + if (Math.random() < 0.5) { + this._effecDisplay.scaleY *= -1.0; + } + + Game.instance.addChild(this._effecDisplay); + this._effecDisplay.animation.play("idle"); + } + + Game.instance.addChild(this._armatureDisplay); + this._armatureDisplay.animation.play("idle"); + } + + public update(): boolean { + this._armatureDisplay.x += this._speedX; + this._armatureDisplay.y += this._speedY; + + if ( + this._armatureDisplay.x < -100.0 || this._armatureDisplay.x >= Game.STAGE_WIDTH + 100.0 || + this._armatureDisplay.y < -100.0 || this._armatureDisplay.y >= Game.STAGE_HEIGHT + 100.0 + ) { + Game.instance.removeChild(this._armatureDisplay); + this._armatureDisplay.dispose(); + + if (this._effecDisplay !== null) { + Game.instance.removeChild(this._effecDisplay); + this._effecDisplay.dispose(); + } + + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/HelloDragonBones.ts b/reference/Egret/Demos/src/demo/HelloDragonBones.ts new file mode 100644 index 0000000..370058d --- /dev/null +++ b/reference/Egret/Demos/src/demo/HelloDragonBones.ts @@ -0,0 +1,43 @@ +/** + * How to use + * 1. Load data. + * + * 2. Parse data. + * factory.parseDragonBonesData(); + * factory.parseTextureAtlasData(); + * + * 3. Build armature. + * armatureDisplay = factory.buildArmatureDisplay("armatureName"); + * + * 4. Play animation. + * armatureDisplay.animation.play("animationName"); + * + * 5. Add armature to stage. + * addChild(armatureDisplay); + */ +class HelloDragonBones extends BaseTest { + public constructor() { + super(); + + this._resources.push( + // "resource/assets/dragon_boy_ske.json", + "resource/assets/dragon_boy_ske.dbbin", + "resource/assets/dragon_boy_tex.json", + "resource/assets/dragon_boy_tex.png" + ); + } + + protected _onStart(): void { + const factory = dragonBones.EgretFactory.factory; + // factory.parseDragonBonesData(RES.getRes("resource/assets/dragon_boy_ske.json")); + factory.parseDragonBonesData(RES.getRes("resource/assets/dragon_boy_ske.dbbin")); + factory.parseTextureAtlasData(RES.getRes("resource/assets/dragon_boy_tex.json"), RES.getRes("resource/assets/dragon_boy_tex.png")); + + const armatureDisplay = factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.animation.play("walk"); + + armatureDisplay.x = this.stage.stageWidth * 0.5; + armatureDisplay.y = this.stage.stageHeight * 0.5 + 100; + this.addChild(armatureDisplay); + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/PerformanceTest.ts b/reference/Egret/Demos/src/demo/PerformanceTest.ts new file mode 100644 index 0000000..be15e3f --- /dev/null +++ b/reference/Egret/Demos/src/demo/PerformanceTest.ts @@ -0,0 +1,141 @@ +class PerformanceTest extends BaseTest { + private _addingArmature: boolean = false; + private _removingArmature: boolean = false; + private readonly _text: egret.TextField = new egret.TextField(); + private readonly _armatures: Array = []; + public constructor() { + super(); + + this._resources.push( + "resource/assets/dragon_boy_ske.dbbin", + "resource/assets/dragon_boy_tex.json", + "resource/assets/dragon_boy_tex.png" + ); + } + + protected _onStart(): void { + // + this._text.size = 20; + this._text.textAlign = egret.HorizontalAlign.CENTER; + this._text.text = ""; + this.addChild(this._text); + + for (let i = 0; i < 300; ++i) { + this._addArmature(); + } + + this._resetPosition(); + this._updateText(); + + this.stage.addEventListener(egret.Event.ENTER_FRAME, this._enterFrameHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this._touchHandler, this); + this.stage.addEventListener(egret.TouchEvent.TOUCH_END, this._touchHandler, this); + } + + private _enterFrameHandler(event: egret.Event): void { + if (this._addingArmature) { + for (let i = 0; i < 10; ++i) { + + this._addArmature(); + } + + this._resetPosition(); + this._updateText(); + } + + if (this._removingArmature) { + for (let i = 0; i < 10; ++i) { + + this._removeArmature(); + } + + this._resetPosition(); + this._updateText(); + } + } + + private _touchHandler(event: egret.TouchEvent): void { + switch (event.type) { + case egret.TouchEvent.TOUCH_BEGIN: + const touchRight = event.stageX > this.stage.stageWidth * 0.5; + this._addingArmature = touchRight; + this._removingArmature = !touchRight; + break; + + case egret.TouchEvent.TOUCH_END: + this._addingArmature = false; + this._removingArmature = false; + break; + } + } + + private _addArmature(): void { + if (this._armatures.length === 0) { + dragonBones.EgretFactory.factory.parseDragonBonesData(RES.getRes("resource/assets/dragon_boy_ske.dbbin")); + dragonBones.EgretFactory.factory.parseTextureAtlasData(RES.getRes("resource/assets/dragon_boy_tex.json"), RES.getRes("resource/assets/dragon_boy_tex.png")); + } + + const armatureDisplay = dragonBones.EgretFactory.factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.armature.cacheFrameRate = 24; + armatureDisplay.animation.play("walk", 0); + armatureDisplay.scaleX = armatureDisplay.scaleY = 0.7; + this.addChild(armatureDisplay); + + this._armatures.push(armatureDisplay); + } + + private _removeArmature(): void { + if (this._armatures.length === 0) { + return; + } + + const armatureDisplay = this._armatures.pop(); + this.removeChild(armatureDisplay); + armatureDisplay.dispose(); + + if (this._armatures.length === 0) { + dragonBones.EgretFactory.factory.clear(true); + dragonBones.BaseObject.clearPool(); + } + } + + private _resetPosition(): void { + const armatureCount = this._armatures.length; + if (armatureCount === 0) { + return; + } + + const paddingH = 50; + const paddingV = 150; + const gapping = 100; + + const stageWidth = this.stage.stageWidth - paddingH * 2; + const columnCount = Math.floor(stageWidth / gapping); + const paddingHModify = (this.stage.stageWidth - columnCount * gapping) * 0.5; + + const dX = stageWidth / columnCount; + const dY = (this.stage.stageHeight - paddingV * 2) / Math.ceil(armatureCount / columnCount); + + for (let i = 0, l = armatureCount; i < l; ++i) { + const armatureDisplay = this._armatures[i]; + const lineY = Math.floor(i / columnCount); + + paddingHModify; + dX; + dY; + lineY; + // armatureDisplay.x = (i % columnCount) * dX + paddingHModify; + // armatureDisplay.y = lineY * dY + paddingV; + armatureDisplay.x = Math.random() * this.stage.stageWidth; + armatureDisplay.y = Math.random() * this.stage.stageHeight; + } + } + + private _updateText(): void { + this._text.text = "Count: " + this._armatures.length + " \nTouch screen left to decrease count / right to increase count."; + this._text.width = this.stage.stageWidth; + this._text.x = 0; + this._text.y = this.stage.stageHeight - 60; + this.addChild(this._text); + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/src/demo/ReplaceSlotDisplay.ts b/reference/Egret/Demos/src/demo/ReplaceSlotDisplay.ts new file mode 100644 index 0000000..97d2a13 --- /dev/null +++ b/reference/Egret/Demos/src/demo/ReplaceSlotDisplay.ts @@ -0,0 +1,127 @@ +class ReplaceSlotDisplay extends BaseTest { + + private _displayIndex: number = 0; + private readonly _replaceDisplays: string[] = [ + // Replace normal display. + "display0002", "display0003", "display0004", "display0005", "display0006", "display0007", "display0008", "display0009", "display0010", + // Replace mesh display. + "meshA", "meshB", "meshC", + ]; + + private readonly _factory: dragonBones.EgretFactory = dragonBones.EgretFactory.factory; + private _armatureDisplay: dragonBones.EgretArmatureDisplay; + + public constructor() { + super(); + + this._resources.push( + "resource/assets/replace_slot_display/main_ske.json", + "resource/assets/replace_slot_display/main_tex.json", + "resource/assets/replace_slot_display/main_tex.png", + "resource/assets/replace_slot_display/replace_ske.json", + "resource/assets/replace_slot_display/replace_tex.json", + "resource/assets/replace_slot_display/replace_tex.png" + ); + } + + protected _onStart(): void { + this._factory.parseDragonBonesData(RES.getRes("resource/assets/replace_slot_display/main_ske.json")); + this._factory.parseTextureAtlasData(RES.getRes("resource/assets/replace_slot_display/main_tex.json"), RES.getRes("resource/assets/replace_slot_display/main_tex.png")); + this._factory.parseDragonBonesData(RES.getRes("resource/assets/replace_slot_display/replace_ske.json")); + this._factory.parseTextureAtlasData(RES.getRes("resource/assets/replace_slot_display/replace_tex.json"), RES.getRes("resource/assets/replace_slot_display/replace_tex.png")); + + this._armatureDisplay = this._factory.buildArmatureDisplay("MyArmature"); + this._armatureDisplay.animation.timeScale = 0.1; + this._armatureDisplay.animation.play(); + + this._armatureDisplay.x = this.stage.stageWidth * 0.5; + this._armatureDisplay.y = this.stage.stageHeight * 0.5; + this.addChild(this._armatureDisplay); + + this.stage.addEventListener(egret.TouchEvent.TOUCH_BEGIN, + (event: egret.TouchEvent): void => { + this._replaceDisplay(); + }, + this + ); + } + + private _replaceDisplay(): void { + this._displayIndex = (this._displayIndex + 1) % this._replaceDisplays.length; + + const replaceDisplayName = this._replaceDisplays[this._displayIndex]; + + if (replaceDisplayName.indexOf("mesh") >= 0) { // Replace mesh display. + switch (replaceDisplayName) { + case "meshA": + // Normal to mesh. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "meshA", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0002", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + + case "meshB": + // Normal to mesh. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "meshB", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0003", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + + case "meshC": + // Back to normal. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "mesh", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0005", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + } + } + else { // Replace normal display. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + replaceDisplayName, + this._armatureDisplay.armature.getSlot("ball") + ); + } + } +} \ No newline at end of file diff --git a/reference/Egret/Demos/template/debug/index.html b/reference/Egret/Demos/template/debug/index.html new file mode 100644 index 0000000..7063cf3 --- /dev/null +++ b/reference/Egret/Demos/template/debug/index.html @@ -0,0 +1,88 @@ + + + + + + Egret + + + + + + + + + + +

+ + + + \ No newline at end of file diff --git a/reference/Egret/Demos/template/runtime/native_loader.js b/reference/Egret/Demos/template/runtime/native_loader.js new file mode 100644 index 0000000..ad94285 --- /dev/null +++ b/reference/Egret/Demos/template/runtime/native_loader.js @@ -0,0 +1,8 @@ +require("launcher/native_require.js"); + +egret_native.egtMain = function () { + egret_native.nativeType = "native"; + + egret_native.egretInit(); + egret_native.egretStart(); +}; diff --git a/reference/Egret/Demos/template/runtime/native_require.js b/reference/Egret/Demos/template/runtime/native_require.js new file mode 100644 index 0000000..045098c --- /dev/null +++ b/reference/Egret/Demos/template/runtime/native_require.js @@ -0,0 +1,51 @@ + +var game_file_list = [ + //以下为自动修改,请勿修改 + //----auto game_file_list start---- + //----auto game_file_list end---- +]; + +var window = this; + +egret_native.setSearchPaths([""]); + +egret_native.requireFiles = function () { + for (var key in game_file_list) { + var src = game_file_list[key]; + require(src); + } +}; + +egret_native.egretInit = function () { + egret_native.requireFiles(); + egret.TextField.default_fontFamily = "/system/fonts/DroidSansFallback.ttf"; + //egret.dom为空实现 + egret.dom = {}; + egret.dom.drawAsCanvas = function () { + }; +}; + +egret_native.egretStart = function () { + var option = { + //以下为自动修改,请勿修改 + //----auto option start---- + entryClassName: "Main", + frameRate: 60, + scaleMode: "fixedHeight", + contentWidth: 800, + contentHeight: 600, + showPaintRect: false, + showFPS: true, + fpsStyles: "x:0,y:0,size:12,textColor:0xffffff,bgAlpha:0.9", + showLog: false, + logFilter: "", + maxTouches: 2, + textureScaleFactor: 1 + //----auto option end---- + }; + + egret.native.NativePlayer.option = option; + egret.runEgret(); + egret_native.Label.createLabel(egret.TextField.default_fontFamily, 20, "", 0); + egret_native.EGTView.preSetOffScreenBufferEnable(true); +}; \ No newline at end of file diff --git a/reference/Egret/Demos/template/runtime/runtime_loader.js b/reference/Egret/Demos/template/runtime/runtime_loader.js new file mode 100644 index 0000000..5b5f76b --- /dev/null +++ b/reference/Egret/Demos/template/runtime/runtime_loader.js @@ -0,0 +1,8 @@ +require("launcher/native_require.js"); + +egret_native.egtMain = function () { + egret_native.nativeType = "runtime"; + + egret_native.egretInit(); + egret_native.egretStart(); +}; \ No newline at end of file diff --git a/reference/Egret/Demos/template/web/index.html b/reference/Egret/Demos/template/web/index.html new file mode 100644 index 0000000..6eb8e17 --- /dev/null +++ b/reference/Egret/Demos/template/web/index.html @@ -0,0 +1,88 @@ + + + + + + Egret + + + + + + + + + + +
+
+ + + + \ No newline at end of file diff --git a/reference/Egret/Demos/tsconfig.json b/reference/Egret/Demos/tsconfig.json new file mode 100644 index 0000000..6f80508 --- /dev/null +++ b/reference/Egret/Demos/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": false, + "alwaysStrict": true, + "noImplicitAny": false, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "strictNullChecks": false, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ] +} \ No newline at end of file diff --git a/reference/Egret/Demos/wingProperties.json b/reference/Egret/Demos/wingProperties.json new file mode 100644 index 0000000..bfe9073 --- /dev/null +++ b/reference/Egret/Demos/wingProperties.json @@ -0,0 +1,11 @@ +{ + "resourcePlugin": { + "configs": [ + { + "configPath": "resource/default.res.json", + "relativePath": "resource/" + } + ] + }, + "theme": "resource/default.thm.json" +} \ No newline at end of file diff --git a/reference/Egret/README.md b/reference/Egret/README.md new file mode 100644 index 0000000..9e36244 --- /dev/null +++ b/reference/Egret/README.md @@ -0,0 +1,5 @@ +# DragonBones Egret library + +## [Demos](./Demos/) + +## [Egret](http://www.egret.com/) \ No newline at end of file diff --git a/reference/Egret/wasm/README.md b/reference/Egret/wasm/README.md new file mode 100644 index 0000000..161b092 --- /dev/null +++ b/reference/Egret/wasm/README.md @@ -0,0 +1,8 @@ +## How to build +``` +$npm install +$npm run build +``` + +## Egret declaration +[egret.d.ts](https://github.com/egret-labs/egret-core/blob/master/build/egret/egret.d.ts) \ No newline at end of file diff --git a/reference/Egret/wasm/out/dragonBones-wasm.d.ts b/reference/Egret/wasm/out/dragonBones-wasm.d.ts new file mode 100644 index 0000000..67a5b7c --- /dev/null +++ b/reference/Egret/wasm/out/dragonBones-wasm.d.ts @@ -0,0 +1,4698 @@ +declare namespace dragonBones { + /** + * @private + */ + const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4, + } + /** + * @private + */ + const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2, + } + /** + * @private + */ + const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3, + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2, + } + /** + * @private + */ + const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11, + } + /** + * @private + */ + const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13, + } + /** + * @private + */ + const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5, + } + /** + * @private + */ + const enum TimelineType { + Action = 0, + ZOrder = 1, + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + AnimationTime = 40, + AnimationWeight = 41, + } + /** + * @private + */ + const enum OffsetMode { + None = 0, + Additive = 1, + Override = 2, + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5, + } + /** + * @private + */ + interface Map { + [key: string]: T; + } + /** + * @private + */ + class DragonBones { + static yDown: boolean; + static debug: boolean; + static debugDraw: boolean; + static webAssembly: boolean; + static readonly VERSION: string; + private readonly _clock; + private readonly _events; + private readonly _objects; + private _eventManager; + constructor(eventManager: IEventDispatcher); + advanceTime(passedTime: number): void; + bufferEvent(value: EventObject): void; + bufferObject(object: BaseObject): void; + readonly clock: WorldClock; + readonly eventManager: IEventDispatcher; + } +} +declare namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class BaseObject { + private static _hashCode; + private static _defaultMaxCount; + private static readonly _maxCountMap; + private static readonly _poolsMap; + private static _returnObject(object); + /** + * @private + */ + static toString(): string; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static clearPool(objectConstructor?: (typeof BaseObject) | null): void; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static borrowObject(objectConstructor: { + new (): T; + }): T; + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly hashCode: number; + private _isInPool; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + returnToPool(): void; + } +} +declare namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Matrix { + a: number; + b: number; + c: number; + d: number; + tx: number; + ty: number; + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Matrix): Matrix; + /** + * @private + */ + copyFromArray(value: Array, offset?: number): Matrix; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + identity(): Matrix; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + concat(value: Matrix): Matrix; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + invert(): Matrix; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + transformPoint(x: number, y: number, result: { + x: number; + y: number; + }, delta?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Transform { + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x: number; + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y: number; + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew: number; + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation: number; + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX: number; + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY: number; + /** + * @private + */ + static readonly PI_D: number; + /** + * @private + */ + static readonly PI_H: number; + /** + * @private + */ + static readonly PI_Q: number; + /** + * @private + */ + static readonly RAD_DEG: number; + /** + * @private + */ + static readonly DEG_RAD: number; + /** + * @private + */ + static normalizeRadian(value: number): number; + constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x?: number, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y?: number, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew?: number, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation?: number, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX?: number, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Transform): Transform; + /** + * @private + */ + identity(): Transform; + /** + * @private + */ + add(value: Transform): Transform; + /** + * @private + */ + minus(value: Transform): Transform; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fromMatrix(matrix: Matrix): Transform; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + toMatrix(matrix: Matrix): Transform; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ColorTransform { + alphaMultiplier: number; + redMultiplier: number; + greenMultiplier: number; + blueMultiplier: number; + alphaOffset: number; + redOffset: number; + greenOffset: number; + blueOffset: number; + constructor(alphaMultiplier?: number, redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaOffset?: number, redOffset?: number, greenOffset?: number, blueOffset?: number); + copyFrom(value: ColorTransform): void; + identity(): void; + } +} +declare namespace dragonBones { + class Point { + x: number; + y: number; + constructor(x?: number, y?: number); + copyFrom(value: Point): void; + clear(): void; + } +} +declare namespace dragonBones { + class Rectangle { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + copyFrom(value: Rectangle): void; + clear(): void; + } +} +declare namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + class UserData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly ints: Array; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly floats: Array; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly strings: Array; + /** + * @private + */ + protected _onClear(): void; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getInt(index?: number): number; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getFloat(index?: number): number; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getString(index?: number): string; + } + /** + * @private + */ + class ActionData extends BaseObject { + static toString(): string; + type: ActionType; + name: string; + bone: BoneData | null; + slot: SlotData | null; + data: UserData | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + class DragonBonesData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly frameIndices: Array; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatureNames: Array; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatures: Map; + /** + * @private + */ + intArray: Array | Int16Array; + /** + * @private + */ + floatArray: Array | Float32Array; + /** + * @private + */ + frameIntArray: Array | Int16Array; + /** + * @private + */ + frameFloatArray: Array | Float32Array; + /** + * @private + */ + frameArray: Array | Int16Array; + /** + * @private + */ + timelineArray: Array | Uint16Array; + /** + * @private + */ + userData: UserData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addArmature(value: ArmatureData): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + getArmature(name: string): ArmatureData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + dispose(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + class CanvasData extends BaseObject { + /** + * @private + */ + static toString(): string; + hasBackground: boolean; + color: number; + x: number; + y: number; + width: number; + height: number; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class ArmatureData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * @private + */ + scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly aabb: Rectangle; + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * @private + */ + readonly sortedBones: Array; + /** + * @private + */ + readonly sortedSlots: Array; + /** + * @private + */ + readonly defaultActions: Array; + /** + * @private + */ + readonly actions: Array; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly bones: Map; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly slots: Map; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly skins: Map; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animations: Map; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultAnimation: AnimationData | null; + /** + * @private + */ + canvas: CanvasData | null; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + sortBones(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number; + /** + * @private + */ + getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void; + /** + * @private + */ + addBone(value: BoneData): void; + /** + * @private + */ + addSlot(value: SlotData): void; + /** + * @private + */ + addSkin(value: SkinData): void; + /** + * @private + */ + addAnimation(value: AnimationData): void; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + getBone(name: string): BoneData | null; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + getSlot(name: string): SlotData | null; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + getSkin(name: string): SkinData | null; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + getAnimation(name: string): AnimationData | null; + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class BoneData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + inheritTranslation: boolean; + /** + * @private + */ + inheritRotation: boolean; + /** + * @private + */ + inheritScale: boolean; + /** + * @private + */ + inheritReflection: boolean; + /** + * @private + */ + length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly transform: Transform; + /** + * @private + */ + readonly constraints: Array; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class SlotData extends BaseObject { + /** + * @private + */ + static readonly DEFAULT_COLOR: ColorTransform; + /** + * @private + */ + static createColor(): ColorTransform; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + blendMode: BlendMode; + /** + * @private + */ + displayIndex: number; + /** + * @private + */ + zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + color: ColorTransform; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + class SkinData extends BaseObject { + static toString(): string; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly displays: Map>; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addDisplay(slotName: string, value: DisplayData | null): void; + /** + * @private + */ + getDisplay(slotName: string, displayName: string): DisplayData | null; + /** + * @private + */ + getDisplays(slotName: string): Array | null; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class ConstraintData extends BaseObject { + order: number; + target: BoneData; + bone: BoneData; + root: BoneData | null; + protected _onClear(): void; + } + /** + * @private + */ + class IKConstraintData extends ConstraintData { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DisplayData extends BaseObject { + type: DisplayType; + name: string; + path: string; + readonly transform: Transform; + parent: ArmatureData; + protected _onClear(): void; + } + /** + * @private + */ + class ImageDisplayData extends DisplayData { + static toString(): string; + readonly pivot: Point; + texture: TextureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class ArmatureDisplayData extends DisplayData { + static toString(): string; + inheritAnimation: boolean; + readonly actions: Array; + armature: ArmatureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class MeshDisplayData extends ImageDisplayData { + static toString(): string; + inheritAnimation: boolean; + offset: number; + weight: WeightData | null; + protected _onClear(): void; + } + /** + * @private + */ + class BoundingBoxDisplayData extends DisplayData { + static toString(): string; + boundingBox: BoundingBoxData | null; + protected _onClear(): void; + } + /** + * @private + */ + class WeightData extends BaseObject { + static toString(): string; + count: number; + offset: number; + readonly bones: Array; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + height: number; + /** + * @private + */ + protected _onClear(): void; + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA: { + x: number; + y: number; + } | null, intersectionPointB: { + x: number; + y: number; + } | null, normalRadians: { + x: number; + y: number; + } | null): number; + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x, y, xMin, yMin, xMax, yMax); + /** + * @private + */ + static rectangleIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xMin: number, yMin: number, xMax: number, yMax: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static ellipseIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xC: number, yC: number, widthH: number, heightH: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static polygonIntersectsSegment(xA: number, yA: number, xB: number, yB: number, vertices: Array | Float32Array, offset: number, count: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + count: number; + /** + * @private + */ + offset: number; + /** + * @private + */ + x: number; + /** + * @private + */ + y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + vertices: Array | Float32Array; + /** + * @private + */ + weight: WeightData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } +} +declare namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + frameIntOffset: number; + /** + * @private + */ + frameFloatOffset: number; + /** + * @private + */ + frameOffset: number; + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + duration: number; + /** + * @private + */ + scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * @private + */ + readonly boneTimelines: Map>; + /** + * @private + */ + readonly slotTimelines: Map>; + /** + * @private + */ + readonly boneCachedFrameIndices: Map>; + /** + * @private + */ + readonly slotCachedFrameIndices: Map>; + /** + * @private + */ + actionTimeline: TimelineData | null; + /** + * @private + */ + zOrderTimeline: TimelineData | null; + /** + * @private + */ + parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + addBoneTimeline(bone: BoneData, timeline: TimelineData): void; + /** + * @private + */ + addSlotTimeline(slot: SlotData, timeline: TimelineData): void; + /** + * @private + */ + getBoneTimelines(name: string): Array | null; + /** + * @private + */ + getSlotTimeline(name: string): Array | null; + /** + * @private + */ + getBoneCachedFrameIndices(name: string): Array | null; + /** + * @private + */ + getSlotCachedFrameIndices(name: string): Array | null; + } + /** + * @private + */ + class TimelineData extends BaseObject { + static toString(): string; + type: TimelineType; + offset: number; + frameIndicesOffset: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + class AnimationConfig extends BaseObject { + static toString(): string; + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTime: number; + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly boneMask: Array; + /** + * @private + */ + protected _onClear(): void; + clear(): void; + copyFrom(value: AnimationConfig): void; + containsBoneMask(name: string): boolean; + addBoneMask(armature: Armature, name: string, recursive?: boolean): void; + removeBoneMask(armature: Armature, name: string, recursive?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + width: number; + /** + * @private + */ + height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + imagePath: string; + /** + * @private + */ + readonly textures: Map; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + copyFrom(value: TextureAtlasData): void; + /** + * @private + */ + abstract createTexture(): TextureData; + /** + * @private + */ + addTexture(value: TextureData): void; + /** + * @private + */ + getTexture(name: string): TextureData | null; + } + /** + * @private + */ + abstract class TextureData extends BaseObject { + static createRectangle(): Rectangle; + rotated: boolean; + name: string; + readonly region: Rectangle; + parent: TextureAtlasData; + frame: Rectangle | null; + protected _onClear(): void; + copyFrom(value: TextureData): void; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} +declare namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + class Armature extends BaseObject implements IAnimatable { + static toString(): string; + private static _onSortSlots(a, b); + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + inheritAnimation: boolean; + /** + * @private + */ + debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + private _debugDraw; + private _lockUpdate; + private _bonesDirty; + private _slotsDirty; + private _zOrderDirty; + private _flipX; + private _flipY; + /** + * @internal + * @private + */ + _cacheFrameIndex: number; + private readonly _bones; + private readonly _slots; + private readonly _actions; + private _animation; + private _proxy; + private _display; + /** + * @private + */ + _replaceTextureAtlasData: TextureAtlasData | null; + private _replacedTexture; + /** + * @internal + * @private + */ + _dragonBones: DragonBones; + private _clock; + /** + * @internal + * @private + */ + _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void; + private _sortBones(); + private _sortSlots(); + /** + * @internal + * @private + */ + _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void; + /** + * @internal + * @private + */ + _addBoneToBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _removeBoneFromBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _addSlotToSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _removeSlotFromSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _bufferAction(action: ActionData, append: boolean): void; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @private + */ + init(armatureData: ArmatureData, proxy: IArmatureProxy, display: any, dragonBones: DragonBones): void; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(boneName?: string | null, updateSlotDisplay?: boolean): void; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): Slot | null; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): Slot | null; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBone(name: string): Bone | null; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBoneByDisplay(display: any): Bone | null; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlot(name: string): Slot | null; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlotByDisplay(display: any): Slot | null; + /** + * @deprecated + */ + addBone(value: Bone, parentName?: string | null): void; + /** + * @deprecated + */ + removeBone(value: Bone): void; + /** + * @deprecated + */ + addSlot(value: Slot, parentName: string): void; + /** + * @deprecated + */ + removeSlot(value: Slot): void; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + flipX: boolean; + flipY: boolean; + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + cacheFrameRate: number; + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly name: string; + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animation: Animation; + /** + * @pivate + */ + readonly proxy: IArmatureProxy; + /** + * @pivate + */ + readonly eventDispatcher: IEventDispatcher; + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly display: any; + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + replacedTexture: any; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly parent: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + replaceTexture(texture: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + hasEventListener(type: EventStringType): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + addEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + removeEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + enableAnimationCache(frameRate: number): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + } +} +declare namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix; + /** + * @private + */ + protected static readonly _helpTransform: Transform; + /** + * @private + */ + protected static readonly _helpPoint: Point; + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly globalTransformMatrix: Matrix; + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly global: Transform; + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly offset: Transform; + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + _armature: Armature; + /** + * @private + */ + _parent: Bone; + /** + * @private + */ + protected _onClear(): void; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setParent(value: Bone | null): void; + /** + * @private + */ + updateGlobalTransform(): void; + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armature: Armature; + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly parent: Bone; + } +} +declare namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class Bone extends TransformObject { + static toString(): string; + /** + * @private + */ + offsetMode: OffsetMode; + /** + * @internal + * @private + */ + readonly animationPose: Transform; + /** + * @internal + * @private + */ + readonly constraints: Array; + /** + * @readonly + */ + boneData: BoneData; + /** + * @internal + * @private + */ + _transformDirty: boolean; + /** + * @internal + * @private + */ + _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + _blendDirty: boolean; + private _localDirty; + private _visible; + private _cachedFrameIndex; + /** + * @internal + * @private + */ + _blendLayer: number; + /** + * @internal + * @private + */ + _blendLeftWeight: number; + /** + * @internal + * @private + */ + _blendLayerWeight: number; + private readonly _bones; + private readonly _slots; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache); + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + init(boneData: BoneData): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @internal + * @private + */ + updateByConstraint(): void; + /** + * @internal + * @private + */ + addConstraint(constraint: Constraint): void; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(child: TransformObject): boolean; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + visible: boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + readonly length: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + readonly slot: Slot | null; + } +} +declare namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + displayController: string | null; + /** + * @readonly + */ + slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + _colorDirty: boolean; + /** + * @private + */ + _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + _pivotX: number; + /** + * @private + */ + _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix; + /** + * @private + */ + readonly _colorTransform: ColorTransform; + /** + * @private + */ + readonly _ffdVertices: Array; + /** + * @private + */ + readonly _displayDatas: Array; + /** + * @private + */ + protected readonly _displayList: Array; + /** + * @private + */ + protected readonly _meshBones: Array; + /** + * @internal + * @private + */ + _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any; + /** + * @private + */ + protected _meshDisplay: any; + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void; + /** + * @private + */ + protected _updateDisplay(): void; + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void; + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setDisplayIndex(value: number, isAnimation?: boolean): boolean; + /** + * @internal + * @private + */ + _setZorder(value: number): boolean; + /** + * @internal + * @private + */ + _setColor(value: ColorTransform): boolean; + /** + * @private + */ + _setDisplayList(value: Array | null): boolean; + /** + * @private + */ + init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @private + */ + updateTransformAndMatrix(): void; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): boolean; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + displayIndex: number; + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + displayList: Array; + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + readonly boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + readonly rawDisplay: any; + /** + * @private + */ + readonly meshDisplay: any; + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + display: any; + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + childArmature: Armature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + setDisplay(value: any): void; + } +} +declare namespace dragonBones { + /** + * @private + * @internal + */ + abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix; + protected static readonly _helpTransform: Transform; + protected static readonly _helpPoint: Point; + target: Bone; + bone: Bone; + root: Bone | null; + protected _onClear(): void; + abstract update(): void; + } + /** + * @private + * @internal + */ + class IKConstraint extends Constraint { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + private _computeA(); + private _computeB(); + update(): void; + } +} +declare namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + time: number; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private readonly _animatebles; + private _clock; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(time?: number); + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(value: IAnimatable): boolean; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + add(value: IAnimatable): void; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + remove(value: IAnimatable): void; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + clear(): void; + /** + * @inheritDoc + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + class Animation extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private _animationDirty; + /** + * @internal + * @private + */ + _timelineDirty: boolean; + private readonly _animationNames; + private readonly _animationStates; + private readonly _animations; + private _armature; + private _animationConfig; + private _lastAnimationState; + /** + * @private + */ + protected _onClear(): void; + private _fadeOut(animationConfig); + /** + * @internal + * @private + */ + init(armature: Armature): void; + /** + * @internal + * @private + */ + advanceTime(passedTime: number): void; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + reset(): void; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(animationName?: string | null): void; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + playConfig(animationConfig: AnimationConfig): AnimationState | null; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + play(animationName?: string | null, playTimes?: number): AnimationState | null; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + fadeIn(animationName: string, fadeInTime?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode): AnimationState | null; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByTime(animationName: string, time?: number, playTimes?: number): AnimationState | null; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByFrame(animationName: string, frame?: number, playTimes?: number): AnimationState | null; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByProgress(animationName: string, progress?: number, playTimes?: number): AnimationState | null; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByTime(animationName: string, time?: number): AnimationState | null; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByFrame(animationName: string, frame?: number): AnimationState | null; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByProgress(animationName: string, progress?: number): AnimationState | null; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + getState(animationName: string): AnimationState | null; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + hasAnimation(animationName: string): boolean; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + getStates(): Array; + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationName: string; + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + animations: Map; + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly animationConfig: AnimationConfig; + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + gotoAndPlay(animationName: string, fadeInTime?: number, duration?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode, pauseFadeOut?: boolean, pauseFadeIn?: boolean): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + gotoAndStop(animationName: string, time?: number): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationList: Array; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationDataList: Array; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class BonePose extends BaseObject { + static toString(): string; + readonly current: Transform; + readonly delta: Transform; + readonly result: Transform; + protected _onClear(): void; + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationState extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * @private + */ + fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + animationData: AnimationData; + private _timelineDirty; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + _subFadeState: number; + /** + * @internal + * @private + */ + _position: number; + /** + * @internal + * @private + */ + _duration: number; + private _fadeTime; + private _time; + /** + * @internal + * @private + */ + _fadeProgress: number; + private _weightResult; + private readonly _boneMask; + private readonly _boneTimelines; + private readonly _slotTimelines; + private readonly _bonePoses; + private _armature; + /** + * @internal + * @private + */ + _actionTimeline: ActionTimelineState; + private _zOrderTimeline; + /** + * @private + */ + protected _onClear(): void; + private _isDisabled(slot); + private _advanceFadeTime(passedTime); + private _blendBoneTimline(timeline); + /** + * @private + * @internal + */ + init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void; + /** + * @private + * @internal + */ + updateTimelines(): void; + /** + * @private + * @internal + */ + advanceTime(passedTime: number, cacheFrameRate: number): void; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + play(): void; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(): void; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeOut(fadeOutTime: number, pausePlayhead?: boolean): void; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + containsBoneMask(name: string): boolean; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + addBoneMask(name: string, recursive?: boolean): void; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeBoneMask(name: string, recursive?: boolean): void; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeAllBoneMask(): void; + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeIn: boolean; + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeOut: boolean; + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeComplete: boolean; + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + currentTime: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + readonly clip: AnimationData; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + const enum TweenState { + None = 0, + Once = 1, + Always = 2, + } + /** + * @internal + * @private + */ + abstract class TimelineState extends BaseObject { + playState: number; + currentPlayTimes: number; + currentTime: number; + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + protected _onClear(): void; + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + protected _setCurrentTime(passedTime: number): boolean; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType, progress, easing); + private static _getEasingCurveValue(progress, samples, count, offset); + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + abstract class BoneTimelineState extends TweenTimelineState { + bone: Bone; + bonePose: BonePose; + protected _onClear(): void; + } + /** + * @internal + * @private + */ + abstract class SlotTimelineState extends TweenTimelineState { + slot: Slot; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class ActionTimelineState extends TimelineState { + static toString(): string; + private _onCrossFrame(frameIndex); + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + update(passedTime: number): void; + setCurrentTime(value: number): void; + } + /** + * @internal + * @private + */ + class ZOrderTimelineState extends TimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + class BoneAllTimelineState extends BoneTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + } + /** + * @internal + * @private + */ + class SlotDislayIndexTimelineState extends SlotTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + } + /** + * @internal + * @private + */ + class SlotColorTimelineState extends SlotTimelineState { + static toString(): string; + private _dirty; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + class SlotFFDTimelineState extends SlotTimelineState { + static toString(): string; + meshOffset: number; + private _dirty; + private _frameFloatOffset; + private _valueCount; + private _ffdCount; + private _valueOffset; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } +} +declare namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly START: string; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly LOOP_COMPLETE: string; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly COMPLETE: string; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN: string; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN_COMPLETE: string; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT: string; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT_COMPLETE: string; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FRAME_EVENT: string; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly SOUND_EVENT: string; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + data: UserData | null; + /** + * @private + */ + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + type EventStringType = string | "start" | "loopComplete" | "complete" | "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string; + protected static readonly DATA_VERSION_3_0: string; + protected static readonly DATA_VERSION_4_0: string; + protected static readonly DATA_VERSION_4_5: string; + protected static readonly DATA_VERSION_5_0: string; + protected static readonly DATA_VERSION: string; + protected static readonly DATA_VERSIONS: Array; + protected static readonly TEXTURE_ATLAS: string; + protected static readonly SUB_TEXTURE: string; + protected static readonly FORMAT: string; + protected static readonly IMAGE_PATH: string; + protected static readonly WIDTH: string; + protected static readonly HEIGHT: string; + protected static readonly ROTATED: string; + protected static readonly FRAME_X: string; + protected static readonly FRAME_Y: string; + protected static readonly FRAME_WIDTH: string; + protected static readonly FRAME_HEIGHT: string; + protected static readonly DRADON_BONES: string; + protected static readonly USER_DATA: string; + protected static readonly ARMATURE: string; + protected static readonly BONE: string; + protected static readonly IK: string; + protected static readonly SLOT: string; + protected static readonly SKIN: string; + protected static readonly DISPLAY: string; + protected static readonly ANIMATION: string; + protected static readonly Z_ORDER: string; + protected static readonly FFD: string; + protected static readonly FRAME: string; + protected static readonly TRANSLATE_FRAME: string; + protected static readonly ROTATE_FRAME: string; + protected static readonly SCALE_FRAME: string; + protected static readonly VISIBLE_FRAME: string; + protected static readonly DISPLAY_FRAME: string; + protected static readonly COLOR_FRAME: string; + protected static readonly DEFAULT_ACTIONS: string; + protected static readonly ACTIONS: string; + protected static readonly EVENTS: string; + protected static readonly INTS: string; + protected static readonly FLOATS: string; + protected static readonly STRINGS: string; + protected static readonly CANVAS: string; + protected static readonly TRANSFORM: string; + protected static readonly PIVOT: string; + protected static readonly AABB: string; + protected static readonly COLOR: string; + protected static readonly VERSION: string; + protected static readonly COMPATIBLE_VERSION: string; + protected static readonly FRAME_RATE: string; + protected static readonly TYPE: string; + protected static readonly SUB_TYPE: string; + protected static readonly NAME: string; + protected static readonly PARENT: string; + protected static readonly TARGET: string; + protected static readonly SHARE: string; + protected static readonly PATH: string; + protected static readonly LENGTH: string; + protected static readonly DISPLAY_INDEX: string; + protected static readonly BLEND_MODE: string; + protected static readonly INHERIT_TRANSLATION: string; + protected static readonly INHERIT_ROTATION: string; + protected static readonly INHERIT_SCALE: string; + protected static readonly INHERIT_REFLECTION: string; + protected static readonly INHERIT_ANIMATION: string; + protected static readonly INHERIT_FFD: string; + protected static readonly BEND_POSITIVE: string; + protected static readonly CHAIN: string; + protected static readonly WEIGHT: string; + protected static readonly FADE_IN_TIME: string; + protected static readonly PLAY_TIMES: string; + protected static readonly SCALE: string; + protected static readonly OFFSET: string; + protected static readonly POSITION: string; + protected static readonly DURATION: string; + protected static readonly TWEEN_TYPE: string; + protected static readonly TWEEN_EASING: string; + protected static readonly TWEEN_ROTATE: string; + protected static readonly TWEEN_SCALE: string; + protected static readonly CURVE: string; + protected static readonly SOUND: string; + protected static readonly EVENT: string; + protected static readonly ACTION: string; + protected static readonly X: string; + protected static readonly Y: string; + protected static readonly SKEW_X: string; + protected static readonly SKEW_Y: string; + protected static readonly SCALE_X: string; + protected static readonly SCALE_Y: string; + protected static readonly VALUE: string; + protected static readonly ROTATE: string; + protected static readonly SKEW: string; + protected static readonly ALPHA_OFFSET: string; + protected static readonly RED_OFFSET: string; + protected static readonly GREEN_OFFSET: string; + protected static readonly BLUE_OFFSET: string; + protected static readonly ALPHA_MULTIPLIER: string; + protected static readonly RED_MULTIPLIER: string; + protected static readonly GREEN_MULTIPLIER: string; + protected static readonly BLUE_MULTIPLIER: string; + protected static readonly UVS: string; + protected static readonly VERTICES: string; + protected static readonly TRIANGLES: string; + protected static readonly WEIGHTS: string; + protected static readonly SLOT_POSE: string; + protected static readonly BONE_POSE: string; + protected static readonly GOTO_AND_PLAY: string; + protected static readonly DEFAULT_NAME: string; + protected static _getArmatureType(value: string): ArmatureType; + protected static _getDisplayType(value: string): DisplayType; + protected static _getBoundingBoxType(value: string): BoundingBoxType; + protected static _getActionType(value: string): ActionType; + protected static _getBlendMode(value: string): BlendMode; + /** + * @private + */ + abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static parseDragonBonesData(rawData: any): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + static parseTextureAtlasData(rawData: any, scale?: number): any; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ObjectDataParser extends DataParser { + /** + * @private + */ + private _intArrayJson; + private _floatArrayJson; + private _frameIntArrayJson; + private _frameFloatArrayJson; + private _frameArrayJson; + private _timelineArrayJson; + private _intArrayBuffer; + private _floatArrayBuffer; + private _frameIntArrayBuffer; + private _frameFloatArrayBuffer; + private _frameArrayBuffer; + private _timelineArrayBuffer; + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean; + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number; + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string; + protected _rawTextureAtlasIndex: number; + protected readonly _rawBones: Array; + protected _data: DragonBonesData; + protected _armature: ArmatureData; + protected _bone: BoneData; + protected _slot: SlotData; + protected _skin: SkinData; + protected _mesh: MeshDisplayData; + protected _animation: AnimationData; + protected _timeline: TimelineData; + protected _rawTextureAtlases: Array | null; + private _defalultColorOffset; + private _prevTweenRotate; + private _prevRotation; + private readonly _helpMatrixA; + private readonly _helpMatrixB; + private readonly _helpTransform; + private readonly _helpColorTransform; + private readonly _helpPoint; + private readonly _helpArray; + private readonly _actionFrames; + private readonly _weightSlotPose; + private readonly _weightBonePoses; + private readonly _weightBoneIndices; + private readonly _cacheBones; + private readonly _meshs; + private readonly _slotChildActions; + /** + * @private + */ + private _getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, t, result); + /** + * @private + */ + private _samplingEasingCurve(curve, samples); + private _sortActionFrame(a, b); + private _parseActionDataInFrame(rawData, frameStart, bone, slot); + private _mergeActionFrame(rawData, frameStart, type, bone, slot); + private _parseCacheActionFrame(frame); + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData; + /** + * @private + */ + protected _parseBone(rawData: any): BoneData; + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void; + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData; + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData; + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null; + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void; + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseTimeline(rawData: any, type: TimelineType, addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, frameParser: (rawData: any, frameStart: number, frameCount: number) => number): TimelineData | null; + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void; + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void; + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number; + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void; + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @private + */ + protected _parseWASMArray(): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @inheritDoc + */ + parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale?: number): boolean; + /** + * @private + */ + private static _objectDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): ObjectDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BinaryDataParser extends ObjectDataParser { + private _binary; + private _binaryOffset; + private _intArray; + private _floatArray; + private _frameIntArray; + private _frameFloatArray; + private _frameArray; + private _timelineArray; + private _inRange(a, min, max); + private _decodeUTF8(data); + private _getUTF16Key(value); + private _parseBinaryTimeline(type, offset, timelineData?); + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @private + */ + private static _binaryDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): BinaryDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BuildArmaturePackage { + dataName: string; + textureAtlasName: string; + data: DragonBonesData; + armature: ArmatureData; + skin: SkinData | null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map>; + /** + * @private + */ + protected _dragonBones: DragonBones; + /** + * @private + */ + protected _dataParser: DataParser; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null; + /** + * @private + */ + protected _fillBuildArmaturePackage(dataPackage: BuildArmaturePackage, dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string): boolean; + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseDragonBonesData(rawData: any, name?: string | null, scale?: number): DragonBonesData | null; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + updateTextureAtlasData(name: string, textureAtlases: Array): void; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + getDragonBonesData(name: string): DragonBonesData | null; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + addDragonBonesData(data: DragonBonesData, name?: string | null): void; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeDragonBonesData(name: string, disposeData?: boolean): void; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureAtlasData(name: string): Array | null; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + addTextureAtlasData(data: TextureAtlasData, name?: string | null): void; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeTextureAtlasData(name: string, disposeData?: boolean): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + getArmatureData(name: string, dragonBonesName?: string): ArmatureData | null; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + clear(disposeData?: boolean): void; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + buildArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): Armature | null; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplayList(dragonBonesName: string | null, armatureName: string, slotName: string, slot: Slot): void; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + copyAnimationsToArmature(toArmature: Armature, fromArmatreName: string, fromSkinName?: string | null, fromDragonBonesDataName?: string | null, replaceOriginalAnimation?: boolean): boolean; + /** + * @private + */ + getAllDragonBonesData(): Map; + /** + * @private + */ + getAllTextureAtlasData(): Map>; + } +} +declare namespace dragonBones { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EgretEvent extends egret.Event { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly eventObject: EventObject; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + readonly armature: Armature; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + readonly bone: Bone | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + readonly slot: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + readonly animationName: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#name + */ + readonly frameLabel: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#name + */ + readonly sound: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + static START: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + static LOOP_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + static COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + static FADE_IN: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + static FADE_IN_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + static FADE_OUT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + static FADE_OUT_COMPLETE: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static ANIMATION_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static BONE_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + static MOVEMENT_FRAME_EVENT: string; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + static SOUND: string; + } + /** + * @inheritDoc + */ + class EgretArmatureDisplay extends egret.DisplayObjectContainer implements IArmatureProxy { + private _disposeProxy; + private _armature; + private _debugDrawer; + /** + * @inheritDoc + */ + init(armature: Armature): void; + /** + * @inheritDoc + */ + clear(): void; + /** + * @inheritDoc + */ + dispose(disposeProxy?: boolean): void; + /** + * @inheritDoc + */ + debugUpdate(isEnabled: boolean): void; + /** + * @inheritDoc + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * @inheritDoc + */ + hasEvent(type: EventStringType): boolean; + /** + * @inheritDoc + */ + addEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * @inheritDoc + */ + removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void; + /** + * @inheritDoc + */ + readonly armature: Armature; + /** + * @inheritDoc + */ + readonly animation: Animation; + } + interface PEgretTextureAtlasData extends TextureAtlasData { + renderTexture: egret.Texture | null; + textures: any; + __parent: any; + _textureNames: Array; + _texture: egret.Texture | null; + } + interface PEgretTextureData extends TextureData { + renderTexture: egret.Texture | null; + __parent: any; + _renderTexture: egret.Texture | null; + } + let EgretArmatureProxy: any; + let EgretSlot: any; + let EgretTextureAtlasData: any; + let EgretTextureData: any; + function createEgretDisplay(display: egret.DisplayObject | Armature | null, type: DisplayType): any; + function egretWASMInit(): void; + function registerGetterSetter(): void; +} +declare namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class EgretFactory extends BaseFactory { + private static _time; + private static _dragonBones; + private static _factory; + private static _eventManager; + private static _clockHandler(time); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 5.0 + * @language zh_CN + */ + static readonly clock: any; + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + static readonly factory: EgretFactory; + /** + * @private + */ + private _rawTextures; + /** + * @inheritDoc + */ + constructor(); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: any | null, textureAtlas: egret.Texture): TextureAtlasData; + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * @private + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + buildArmatureDisplay(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): EgretArmatureDisplay | null; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureDisplay(textureName: string, textureAtlasName?: string | null): egret.Bitmap | null; + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * public + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly soundEventManager: egret.EventDispatcher; + } +} diff --git a/reference/Egret/wasm/out/dragonBones-wasm.js b/reference/Egret/wasm/out/dragonBones-wasm.js new file mode 100644 index 0000000..71f9d81 --- /dev/null +++ b/reference/Egret/wasm/out/dragonBones-wasm.js @@ -0,0 +1,11750 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DragonBones = (function () { + function DragonBones(eventManager) { + this._clock = new dragonBones.WorldClock(); + this._events = []; + this._objects = []; + this._eventManager = null; + this._eventManager = eventManager; + } + DragonBones.prototype.advanceTime = function (passedTime) { + if (this._objects.length > 0) { + for (var _i = 0, _a = this._objects; _i < _a.length; _i++) { + var object = _a[_i]; + object.returnToPool(); + } + this._objects.length = 0; + } + this._clock.advanceTime(passedTime); + if (this._events.length > 0) { + for (var i = 0; i < this._events.length; ++i) { + var eventObject = this._events[i]; + var armature = eventObject.armature; + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + this.bufferObject(eventObject); + } + this._events.length = 0; + } + }; + DragonBones.prototype.bufferEvent = function (value) { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + }; + DragonBones.prototype.bufferObject = function (object) { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + }; + Object.defineProperty(DragonBones.prototype, "clock", { + get: function () { + return this._clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DragonBones.prototype, "eventManager", { + get: function () { + return this._eventManager; + }, + enumerable: true, + configurable: true + }); + DragonBones.yDown = true; + DragonBones.debug = false; + DragonBones.debugDraw = false; + DragonBones.webAssembly = false; + DragonBones.VERSION = "5.1.0"; + return DragonBones; + }()); + dragonBones.DragonBones = DragonBones; + if (!console.warn) { + console.warn = function () { }; + } + if (!console.assert) { + console.assert = function () { }; + } +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var BaseObject = (function () { + function BaseObject() { + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + this.hashCode = BaseObject._hashCode++; + this._isInPool = false; + } + BaseObject._returnObject = function (object) { + var classType = String(object.constructor); + var maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + }; + /** + * @private + */ + BaseObject.toString = function () { + throw new Error(); + }; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.setMaxCount = function (objectConstructor, maxCount) { + if (maxCount < 0 || maxCount !== maxCount) { + maxCount = 0; + } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (var classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + var pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + } + }; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.clearPool = function (objectConstructor) { + if (objectConstructor === void 0) { objectConstructor = null; } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (var k in BaseObject._poolsMap) { + var pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + }; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.borrowObject = function (objectConstructor) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + var object_1 = pool.pop(); + object_1._isInPool = false; + return object_1; + } + var object = new objectConstructor(); + object._onClear(); + return object; + }; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.prototype.returnToPool = function () { + this._onClear(); + BaseObject._returnObject(this); + }; + BaseObject._hashCode = 0; + BaseObject._defaultMaxCount = 1000; + BaseObject._maxCountMap = {}; + BaseObject._poolsMap = {}; + return BaseObject; + }()); + dragonBones.BaseObject = BaseObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Matrix = (function () { + function Matrix(a, b, c, d, tx, ty) { + if (a === void 0) { a = 1.0; } + if (b === void 0) { b = 0.0; } + if (c === void 0) { c = 0.0; } + if (d === void 0) { d = 1.0; } + if (tx === void 0) { tx = 0.0; } + if (ty === void 0) { ty = 0.0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * @private + */ + Matrix.prototype.toString = function () { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + }; + /** + * @private + */ + Matrix.prototype.copyFrom = function (value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + return this; + }; + /** + * @private + */ + Matrix.prototype.copyFromArray = function (value, offset) { + if (offset === void 0) { offset = 0; } + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + return this; + }; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.identity = function () { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + }; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.concat = function (value) { + var aA = this.a * value.a; + var bA = 0.0; + var cA = 0.0; + var dA = this.d * value.d; + var txA = this.tx * value.a + value.tx; + var tyA = this.ty * value.d + value.ty; + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + return this; + }; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.invert = function () { + var aA = this.a; + var bA = this.b; + var cA = this.c; + var dA = this.d; + var txA = this.tx; + var tyA = this.ty; + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + return this; + } + var determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + } + determinant = 1.0 / determinant; + var k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + return this; + }; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.transformPoint = function (x, y, result, delta) { + if (delta === void 0) { delta = false; } + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + }; + return Matrix; + }()); + dragonBones.Matrix = Matrix; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Transform = (function () { + function Transform( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (skew === void 0) { skew = 0.0; } + if (rotation === void 0) { rotation = 0.0; } + if (scaleX === void 0) { scaleX = 1.0; } + if (scaleY === void 0) { scaleY = 1.0; } + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + /** + * @private + */ + Transform.normalizeRadian = function (value) { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + return value; + }; + /** + * @private + */ + Transform.prototype.toString = function () { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + }; + /** + * @private + */ + Transform.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.identity = function () { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + return this; + }; + /** + * @private + */ + Transform.prototype.add = function (value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.minus = function (value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + return this; + }; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.fromMatrix = function (matrix) { + var backupScaleX = this.scaleX, backupScaleY = this.scaleY; + var PI_Q = Transform.PI_Q; + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + var skewX = Math.atan(-matrix.c / matrix.d); + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + this.skew = skewX - this.rotation; + return this; + }; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.toMatrix = function (matrix) { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + matrix.tx = this.x; + matrix.ty = this.y; + return this; + }; + /** + * @private + */ + Transform.PI_D = Math.PI * 2.0; + /** + * @private + */ + Transform.PI_H = Math.PI / 2.0; + /** + * @private + */ + Transform.PI_Q = Math.PI / 4.0; + /** + * @private + */ + Transform.RAD_DEG = 180.0 / Math.PI; + /** + * @private + */ + Transform.DEG_RAD = Math.PI / 180.0; + return Transform; + }()); + dragonBones.Transform = Transform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ColorTransform = (function () { + function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) { + if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; } + if (redMultiplier === void 0) { redMultiplier = 1.0; } + if (greenMultiplier === void 0) { greenMultiplier = 1.0; } + if (blueMultiplier === void 0) { blueMultiplier = 1.0; } + if (alphaOffset === void 0) { alphaOffset = 0; } + if (redOffset === void 0) { redOffset = 0; } + if (greenOffset === void 0) { greenOffset = 0; } + if (blueOffset === void 0) { blueOffset = 0; } + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + ColorTransform.prototype.copyFrom = function (value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + }; + ColorTransform.prototype.identity = function () { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + }; + return ColorTransform; + }()); + dragonBones.ColorTransform = ColorTransform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Point = (function () { + function Point(x, y) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + this.x = x; + this.y = y; + } + Point.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + }; + Point.prototype.clear = function () { + this.x = this.y = 0.0; + }; + return Point; + }()); + dragonBones.Point = Point; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Rectangle = (function () { + function Rectangle(x, y, width, height) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (width === void 0) { width = 0.0; } + if (height === void 0) { height = 0.0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Rectangle.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + }; + Rectangle.prototype.clear = function () { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + }; + return Rectangle; + }()); + dragonBones.Rectangle = Rectangle; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + var UserData = (function (_super) { + __extends(UserData, _super); + function UserData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.ints = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.floats = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.strings = []; + return _this; + } + /** + * @private + */ + UserData.toString = function () { + return "[class dragonBones.UserData]"; + }; + /** + * @private + */ + UserData.prototype._onClear = function () { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + }; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getInt = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + }; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getFloat = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + }; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getString = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + }; + return UserData; + }(dragonBones.BaseObject)); + dragonBones.UserData = UserData; + /** + * @private + */ + var ActionData = (function (_super) { + __extends(ActionData, _super); + function ActionData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.data = null; // + return _this; + } + ActionData.toString = function () { + return "[class dragonBones.ActionData]"; + }; + ActionData.prototype._onClear = function () { + if (this.data !== null) { + this.data.returnToPool(); + } + this.type = 0 /* Play */; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + }; + return ActionData; + }(dragonBones.BaseObject)); + dragonBones.ActionData = ActionData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + var DragonBonesData = (function (_super) { + __extends(DragonBonesData, _super); + function DragonBonesData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.frameIndices = []; + /** + * @private + */ + _this.cachedFrames = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatureNames = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatures = {}; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + DragonBonesData.toString = function () { + return "[class dragonBones.DragonBonesData]"; + }; + /** + * @private + */ + DragonBonesData.prototype._onClear = function () { + for (var k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + }; + /** + * @private + */ + DragonBonesData.prototype.addArmature = function (value) { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + DragonBonesData.prototype.getArmature = function (name) { + return name in this.armatures ? this.armatures[name] : null; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + DragonBonesData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + return DragonBonesData; + }(dragonBones.BaseObject)); + dragonBones.DragonBonesData = DragonBonesData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var CanvasData = (function (_super) { + __extends(CanvasData, _super); + function CanvasData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + CanvasData.toString = function () { + return "[class dragonBones.CanvasData]"; + }; + /** + * @private + */ + CanvasData.prototype._onClear = function () { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + return CanvasData; + }(dragonBones.BaseObject)); + dragonBones.CanvasData = CanvasData; + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var ArmatureData = (function (_super) { + __extends(ArmatureData, _super); + function ArmatureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.aabb = new dragonBones.Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animationNames = []; + /** + * @private + */ + _this.sortedBones = []; + /** + * @private + */ + _this.sortedSlots = []; + /** + * @private + */ + _this.defaultActions = []; + /** + * @private + */ + _this.actions = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.bones = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.slots = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.skins = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animations = {}; + /** + * @private + */ + _this.canvas = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + ArmatureData.toString = function () { + return "[class dragonBones.ArmatureData]"; + }; + /** + * @private + */ + ArmatureData.prototype._onClear = function () { + for (var _i = 0, _a = this.defaultActions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + for (var _b = 0, _c = this.actions; _b < _c.length; _b++) { + var action = _c[_b]; + action.returnToPool(); + } + for (var k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + for (var k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + for (var k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + for (var k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.type = 0 /* Armature */; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + ArmatureData.prototype.sortBones = function () { + var total = this.sortedBones.length; + if (total <= 0) { + return; + } + var sortHelper = this.sortedBones.concat(); + var index = 0; + var count = 0; + this.sortedBones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { + continue; + } + this.sortedBones.push(bone); + count++; + } + }; + /** + * @private + */ + ArmatureData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0) { + return; + } + this.cacheFrameRate = frameRate; + for (var k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + }; + /** + * @private + */ + ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform) { + var dataArray = this.parent.cachedFrames; + var arrayOffset = dataArray.length; + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + return arrayOffset; + }; + /** + * @private + */ + ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) { + var dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + }; + /** + * @private + */ + ArmatureData.prototype.addBone = function (value) { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + this.bones[value.name] = value; + this.sortedBones.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSlot = function (value) { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + this.slots[value.name] = value; + this.sortedSlots.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSkin = function (value) { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + }; + /** + * @private + */ + ArmatureData.prototype.addAnimation = function (value) { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + }; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + ArmatureData.prototype.getBone = function (name) { + return name in this.bones ? this.bones[name] : null; + }; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + ArmatureData.prototype.getSlot = function (name) { + return name in this.slots ? this.slots[name] : null; + }; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + ArmatureData.prototype.getSkin = function (name) { + return name in this.skins ? this.skins[name] : null; + }; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + ArmatureData.prototype.getAnimation = function (name) { + return name in this.animations ? this.animations[name] : null; + }; + return ArmatureData; + }(dragonBones.BaseObject)); + dragonBones.ArmatureData = ArmatureData; + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var BoneData = (function (_super) { + __extends(BoneData, _super); + function BoneData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.transform = new dragonBones.Transform(); + /** + * @private + */ + _this.constraints = []; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + BoneData.toString = function () { + return "[class dragonBones.BoneData]"; + }; + /** + * @private + */ + BoneData.prototype._onClear = function () { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + }; + return BoneData; + }(dragonBones.BaseObject)); + dragonBones.BoneData = BoneData; + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var SlotData = (function (_super) { + __extends(SlotData, _super); + function SlotData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.color = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + SlotData.createColor = function () { + return new dragonBones.ColorTransform(); + }; + /** + * @private + */ + SlotData.toString = function () { + return "[class dragonBones.SlotData]"; + }; + /** + * @private + */ + SlotData.prototype._onClear = function () { + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.blendMode = 0 /* Normal */; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform(); + return SlotData; + }(dragonBones.BaseObject)); + dragonBones.SlotData = SlotData; + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + var SkinData = (function (_super) { + __extends(SkinData, _super); + function SkinData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.displays = {}; + return _this; + } + SkinData.toString = function () { + return "[class dragonBones.SkinData]"; + }; + /** + * @private + */ + SkinData.prototype._onClear = function () { + for (var k in this.displays) { + var slotDisplays = this.displays[k]; + for (var _i = 0, slotDisplays_1 = slotDisplays; _i < slotDisplays_1.length; _i++) { + var display = slotDisplays_1[_i]; + if (display !== null) { + display.returnToPool(); + } + } + delete this.displays[k]; + } + this.name = ""; + // this.displays.clear(); + }; + /** + * @private + */ + SkinData.prototype.addDisplay = function (slotName, value) { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + var slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + }; + /** + * @private + */ + SkinData.prototype.getDisplay = function (slotName, displayName) { + var slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (var _i = 0, slotDisplays_2 = slotDisplays; _i < slotDisplays_2.length; _i++) { + var display = slotDisplays_2[_i]; + if (display !== null && display.name === displayName) { + return display; + } + } + } + return null; + }; + /** + * @private + */ + SkinData.prototype.getDisplays = function (slotName) { + if (!(slotName in this.displays)) { + return null; + } + return this.displays[slotName]; + }; + return SkinData; + }(dragonBones.BaseObject)); + dragonBones.SkinData = SkinData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ConstraintData = (function (_super) { + __extends(ConstraintData, _super); + function ConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstraintData.prototype._onClear = function () { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + }; + return ConstraintData; + }(dragonBones.BaseObject)); + dragonBones.ConstraintData = ConstraintData; + /** + * @private + */ + var IKConstraintData = (function (_super) { + __extends(IKConstraintData, _super); + function IKConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraintData.toString = function () { + return "[class dragonBones.IKConstraintData]"; + }; + IKConstraintData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + return IKConstraintData; + }(ConstraintData)); + dragonBones.IKConstraintData = IKConstraintData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DisplayData = (function (_super) { + __extends(DisplayData, _super); + function DisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.transform = new dragonBones.Transform(); + return _this; + } + DisplayData.prototype._onClear = function () { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + }; + return DisplayData; + }(dragonBones.BaseObject)); + dragonBones.DisplayData = DisplayData; + /** + * @private + */ + var ImageDisplayData = (function (_super) { + __extends(ImageDisplayData, _super); + function ImageDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pivot = new dragonBones.Point(); + return _this; + } + ImageDisplayData.toString = function () { + return "[class dragonBones.ImageDisplayData]"; + }; + ImageDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Image */; + this.pivot.clear(); + this.texture = null; + }; + return ImageDisplayData; + }(DisplayData)); + dragonBones.ImageDisplayData = ImageDisplayData; + /** + * @private + */ + var ArmatureDisplayData = (function (_super) { + __extends(ArmatureDisplayData, _super); + function ArmatureDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.actions = []; + return _this; + } + ArmatureDisplayData.toString = function () { + return "[class dragonBones.ArmatureDisplayData]"; + }; + ArmatureDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.actions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + this.type = 1 /* Armature */; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + }; + return ArmatureDisplayData; + }(DisplayData)); + dragonBones.ArmatureDisplayData = ArmatureDisplayData; + /** + * @private + */ + var MeshDisplayData = (function (_super) { + __extends(MeshDisplayData, _super); + function MeshDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.weight = null; // Initial value. + return _this; + } + MeshDisplayData.toString = function () { + return "[class dragonBones.MeshDisplayData]"; + }; + MeshDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Mesh */; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + }; + return MeshDisplayData; + }(ImageDisplayData)); + dragonBones.MeshDisplayData = MeshDisplayData; + /** + * @private + */ + var BoundingBoxDisplayData = (function (_super) { + __extends(BoundingBoxDisplayData, _super); + function BoundingBoxDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.boundingBox = null; // Initial value. + return _this; + } + BoundingBoxDisplayData.toString = function () { + return "[class dragonBones.BoundingBoxDisplayData]"; + }; + BoundingBoxDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + this.type = 3 /* BoundingBox */; + this.boundingBox = null; + }; + return BoundingBoxDisplayData; + }(DisplayData)); + dragonBones.BoundingBoxDisplayData = BoundingBoxDisplayData; + /** + * @private + */ + var WeightData = (function (_super) { + __extends(WeightData, _super); + function WeightData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.bones = []; + return _this; + } + WeightData.toString = function () { + return "[class dragonBones.WeightData]"; + }; + WeightData.prototype._onClear = function () { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + }; + return WeightData; + }(dragonBones.BaseObject)); + dragonBones.WeightData = WeightData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + var BoundingBoxData = (function (_super) { + __extends(BoundingBoxData, _super); + function BoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + BoundingBoxData.prototype._onClear = function () { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + }; + return BoundingBoxData; + }(dragonBones.BaseObject)); + dragonBones.BoundingBoxData = BoundingBoxData; + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var RectangleBoundingBoxData = (function (_super) { + __extends(RectangleBoundingBoxData, _super); + function RectangleBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + RectangleBoundingBoxData.toString = function () { + return "[class dragonBones.RectangleBoundingBoxData]"; + }; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + RectangleBoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) { + var code = 0 /* InSide */; // initialised as being inside of [[clip window]] + if (x < xMin) { + code |= 1 /* Left */; + } + else if (x > xMax) { + code |= 2 /* Right */; + } + if (y < yMin) { + code |= 4 /* Top */; + } + else if (y > yMax) { + code |= 8 /* Bottom */; + } + return code; + }; + /** + * @private + */ + RectangleBoundingBoxData.rectangleIntersectsSegment = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + if (inSideA && inSideB) { + return -1; + } + var intersectionCount = 0; + var outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + var outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + while (true) { + if ((outcode0 | outcode1) === 0) { + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { + break; + } + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + var x = 0.0; + var y = 0.0; + var normalRadian = 0.0; + // At least one endpoint is outside the clip rectangle; pick it. + var outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + // Now find the intersection point; + if ((outcodeOut & 4 /* Top */) !== 0) { + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & 8 /* Bottom */) !== 0) { + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & 2 /* Right */) !== 0) { + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & 1 /* Left */) !== 0) { + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + return intersectionCount; + }; + /** + * @private + */ + RectangleBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Rectangle */; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + return false; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var widthH = this.width * 0.5; + var heightH = this.height * 0.5; + var intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return RectangleBoundingBoxData; + }(BoundingBoxData)); + dragonBones.RectangleBoundingBoxData = RectangleBoundingBoxData; + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var EllipseBoundingBoxData = (function (_super) { + __extends(EllipseBoundingBoxData, _super); + function EllipseBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EllipseBoundingBoxData.toString = function () { + return "[class dragonBones.EllipseData]"; + }; + /** + * @private + */ + EllipseBoundingBoxData.ellipseIntersectsSegment = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var d = widthH / heightH; + var dd = d * d; + yA *= d; + yB *= d; + var dX = xB - xA; + var dY = yB - yA; + var lAB = Math.sqrt(dX * dX + dY * dY); + var xD = dX / lAB; + var yD = dY / lAB; + var a = (xC - xA) * xD + (yC - yA) * yD; + var aa = a * a; + var ee = xA * xA + yA * yA; + var rr = widthH * widthH; + var dR = rr - ee + aa; + var intersectionCount = 0; + if (dR >= 0.0) { + var dT = Math.sqrt(dR); + var sA = a - dT; + var sB = a + dT; + var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + var sideAB = inSideA * inSideB; + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + return intersectionCount; + }; + /** + * @private + */ + EllipseBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 1 /* Ellipse */; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + return false; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return EllipseBoundingBoxData; + }(BoundingBoxData)); + dragonBones.EllipseBoundingBoxData = EllipseBoundingBoxData; + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var PolygonBoundingBoxData = (function (_super) { + __extends(PolygonBoundingBoxData, _super); + function PolygonBoundingBoxData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.weight = null; // Initial value. + return _this; + } + /** + * @private + */ + PolygonBoundingBoxData.toString = function () { + return "[class dragonBones.PolygonBoundingBoxData]"; + }; + /** + * @private + */ + PolygonBoundingBoxData.polygonIntersectsSegment = function (xA, yA, xB, yB, vertices, offset, count, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (xA === xB) { + xA = xB + 0.000001; + } + if (yA === yB) { + yA = yB + 0.000001; + } + var dXAB = xA - xB; + var dYAB = yA - yB; + var llAB = xA * yB - yA * xB; + var intersectionCount = 0; + var xC = vertices[offset + count - 2]; + var yC = vertices[offset + count - 1]; + var dMin = 0.0; + var dMax = 0.0; + var xMin = 0.0; + var yMin = 0.0; + var xMax = 0.0; + var yMax = 0.0; + for (var i = 0; i < count; i += 2) { + var xD = vertices[offset + i]; + var yD = vertices[offset + i + 1]; + if (xC === xD) { + xC = xD + 0.0001; + } + if (yC === yD) { + yC = yD + 0.0001; + } + var dXCD = xC - xD; + var dYCD = yC - yD; + var llCD = xC * yD - yC * xD; + var ll = dXAB * dYCD - dYAB * dXCD; + var x = (llAB * dXCD - dXAB * llCD) / ll; + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + var y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + var d = x - xA; + if (d < 0.0) { + d = -d; + } + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + xC = xD; + yC = yD; + } + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + return intersectionCount; + }; + /** + * @private + */ + PolygonBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Polygon */; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null; // + this.weight = null; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (var i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + var yA = this.vertices[this.offset + iP + 1]; + var yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + var xA = this.vertices[this.offset + iP]; + var xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + iP = i; + } + } + return isInSide; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment(xA, yA, xB, yB, this.vertices, this.offset, this.count, intersectionPointA, intersectionPointB, normalRadians); + } + return intersectionCount; + }; + return PolygonBoundingBoxData; + }(BoundingBoxData)); + dragonBones.PolygonBoundingBoxData = PolygonBoundingBoxData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationData = (function (_super) { + __extends(AnimationData, _super); + function AnimationData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.cachedFrames = []; + /** + * @private + */ + _this.boneTimelines = {}; + /** + * @private + */ + _this.slotTimelines = {}; + /** + * @private + */ + _this.boneCachedFrameIndices = {}; + /** + * @private + */ + _this.slotCachedFrameIndices = {}; + /** + * @private + */ + _this.actionTimeline = null; // Initial value. + /** + * @private + */ + _this.zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationData.toString = function () { + return "[class dragonBones.AnimationData]"; + }; + /** + * @private + */ + AnimationData.prototype._onClear = function () { + for (var k in this.boneTimelines) { + for (var kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + delete this.boneTimelines[k]; + } + for (var k in this.slotTimelines) { + for (var kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + delete this.slotTimelines[k]; + } + for (var k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + for (var k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + }; + /** + * @private + */ + AnimationData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0.0) { + return; + } + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + this.cachedFrames.length = cacheFrameCount; + for (var i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + for (var _i = 0, _a = this.parent.sortedBones; _i < _a.length; _i++) { + var bone = _a[_i]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.boneCachedFrameIndices[bone.name] = indices; + } + for (var _b = 0, _c = this.parent.sortedSlots; _b < _c.length; _b++) { + var slot = _c[_b]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.slotCachedFrameIndices[slot.name] = indices; + } + }; + /** + * @private + */ + AnimationData.prototype.addBoneTimeline = function (bone, timeline) { + var timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.addSlotTimeline = function (slot, timeline) { + var timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.getBoneTimelines = function (name) { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotTimeline = function (name) { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getBoneCachedFrameIndices = function (name) { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotCachedFrameIndices = function (name) { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + }; + return AnimationData; + }(dragonBones.BaseObject)); + dragonBones.AnimationData = AnimationData; + /** + * @private + */ + var TimelineData = (function (_super) { + __extends(TimelineData, _super); + function TimelineData() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineData.toString = function () { + return "[class dragonBones.TimelineData]"; + }; + TimelineData.prototype._onClear = function () { + this.type = 10 /* BoneAll */; + this.offset = 0; + this.frameIndicesOffset = -1; + }; + return TimelineData; + }(dragonBones.BaseObject)); + dragonBones.TimelineData = TimelineData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + var AnimationConfig = (function (_super) { + __extends(AnimationConfig, _super); + function AnimationConfig() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.boneMask = []; + return _this; + } + AnimationConfig.toString = function () { + return "[class dragonBones.AnimationConfig]"; + }; + /** + * @private + */ + AnimationConfig.prototype._onClear = function () { + this.pauseFadeOut = true; + this.fadeOutMode = 4 /* All */; + this.fadeOutTweenType = 1 /* Line */; + this.fadeOutTime = -1.0; + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = 1 /* Line */; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + }; + AnimationConfig.prototype.clear = function () { + this._onClear(); + }; + AnimationConfig.prototype.copyFrom = function (value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + this.boneMask.length = value.boneMask.length; + for (var i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + }; + AnimationConfig.prototype.containsBoneMask = function (name) { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + }; + AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + if (this.boneMask.indexOf(name) < 0) { + this.boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + }; + AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this.boneMask.indexOf(name); + if (index >= 0) { + this.boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var index_1 = this.boneMask.indexOf(bone.name); + if (index_1 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index_1, 1); + } + } + } + else { + for (var _b = 0, _c = armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + }; + return AnimationConfig; + }(dragonBones.BaseObject)); + dragonBones.AnimationConfig = AnimationConfig; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var TextureAtlasData = (function (_super) { + __extends(TextureAtlasData, _super); + function TextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.textures = {}; + return _this; + } + /** + * @private + */ + TextureAtlasData.prototype._onClear = function () { + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + }; + /** + * @private + */ + TextureAtlasData.prototype.copyFrom = function (value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + // this.textures.clear(); + for (var k in value.textures) { + var texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + }; + /** + * @private + */ + TextureAtlasData.prototype.addTexture = function (value) { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + value.parent = this; + this.textures[value.name] = value; + }; + /** + * @private + */ + TextureAtlasData.prototype.getTexture = function (name) { + return name in this.textures ? this.textures[name] : null; + }; + return TextureAtlasData; + }(dragonBones.BaseObject)); + dragonBones.TextureAtlasData = TextureAtlasData; + /** + * @private + */ + var TextureData = (function (_super) { + __extends(TextureData, _super); + function TextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = new dragonBones.Rectangle(); + _this.frame = null; // Initial value. + return _this; + } + TextureData.createRectangle = function () { + return new dragonBones.Rectangle(); + }; + TextureData.prototype._onClear = function () { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + }; + TextureData.prototype.copyFrom = function (value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + }; + return TextureData; + }(dragonBones.BaseObject)); + dragonBones.TextureData = TextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones_1) { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + var Armature = (function (_super) { + __extends(Armature, _super); + function Armature() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._bones = []; + _this._slots = []; + _this._actions = []; + _this._animation = null; // Initial value. + _this._proxy = null; // Initial value. + /** + * @private + */ + _this._replaceTextureAtlasData = null; // Initial value. + _this._clock = null; // Initial value. + return _this; + } + Armature.toString = function () { + return "[class dragonBones.Armature]"; + }; + Armature._onSortSlots = function (a, b) { + return a._zOrder > b._zOrder ? 1 : -1; + }; + /** + * @private + */ + Armature.prototype._onClear = function () { + if (this._clock !== null) { + this._clock.remove(this); + } + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + bone.returnToPool(); + } + for (var _b = 0, _c = this._slots; _b < _c.length; _b++) { + var slot = _c[_b]; + slot.returnToPool(); + } + for (var _d = 0, _e = this._actions; _d < _e.length; _d++) { + var action = _e[_d]; + action.returnToPool(); + } + if (this._animation !== null) { + this._animation.returnToPool(); + } + if (this._proxy !== null) { + this._proxy.clear(); + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + }; + Armature.prototype._sortBones = function () { + var total = this._bones.length; + if (total <= 0) { + return; + } + var sortHelper = this._bones.concat(); + var index = 0; + var count = 0; + this._bones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this._bones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { + continue; + } + this._bones.push(bone); + count++; + } + }; + Armature.prototype._sortSlots = function () { + this._slots.sort(Armature._onSortSlots); + }; + /** + * @internal + * @private + */ + Armature.prototype._sortZOrder = function (slotIndices, offset) { + var slotDatas = this.armatureData.sortedSlots; + var isOriginal = slotIndices === null; + if (this._zOrderDirty || !isOriginal) { + for (var i = 0, l = slotDatas.length; i < l; ++i) { + var slotIndex = isOriginal ? i : slotIndices[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + var slotData = slotDatas[slotIndex]; + var slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addBoneToBoneList = function (value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeBoneFromBoneList = function (value) { + var index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addSlotToSlotList = function (value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeSlotFromSlotList = function (value) { + var index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._bufferAction = function (action, append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + }; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.dispose = function () { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + }; + /** + * @private + */ + Armature.prototype.init = function (armatureData, proxy, display, dragonBones) { + if (this.armatureData !== null) { + return; + } + this.armatureData = armatureData; + this._animation = dragonBones_1.BaseObject.borrowObject(dragonBones_1.Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + }; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.advanceTime = function (passedTime) { + if (this._lockUpdate) { + return; + } + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + var prevCacheFrameIndex = this._cacheFrameIndex; + // Update nimation. + this._animation.advanceTime(passedTime); + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + var i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + if (this._actions.length > 0) { + this._lockUpdate = true; + for (var _i = 0, _a = this._actions; _i < _a.length; _i++) { + var action = _a[_i]; + if (action.type === 0 /* Play */) { + this._animation.fadeIn(action.name); + } + } + this._actions.length = 0; + this._lockUpdate = false; + } + // + var drawed = this.debugDraw || dragonBones_1.DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + }; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName !== null && boneName.length > 0) { + var bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + if (updateSlotDisplay) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (var _b = 0, _c = this._bones; _b < _c.length; _b++) { + var bone = _c[_b]; + bone.invalidUpdate(); + } + if (updateSlotDisplay) { + for (var _d = 0, _e = this._slots; _d < _e.length; _d++) { + var slot = _e[_d]; + slot.invalidUpdate(); + } + } + } + }; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.containsPoint = function (x, y) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.containsPoint(x, y)) { + return slot; + } + } + return null; + }; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var isV = xA === xB; + var dMin = 0.0; + var dMax = 0.0; + var intXA = 0.0; + var intYA = 0.0; + var intXB = 0.0; + var intYB = 0.0; + var intAN = 0.0; + var intBN = 0.0; + var intSlotA = null; + var intSlotB = null; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + if (intersectionPointB !== null) { + var d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + return intSlotA; + }; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBone = function (name) { + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.name === name) { + return bone; + } + } + return null; + }; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBoneByDisplay = function (display) { + var slot = this.getSlotByDisplay(display); + return slot !== null ? slot.parent : null; + }; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlot = function (name) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.name === name) { + return slot; + } + } + return null; + }; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlotByDisplay = function (display) { + if (display !== null) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.display === display) { + return slot; + } + } + } + return null; + }; + /** + * @deprecated + */ + Armature.prototype.addBone = function (value, parentName) { + if (parentName === void 0) { parentName = null; } + console.assert(value !== null); + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + }; + /** + * @deprecated + */ + Armature.prototype.removeBone = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * @deprecated + */ + Armature.prototype.addSlot = function (value, parentName) { + var bone = this.getBone(parentName); + console.assert(value !== null && bone !== null); + value._setArmature(this); + value._setParent(bone); + }; + /** + * @deprecated + */ + Armature.prototype.removeSlot = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBones = function () { + return this._bones; + }; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlots = function () { + return this._slots; + }; + Object.defineProperty(Armature.prototype, "flipX", { + get: function () { + return this._flipX; + }, + set: function (value) { + if (this._flipX === value) { + return; + } + this._flipX = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "flipY", { + get: function () { + return this._flipY; + }, + set: function (value) { + if (this._flipY === value) { + return; + } + this._flipY = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "cacheFrameRate", { + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.armatureData.cacheFrameRate; + }, + set: function (value) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + // Set child armature frameRate. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "name", { + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this.armatureData.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "animation", { + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._animation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "proxy", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "eventDispatcher", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "display", { + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "replacedTexture", { + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + get: function () { + return this._replacedTexture; + }, + set: function (value) { + if (this._replacedTexture === value) { + return; + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + this._replacedTexture = value; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + slot.invalidUpdate(); + slot.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + // Update childArmature clock. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "parent", { + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + Armature.prototype.replaceTexture = function (texture) { + this.replacedTexture = texture; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.hasEventListener = function (type) { + return this._proxy.hasEvent(type); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.addEventListener = function (type, listener, target) { + this._proxy.addEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.removeEventListener = function (type, listener, target) { + this._proxy.removeEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + Armature.prototype.enableAnimationCache = function (frameRate) { + this.cacheFrameRate = frameRate; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Armature.prototype.getDisplay = function () { + return this._display; + }; + return Armature; + }(dragonBones_1.BaseObject)); + dragonBones_1.Armature = Armature; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var TransformObject = (function (_super) { + __extends(TransformObject, _super); + function TransformObject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.globalTransformMatrix = new dragonBones.Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.global = new dragonBones.Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.offset = new dragonBones.Transform(); + return _this; + } + /** + * @private + */ + TransformObject.prototype._onClear = function () { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setArmature = function (value) { + this._armature = value; + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setParent = function (value) { + this._parent = value; + }; + /** + * @private + */ + TransformObject.prototype.updateGlobalTransform = function () { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + }; + Object.defineProperty(TransformObject.prototype, "armature", { + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TransformObject.prototype, "parent", { + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + TransformObject._helpMatrix = new dragonBones.Matrix(); + /** + * @private + */ + TransformObject._helpTransform = new dragonBones.Transform(); + /** + * @private + */ + TransformObject._helpPoint = new dragonBones.Point(); + return TransformObject; + }(dragonBones.BaseObject)); + dragonBones.TransformObject = TransformObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var Bone = (function (_super) { + __extends(Bone, _super); + function Bone() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this.animationPose = new dragonBones.Transform(); + /** + * @internal + * @private + */ + _this.constraints = []; + _this._bones = []; + _this._slots = []; + return _this; + } + Bone.toString = function () { + return "[class dragonBones.Bone]"; + }; + /** + * @private + */ + Bone.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + this.offsetMode = 1 /* Additive */; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null; // + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Bone.prototype._updateGlobalTransformMatrix = function (isCache) { + var flipX = this._armature.flipX; + var flipY = this._armature.flipY === dragonBones.DragonBones.yDown; + var global = this.global; + var globalTransformMatrix = this.globalTransformMatrix; + var inherit = this._parent !== null; + var dR = 0.0; + if (this.offsetMode === 1 /* Additive */) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === 0 /* None */) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + if (inherit) { + var parentMatrix = this._parent.globalTransformMatrix; + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + var x = global.x; + var y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + } + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + }; + /** + * @internal + * @private + */ + Bone.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + var oldSlots = null; + var oldBones = null; + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + this._armature = value; // + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + if (oldSlots !== null) { + for (var _i = 0, oldSlots_1 = oldSlots; _i < oldSlots_1.length; _i++) { + var slot = oldSlots_1[_i]; + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + if (oldBones !== null) { + for (var _a = 0, oldBones_1 = oldBones; _a < oldBones_1.length; _a++) { + var bone = oldBones_1[_a]; + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + }; + /** + * @internal + * @private + */ + Bone.prototype.init = function (boneData) { + if (this.boneData !== null) { + return; + } + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + }; + /** + * @internal + * @private + */ + Bone.prototype.update = function (cacheFrameIndex) { + this._blendDirty = false; + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.update(); + } + } + if (this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty)) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { + for (var _b = 0, _c = this.constraints; _b < _c.length; _b++) { + var constraint = _c[_b]; + constraint.update(); + } + } + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + this._localDirty = true; + }; + /** + * @internal + * @private + */ + Bone.prototype.updateByConstraint = function () { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + this._transformDirty = true; + } + }; + /** + * @internal + * @private + */ + Bone.prototype.addConstraint = function (constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + }; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.invalidUpdate = function () { + this._transformDirty = true; + }; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.contains = function (child) { + if (child === this) { + return false; + } + var ancestor = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + return ancestor === this; + }; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getBones = function () { + this._bones.length = 0; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.parent === this) { + this._bones.push(bone); + } + } + return this._bones; + }; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getSlots = function () { + this._slots.length = 0; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + this._slots.push(slot); + } + } + return this._slots; + }; + Object.defineProperty(Bone.prototype, "visible", { + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._visible; + }, + set: function (value) { + if (this._visible === value) { + return; + } + this._visible = value; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot._parent === this) { + slot._updateVisible(); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "length", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + get: function () { + return this.boneData.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + get: function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + return slot; + } + } + return null; + }, + enumerable: true, + configurable: true + }); + return Bone; + }(dragonBones.TransformObject)); + dragonBones.Bone = Bone; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + var Slot = (function (_super) { + __extends(Slot, _super); + function Slot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this._localMatrix = new dragonBones.Matrix(); + /** + * @private + */ + _this._colorTransform = new dragonBones.ColorTransform(); + /** + * @private + */ + _this._ffdVertices = []; + /** + * @private + */ + _this._displayDatas = []; + /** + * @private + */ + _this._displayList = []; + /** + * @private + */ + _this._meshBones = []; + /** + * @private + */ + _this._rawDisplay = null; // Initial value. + /** + * @private + */ + _this._meshDisplay = null; // Initial value. + return _this; + } + /** + * @private + */ + Slot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + var disposeDisplayList = []; + for (var _i = 0, _a = this._displayList; _i < _a.length; _i++) { + var eachDisplay = _a[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _b = 0, disposeDisplayList_1 = disposeDisplayList; _b < disposeDisplayList_1.length; _b++) { + var eachDisplay = disposeDisplayList_1[_b]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { + this._disposeDisplay(this._meshDisplay); + } + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + this.displayController = null; + this.slotData = null; // + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = 0 /* Normal */; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Slot.prototype._updateDisplayData = function () { + var prevDisplayData = this._displayData; + var prevTextureData = this._textureData; + var prevMeshData = this._meshData; + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === 0 /* Image */ || this._displayData.type === 2 /* Mesh */) { + this._textureData = this._displayData.texture; + if (this._displayData.type === 2 /* Mesh */) { + this._meshData = this._displayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */) { + this._meshData = rawDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = this._displayData.boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = rawDisplayData.boundingBox; + } + else { + this._boundingBoxData = null; + } + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + var imageDisplayData = this._displayData; + var scale = this._armature.armatureData.scale; + var frame = this._textureData.frame; + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + var rect = frame !== null ? frame : this._textureData.region; + var width = rect.width * scale; + var height = rect.height * scale; + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + this._pivotX *= width; + this._pivotY *= height; + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + for (var i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + var vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + 0 /* MeshVertexCount */]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + for (var i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { + this._meshDirty = true; + } + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + this._displayDirty = true; + this._transformDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._updateDisplay = function () { + var prevDisplay = this._display !== null ? this._display : this._rawDisplay; + var prevChildArmature = this._childArmature; + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof dragonBones.Armature) { + this._childArmature = this._display; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + // Update display. + var currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { + if (this._childArmature.cacheFrameRate === 0) { + var cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + // Child armature action. + var actions = null; + if (this._displayData !== null && this._displayData.type === 1 /* Armature */) { + actions = this._displayData.actions; + } + else { + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === 1 /* Armature */) { + actions = rawDisplayData.actions; + } + } + if (actions !== null && actions.length > 0) { + for (var _i = 0, actions_1 = actions; _i < actions_1.length; _i++) { + var action = actions_1[_i]; + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + }; + /** + * @private + */ + Slot.prototype._updateGlobalTransformMatrix = function (isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._isMeshBonesUpdate = function () { + for (var _i = 0, _a = this._meshBones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + return false; + }; + /** + * @internal + * @private + */ + Slot.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + this._armature = value; // + this._onUpdateDisplay(); + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + }; + /** + * @internal + * @private + */ + Slot.prototype._setDisplayIndex = function (value, isAnimation) { + if (isAnimation === void 0) { isAnimation = false; } + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + this._animationDisplayIndex = value; + } + if (this._displayIndex === value) { + return false; + } + this._displayIndex = value; + this._displayDirty = true; + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setZorder = function (value) { + if (this._zOrder === value) { + //return false; + } + this._zOrder = value; + this._zOrderDirty = true; + return this._zOrderDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setColor = function (value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + return this._colorDirty; + }; + /** + * @private + */ + Slot.prototype._setDisplayList = function (value) { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + for (var i = 0, l = value.length; i < l; ++i) { + var eachDisplay = value[i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) { + this._initDisplay(eachDisplay); + } + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @private + */ + Slot.prototype.init = function (slotData, displayDatas, rawDisplay, meshDisplay) { + if (this.slotData !== null) { + return; + } + this.slotData = slotData; + this.name = this.slotData.name; + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._displayDatas.length = this._rawDisplayDatas.length; + for (var i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + }; + /** + * @internal + * @private + */ + Slot.prototype.update = function (cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + if (this._transformDirty) { + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + if (this._display === null) { + return; + } + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + if (this._meshData !== null && this._display === this._meshDisplay) { + var isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + return; + } + } + if (this._transformDirty) { + this._transformDirty = false; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + this._updateTransform(false); + } + }; + /** + * @private + */ + Slot.prototype.updateTransformAndMatrix = function () { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + }; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.containsPoint = function (x, y) { + if (this._boundingBoxData === null) { + return false; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + }; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (this._boundingBoxData === null) { + return 0; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + return intersectionCount; + }; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + Slot.prototype.invalidUpdate = function () { + this._displayDirty = true; + this._transformDirty = true; + }; + Object.defineProperty(Slot.prototype, "displayIndex", { + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._displayIndex; + }, + set: function (value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "displayList", { + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._displayList.concat(); + }, + set: function (value) { + var backupDisplayList = this._displayList.concat(); // Copy. + var disposeDisplayList = new Array(); + if (this._setDisplayList(value)) { + this.update(-1); + } + // Release replaced displays. + for (var _i = 0, backupDisplayList_1 = backupDisplayList; _i < backupDisplayList_1.length; _i++) { + var eachDisplay = backupDisplayList_1[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _a = 0, disposeDisplayList_2 = disposeDisplayList; _a < disposeDisplayList_2.length; _a++) { + var eachDisplay = disposeDisplayList_2[_a]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "boundingBoxData", { + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + get: function () { + return this._boundingBoxData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "rawDisplay", { + /** + * @private + */ + get: function () { + return this._rawDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "meshDisplay", { + /** + * @private + */ + get: function () { + return this._meshDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "display", { + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + set: function (value) { + if (this._display === value) { + return; + } + var displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { + this._displayIndex = 0; + } + if (this._displayIndex < 0) { + return; + } + else { + var replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "childArmature", { + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._childArmature; + }, + set: function (value) { + if (this._childArmature === value) { + return; + } + this.display = value; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.getDisplay = function () { + return this._display; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.setDisplay = function (value) { + this.display = value; + }; + return Slot; + }(dragonBones.TransformObject)); + dragonBones.Slot = Slot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + * @internal + */ + var Constraint = (function (_super) { + __extends(Constraint, _super); + function Constraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + Constraint.prototype._onClear = function () { + this.target = null; // + this.bone = null; // + this.root = null; // + }; + Constraint._helpMatrix = new dragonBones.Matrix(); + Constraint._helpTransform = new dragonBones.Transform(); + Constraint._helpPoint = new dragonBones.Point(); + return Constraint; + }(dragonBones.BaseObject)); + dragonBones.Constraint = Constraint; + /** + * @private + * @internal + */ + var IKConstraint = (function (_super) { + __extends(IKConstraint, _super); + function IKConstraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraint.toString = function () { + return "[class dragonBones.IKConstraint]"; + }; + IKConstraint.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + IKConstraint.prototype._computeA = function () { + var ikGlobal = this.target.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + var ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype._computeB = function () { + var boneLength = this.bone.boneData.length; + var parent = this.root; + var ikGlobal = this.target.global; + var parentGlobal = parent.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + var x = globalTransformMatrix.a * boneLength; + var y = globalTransformMatrix.b * boneLength; + var lLL = x * x + y * y; + var lL = Math.sqrt(lLL); + var dX = global.x - parentGlobal.x; + var dY = global.y - parentGlobal.y; + var lPP = dX * dX + dY * dY; + var lP = Math.sqrt(lPP); + var rawRadianA = Math.atan2(dY, dX); + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + var lTT = dX * dX + dY * dY; + var lT = Math.sqrt(lTT); + var ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + var h = (lPP - lLL + lTT) / (2.0 * lTT); + var r = Math.sqrt(lPP - h * h * lTT) / lT; + var hX = parentGlobal.x + (dX * h); + var hY = parentGlobal.y + (dY * h); + var rX = -dY * r; + var rY = dX * r; + var isPPR = false; + if (parent._parent !== null) { + var parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + var dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + var parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + var ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype.update = function () { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + }; + return IKConstraint; + }(Constraint)); + dragonBones.IKConstraint = IKConstraint; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var WorldClock = (function () { + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + function WorldClock(time) { + if (time === void 0) { time = -1.0; } + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + this.time = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + this.timeScale = 1.0; + this._animatebles = []; + this._clock = null; + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.advanceTime = function (passedTime) { + if (passedTime !== passedTime) { + passedTime = 0.0; + } + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + if (passedTime === 0.0) { + return; + } + var i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + var animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + var animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + this._animatebles.length -= r; + } + }; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.contains = function (value) { + return this._animatebles.indexOf(value) >= 0; + }; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.add = function (value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + }; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.remove = function (value) { + var index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + }; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.clear = function () { + for (var _i = 0, _a = this._animatebles; _i < _a.length; _i++) { + var animatable = _a[_i]; + if (animatable !== null) { + animatable.clock = null; + } + } + }; + Object.defineProperty(WorldClock.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock !== null) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.clock = new WorldClock(); + return WorldClock; + }()); + dragonBones.WorldClock = WorldClock; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._animationNames = []; + _this._animationStates = []; + _this._animations = {}; + _this._animationConfig = null; // Initial value. + return _this; + } + /** + * @private + */ + Animation.toString = function () { + return "[class dragonBones.Animation]"; + }; + /** + * @private + */ + Animation.prototype._onClear = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + for (var k in this._animations) { + delete this._animations[k]; + } + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + this.timeScale = 1.0; + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + }; + Animation.prototype._fadeOut = function (animationConfig) { + switch (animationConfig.fadeOutMode) { + case 1 /* SameLayer */: + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 2 /* SameGroup */: + for (var _b = 0, _c = this._animationStates; _b < _c.length; _b++) { + var animationState = _c[_b]; + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 3 /* SameLayerAndGroup */: + for (var _d = 0, _e = this._animationStates; _d < _e.length; _d++) { + var animationState = _e[_d]; + if (animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 4 /* All */: + for (var _f = 0, _g = this._animationStates; _f < _g.length; _f++) { + var animationState = _g[_f]; + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + case 0 /* None */: + case 5 /* Single */: + default: + break; + } + }; + /** + * @internal + * @private + */ + Animation.prototype.init = function (armature) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig); + }; + /** + * @internal + * @private + */ + Animation.prototype.advanceTime = function (passedTime) { + if (passedTime < 0.0) { + passedTime = -passedTime; + } + if (this._armature.inheritAnimation && this._armature._parent !== null) { + passedTime *= this._armature._parent._armature.animation.timeScale; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + var animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + var animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + var animationData = animationState.animationData; + var cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { + this._animationDirty = false; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (var i = 0, r = 0; i < animationStateCount; ++i) { + var animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, 0.0); + } + if (i === animationStateCount - 1 && r > 0) { + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + this._timelineDirty = false; + }; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.reset = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + }; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.stop = function (animationName) { + if (animationName === void 0) { animationName = null; } + if (animationName !== null) { + var animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.stop(); + } + } + }; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + Animation.prototype.playConfig = function (animationConfig) { + var animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName); + return null; + } + var animationData = this._animations[animationName]; + if (animationConfig.fadeOutMode === 5 /* Single */) { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState_1 = _a[_i]; + if (animationState_1.animationData === animationData) { + return animationState_1; + } + } + } + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + this._fadeOut(animationConfig); + var animationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + if (this._animationStates.length > 0) { + var added = false; + for (var i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + // Child armature play same name animation. + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var childArmature = slot.childArmature; + if (childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null) { + childArmature.animation.fadeIn(animationName); // + } + } + if (animationConfig.fadeInTime <= 0.0) { + this._armature.advanceTime(0.0); + } + this._lastAnimationState = animationState; + return animationState; + }; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + var defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + return this._lastAnimationState; + }; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) { + if (time === void 0) { time = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) { + if (frame === void 0) { frame = 0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + return this.playConfig(this._animationConfig); + }; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) { + if (progress === void 0) { progress = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + return this.playConfig(this._animationConfig); + }; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByTime = function (animationName, time) { + if (time === void 0) { time = 0.0; } + var animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByFrame = function (animationName, frame) { + if (frame === void 0) { frame = 0; } + var animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByProgress = function (animationName, progress) { + if (progress === void 0) { progress = 0.0; } + var animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.getState = function (animationName) { + var i = this._animationStates.length; + while (i--) { + var animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + return null; + }; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.hasAnimation = function (animationName) { + return animationName in this._animations; + }; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + Animation.prototype.getStates = function () { + return this._animationStates; + }; + Object.defineProperty(Animation.prototype, "isPlaying", { + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.isPlaying) { + return true; + } + } + return false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "isCompleted", { + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (!animationState.isCompleted) { + return false; + } + } + return this._animationStates.length > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationName", { + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationNames", { + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animations", { + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animations; + }, + set: function (value) { + if (this._animations === value) { + return; + } + this._animationNames.length = 0; + for (var k in this._animations) { + delete this._animations[k]; + } + for (var k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationConfig", { + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + this._animationConfig.clear(); + return this._animationConfig; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationState", { + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) { + if (fadeInTime === void 0) { fadeInTime = -1; } + if (duration === void 0) { duration = -1; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (pauseFadeOut === void 0) { pauseFadeOut = true; } + if (pauseFadeIn === void 0) { pauseFadeIn = true; } + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + var animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + return this.playConfig(this._animationConfig); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + Animation.prototype.gotoAndStop = function (animationName, time) { + if (time === void 0) { time = 0; } + return this.gotoAndStopByTime(animationName, time); + }; + Object.defineProperty(Animation.prototype, "animationList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationDataList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + var list = []; + for (var i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + return list; + }, + enumerable: true, + configurable: true + }); + return Animation; + }(dragonBones.BaseObject)); + dragonBones.Animation = Animation; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var BonePose = (function (_super) { + __extends(BonePose, _super); + function BonePose() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.current = new dragonBones.Transform(); + _this.delta = new dragonBones.Transform(); + _this.result = new dragonBones.Transform(); + return _this; + } + BonePose.toString = function () { + return "[class dragonBones.BonePose]"; + }; + BonePose.prototype._onClear = function () { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + }; + return BonePose; + }(dragonBones.BaseObject)); + dragonBones.BonePose = BonePose; + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationState = (function (_super) { + __extends(AnimationState, _super); + function AnimationState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._boneMask = []; + _this._boneTimelines = []; + _this._slotTimelines = []; + _this._bonePoses = {}; + /** + * @internal + * @private + */ + _this._actionTimeline = null; // Initial value. + _this._zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationState.toString = function () { + return "[class dragonBones.AnimationState]"; + }; + /** + * @private + */ + AnimationState.prototype._onClear = function () { + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.returnToPool(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.returnToPool(); + } + for (var k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null; // + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + }; + AnimationState.prototype._isDisabled = function (slot) { + if (this.displayControl) { + var displayController = slot.displayController; + if (displayController === null || + displayController === this.name || + displayController === this.group) { + return false; + } + } + return true; + }; + AnimationState.prototype._advanceFadeTime = function (passedTime) { + var isFadeOut = this._fadeState > 0; + if (this._subFadeState < 0) { + this._subFadeState = 0; + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + if (passedTime < 0.0) { + passedTime = -passedTime; + } + this._fadeTime += passedTime; + if (this._fadeTime >= this.fadeTotalTime) { + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + if (this._subFadeState > 0) { + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + }; + AnimationState.prototype._blendBoneTimline = function (timeline) { + var bone = timeline.bone; + var bonePose = timeline.bonePose.result; + var animationPose = bone.animationPose; + var boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.init = function (armature, animationData, animationConfig) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (var i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + this._actionTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.updateTimelines = function () { + var boneTimelines = {}; + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + var timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + boneTimelines[timelineName].push(timeline); + } + for (var _b = 0, _c = this._armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + var timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + var timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { + delete boneTimelines[timelineName]; + } + else { + var bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = dragonBones.BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (var _d = 0, timelineDatas_1 = timelineDatas; _d < timelineDatas_1.length; _d++) { + var timelineData = timelineDatas_1[_d]; + switch (timelineData.type) { + case 10 /* BoneAll */: + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + case 11 /* BoneT */: + case 12 /* BoneR */: + case 13 /* BoneS */: + // TODO + break; + case 14 /* BoneX */: + case 15 /* BoneY */: + case 16 /* BoneRotate */: + case 17 /* BoneSkew */: + case 18 /* BoneScaleX */: + case 19 /* BoneScaleY */: + // TODO + break; + } + } + } + else if (this.resetToPose) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + for (var k in boneTimelines) { + for (var _e = 0, _f = boneTimelines[k]; _e < _f.length; _e++) { + var timeline = _f[_e]; + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + var slotTimelines = {}; + var ffdFlags = []; + for (var _g = 0, _h = this._slotTimelines; _g < _h.length; _g++) { + var timeline = _h[_g]; + var timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + slotTimelines[timelineName].push(timeline); + } + for (var _j = 0, _k = this._armature.getSlots(); _j < _k.length; _j++) { + var slot = _k[_j]; + var boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + var timelineName = slot.name; + var timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { + delete slotTimelines[timelineName]; + } + else { + var displayIndexFlag = false; + var colorFlag = false; + ffdFlags.length = 0; + if (timelineDatas !== null) { + for (var _l = 0, timelineDatas_2 = timelineDatas; _l < timelineDatas_2.length; _l++) { + var timelineData = timelineDatas_2[_l]; + switch (timelineData.type) { + case 20 /* SlotDisplay */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + case 21 /* SlotColor */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + case 22 /* SlotFFD */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + if (this.resetToPose) { + if (!displayIndexFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + if (!colorFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + for (var _m = 0, _o = slot._rawDisplayDatas; _m < _o.length; _m++) { + var displayData = _o[_m]; + if (displayData !== null && displayData.type === 2 /* Mesh */ && ffdFlags.indexOf(displayData.offset) < 0) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + for (var k in slotTimelines) { + for (var _p = 0, _q = slotTimelines[k]; _p < _q.length; _p++) { + var timeline = _q[_p]; + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.advanceTime = function (passedTime, cacheFrameRate) { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + // Update time. + if (this._playheadState === 3) { + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + this._time += passedTime; + } + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + if (this.weight === 0.0) { + return; + } + var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + var isUpdateTimeline = true; + var isUpdateBoneTimeline = true; + var time = this._time; + this._weightResult = this.weight * this._fadeProgress; + this._actionTimeline.update(time); // Update main timeline. + if (isCacheEnabled) { + var internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.update(time); + } + if (isCacheEnabled) { + var cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { + isUpdateBoneTimeline = false; + } + else { + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { + var bone = null; + var prevTimeline = null; // + for (var i = 0, l = this._boneTimelines.length; i < l; ++i) { + var timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + bone = timeline.bone; + } + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + for (var i = 0, l = this._slotTimelines.length; i < l; ++i) { + var timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + timeline.update(time); + } + } + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { + this.fadeOut(this.autoFadeOutTime); + } + } + } + }; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.play = function () { + this._playheadState = 3; // 11 + }; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.stop = function () { + this._playheadState &= 1; // 0x + }; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) { + if (pausePlayhead === void 0) { pausePlayhead = true; } + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.fadeOut(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.fadeOut(); + } + } + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + }; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.containsBoneMask = function (name) { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + }; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.addBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + if (this._boneMask.indexOf(name) < 0) { + this._boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + this._timelineDirty = true; + }; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this._boneMask.indexOf(name); + if (index >= 0) { + this._boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = this._armature.getBone(name); + if (currentBone !== null) { + var bones = this._armature.getBones(); + if (this._boneMask.length > 0) { + for (var _i = 0, bones_1 = bones; _i < bones_1.length; _i++) { + var bone = bones_1[_i]; + var index_2 = this._boneMask.indexOf(bone.name); + if (index_2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index_2, 1); + } + } + } + else { + for (var _a = 0, bones_2 = bones; _a < bones_2.length; _a++) { + var bone = bones_2[_a]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + this._timelineDirty = true; + }; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeAllBoneMask = function () { + this._boneMask.length = 0; + this._timelineDirty = true; + }; + Object.defineProperty(AnimationState.prototype, "isFadeIn", { + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState < 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeOut", { + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeComplete", { + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState === 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isPlaying", { + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isCompleted", { + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.playState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentPlayTimes", { + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "totalTime", { + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._duration; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentTime", { + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentTime; + }, + set: function (value) { + var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + if (this._time === value) { + return; + } + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.playState = -1; + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.playState = -1; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "clip", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + get: function () { + return this.animationData; + }, + enumerable: true, + configurable: true + }); + return AnimationState; + }(dragonBones.BaseObject)); + dragonBones.AnimationState = AnimationState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var TimelineState = (function (_super) { + __extends(TimelineState, _super); + function TimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineState.prototype._onClear = function () { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + this._tweenState = 0 /* None */; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + }; + TimelineState.prototype._setCurrentTime = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this._actionTimeline !== null && this._frameCount <= 1) { + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { + var playTimes = this._animationState.playTimes; + var totalTime = playTimes * this._duration; + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + this.currentTime += this._position; + } + else { + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + // Clear frame flag when timeline start or loopComplete. + if ((prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes)) { + this._frameIndex = -1; + } + return true; + }; + TimelineState.prototype.init = function (armature, animationState, timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + if (this === this._actionTimeline) { + this._actionTimeline = null; // + } + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + this._frameCount = this._timelineArray[this._timelineData.offset + 2 /* TimelineKeyFrameCount */]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + 4 /* TimelineFrameValueOffset */]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + 0 /* TimelineScale */]; + this._timeOffset = this._timelineArray[this._timelineData.offset + 1 /* TimelineOffset */] * 0.01; + } + }; + TimelineState.prototype.fadeOut = function () { }; + TimelineState.prototype.update = function (passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[this._timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + } + this._onArriveAtFrame(); + } + if (this._tweenState !== 0 /* None */) { + this._onUpdateFrame(); + } + } + }; + return TimelineState; + }(dragonBones.BaseObject)); + dragonBones.TimelineState = TimelineState; + /** + * @internal + * @private + */ + var TweenTimelineState = (function (_super) { + __extends(TweenTimelineState, _super); + function TweenTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TweenTimelineState._getEasingValue = function (tweenType, progress, easing) { + var value = progress; + switch (tweenType) { + case 3 /* QuadIn */: + value = Math.pow(progress, 2.0); + break; + case 4 /* QuadOut */: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + case 5 /* QuadInOut */: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + return (value - progress) * easing + progress; + }; + TweenTimelineState._getEasingCurveValue = function (progress, samples, count, offset) { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + var segmentCount = count + 1; // + 2 - 1 + var valueIndex = Math.floor(progress * segmentCount); + var fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + var toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + }; + TweenTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._tweenType = 0 /* None */; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + }; + TweenTimelineState.prototype._onArriveAtFrame = function () { + if (this._frameCount > 1 && + (this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) { + this._tweenType = this._frameArray[this._frameOffset + 1 /* FrameTweenType */]; // TODO recode ture tween type. + this._tweenState = this._tweenType === 0 /* None */ ? 1 /* Once */ : 2 /* Always */; + if (this._tweenType === 2 /* Curve */) { + this._curveCount = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */]; + } + else if (this._tweenType !== 0 /* None */ && this._tweenType !== 1 /* Line */) { + this._tweenEasing = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] * 0.01; + } + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = 1 /* Once */; + } + }; + TweenTimelineState.prototype._onUpdateFrame = function () { + if (this._tweenState === 2 /* Always */) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === 2 /* Curve */) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + 3 /* FrameCurveSamples */); + } + else if (this._tweenType !== 1 /* Line */) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + }; + return TweenTimelineState; + }(TimelineState)); + dragonBones.TweenTimelineState = TweenTimelineState; + /** + * @internal + * @private + */ + var BoneTimelineState = (function (_super) { + __extends(BoneTimelineState, _super); + function BoneTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bone = null; // + this.bonePose = null; // + }; + return BoneTimelineState; + }(TweenTimelineState)); + dragonBones.BoneTimelineState = BoneTimelineState; + /** + * @internal + * @private + */ + var SlotTimelineState = (function (_super) { + __extends(SlotTimelineState, _super); + function SlotTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.slot = null; // + }; + return SlotTimelineState; + }(TweenTimelineState)); + dragonBones.SlotTimelineState = SlotTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var ActionTimelineState = (function (_super) { + __extends(ActionTimelineState, _super); + function ActionTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ActionTimelineState.toString = function () { + return "[class dragonBones.ActionTimelineState]"; + }; + ActionTimelineState.prototype._onCrossFrame = function (frameIndex) { + var eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + frameIndex]; + var actionCount = this._frameArray[frameOffset + 1]; + var actions = this._armature.armatureData.actions; + for (var i = 0; i < actionCount; ++i) { + var actionIndex = this._frameArray[frameOffset + 2 + i]; + var action = actions[actionIndex]; + if (action.type === 0 /* Play */) { + if (action.slot !== null) { + var slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + var eventType = action.type === 10 /* Frame */ ? dragonBones.EventObject.FRAME_EVENT : dragonBones.EventObject.SOUND_EVENT; + if (action.type === 11 /* Sound */ || eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + }; + ActionTimelineState.prototype._onArriveAtFrame = function () { }; + ActionTimelineState.prototype._onUpdateFrame = function () { }; + ActionTimelineState.prototype.update = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + var eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { + this._armature._sortZOrder(null, 0); + } + prevPlayTimes = this.currentPlayTimes; + if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = dragonBones.EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + var isReverse = this._animationState.timeScale < 0.0; + var loopCompleteEvent = null; + var completeEvent = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + loopCompleteEvent.type = dragonBones.EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + if (this.playState > 0) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) { + completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + completeEvent.type = dragonBones.EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + } + } + if (this._frameCount > 1) { + var timelineData = this._timelineData; + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + var crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { + if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + // Arrive at frame. + var framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { + if (!isReverse && loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + this._onCrossFrame(this._frameIndex); + } + } + } + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + }; + ActionTimelineState.prototype.setCurrentTime = function (value) { + this._setCurrentTime(value); + this._frameIndex = -1; + }; + return ActionTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ActionTimelineState = ActionTimelineState; + /** + * @internal + * @private + */ + var ZOrderTimelineState = (function (_super) { + __extends(ZOrderTimelineState, _super); + function ZOrderTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZOrderTimelineState.toString = function () { + return "[class dragonBones.ZOrderTimelineState]"; + }; + ZOrderTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + }; + ZOrderTimelineState.prototype._onUpdateFrame = function () { }; + return ZOrderTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ZOrderTimelineState = ZOrderTimelineState; + /** + * @internal + * @private + */ + var BoneAllTimelineState = (function (_super) { + __extends(BoneAllTimelineState, _super); + function BoneAllTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneAllTimelineState.toString = function () { + return "[class dragonBones.BoneAllTimelineState]"; + }; + BoneAllTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { + var current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + }; + BoneAllTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var result = this.bonePose.result; + this.bone._transformDirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + var scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + }; + BoneAllTimelineState.prototype.fadeOut = function () { + var result = this.bonePose.result; + result.rotation = dragonBones.Transform.normalizeRadian(result.rotation); + result.skew = dragonBones.Transform.normalizeRadian(result.skew); + }; + return BoneAllTimelineState; + }(dragonBones.BoneTimelineState)); + dragonBones.BoneAllTimelineState = BoneAllTimelineState; + /** + * @internal + * @private + */ + var SlotDislayIndexTimelineState = (function (_super) { + __extends(SlotDislayIndexTimelineState, _super); + function SlotDislayIndexTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotDislayIndexTimelineState.toString = function () { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + }; + SlotDislayIndexTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + }; + return SlotDislayIndexTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotDislayIndexTimelineState = SlotDislayIndexTimelineState; + /** + * @internal + * @private + */ + var SlotColorTimelineState = (function (_super) { + __extends(SlotColorTimelineState, _super); + function SlotColorTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._delta = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._result = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + return _this; + } + SlotColorTimelineState.toString = function () { + return "[class dragonBones.SlotColorTimelineState]"; + }; + SlotColorTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._dirty = false; + }; + SlotColorTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var intArray = this._dragonBonesData.intArray; + var frameIntArray = this._dragonBonesData.frameIntArray; + var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + var colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { + var color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + }; + SlotColorTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + }; + SlotColorTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotColorTimelineState.prototype.update = function (passedTime) { + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._colorTransform; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + this.slot._colorDirty = true; + } + } + } + }; + return SlotColorTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotColorTimelineState = SlotColorTimelineState; + /** + * @internal + * @private + */ + var SlotFFDTimelineState = (function (_super) { + __extends(SlotFFDTimelineState, _super); + function SlotFFDTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = []; + _this._delta = []; + _this._result = []; + return _this; + } + SlotFFDTimelineState.toString = function () { + return "[class dragonBones.SlotFFDTimelineState]"; + }; + SlotFFDTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.meshOffset = 0; + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + }; + SlotFFDTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var isTween = this._tweenState === 2 /* Always */; + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + if (isTween) { + var nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + }; + SlotFFDTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + for (var i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + }; + SlotFFDTimelineState.prototype.init = function (armature, animationState, timelineData) { + _super.prototype.init.call(this, armature, animationState, timelineData); + if (this._timelineData !== null) { + var frameIntArray = this._dragonBonesData.frameIntArray; + var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + 3 /* TimelineFrameValueCount */]; + this.meshOffset = frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */]; + this._ffdCount = frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */]; + this._valueCount = frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */]; + this._valueOffset = frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */]; + this._frameFloatOffset = frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + }; + SlotFFDTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotFFDTimelineState.prototype.update = function (passedTime) { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._ffdVertices; + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + this.slot._meshDirty = true; + } + } + } + }; + return SlotFFDTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotFFDTimelineState = SlotFFDTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EventObject = (function (_super) { + __extends(EventObject, _super); + function EventObject() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EventObject.toString = function () { + return "[class dragonBones.EventObject]"; + }; + /** + * @private + */ + EventObject.prototype._onClear = function () { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + }; + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.START = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.LOOP_COMPLETE = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.COMPLETE = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN_COMPLETE = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT_COMPLETE = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FRAME_EVENT = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.SOUND_EVENT = "soundEvent"; + return EventObject; + }(dragonBones.BaseObject)); + dragonBones.EventObject = EventObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DataParser = (function () { + function DataParser() { + } + DataParser._getArmatureType = function (value) { + switch (value.toLowerCase()) { + case "stage": + return 2 /* Stage */; + case "armature": + return 0 /* Armature */; + case "movieclip": + return 1 /* MovieClip */; + default: + return 0 /* Armature */; + } + }; + DataParser._getDisplayType = function (value) { + switch (value.toLowerCase()) { + case "image": + return 0 /* Image */; + case "mesh": + return 2 /* Mesh */; + case "armature": + return 1 /* Armature */; + case "boundingbox": + return 3 /* BoundingBox */; + default: + return 0 /* Image */; + } + }; + DataParser._getBoundingBoxType = function (value) { + switch (value.toLowerCase()) { + case "rectangle": + return 0 /* Rectangle */; + case "ellipse": + return 1 /* Ellipse */; + case "polygon": + return 2 /* Polygon */; + default: + return 0 /* Rectangle */; + } + }; + DataParser._getActionType = function (value) { + switch (value.toLowerCase()) { + case "play": + return 0 /* Play */; + case "frame": + return 10 /* Frame */; + case "sound": + return 11 /* Sound */; + default: + return 0 /* Play */; + } + }; + DataParser._getBlendMode = function (value) { + switch (value.toLowerCase()) { + case "normal": + return 0 /* Normal */; + case "add": + return 1 /* Add */; + case "alpha": + return 2 /* Alpha */; + case "darken": + return 3 /* Darken */; + case "difference": + return 4 /* Difference */; + case "erase": + return 5 /* Erase */; + case "hardlight": + return 6 /* HardLight */; + case "invert": + return 7 /* Invert */; + case "layer": + return 8 /* Layer */; + case "lighten": + return 9 /* Lighten */; + case "multiply": + return 10 /* Multiply */; + case "overlay": + return 11 /* Overlay */; + case "screen": + return 12 /* Screen */; + case "subtract": + return 13 /* Subtract */; + default: + return 0 /* Normal */; + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + DataParser.parseDragonBonesData = function (rawData) { + if (rawData instanceof ArrayBuffer) { + return dragonBones.BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + DataParser.parseTextureAtlasData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.warn("已废弃,请参考 @see"); + var textureAtlasData = {}; + var subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (var i = 0, len = subTextureList.length; i < len; i++) { + var subTextureObject = subTextureList[i]; + var subTextureName = subTextureObject[DataParser.NAME]; + var subTextureRegion = new dragonBones.Rectangle(); + var subTextureFrame = null; + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new dragonBones.Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + return textureAtlasData; + }; + DataParser.DATA_VERSION_2_3 = "2.3"; + DataParser.DATA_VERSION_3_0 = "3.0"; + DataParser.DATA_VERSION_4_0 = "4.0"; + DataParser.DATA_VERSION_4_5 = "4.5"; + DataParser.DATA_VERSION_5_0 = "5.0"; + DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0; + DataParser.DATA_VERSIONS = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + DataParser.TEXTURE_ATLAS = "textureAtlas"; + DataParser.SUB_TEXTURE = "SubTexture"; + DataParser.FORMAT = "format"; + DataParser.IMAGE_PATH = "imagePath"; + DataParser.WIDTH = "width"; + DataParser.HEIGHT = "height"; + DataParser.ROTATED = "rotated"; + DataParser.FRAME_X = "frameX"; + DataParser.FRAME_Y = "frameY"; + DataParser.FRAME_WIDTH = "frameWidth"; + DataParser.FRAME_HEIGHT = "frameHeight"; + DataParser.DRADON_BONES = "dragonBones"; + DataParser.USER_DATA = "userData"; + DataParser.ARMATURE = "armature"; + DataParser.BONE = "bone"; + DataParser.IK = "ik"; + DataParser.SLOT = "slot"; + DataParser.SKIN = "skin"; + DataParser.DISPLAY = "display"; + DataParser.ANIMATION = "animation"; + DataParser.Z_ORDER = "zOrder"; + DataParser.FFD = "ffd"; + DataParser.FRAME = "frame"; + DataParser.TRANSLATE_FRAME = "translateFrame"; + DataParser.ROTATE_FRAME = "rotateFrame"; + DataParser.SCALE_FRAME = "scaleFrame"; + DataParser.VISIBLE_FRAME = "visibleFrame"; + DataParser.DISPLAY_FRAME = "displayFrame"; + DataParser.COLOR_FRAME = "colorFrame"; + DataParser.DEFAULT_ACTIONS = "defaultActions"; + DataParser.ACTIONS = "actions"; + DataParser.EVENTS = "events"; + DataParser.INTS = "ints"; + DataParser.FLOATS = "floats"; + DataParser.STRINGS = "strings"; + DataParser.CANVAS = "canvas"; + DataParser.TRANSFORM = "transform"; + DataParser.PIVOT = "pivot"; + DataParser.AABB = "aabb"; + DataParser.COLOR = "color"; + DataParser.VERSION = "version"; + DataParser.COMPATIBLE_VERSION = "compatibleVersion"; + DataParser.FRAME_RATE = "frameRate"; + DataParser.TYPE = "type"; + DataParser.SUB_TYPE = "subType"; + DataParser.NAME = "name"; + DataParser.PARENT = "parent"; + DataParser.TARGET = "target"; + DataParser.SHARE = "share"; + DataParser.PATH = "path"; + DataParser.LENGTH = "length"; + DataParser.DISPLAY_INDEX = "displayIndex"; + DataParser.BLEND_MODE = "blendMode"; + DataParser.INHERIT_TRANSLATION = "inheritTranslation"; + DataParser.INHERIT_ROTATION = "inheritRotation"; + DataParser.INHERIT_SCALE = "inheritScale"; + DataParser.INHERIT_REFLECTION = "inheritReflection"; + DataParser.INHERIT_ANIMATION = "inheritAnimation"; + DataParser.INHERIT_FFD = "inheritFFD"; + DataParser.BEND_POSITIVE = "bendPositive"; + DataParser.CHAIN = "chain"; + DataParser.WEIGHT = "weight"; + DataParser.FADE_IN_TIME = "fadeInTime"; + DataParser.PLAY_TIMES = "playTimes"; + DataParser.SCALE = "scale"; + DataParser.OFFSET = "offset"; + DataParser.POSITION = "position"; + DataParser.DURATION = "duration"; + DataParser.TWEEN_TYPE = "tweenType"; + DataParser.TWEEN_EASING = "tweenEasing"; + DataParser.TWEEN_ROTATE = "tweenRotate"; + DataParser.TWEEN_SCALE = "tweenScale"; + DataParser.CURVE = "curve"; + DataParser.SOUND = "sound"; + DataParser.EVENT = "event"; + DataParser.ACTION = "action"; + DataParser.X = "x"; + DataParser.Y = "y"; + DataParser.SKEW_X = "skX"; + DataParser.SKEW_Y = "skY"; + DataParser.SCALE_X = "scX"; + DataParser.SCALE_Y = "scY"; + DataParser.VALUE = "value"; + DataParser.ROTATE = "rotate"; + DataParser.SKEW = "skew"; + DataParser.ALPHA_OFFSET = "aO"; + DataParser.RED_OFFSET = "rO"; + DataParser.GREEN_OFFSET = "gO"; + DataParser.BLUE_OFFSET = "bO"; + DataParser.ALPHA_MULTIPLIER = "aM"; + DataParser.RED_MULTIPLIER = "rM"; + DataParser.GREEN_MULTIPLIER = "gM"; + DataParser.BLUE_MULTIPLIER = "bM"; + DataParser.UVS = "uvs"; + DataParser.VERTICES = "vertices"; + DataParser.TRIANGLES = "triangles"; + DataParser.WEIGHTS = "weights"; + DataParser.SLOT_POSE = "slotPose"; + DataParser.BONE_POSE = "bonePose"; + DataParser.GOTO_AND_PLAY = "gotoAndPlay"; + DataParser.DEFAULT_NAME = "default"; + return DataParser; + }()); + dragonBones.DataParser = DataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ObjectDataParser = (function (_super) { + __extends(ObjectDataParser, _super); + function ObjectDataParser() { + /** + * @private + */ + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._intArrayJson = []; + _this._floatArrayJson = []; + _this._frameIntArrayJson = []; + _this._frameFloatArrayJson = []; + _this._frameArrayJson = []; + _this._timelineArrayJson = []; + _this._rawTextureAtlasIndex = 0; + _this._rawBones = []; + _this._data = null; // + _this._armature = null; // + _this._bone = null; // + _this._slot = null; // + _this._skin = null; // + _this._mesh = null; // + _this._animation = null; // + _this._timeline = null; // + _this._rawTextureAtlases = null; + _this._defalultColorOffset = -1; + _this._prevTweenRotate = 0; + _this._prevRotation = 0.0; + _this._helpMatrixA = new dragonBones.Matrix(); + _this._helpMatrixB = new dragonBones.Matrix(); + _this._helpTransform = new dragonBones.Transform(); + _this._helpColorTransform = new dragonBones.ColorTransform(); + _this._helpPoint = new dragonBones.Point(); + _this._helpArray = []; + _this._actionFrames = []; + _this._weightSlotPose = {}; + _this._weightBonePoses = {}; + _this._weightBoneIndices = {}; + _this._cacheBones = {}; + _this._meshs = {}; + _this._slotChildActions = {}; + return _this; + } + ObjectDataParser._getBoolean = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + default: + return true; + } + } + else { + return !!value; + } + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getNumber = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + return +value || 0; + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getString = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + return value; + } + return String(value); + } + return defaultValue; + }; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + ObjectDataParser.prototype._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) { + var l_t = 1.0 - t; + var powA = l_t * l_t; + var powB = t * t; + var kA = l_t * powA; + var kB = 3.0 * t * powA; + var kC = 3.0 * l_t * powB; + var kD = t * powB; + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + }; + /** + * @private + */ + ObjectDataParser.prototype._samplingEasingCurve = function (curve, samples) { + var curveCount = curve.length; + var stepIndex = -2; + for (var i = 0, l = samples.length; i < l; ++i) { + var t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { + stepIndex += 6; + } + var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + var x1 = isInCurve ? curve[stepIndex] : 0.0; + var y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + var x2 = curve[stepIndex + 2]; + var y2 = curve[stepIndex + 3]; + var x3 = curve[stepIndex + 4]; + var y3 = curve[stepIndex + 5]; + var x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + var y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + var lower = 0.0; + var higher = 1.0; + while (higher - lower > 0.0001) { + var percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + samples[i] = this._helpPoint.y; + } + }; + ObjectDataParser.prototype._sortActionFrame = function (a, b) { + return a.frameStart > b.frameStart ? 1 : -1; + }; + ObjectDataParser.prototype._parseActionDataInFrame = function (rawData, frameStart, bone, slot) { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, 11 /* Sound */, bone, slot); + } + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, 0 /* Play */, bone, slot); + } + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, 0 /* Play */, bone, slot); + } + }; + ObjectDataParser.prototype._mergeActionFrame = function (rawData, frameStart, type, bone, slot) { + var actionOffset = dragonBones.DragonBones.webAssembly ? this._armature.actions.size() : this._armature.actions.length; + var actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + var frame = null; + if (this._actionFrames.length === 0) { + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + for (var _i = 0, _a = this._actionFrames; _i < _a.length; _i++) { + var eachFrame = _a[_i]; + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + if (frame === null) { + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + for (var i = 0; i < actionCount; ++i) { + frame.actions.push(actionOffset + i); + } + }; + ObjectDataParser.prototype._parseCacheActionFrame = function (frame) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = frameArray.length; + var actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + 0 /* FramePosition */] = frame.frameStart; + frameArray[frameOffset + 0 /* FramePosition */ + 1] = actionCount; // Action count. + for (var i = 0; i < actionCount; ++i) { + frameArray[frameOffset + 0 /* FramePosition */ + 2 + i] = frame.actions[i]; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArmature = function (rawData, scale) { + // const armature = BaseObject.borrowObject(ArmatureData); + var armature = dragonBones.DragonBones.webAssembly ? new Module["ArmatureData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */); + } + if (armature.frameRate === 0) { + armature.frameRate = 24; + } + this._armature = armature; + if (ObjectDataParser.AABB in rawData) { + var rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + if (ObjectDataParser.CANVAS in rawData) { + var rawCanvas = rawData[ObjectDataParser.CANVAS]; + var canvas = dragonBones.BaseObject.borrowObject(dragonBones.CanvasData); + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + armature.canvas = canvas; + } + if (ObjectDataParser.BONE in rawData) { + var rawBones = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawBones_1 = rawBones; _i < rawBones_1.length; _i++) { + var rawBone = rawBones_1[_i]; + var parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + var bone = this._parseBone(rawBone); + if (parentName.length > 0) { + var parent_1 = armature.getBone(parentName); + if (parent_1 !== null) { + bone.parent = parent_1; + } + else { + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + if (bone.name in this._cacheBones) { + for (var _a = 0, _b = this._cacheBones[bone.name]; _a < _b.length; _a++) { + var child = _b[_a]; + child.parent = bone; + } + delete this._cacheBones[bone.name]; + } + armature.addBone(bone); + this._rawBones.push(bone); // Raw bone sort. + } + } + if (ObjectDataParser.IK in rawData) { + var rawIKS = rawData[ObjectDataParser.IK]; + for (var _c = 0, rawIKS_1 = rawIKS; _c < rawIKS_1.length; _c++) { + var rawIK = rawIKS_1[_c]; + this._parseIKConstraint(rawIK); + } + } + armature.sortBones(); + if (ObjectDataParser.SLOT in rawData) { + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _d = 0, rawSlots_1 = rawSlots; _d < rawSlots_1.length; _d++) { + var rawSlot = rawSlots_1[_d]; + armature.addSlot(this._parseSlot(rawSlot)); + } + } + if (ObjectDataParser.SKIN in rawData) { + var rawSkins = rawData[ObjectDataParser.SKIN]; + for (var _e = 0, rawSkins_1 = rawSkins; _e < rawSkins_1.length; _e++) { + var rawSkin = rawSkins_1[_e]; + armature.addSkin(this._parseSkin(rawSkin)); + } + } + if (ObjectDataParser.ANIMATION in rawData) { + var rawAnimations = rawData[ObjectDataParser.ANIMATION]; + for (var _f = 0, rawAnimations_1 = rawAnimations; _f < rawAnimations_1.length; _f++) { + var rawAnimation = rawAnimations_1[_f]; + var animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, 0 /* Play */, null, null); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, 0 /* Play */, null, null); + } + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? armature.defaultActions.size() : armature.defaultActions.length); ++i) { + var action = dragonBones.DragonBones.webAssembly ? armature.defaultActions.get(i) : armature.defaultActions[i]; + if (action.type === 0 /* Play */) { + var animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + // Clear helper. + this._rawBones.length = 0; + this._armature = null; + for (var k in this._meshs) { + delete this._meshs[k]; + } + for (var k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (var k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (var k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (var k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (var k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + return armature; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBone = function (rawData) { + // const bone = BaseObject.borrowObject(BoneData); + var bone = dragonBones.DragonBones.webAssembly ? new Module["BoneData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + } + return bone; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseIKConstraint = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + var target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + // const constraint = BaseObject.borrowObject(IKConstraintData); + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraintData"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + var chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (dragonBones.DragonBones.webAssembly) { + bone.constraints.push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlot = function (rawData) { + // const slot = BaseObject.borrowObject(SlotData); + var slot = dragonBones.DragonBones.webAssembly ? new Module["SlotData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = dragonBones.DragonBones.webAssembly ? this._armature.sortedSlots.size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")); // + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */); + } + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].createColor() : dragonBones.SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : dragonBones.SlotData.DEFAULT_COLOR; + } + if (ObjectDataParser.ACTIONS in rawData) { + var actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, 0 /* Play */, null, null); + } + return slot; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSkin = function (rawData) { + // const skin = BaseObject.borrowObject(SkinData); + var skin = dragonBones.DragonBones.webAssembly ? new Module["SkinData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _i = 0, rawSlots_2 = rawSlots; _i < rawSlots_2.length; _i++) { + var rawSlot = rawSlots_2[_i]; + var slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + if (ObjectDataParser.DISPLAY in rawSlot) { + var rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (var _a = 0, rawDisplays_1 = rawDisplays; _a < rawDisplays_1.length; _a++) { + var rawDisplay = rawDisplays_1[_a]; + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + this._slot = null; // + } + } + this._skin = null; // + } + return skin; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseDisplay = function (rawData) { + var display = null; + var name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + var path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + var type = 0 /* Image */; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + switch (type) { + case 0 /* Image */: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + var imageDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ImageDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + case 1 /* Armature */: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + var armatureDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, 0 /* Play */, null, null); + } + else if (this._slot.name in this._slotChildActions) { + var displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (var _i = 0, _a = this._slotChildActions[this._slot.name]; _i < _a.length; _i++) { + var action = _a[_i]; + if (dragonBones.DragonBones.webAssembly) { + armatureDisplay.actions.push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + delete this._slotChildActions[this._slot.name]; + } + } + break; + case 2 /* Mesh */: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + var meshDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["MeshDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + var shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + var shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + case 3 /* BoundingBox */: + var boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + var boundingBoxDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + return display; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePivot = function (rawData, display) { + if (ObjectDataParser.PIVOT in rawData) { + var rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseMesh = function (rawData, mesh) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var rawUVs = rawData[ObjectDataParser.UVS]; + var rawTriangles = rawData[ObjectDataParser.TRIANGLES]; + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + var vertexCount = Math.floor(rawVertices.length / 2); // uint + var triangleCount = Math.floor(rawTriangles.length / 3); // uint + var vertexOffset = floatArray.length; + var uvOffset = vertexOffset + vertexCount * 2; + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + 0 /* MeshVertexCount */] = vertexCount; + intArray[mesh.offset + 1 /* MeshTriangleCount */] = triangleCount; + intArray[mesh.offset + 2 /* MeshFloatOffset */] = vertexOffset; + for (var i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + 4 /* MeshVertexIndices */ + i] = rawTriangles[i]; + } + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + if (ObjectDataParser.WEIGHTS in rawData) { + var rawWeights = rawData[ObjectDataParser.WEIGHTS]; + var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE]; + var rawBonePoses = rawData[ObjectDataParser.BONE_POSE]; + var weightBoneIndices = new Array(); + var weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + var floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + 1 /* WeigthFloatOffset */] = floatOffset; + for (var i = 0; i < weightBoneCount; ++i) { + var rawBoneIndex = rawBonePoses[i * 7]; // uint + var bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + if (dragonBones.DragonBones.webAssembly) { + for (var j = 0; j < this._armature.sortedBones.size(); j++) { + if (this._armature.sortedBones.get(j) === bone) { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = j; + } + } + } + else { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = this._armature.sortedBones.indexOf(bone); + } + } + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + for (var i = 0, iW = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + var iD = i * 2; + var vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + var x = floatArray[vertexOffset + iD]; + var y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var rawBoneIndex = rawWeights[iW++]; // uint + var bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + mesh.weight = weight; + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoundingBox = function (rawData) { + var boundingBox = null; + var type = 0 /* Rectangle */; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + switch (type) { + case 0 /* Rectangle */: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.RectangleBoundingBoxData); + break; + case 1 /* Ellipse */: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.EllipseBoundingBoxData); + break; + case 2 /* Polygon */: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === 0 /* Rectangle */ || boundingBox.type === 1 /* Ellipse */) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + return boundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + for (var i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + var iN = i + 1; + var x = rawVertices[i]; + var y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + return polygonBoundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (dragonBones.DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + this._animation = animation; + if (ObjectDataParser.FRAME in rawData) { + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (var i = 0, frameStart = 0; i < keyFrameCount; ++i) { + var rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], 1 /* ZOrder */, false, false, 0, this._parseZOrderFrame); + } + if (ObjectDataParser.BONE in rawData) { + var rawTimelines = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawTimelines_1 = rawTimelines; _i < rawTimelines_1.length; _i++) { + var rawTimeline = rawTimelines_1[_i]; + this._parseBoneTimeline(rawTimeline); + } + } + if (ObjectDataParser.SLOT in rawData) { + var rawTimelines = rawData[ObjectDataParser.SLOT]; + for (var _a = 0, rawTimelines_2 = rawTimelines; _a < rawTimelines_2.length; _a++) { + var rawTimeline = rawTimelines_2[_a]; + this._parseSlotTimeline(rawTimeline); + } + } + if (ObjectDataParser.FFD in rawData) { + var rawTimelines = rawData[ObjectDataParser.FFD]; + for (var _b = 0, rawTimelines_3 = rawTimelines; _b < rawTimelines_3.length; _b++) { + var rawTimeline = rawTimelines_3[_b]; + var slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + var displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + this._slot = slot; + this._mesh = this._meshs[displayName]; + var timelineFFD = this._parseTimeline(rawTimeline, 22 /* SlotFFD */, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + this._slot = null; // + this._mesh = null; // + } + } + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + var timeline = this._animation.actionTimeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var keyFrameCount = this._actionFrames.length; + timeline.type = 0 /* Action */; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = 100; + timelineArray[timeline.offset + 1 /* TimelineOffset */] = 0; + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = 0; + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + this._actionFrames.length = 0; + } + this._animation = null; // + return animation; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTimeline = function (rawData, type, addIntOffset, addFloatOffset, frameValueCount, frameParser) { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntArrayLength = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + var frameFloatArrayLength = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + var timeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + 1 /* TimelineOffset */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + } + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + var frameIndices = this._data.frameIndices; + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneTimeline = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + var timeline = this._parseTimeline(rawData, 10 /* BoneAll */, false, true, 6, this._parseBoneFrame); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + this._bone = null; // + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotTimeline = function (rawData) { + var slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + this._slot = slot; + var displayIndexTimeline = this._parseTimeline(rawData, 20 /* SlotDisplay */, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + var colorTimeline = this._parseTimeline(rawData, 21 /* SlotColor */, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseFrame = function (rawData, frameStart, frameCount, frameArray) { + rawData; + frameCount; + var frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + 0 /* FramePosition */] = frameStart; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTweenFrame = function (rawData, frameStart, frameCount, frameArray) { + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + var sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + 1 /* FrameTweenType */] = 2 /* Curve */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = sampleCount; + for (var i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + 3 /* FrameCurveSamples */ + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + var noTween = -2.0; + var tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 1 /* Line */; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 3 /* QuadIn */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 4 /* QuadOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 5 /* QuadInOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (ObjectDataParser.Z_ORDER in rawData) { + var rawZOrder = rawData[ObjectDataParser.Z_ORDER]; + if (rawZOrder.length > 0) { + var slotCount = this._armature.sortedSlots.length; + var unchanged = new Array(slotCount - rawZOrder.length / 2); + var zOrders = new Array(slotCount); + for (var i_1 = 0; i_1 < slotCount; ++i_1) { + zOrders[i_1] = -1; + } + var originalIndex = 0; + var unchangedIndex = 0; + for (var i_2 = 0, l = rawZOrder.length; i_2 < l; i_2 += 2) { + var slotIndex = rawZOrder[i_2]; + var zOrderOffset = rawZOrder[i_2 + 1]; + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + var i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + return frameOffset; + } + } + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) { + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + // Modify rotation. + var rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + dragonBones.Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + rotation = this._prevRotation + rotation - this._prevRotation + dragonBones.Transform.PI_D * this._prevTweenRotate; + } + } + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + var frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotDisplayIndexFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotColorFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + var rawColor = rawData[ObjectDataParser.COLOR]; + for (var k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + colorOffset = this._defalultColorOffset; + } + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotFFDFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameFloatOffset = frameFloatArray.length; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] : null; + var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + var vertexCount = intArray[this._mesh.offset + 0 /* MeshVertexCount */]; + var x = 0.0; + var y = 0.0; + var iB = 0; + var iV = 0; + if (this._mesh.weight !== null) { + var rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + 2 /* WeigthBoneIndices */ + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + for (var i = 0; i < vertexCount * 2; i += 2) { + if (rawVertices === null) { + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + if (this._mesh.weight !== null) { + var rawBonePoses = this._weightBonePoses[this._mesh.name]; + var weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + var vertexBoneCount = intArray[iB++]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._mesh.weight.bones[boneIndex]; + var rawBoneIndex = this._rawBones.indexOf(bone); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + if (frameStart === 0) { + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */] = this._mesh.offset; + frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */] = 0; + frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] = frameFloatOffset; + timelineArray[this._timeline.offset + 3 /* TimelineFrameValueCount */] = frameIntOffset - this._animation.frameIntOffset; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseActionData = function (rawData, actions, type, bone, slot) { + var actionCount = 0; + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (var _i = 0, rawData_1 = rawData; _i < rawData_1.length; _i++) { + var rawAction = rawData_1[_i]; + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = 0 /* Play */; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + if (ObjectDataParser.BONE in rawAction) { + var boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + if (ObjectDataParser.SLOT in rawAction) { + var slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawInts = rawAction[ObjectDataParser.INTS]; + for (var _a = 0, rawInts_1 = rawInts; _a < rawInts_1.length; _a++) { + var rawValue = rawInts_1[_a]; + dragonBones.DragonBones.webAssembly ? action.data.ints.push_back(rawValue) : action.data.ints.push(rawValue); + } + } + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawFloats = rawAction[ObjectDataParser.FLOATS]; + for (var _b = 0, rawFloats_1 = rawFloats; _b < rawFloats_1.length; _b++) { + var rawValue = rawFloats_1[_b]; + dragonBones.DragonBones.webAssembly ? action.data.floats.push_back(rawValue) : action.data.floats.push(rawValue); + } + } + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawStrings = rawAction[ObjectDataParser.STRINGS]; + for (var _c = 0, rawStrings_1 = rawStrings; _c < rawStrings_1.length; _c++) { + var rawValue = rawStrings_1[_c]; + dragonBones.DragonBones.webAssembly ? action.data.strings.push_back(rawValue) : action.data.strings.push(rawValue); + } + } + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + } + return actionCount; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTransform = function (rawData, transform, scale) { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * dragonBones.Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.Transform.DEG_RAD) - transform.rotation; + } + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseColorTransform = function (rawData, color) { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArray = function (rawData) { + rawData; + if (dragonBones.DragonBones.webAssembly) { + return; + } + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseWASMArray = function () { + var intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (var i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (var i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (var i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (var i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (var i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (var i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined); + var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) { + // const data = BaseObject.borrowObject(DragonBonesData); + var data = dragonBones.DragonBones.webAssembly ? new Module["DragonBonesData"]() : dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + if (data.frameRate === 0) { + data.frameRate = 24; + } + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + this._parseArray(rawData); + var rawArmatures = rawData[ObjectDataParser.ARMATURE]; + for (var _i = 0, rawArmatures_1 = rawArmatures; _i < rawArmatures_1.length; _i++) { + var rawArmature = rawArmatures_1[_i]; + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + this._data = null; + } + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + return null; + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) { + if (scale === void 0) { scale = 0.0; } + console.assert(rawData !== undefined); + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + var rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + return true; + } + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + if (scale > 0.0) { + textureAtlasData.scale = scale; + } + else { + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + scale = 1.0 / scale; // + if (ObjectDataParser.SUB_TEXTURE in rawData) { + var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE]; + for (var i = 0, l = rawTextures.length; i < l; ++i) { + var rawTexture = rawTextures[i]; + var textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = dragonBones.DragonBones.webAssembly ? Module["TextureData"].createRectangle() : dragonBones.TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + textureAtlasData.addTexture(textureData); + } + } + return true; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + ObjectDataParser.getInstance = function () { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + return ObjectDataParser._objectDataParserInstance; + }; + /** + * @private + */ + ObjectDataParser._objectDataParserInstance = null; + return ObjectDataParser; + }(dragonBones.DataParser)); + dragonBones.ObjectDataParser = ObjectDataParser; + var ActionFrame = (function () { + function ActionFrame() { + this.frameStart = 0; + this.actions = []; + } + return ActionFrame; + }()); +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BinaryDataParser = (function (_super) { + __extends(BinaryDataParser, _super); + function BinaryDataParser() { + return _super !== null && _super.apply(this, arguments) || this; + } + BinaryDataParser.prototype._inRange = function (a, min, max) { + return min <= a && a <= max; + }; + BinaryDataParser.prototype._decodeUTF8 = function (data) { + var EOF_byte = -1; + var EOF_code_point = -1; + var FATAL_POINT = 0xFFFD; + var pos = 0; + var result = ""; + var code_point; + var utf8_code_point = 0; + var utf8_bytes_needed = 0; + var utf8_bytes_seen = 0; + var utf8_lower_boundary = 0; + while (data.length > pos) { + var _byte = data[pos++]; + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + var cp = utf8_code_point; + var lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) + result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + return result; + }; + BinaryDataParser.prototype._getUTF16Key = function (value) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + return value; + }; + BinaryDataParser.prototype._parseBinaryTimeline = function (type, offset, timelineData) { + if (timelineData === void 0) { timelineData = null; } + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + var timeline = timelineData !== null ? timelineData : (dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData)); + timeline.type = type; + timeline.offset = offset; + this._timeline = timeline; + var keyFrameCount = this._timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK + 1]] - frameStart; + } + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseMesh = function (rawData, mesh) { + mesh.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + var weightOffset = this._intArray[mesh.offset + 3 /* MeshWeightOffset */]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + var vertexCount = this._intArray[mesh.offset + 0 /* MeshVertexCount */]; + var boneCount = this._intArray[weightOffset + 0 /* WeigthBoneCount */]; + weight.offset = weightOffset; + if (dragonBones.DragonBones.webAssembly) { + weight.bones.resize(boneCount, null); + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones.set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + var boneIndicesOffset = weightOffset + 2 /* WeigthBoneIndices */ + boneCount; + for (var i = 0, l = vertexCount; i < l; ++i) { + var vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + mesh.weight = weight; + } + }; + /** + * @private + */ + BinaryDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + return polygonBoundingBox; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.DURATION, 1), 1); + animation.playTimes = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.SCALE, 1.0); + animation.name = dragonBones.ObjectDataParser._getString(rawData, dragonBones.ObjectDataParser.NAME, dragonBones.ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = dragonBones.ObjectDataParser.DEFAULT_NAME; + } + // Offsets. + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + this._animation = animation; + if (dragonBones.ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(0 /* Action */, rawData[dragonBones.ObjectDataParser.ACTION]); + } + if (dragonBones.ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(1 /* ZOrder */, rawData[dragonBones.ObjectDataParser.Z_ORDER]); + } + if (dragonBones.ObjectDataParser.BONE in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.BONE]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + if (dragonBones.ObjectDataParser.SLOT in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.SLOT]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + this._animation = null; + return animation; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseArray = function (rawData) { + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + if (dragonBones.DragonBones.webAssembly) { + var tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + var tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + var tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + var tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + var intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + var floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + var frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + var frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + var frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + var timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + for (var i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + for (var i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + for (var i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + for (var i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + for (var i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + for (var i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + }; + /** + * @inheritDoc + */ + BinaryDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + var tag = new Uint8Array(rawData, 0, 8); + if (tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0)) { + console.assert(false, "Nonsupport data."); + return null; + } + var headerLength = new Uint32Array(rawData, 8, 1)[0]; + var headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + var headerString = this._decodeUTF8(headerBytes); + var header = JSON.parse(headerString); + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + return _super.prototype.parseDragonBonesData.call(this, header, scale); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + BinaryDataParser.getInstance = function () { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + return BinaryDataParser._binaryDataParserInstance; + }; + /** + * @private + */ + BinaryDataParser._binaryDataParserInstance = null; + return BinaryDataParser; + }(dragonBones.ObjectDataParser)); + dragonBones.BinaryDataParser = BinaryDataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BuildArmaturePackage = (function () { + function BuildArmaturePackage() { + this.dataName = ""; + this.textureAtlasName = ""; + this.skin = null; + } + return BuildArmaturePackage; + }()); + dragonBones.BuildArmaturePackage = BuildArmaturePackage; + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var BaseFactory = (function () { + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + function BaseFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + this.autoSearch = false; + /** + * @private + */ + this._dragonBonesDataMap = {}; + /** + * @private + */ + this._textureAtlasDataMap = {}; + /** + * @private + */ + this._dragonBones = null; + /** + * @private + */ + this._dataParser = null; + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new dragonBones.ObjectDataParser(); + } + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new dragonBones.BinaryDataParser(); + } + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + BaseFactory.prototype._isSupportMesh = function () { + return true; + }; + /** + * @private + */ + BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) { + if (textureAtlasName in this._textureAtlasDataMap) { + for (var _i = 0, _a = this._textureAtlasDataMap[textureAtlasName]; _i < _a.length; _i++) { + var textureAtlasData = _a[_i]; + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + if (this.autoSearch) { + for (var k in this._textureAtlasDataMap) { + for (var _b = 0, _c = this._textureAtlasDataMap[k]; _b < _c.length; _b++) { + var textureAtlasData = _c[_b]; + if (textureAtlasData.autoSearch) { + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + return null; + }; + /** + * @private + */ + BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) { + var dragonBonesData = null; + var armatureData = null; + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { + for (var k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (var k in this._dragonBonesDataMap) { + var skinDragonBonesData = this._dragonBonesDataMap[k]; + var skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + return true; + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype._buildBones = function (dataPackage, armature) { + var bones = dataPackage.armature.sortedBones; + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? bones.size() : bones.length); ++i) { + var boneData = dragonBones.DragonBones.webAssembly ? bones.get(i) : bones[i]; + var bone = dragonBones.DragonBones.webAssembly ? new Module["Bone"]() : dragonBones.BaseObject.borrowObject(dragonBones.Bone); + bone.init(boneData); + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + var constraints = boneData.constraints; + for (var j = 0; j < (dragonBones.DragonBones.webAssembly ? constraints.size() : constraints.length); ++j) { + var constraintData = dragonBones.DragonBones.webAssembly ? constraints.get(j) : constraints[j]; + var target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + // TODO more constraint type. + var ikConstraintData = constraintData; + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraint"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraint); + var root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + }; + /** + * @private + */ + BaseFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var skinSlots = {}; + for (var k in defaultSkin.displays) { + var displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + if (currentSkin !== defaultSkin) { + for (var k in currentSkin.displays) { + var displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + for (var _i = 0, _a = dataPackage.armature.sortedSlots; _i < _a.length; _i++) { + var slotData = _a[_i]; + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Array(); + for (var _b = 0, displays_1 = displays; _b < displays_1.length; _b++) { + var displayData = displays_1[_b]; + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + BaseFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_2 = actions; _i < actions_2.length; _i++) { + var action = actions_2[_i]; + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * @private + */ + BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + for (var i = 0, l = displayList.length; i < l; ++i) { + if (!displayList[i]) { + displayList[i] = null; + } + } + } + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.displayList = displayList; + }; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 1.0; } + var dragonBonesData = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + while (true) { + var textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + return dragonBonesData; + }; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + var textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + return textureAtlasData; + }; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.updateTextureAtlasData = function (name, textureAtlases) { + var textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (var i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + }; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getDragonBonesData = function (name) { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + }; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addDragonBonesData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + this._dragonBonesDataMap[name] = data; + }; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + delete this._dragonBonesDataMap[name]; + } + }; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getTextureAtlasData = function (name) { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + }; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addTextureAtlasData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + var textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + }; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._textureAtlasDataMap) { + var textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (var _i = 0, textureAtlasDataList_1 = textureAtlasDataList; _i < textureAtlasDataList_1.length; _i++) { + var textureAtlasData = textureAtlasDataList_1[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[name]; + } + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.getArmatureData = function (name, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = ""; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + return dataPackage.armature; + }; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.clear = function (disposeData) { + if (disposeData === void 0) { disposeData = true; } + for (var k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + delete this._dragonBonesDataMap[k]; + } + for (var k in this._textureAtlasDataMap) { + if (disposeData) { + var textureAtlasDataList = this._textureAtlasDataMap[k]; + for (var _i = 0, textureAtlasDataList_2 = textureAtlasDataList; _i < textureAtlasDataList_2.length; _i++) { + var textureAtlasData = textureAtlasDataList_2[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[k]; + } + }; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + var armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + return armature; + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + for (var _i = 0, displays_2 = displays; _i < displays_2.length; _i++) { + var display = displays_2[_i]; + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) { + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + var displayIndex = 0; + for (var _i = 0, displays_3 = displays; _i < displays_3.length; _i++) { + var displayData = displays_3[_i]; + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + }; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + for (var _i = 0, _a = armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays[slot.name]; + var displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (var i = 0, l = displays.length; i < l; ++i) { + var displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + slot.displayList = displayList; + } + }; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) { + if (fromSkinName === void 0) { fromSkinName = null; } + if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; } + if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; } + var dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + var fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + var animations = {}; + for (var animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + for (var animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + toArmature.animation.animations = animations; + } + if (dataPackage.skin) { + var slots = toArmature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var toSlot = slots[i]; + var toSlotDisplayList = toSlot.displayList; + for (var j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + var toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof dragonBones.Armature) { + var displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + var fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === 1 /* Armature */) { + this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + return true; + } + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype.getAllDragonBonesData = function () { + return this._dragonBonesDataMap; + }; + /** + * @private + */ + BaseFactory.prototype.getAllTextureAtlasData = function () { + return this._textureAtlasDataMap; + }; + /** + * @private + */ + BaseFactory._objectParser = null; + /** + * @private + */ + BaseFactory._binaryParser = null; + return BaseFactory; + }()); + dragonBones.BaseFactory = BaseFactory; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EgretEvent = (function (_super) { + __extends(EgretEvent, _super); + function EgretEvent() { + return _super !== null && _super.apply(this, arguments) || this; + } + Object.defineProperty(EgretEvent.prototype, "eventObject", { + /** + * 事件对象。 + * @see dragonBones.EventObject + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.data; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "armature", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#armature + */ + get: function () { + return this.eventObject.armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "bone", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#bone + */ + get: function () { + return this.eventObject.bone; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#slot + */ + get: function () { + return this.eventObject.slot; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationState", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + return this.eventObject.animationState; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "animationName", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#animationState + */ + get: function () { + var animationState = this.eventObject.animationState; + return animationState !== null ? animationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "frameLabel", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretEvent.prototype, "sound", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #eventObject + * @see dragonBones.EventObject#name + */ + get: function () { + return this.eventObject.name; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.START + */ + EgretEvent.START = dragonBones.EventObject.START; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.LOOP_COMPLETE + */ + EgretEvent.LOOP_COMPLETE = dragonBones.EventObject.LOOP_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.COMPLETE + */ + EgretEvent.COMPLETE = dragonBones.EventObject.COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN + */ + EgretEvent.FADE_IN = dragonBones.EventObject.FADE_IN; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_IN_COMPLETE + */ + EgretEvent.FADE_IN_COMPLETE = dragonBones.EventObject.FADE_IN_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT + */ + EgretEvent.FADE_OUT = dragonBones.EventObject.FADE_OUT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FADE_OUT_COMPLETE + */ + EgretEvent.FADE_OUT_COMPLETE = dragonBones.EventObject.FADE_OUT_COMPLETE; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND_EVENT = dragonBones.EventObject.SOUND_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.ANIMATION_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.BONE_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.FRAME_EVENT + */ + EgretEvent.MOVEMENT_FRAME_EVENT = dragonBones.EventObject.FRAME_EVENT; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.EventObject.SOUND_EVENT + */ + EgretEvent.SOUND = dragonBones.EventObject.SOUND_EVENT; + return EgretEvent; + }(egret.Event)); + dragonBones.EgretEvent = EgretEvent; + /** + * @inheritDoc + */ + var EgretArmatureDisplay = (function (_super) { + __extends(EgretArmatureDisplay, _super); + function EgretArmatureDisplay() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._disposeProxy = false; + _this._armature = null; // + _this._debugDrawer = null; + return _this; + } + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.init = function (armature) { + this._armature = armature; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.clear = function () { + this._disposeProxy = false; + this._armature = null; + this._debugDrawer = null; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.dispose = function (disposeProxy) { + if (disposeProxy === void 0) { disposeProxy = true; } + this._disposeProxy = disposeProxy; + if (this._armature !== null) { + this._armature.dispose(); + this._armature = null; + } + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.debugUpdate = function (isEnabled) { + isEnabled; + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype._dispatchEvent = function (type, eventObject) { + var event = egret.Event.create(EgretEvent, type); + event.data = eventObject; + _super.prototype.dispatchEvent.call(this, event); + egret.Event.release(event); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.hasEvent = function (type) { + return this.hasEventListener(type); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.addEvent = function (type, listener, target) { + this.addEventListener(type, listener, target); + }; + /** + * @inheritDoc + */ + EgretArmatureDisplay.prototype.removeEvent = function (type, listener, target) { + this.removeEventListener(type, listener, target); + }; + Object.defineProperty(EgretArmatureDisplay.prototype, "armature", { + /** + * @inheritDoc + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretArmatureDisplay.prototype, "animation", { + /** + * @inheritDoc + */ + get: function () { + return this._armature.animation; + }, + enumerable: true, + configurable: true + }); + return EgretArmatureDisplay; + }(egret.DisplayObjectContainer)); + dragonBones.EgretArmatureDisplay = EgretArmatureDisplay; + function createEgretDisplay(display, type) { + var egretDisplayWrapper = new Module["EgretDisplayWASM"](); // TODO 是否可以将 EgretDisplayWASM 改为 EgretDisplayWrapper + var wasmId; + if (display === null) { + wasmId = -1; + egretDisplayWrapper.setDisplayInfo(wasmId, type); + } + else if (type === 1 /* Armature */) { + wasmId = display.getEgretArmatureId(); + egretDisplayWrapper.setDisplayInfo(wasmId, type); + egretDisplayWrapper.setArmature(display); + } + else { + wasmId = display.$waNode.id; + egretDisplayWrapper.setDisplayInfo(wasmId, type); + } + egretDisplayWrapper._display = display; + return egretDisplayWrapper; + } + dragonBones.createEgretDisplay = createEgretDisplay; + function egretWASMInit() { + /** + * @private + * 扩展 c++ EgretArmatureProxy。(在 js 中构造) + */ + dragonBones.EgretArmatureProxy = Module["EgretArmatureDisplayWASM"].extend("EgretArmatureProxy", { + __construct: function (display) { + this.__parent.__construct.call(this); + this._display = display; + }, + __destruct: function () { + this.__parent.__destruct.call(this); + this._display = null; + }, + clear: function () { + if (this._display) { + this._display.clear(); + } + this._display = null; + }, + debugUpdate: function (isEnabled) { + this._display.debugUpdate(isEnabled); + }, + //extend c++ + _dispatchEvent: function (type, eventObject) { + this._display._dispatchEvent(type, eventObject); + }, + //extend c++ + hasEvent: function (type) { + return this._display.hasEventListener(type); + }, + dispose: function (disposeProxy) { + // TODO lsc + disposeProxy; + // return this._display.dispose(disposeProxy); + }, + addEvent: function (type, listener, target) { + this._display.addEvent(type, listener, target); + }, + removeEvent: function (type, listener, target) { + this._display.removeEvent(type, listener, target); + } + }); + /** + * @private + */ + dragonBones.EgretSlot = Module["EgretSlotWASM"].extend("EgretSlotWrapper", { + __construct: function () { + this.__parent.__construct.call(this); + this._rawDisplay = null; + this._meshDisplay = null; + this._rawDisplayWASM = null; + this._meshDisplayWASM = null; + }, + __destruct: function () { + this.__parent.__destruct.call(this); + this._rawDisplay = null; + this._meshDisplay = null; + }, + init: function (slotData, displayDatas, rawDisplay, meshDisplay) { + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._rawDisplayWASM = createEgretDisplay(this._rawDisplay, 0 /* Image */); + this._meshDisplayWASM = createEgretDisplay(this._meshDisplay, 2 /* Mesh */); + this.__parent.init.call(this, slotData, displayDatas, this._rawDisplayWASM, this._meshDisplayWASM); + }, + getRawDisplay: function () { + return this._rawDisplay; + }, + getMeshDisplay: function () { + return this._meshDisplay; + }, + getRawWASMDisplay: function () { + return this._rawDisplayWASM; + }, + getMeshWASMDisplay: function () { + return this._meshDisplayWASM; + }, + // extend c++ function + getDisplay: function () { + var displayWrapper = this.__parent.getEgretDisplay.call(this); + if (displayWrapper !== null) { + return displayWrapper._display; + } + return null; + }, + setDisplay: function (value) { + if (value === this._rawDisplay || value === this._meshDisplay) { + return; + } + if (value === null || value instanceof egret.Bitmap) { + this.__parent.setEgretDisplay.call(this, createEgretDisplay(value, 0 /* Image */)); + } + else if (value instanceof egret.Mesh) { + this.__parent.setEgretDisplay.call(this, createEgretDisplay(value, 2 /* Mesh */)); + } + else if (value instanceof Module["EgretArmature"]) { + this.__parent.setChildArmature.call(this, value); + } + } + }); + Object.defineProperty(dragonBones.EgretSlot.prototype, "displayList", { + get: dragonBones.EgretSlot.prototype.getEgretDisplayList, + set: dragonBones.EgretSlot.prototype.setEgretDisplayList, + enumerable: true, + configurable: true + }); + Object.defineProperty(dragonBones.EgretSlot.prototype, "rawDisplay", { + get: dragonBones.EgretSlot.prototype.getRawDisplay, + enumerable: true, + configurable: true + }); + Object.defineProperty(dragonBones.EgretSlot.prototype, "meshDisplay", { + get: dragonBones.EgretSlot.prototype.getMeshDisplay, + enumerable: true, + configurable: true + }); + Object.defineProperty(dragonBones.EgretSlot.prototype, "display", { + get: dragonBones.EgretSlot.prototype.getDisplay, + set: dragonBones.EgretSlot.prototype.setDisplay, + enumerable: true, + configurable: true + }); + dragonBones.EgretTextureAtlasData = Module["EgretTextureAtlasDataWASM"].extend("EgretTextureAtlasData", { + __construct: function (rawTextures) { + this.__parent.__construct.call(this); + this._textureNames = []; + this._texture = null; + if (rawTextures) { + for (var _i = 0, rawTextures_1 = rawTextures; _i < rawTextures_1.length; _i++) { + var texture = rawTextures_1[_i]; + this._textureNames.push(texture.name); + } + } + }, + __destruct: function () { + this.__parent.__destruct.call(this); + this._textureNames.length = 0; + this._texture = null; + } + }); + Object.defineProperty(dragonBones.EgretTextureAtlasData.prototype, "renderTexture", { + get: function () { + return this._texture; + }, + set: function (value) { + if (this._texture === value) { + return; + } + if (value["textureId"] === null || value["textureId"] === undefined) { + egret.WebAssemblyNode.setValuesToBitmapData(value); + } + this._texture = value; + var textures = this.textures; + if (this._texture !== null) { + var bitmapData = this._texture.bitmapData; + var textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + var textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + for (var _i = 0, _a = this._textureNames; _i < _a.length; _i++) { + var k = _a[_i]; + for (var i = 0, l = k.length; i < l; ++i) { + if (k.charCodeAt(i) > 255) { + k = encodeURI(k); + break; + } + } + var textureData = textures.get(k); + var subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + var subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + if (!textureData.renderTexture) { + var currTex = new egret.Texture(); + currTex._bitmapData = bitmapData; + if (textureData.rotated) { + currTex.$initData(textureData.region.x, textureData.region.y, subTextureHeight, subTextureWidth, 0, 0, subTextureHeight, subTextureWidth, textureAtlasWidth, textureAtlasHeight); + } + else { + currTex.$initData(textureData.region.x, textureData.region.y, subTextureWidth, subTextureHeight, 0, 0, subTextureWidth, subTextureHeight, textureAtlasWidth, textureAtlasHeight); + } + // Egret 5.0 + egret.WebAssemblyNode.setValuesToBitmapData(currTex); + textureData.setTextureId(currTex["textureId"]); + textureData.renderTexture = currTex; + } + } + } + else { + for (var _b = 0, _c = this._textureNames; _b < _c.length; _b++) { + var k = _c[_b]; + var textureData = textures.get(k); + textureData.renderTexture = null; + } + } + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + dragonBones.EgretTextureData = Module["EgretTextureDataWASM"].extend("EgretTextureData", { + __construct: function () { + this.__parent.__construct.call(this); + this._renderTexture = null; + }, + __destruct: function () { + this.__parent.__destruct.call(this); + this._renderTexture = null; + } + }); + Object.defineProperty(dragonBones.EgretTextureData.prototype, "renderTexture", { + get: function () { + return this._renderTexture; + }, + set: function (value) { + if (this._renderTexture === value) { + return; + } + this._renderTexture = value; + }, + enumerable: true, + configurable: true + }); + /* + * @private + * 扩展 c++ WorldClock。(在 c++ 中构造) + */ + dragonBones.WorldClock = Module["WorldClock"]; + dragonBones.WorldClock.prototype._c_contains = dragonBones.WorldClock.prototype.contains; + dragonBones.WorldClock.prototype._c_add = dragonBones.WorldClock.prototype.add; + dragonBones.WorldClock.prototype._c_remove = dragonBones.WorldClock.prototype.remove; + dragonBones.WorldClock.prototype.contains = function (value) { + if (value instanceof dragonBones.Armature) { + return this._c_contains(value.getAnimatable()); + } + return this._c_contains(value); + }; + dragonBones.WorldClock.prototype.add = function (value) { + if (value instanceof dragonBones.Armature) { + return this._c_add(value.getAnimatable()); + } + return this._c_add(value); + }; + dragonBones.WorldClock.prototype.remove = function (value) { + if (value instanceof dragonBones.Armature) { + return this._c_remove(value.getAnimatable()); + } + return this._c_remove(value); + }; + /** + * @private + * 扩展 c++ EgretArmature。(在 js 中构造) + */ + dragonBones.Armature = Module["EgretArmature"]; + dragonBones.Armature.prototype._c_addBone = dragonBones.Armature.prototype.addBone; + dragonBones.Armature.prototype._c_invalidUpdate = dragonBones.Armature.prototype.invalidUpdate; + dragonBones.Armature.prototype.addBone = function (bone, name) { + if (name === null || name === undefined) { + name = ""; + } + return this._c_addBone(bone, name); + }; + dragonBones.Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName === null) { + boneName = ""; + } + return this._c_invalidUpdate(boneName, updateSlotDisplay); + }; + dragonBones.Armature.prototype.getDisplay = function () { + return this.proxy._display; + }; + Object.defineProperty(dragonBones.Armature.prototype, "display", { + get: function () { + return this.proxy._display; + }, + enumerable: true, + configurable: true + }); + /** + * @private + * 扩展 c++ Animation + */ + dragonBones.Animation = Module["Animation"]; + dragonBones.Animation.prototype._c_play = dragonBones.Animation.prototype.play; + dragonBones.Animation.prototype._c_fadeIn = dragonBones.Animation.prototype.fadeIn; + dragonBones.Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + if (animationName === null) { + animationName = ""; + } + return this._c_play(animationName, playTimes); + }; + dragonBones.Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (animationName === null) { + animationName = ""; + } + if (group === null) { + group = ""; + } + return this._c_fadeIn(animationName, fadeInTime, playTimes, layer, group, fadeOutMode); + }; + } + dragonBones.egretWASMInit = egretWASMInit; + var configTables = { + ActionData: { + getter: [], + setter: ["type", "bone", "slot", "data"] + }, + DragonBonesData: { + getter: ["frameIndices"], + setter: [], + array: ["armatureNames"] + }, + ArmatureData: { + getter: ["defaultActions", "actions"], + setter: ["aabb", "defaultAnimation", "defaultSkin", "parent"], + array: ["animationNames"] + }, + BoneData: { + getter: ["transform", "constraints"], + setter: ["parent"] + }, + SlotData: { + getter: [], + setter: ["blendMode", "color", "parent"], + static: ["DEFAULT_COLOR"] + }, + ConstraintData: { + getter: [], + setter: ["target", "root", "bone"] + }, + DisplayData: { + getter: ["transform"], + setter: ["type", "parent"] + }, + ImageDisplayData: { + getter: ["pivot"], + setter: ["texture"] + }, + ArmatureDisplayData: { + getter: ["actions"], + setter: [] // armature + }, + MeshDisplayData: { + getter: [], + setter: ["weight"] + }, + WeightData: { + getter: ["bones"], + setter: [] + }, + AnimationData: { + getter: [], + setter: ["actionTimeline", "zOrderTimeline", "parent"] + }, + TimelineData: { + getter: [], + setter: ["type"] + }, + AnimationConfig: { + getter: [], + setter: ["fadeOutMode", "fadeOutTweenType", "fadeInTweenType"] + }, + TextureData: { + getter: ["region"], + setter: ["frame"] + }, + TransformObject: { + getter: ["globalTransformMatrix", "global", "offset", "origin"], + setter: [] + }, + Armature: { + getter: ["armatureData", "animation", "proxy", "eventDispatcher"], + setter: ["clock"] + }, + Slot: { + getter: ["boundingBoxData"], + setter: ["displayIndex", "childArmature"] + }, + Constraint: { + getter: [], + setter: ["target", "bone", "root"] + }, + Animation: { + getter: ["animationConfig"], + setter: [], + array: ["animationNames"] + }, + WorldClock: { + getter: [], + setter: ["clock"], + static: ["clock"] + }, + EventObject: { + getter: ["armature", "bone", "slot", "animationState", "data"], + setter: [] + }, + EgretArmatureDisplayWASM: { + getter: ["armature", "animation"], + setter: [] + }, + DragonBones: { + getter: ["clock"], + setter: [] + } + }; + function descGetter(funcName, target) { + return { + get: target["_c_get_" + funcName], + enumerable: true, + configurable: true + }; + } + function descSetter(funcName, target) { + return { + get: target["_c_get_" + funcName], + set: target["_c_set_" + funcName], + enumerable: true, + configurable: true + }; + } + function descArrayGetter(funcName, target) { + target; + return { + get: function () { + var array = this["_js_" + funcName]; + if (!array) { + array = []; + var vector = this["_c_get_" + funcName](); + for (var i = 0, l = vector.size(); i < l; ++i) { + array[i] = vector.get(i); + } + } + return array; + }, + enumerable: true, + configurable: true + }; + } + function registerGetterSetter() { + for (var fieldKey in configTables) { + var getterClass = Module[fieldKey]; + var getterClassProto = Module[fieldKey].prototype; + var getterArray = configTables[fieldKey].getter; + var setterArray = configTables[fieldKey].setter; + var staticArray = configTables[fieldKey].static; + var arrayArray = configTables[fieldKey].array; + if (getterArray) { + for (var _i = 0, getterArray_1 = getterArray; _i < getterArray_1.length; _i++) { + var fieldName = getterArray_1[_i]; + Object.defineProperty(getterClassProto, fieldName, descGetter(fieldName, getterClassProto)); + } + } + if (setterArray) { + for (var _a = 0, setterArray_1 = setterArray; _a < setterArray_1.length; _a++) { + var fieldName = setterArray_1[_a]; + Object.defineProperty(getterClassProto, fieldName, descSetter(fieldName, getterClassProto)); + } + } + if (staticArray) { + for (var _b = 0, staticArray_1 = staticArray; _b < staticArray_1.length; _b++) { + var fieldName = staticArray_1[_b]; + Object.defineProperty(getterClass, fieldName, descSetter(fieldName, getterClass)); + } + } + if (arrayArray) { + for (var _c = 0, arrayArray_1 = arrayArray; _c < arrayArray_1.length; _c++) { + var fieldName = arrayArray_1[_c]; + Object.defineProperty(getterClassProto, fieldName, descArrayGetter(fieldName, getterClass)); + } + } + } + } + dragonBones.registerGetterSetter = registerGetterSetter; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var EgretFactory = (function (_super) { + __extends(EgretFactory, _super); + /** + * @inheritDoc + */ + function EgretFactory() { + var _this = _super.call(this) || this; + /** + * @private + */ + _this._rawTextures = null; + if (EgretFactory._dragonBones === null) { + dragonBones.DragonBones.webAssembly = true; + var eventDisplay = new dragonBones.EgretArmatureDisplay(); + EgretFactory._eventManager = eventDisplay; + EgretFactory._dragonBones = new Module["DragonBones"](); + EgretFactory._dragonBones.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + return _this; + } + EgretFactory._clockHandler = function (time) { + var dbcore = EgretFactory._dragonBones; + // + var objects = dbcore.getObjects(); + for (var i = 0, l = objects.size(); i < l; ++i) { + objects.get(i).returnToPool(); + } + objects.resize(0, null); + // + time *= 0.001; + var passedTime = time - EgretFactory._time; + dbcore.clock.advanceTime(passedTime); + EgretFactory._time = time; + // + var events = dbcore.getEvents(); + for (var i = 0, l = events.size(); i < l; ++i) { + var eventObject = events.get(i); + var armature = eventObject.armature; + var type = eventObject.type; + if (armature === null || armature.display === null || armature.display === undefined) { + console.log("armature display error!"); + } + armature.display._dispatchEvent(type, eventObject); + if (type === dragonBones.EventObject.SOUND_EVENT) { + EgretFactory._eventManager._dispatchEvent(eventObject.type, eventObject); + } + eventObject.returnToPool(); + } + events.resize(0, null); + return false; + }; + Object.defineProperty(EgretFactory, "clock", { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + return EgretFactory._dragonBones.clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretFactory, "factory", { + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + get: function () { + if (EgretFactory._factory === null) { + dragonBones.registerGetterSetter(); + dragonBones.egretWASMInit(); + EgretFactory._factory = new EgretFactory(); + } + return EgretFactory._factory; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + EgretFactory.prototype._isSupportMesh = function () { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + return false; + }; + /** + * @private + */ + EgretFactory.prototype._buildTextureAtlasData = function (textureAtlasData, textureAtlas) { + if (textureAtlasData !== null) { + if (textureAtlas["textureId"] === null) { + egret.WebAssemblyNode.setValuesToBitmapData(textureAtlas); + } + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = new dragonBones.EgretTextureAtlasData(this._rawTextures); + } + return textureAtlasData; + }; + /** + * @private + */ + EgretFactory.prototype._buildArmature = function (dataPackage) { + var armature = new Module['EgretArmature'](); + var armatureDisplay = new dragonBones.EgretArmatureDisplay(); + var armatureProxy = new dragonBones.EgretArmatureProxy(armatureDisplay); + var displayID = armatureDisplay.$waNode.id; + armature.init(dataPackage.armature, armatureProxy, displayID, EgretFactory._dragonBones); + armatureDisplay.init(armature); + return armature; + }; + /** + * @private + */ + EgretFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var currentSkinSlotNames = currentSkin.getSkinSlotNames(); + var defaultSkinSlotNames = defaultSkin.getSkinSlotNames(); + var skinSlots = {}; + // for (let k in defaultSkin.displays) { + for (var i = 0, l = defaultSkinSlotNames.size(); i < l; ++i) { + var slotName = defaultSkinSlotNames.get(i); + var displays = defaultSkin.getDisplays(slotName); + if (displays !== null) { + skinSlots[slotName] = displays; + } + } + if (currentSkin !== defaultSkin) { + // for (let k in currentSkin.displays) { + for (var i = 0, l = currentSkinSlotNames.size(); i < l; ++i) { + var slotName = currentSkinSlotNames.get(i); + var displays = currentSkin.getDisplays(slotName); + if (displays !== null) { + skinSlots[slotName] = displays; + } + } + } + // for (const slotData of dataPackage.armature.sortedSlots) { + var slots = dataPackage.armature.sortedSlots; + for (var i = 0, l = slots.size(); i < l; ++i) { + var slotData = slots.get(i); + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Module["EgretSlotDisplayVector"](); + for (var i_3 = 0, l_1 = displays.size(); i_3 < l_1; ++i_3) { + var displayData = displays.get(i_3); + if (displayData !== null) { + var display = this._getSlotDisplay(dataPackage, displayData, null, slot); + if (display === null) { + var displayWrapper = dragonBones.createEgretDisplay(display, 0 /* Image */); + displayList.push_back(displayWrapper); + } + else if (display.getDisplayType() === 1 /* Armature */) { + var displayWrapper = dragonBones.createEgretDisplay(display, 1 /* Armature */); + displayList.push_back(displayWrapper); + } + else { + displayList.push_back(display); + } + } + else { + var displayWrapper = dragonBones.createEgretDisplay(null, 0 /* Image */); + displayList.push_back(displayWrapper); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setEgretDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + EgretFactory.prototype._buildSlot = function (dataPackage, slotData, displays, armature) { + dataPackage; + armature; + var slot = new dragonBones.EgretSlot(); + slot.init(slotData, displays, new egret.Bitmap(), new egret.Mesh()); + return slot; + }; + /** + * @private + */ + EgretFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + this._rawTextures = rawData ? rawData.SubTexture : null; + return _super.prototype.parseTextureAtlasData.call(this, rawData, textureAtlas, name, scale); + }; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + EgretFactory.prototype.buildArmatureDisplay = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + EgretFactory.clock.add(armature); + return armature.display; + } + return null; + }; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + EgretFactory.prototype.getTextureDisplay = function (textureName, textureAtlasName) { + if (textureAtlasName === void 0) { textureAtlasName = null; } + var textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName); + if (textureData !== null && textureData.texture === null) { + return new egret.Bitmap(textureData.texture); + } + return null; + }; + /* + * @private + */ + EgretFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.getMeshWASMDisplay(); + } + else { + display = slot.getRawWASMDisplay(); + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.getMeshWASMDisplay(); + } + else { + display = slot.getRawWASMDisplay(); + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_3 = actions; _i < actions_3.length; _i++) { + var action = actions_3[_i]; + childArmature.animation.fadeIn(action.name); // TODO action should be do after advanceTime. + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * public + */ + EgretFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + // for (const slot of armature.getSlots()) { + var slots = armature.getSlots(); + for (var i = 0, l = slots.size(); i < l; ++i) { + var slot = slots.get(i); + if ((exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays.get(slot.name); + if (displays === null || displays === undefined) { + continue; + } + var displayList = slot.getEgretDisplayList(); // Copy. + if (displayList === null || displayList === undefined) { + console.log("Slot does not has displayList" + slot.name); + continue; + } + var datalen = displays.size(); + displayList.resize(datalen, null); // Modify displayList length. + for (var i_4 = 0, l_2 = displays.size(); i_4 < l_2; ++i_4) { + var currData = displays.get(i_4); + var currSlot = this._getSlotDisplay(null, currData, null, slot); + if (currSlot.getDisplayType() == 1 /* Armature */) { + var displayWrapper = dragonBones.createEgretDisplay(currSlot, 1 /* Armature */); + displayList.set(i_4, displayWrapper); + } + else { + displayList.set(i_4, currSlot); + } + } + slot.switchDisplayData(displays); + //TODO + // slot.displayList = displayList; + slot.setEgretDisplayList(displayList); + } + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EgretFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + // for (const display of displays) { + for (var i = 0, l = displays.size(); i < l; ++i) { + var display = displays.get(i); + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * @private + */ + EgretFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.getEgretDisplayList(); // Copy. + if (displayList.size() <= displayIndex) { + displayList.resize(displayIndex + 1, null); + } + slot.replaceDisplayData(displayData, displayIndex); + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.setEgretDisplayList(displayList); + }; + Object.defineProperty(EgretFactory.prototype, "soundEventManager", { + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return EgretFactory._eventManager; + }, + enumerable: true, + configurable: true + }); + EgretFactory._time = 0; + EgretFactory._dragonBones = null; + EgretFactory._factory = null; + return EgretFactory; + }(dragonBones.BaseFactory)); + dragonBones.EgretFactory = EgretFactory; +})(dragonBones || (dragonBones = {})); diff --git a/reference/Egret/wasm/out/dragonBones-wasm.min.js b/reference/Egret/wasm/out/dragonBones-wasm.min.js new file mode 100644 index 0000000..63b1ff3 --- /dev/null +++ b/reference/Egret/wasm/out/dragonBones-wasm.min.js @@ -0,0 +1 @@ +"use strict";var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)if(e.hasOwnProperty(i))t[i]=e[i]};return function(e,i){t(e,i);function a(){this.constructor=e}e.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)}}();var dragonBones;(function(t){var e=function(){function e(e){this._clock=new t.WorldClock;this._events=[];this._objects=[];this._eventManager=null;this._eventManager=e}e.prototype.advanceTime=function(e){if(this._objects.length>0){for(var i=0,a=this._objects;i0){for(var n=0;ni){r.length=i}t._maxCountMap[a]=i}else{t._defaultMaxCount=i;for(var a in t._poolsMap){if(a in t._maxCountMap){continue}var r=t._poolsMap[a];if(r.length>i){r.length=i}t._maxCountMap[a]=i}}};t.clearPool=function(e){if(e===void 0){e=null}if(e!==null){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){a.length=0}}else{for(var r in t._poolsMap){var a=t._poolsMap[r];a.length=0}}};t.borrowObject=function(e){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){var r=a.pop();r._isInPool=false;return r}var n=new e;n._onClear();return n};t.prototype.returnToPool=function(){this._onClear();t._returnObject(this)};t._hashCode=0;t._defaultMaxCount=1e3;t._maxCountMap={};t._poolsMap={};return t}();t.BaseObject=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=1}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}this.a=t;this.b=e;this.c=i;this.d=a;this.tx=r;this.ty=n}t.prototype.toString=function(){return"[object dragonBones.Matrix] a:"+this.a+" b:"+this.b+" c:"+this.c+" d:"+this.d+" tx:"+this.tx+" ty:"+this.ty};t.prototype.copyFrom=function(t){this.a=t.a;this.b=t.b;this.c=t.c;this.d=t.d;this.tx=t.tx;this.ty=t.ty;return this};t.prototype.copyFromArray=function(t,e){if(e===void 0){e=0}this.a=t[e];this.b=t[e+1];this.c=t[e+2];this.d=t[e+3];this.tx=t[e+4];this.ty=t[e+5];return this};t.prototype.identity=function(){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this};t.prototype.concat=function(t){var e=this.a*t.a;var i=0;var a=0;var r=this.d*t.d;var n=this.tx*t.a+t.tx;var s=this.ty*t.d+t.ty;if(this.b!==0||this.c!==0){e+=this.b*t.c;i+=this.b*t.d;a+=this.c*t.a;r+=this.c*t.b}if(t.b!==0||t.c!==0){i+=this.a*t.b;a+=this.d*t.c;n+=this.ty*t.c;s+=this.tx*t.b}this.a=e;this.b=i;this.c=a;this.d=r;this.tx=n;this.ty=s;return this};t.prototype.invert=function(){var t=this.a;var e=this.b;var i=this.c;var a=this.d;var r=this.tx;var n=this.ty;if(e===0&&i===0){this.b=this.c=0;if(t===0||a===0){this.a=this.b=this.tx=this.ty=0}else{t=this.a=1/t;a=this.d=1/a;this.tx=-t*r;this.ty=-a*n}return this}var s=t*a-e*i;if(s===0){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this}s=1/s;var o=this.a=a*s;e=this.b=-e*s;i=this.c=-i*s;a=this.d=t*s;this.tx=-(o*r+i*n);this.ty=-(e*r+a*n);return this};t.prototype.transformPoint=function(t,e,i,a){if(a===void 0){a=false}i.x=this.a*t+this.c*e;i.y=this.b*t+this.d*e;if(!a){i.x+=this.tx;i.y+=this.ty}};return t}();t.Matrix=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}if(r===void 0){r=1}if(n===void 0){n=1}this.x=t;this.y=e;this.skew=i;this.rotation=a;this.scaleX=r;this.scaleY=n}t.normalizeRadian=function(t){t=(t+Math.PI)%(Math.PI*2);t+=t>0?-Math.PI:Math.PI;return t};t.prototype.toString=function(){return"[object dragonBones.Transform] x:"+this.x+" y:"+this.y+" skewX:"+this.skew*180/Math.PI+" skewY:"+this.rotation*180/Math.PI+" scaleX:"+this.scaleX+" scaleY:"+this.scaleY};t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.skew=t.skew;this.rotation=t.rotation;this.scaleX=t.scaleX;this.scaleY=t.scaleY;return this};t.prototype.identity=function(){this.x=this.y=0;this.skew=this.rotation=0;this.scaleX=this.scaleY=1;return this};t.prototype.add=function(t){this.x+=t.x;this.y+=t.y;this.skew+=t.skew;this.rotation+=t.rotation;this.scaleX*=t.scaleX;this.scaleY*=t.scaleY;return this};t.prototype.minus=function(t){this.x-=t.x;this.y-=t.y;this.skew-=t.skew;this.rotation-=t.rotation;this.scaleX/=t.scaleX;this.scaleY/=t.scaleY;return this};t.prototype.fromMatrix=function(e){var i=this.scaleX,a=this.scaleY;var r=t.PI_Q;this.x=e.tx;this.y=e.ty;this.rotation=Math.atan(e.b/e.a);var n=Math.atan(-e.c/e.d);this.scaleX=this.rotation>-r&&this.rotation-r&&n=0&&this.scaleX<0){this.scaleX=-this.scaleX;this.rotation=this.rotation-Math.PI}if(a>=0&&this.scaleY<0){this.scaleY=-this.scaleY;n=n-Math.PI}this.skew=n-this.rotation;return this};t.prototype.toMatrix=function(t){if(this.skew!==0||this.rotation!==0){t.a=Math.cos(this.rotation);t.b=Math.sin(this.rotation);if(this.skew===0){t.c=-t.b;t.d=t.a}else{t.c=-Math.sin(this.skew+this.rotation);t.d=Math.cos(this.skew+this.rotation)}if(this.scaleX!==1){t.a*=this.scaleX;t.b*=this.scaleX}if(this.scaleY!==1){t.c*=this.scaleY;t.d*=this.scaleY}}else{t.a=this.scaleX;t.b=0;t.c=0;t.d=this.scaleY}t.tx=this.x;t.ty=this.y;return this};t.PI_D=Math.PI*2;t.PI_H=Math.PI/2;t.PI_Q=Math.PI/4;t.RAD_DEG=180/Math.PI;t.DEG_RAD=Math.PI/180;return t}();t.Transform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n,s,o){if(t===void 0){t=1}if(e===void 0){e=1}if(i===void 0){i=1}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}if(s===void 0){s=0}if(o===void 0){o=0}this.alphaMultiplier=t;this.redMultiplier=e;this.greenMultiplier=i;this.blueMultiplier=a;this.alphaOffset=r;this.redOffset=n;this.greenOffset=s;this.blueOffset=o}t.prototype.copyFrom=function(t){this.alphaMultiplier=t.alphaMultiplier;this.redMultiplier=t.redMultiplier;this.greenMultiplier=t.greenMultiplier;this.blueMultiplier=t.blueMultiplier;this.alphaOffset=t.alphaOffset;this.redOffset=t.redOffset;this.greenOffset=t.greenOffset;this.blueOffset=t.blueOffset};t.prototype.identity=function(){this.alphaMultiplier=this.redMultiplier=this.greenMultiplier=this.blueMultiplier=1;this.alphaOffset=this.redOffset=this.greenOffset=this.blueOffset=0};return t}();t.ColorTransform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e){if(t===void 0){t=0}if(e===void 0){e=0}this.x=t;this.y=e}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y};t.prototype.clear=function(){this.x=this.y=0};return t}();t.Point=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}this.x=t;this.y=e;this.width=i;this.height=a}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.width=t.width;this.height=t.height};t.prototype.clear=function(){this.x=this.y=0;this.width=this.height=0};return t}();t.Rectangle=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.ints=[];e.floats=[];e.strings=[];return e}e.toString=function(){return"[class dragonBones.UserData]"};e.prototype._onClear=function(){this.ints.length=0;this.floats.length=0;this.strings.length=0};e.prototype.getInt=function(t){if(t===void 0){t=0}return t>=0&&t=0&&t=0&&t=t){i=0}if(this.sortedBones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s0){return}this.cacheFrameRate=t;for(var e in this.animations){this.animations[e].cacheFrames(this.cacheFrameRate)}};i.prototype.setCacheFrame=function(t,e){var i=this.parent.cachedFrames;var a=i.length;i.length+=10;i[a]=t.a;i[a+1]=t.b;i[a+2]=t.c;i[a+3]=t.d;i[a+4]=t.tx;i[a+5]=t.ty;i[a+6]=e.rotation;i[a+7]=e.skew;i[a+8]=e.scaleX;i[a+9]=e.scaleY;return a};i.prototype.getCacheFrame=function(t,e,i){var a=this.parent.cachedFrames;t.a=a[i];t.b=a[i+1];t.c=a[i+2];t.d=a[i+3];t.tx=a[i+4];t.ty=a[i+5];e.rotation=a[i+6];e.skew=a[i+7];e.scaleX=a[i+8];e.scaleY=a[i+9];e.x=t.tx;e.y=t.ty};i.prototype.addBone=function(t){if(t.name in this.bones){console.warn("Replace bone: "+t.name);this.bones[t.name].returnToPool()}this.bones[t.name]=t;this.sortedBones.push(t)};i.prototype.addSlot=function(t){if(t.name in this.slots){console.warn("Replace slot: "+t.name);this.slots[t.name].returnToPool()}this.slots[t.name]=t;this.sortedSlots.push(t)};i.prototype.addSkin=function(t){if(t.name in this.skins){console.warn("Replace skin: "+t.name);this.skins[t.name].returnToPool()}this.skins[t.name]=t;if(this.defaultSkin===null){this.defaultSkin=t}};i.prototype.addAnimation=function(t){if(t.name in this.animations){console.warn("Replace animation: "+t.name);this.animations[t.name].returnToPool()}t.parent=this;this.animations[t.name]=t;this.animationNames.push(t.name);if(this.defaultAnimation===null){this.defaultAnimation=t}};i.prototype.getBone=function(t){return t in this.bones?this.bones[t]:null};i.prototype.getSlot=function(t){return t in this.slots?this.slots[t]:null};i.prototype.getSkin=function(t){return t in this.skins?this.skins[t]:null};i.prototype.getAnimation=function(t){return t in this.animations?this.animations[t]:null};return i}(t.BaseObject);t.ArmatureData=i;var a=function(e){__extends(i,e);function i(){var i=e!==null&&e.apply(this,arguments)||this;i.transform=new t.Transform;i.constraints=[];i.userData=null;return i}i.toString=function(){return"[class dragonBones.BoneData]"};i.prototype._onClear=function(){for(var t=0,e=this.constraints;tr){s|=2}if(en){s|=8}return s};e.rectangleIntersectsSegment=function(t,i,a,r,n,s,o,l,h,u,f){if(h===void 0){h=null}if(u===void 0){u=null}if(f===void 0){f=null}var _=t>n&&ts&&in&&as&&r=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){return true}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=this.width*.5;var h=this.height*.5;var u=e.rectangleIntersectsSegment(t,i,a,r,-l,-h,l,h,n,s,o);return u};return e}(e);t.RectangleBoundingBoxData=i;var a=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.EllipseData]"};e.ellipseIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h,u){if(l===void 0){l=null}if(h===void 0){h=null}if(u===void 0){u=null}var f=s/o;var _=f*f;e*=f;a*=f;var m=i-t;var p=a-e;var c=Math.sqrt(m*m+p*p);var d=m/c;var y=p/c;var g=(r-t)*d+(n-e)*y;var v=g*g;var b=t*t+e*e;var D=s*s;var T=D-b+v;var A=0;if(T>=0){var O=Math.sqrt(T);var S=g-O;var x=g+O;var B=S<0?-1:S<=c?0:1;var E=x<0?-1:x<=c?0:1;var M=B*E;if(M<0){return-1}else if(M===0){if(B===-1){A=2;i=t+x*d;a=(e+x*y)/f;if(l!==null){l.x=i;l.y=a}if(h!==null){h.x=i;h.y=a}if(u!==null){u.x=Math.atan2(a/D*_,i/D);u.y=u.x+Math.PI}}else if(E===1){A=1;t=t+S*d;e=(e+S*y)/f;if(l!==null){l.x=t;l.y=e}if(h!==null){h.x=t;h.y=e}if(u!==null){u.x=Math.atan2(e/D*_,t/D);u.y=u.x+Math.PI}}else{A=3;if(l!==null){l.x=t+S*d;l.y=(e+S*y)/f;if(u!==null){u.x=Math.atan2(l.y/D*_,l.x/D)}}if(h!==null){h.x=t+x*d;h.y=(e+x*y)/f;if(u!==null){u.y=Math.atan2(h.y/D*_,h.x/D)}}}}}return A};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.type=1};e.prototype.containsPoint=function(t,e){var i=this.width*.5;if(t>=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){e*=i/a;return Math.sqrt(t*t+e*e)<=i}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=e.ellipseIntersectsSegment(t,i,a,r,0,0,this.width*.5,this.height*.5,n,s,o);return l};return e}(e);t.EllipseBoundingBoxData=a;var r=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.weight=null;return e}e.toString=function(){return"[class dragonBones.PolygonBoundingBoxData]"};e.polygonIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h){if(o===void 0){o=null}if(l===void 0){l=null}if(h===void 0){h=null}if(t===i){t=i+1e-6}if(e===a){e=a+1e-6}var u=t-i;var f=e-a;var _=t*a-e*i;var m=0;var p=r[n+s-2];var c=r[n+s-1];var d=0;var y=0;var g=0;var v=0;var b=0;var D=0;for(var T=0;T=p&&M<=A||M>=A&&M<=p)&&(u===0||M>=t&&M<=i||M>=i&&M<=t)){var w=(_*x-f*B)/E;if((w>=c&&w<=O||w>=O&&w<=c)&&(f===0||w>=e&&w<=a||w>=a&&w<=e)){if(l!==null){var P=M-t;if(P<0){P=-P}if(m===0){d=P;y=P;g=M;v=w;b=M;D=w;if(h!==null){h.x=Math.atan2(O-c,A-p)-Math.PI*.5;h.y=h.x}}else{if(Py){y=P;b=M;D=w;if(h!==null){h.y=Math.atan2(O-c,A-p)-Math.PI*.5}}}m++}else{g=M;v=w;b=M;D=w;m++;if(h!==null){h.x=Math.atan2(O-c,A-p)-Math.PI*.5;h.y=h.x}break}}}p=A;c=O}if(m===1){if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=g;l.y=v}if(h!==null){h.y=h.x+Math.PI}}else if(m>1){m++;if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=b;l.y=D}}return m};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.weight!==null){this.weight.returnToPool()}this.type=2;this.count=0;this.offset=0;this.x=0;this.y=0;this.vertices=null;this.weight=null};e.prototype.containsPoint=function(t,e){var i=false;if(t>=this.x&&t<=this.width&&e>=this.y&&e<=this.height){for(var a=0,r=this.count,n=r-2;a=e||s=e){var l=this.vertices[this.offset+n];var h=this.vertices[this.offset+a];if((e-o)*(l-h)/(s-o)+h0){return}this.cacheFrameRate=Math.max(Math.ceil(t*this.scale),1);var e=Math.ceil(this.cacheFrameRate*this.duration)+1;this.cachedFrames.length=e;for(var i=0,a=this.cacheFrames.length;i=0};e.prototype.addBoneMask=function(t,e,i){if(i===void 0){i=true}var a=t.getBone(e);if(a===null){return}if(this.boneMask.indexOf(e)<0){this.boneMask.push(e)}if(i){for(var r=0,n=t.getBones();r=0){this.boneMask.splice(a,1)}if(i){var r=t.getBone(e);if(r!==null){if(this.boneMask.length>0){for(var n=0,s=t.getBones();n=0&&r.contains(o)){this.boneMask.splice(l,1)}}}else{for(var h=0,u=t.getBones();he._zOrder?1:-1};i.prototype._onClear=function(){if(this._clock!==null){this._clock.remove(this)}for(var t=0,e=this._bones;t=t){i=0}if(this._bones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s=n){continue}var o=i[s];var l=this.getSlot(o.name);if(l!==null){l._setZorder(r)}}this._slotsDirty=true;this._zOrderDirty=!a}};i.prototype._addBoneToBoneList=function(t){if(this._bones.indexOf(t)<0){this._bonesDirty=true;this._bones.push(t);this._animation._timelineDirty=true}};i.prototype._removeBoneFromBoneList=function(t){var e=this._bones.indexOf(t);if(e>=0){this._bones.splice(e,1);this._animation._timelineDirty=true}};i.prototype._addSlotToSlotList=function(t){if(this._slots.indexOf(t)<0){this._slotsDirty=true;this._slots.push(t);this._animation._timelineDirty=true}};i.prototype._removeSlotFromSlotList=function(t){var e=this._slots.indexOf(t);if(e>=0){this._slots.splice(e,1);this._animation._timelineDirty=true}};i.prototype._bufferAction=function(t,e){if(this._actions.indexOf(t)<0){if(e){this._actions.push(t)}else{this._actions.unshift(t)}}};i.prototype.dispose=function(){if(this.armatureData!==null){this._lockUpdate=true;this._dragonBones.bufferObject(this)}};i.prototype.init=function(e,i,a,r){if(this.armatureData!==null){return}this.armatureData=e;this._animation=t.BaseObject.borrowObject(t.Animation);this._proxy=i;this._display=a;this._dragonBones=r;this._proxy.init(this);this._animation.init(this);this._animation.animations=this.armatureData.animations};i.prototype.advanceTime=function(e){if(this._lockUpdate){return}if(this.armatureData===null){console.assert(false,"The armature has been disposed.");return}else if(this.armatureData.parent===null){console.assert(false,"The armature data has been disposed.");return}var i=this._cacheFrameIndex;this._animation.advanceTime(e);if(this._bonesDirty){this._bonesDirty=false;this._sortBones()}if(this._slotsDirty){this._slotsDirty=false;this._sortSlots()}if(this._cacheFrameIndex<0||this._cacheFrameIndex!==i){var a=0,r=0;for(a=0,r=this._bones.length;a0){this._lockUpdate=true;for(var n=0,s=this._actions;n0){var i=this.getBone(t);if(i!==null){i.invalidUpdate();if(e){for(var a=0,r=this._slots;a0){if(r!==null||n!==null){if(r!==null){var T=o?r.y-e:r.x-t;if(T<0){T=-T}if(d===null||Th){h=T;_=n.x;m=n.y;y=b;if(s!==null){c=s.y}}}}else{d=b;break}}}if(d!==null&&r!==null){r.x=u;r.y=f;if(s!==null){s.x=p}}if(y!==null&&n!==null){n.x=_;n.y=m;if(s!==null){s.y=c}}return d};i.prototype.getBone=function(t){for(var e=0,i=this._bones;e=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else{if(this.constraints.length>0){for(var i=0,a=this.constraints;i=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}}else{if(this.constraints.length>0){for(var n=0,s=this.constraints;n=0;if(this._localDirty){this._updateGlobalTransformMatrix(o)}if(o&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}}else if(this._childrenTransformDirty){this._childrenTransformDirty=false}this._localDirty=true};i.prototype.updateByConstraint=function(){if(this._localDirty){this._localDirty=false;if(this._transformDirty||this._parent!==null&&this._parent._childrenTransformDirty){this._updateGlobalTransformMatrix(true)}this._transformDirty=true}};i.prototype.addConstraint=function(t){if(this.constraints.indexOf(t)<0){this.constraints.push(t)}};i.prototype.invalidUpdate=function(){this._transformDirty=true};i.prototype.contains=function(t){if(t===this){return false}var e=t;while(e!==this&&e!==null){e=e.parent}return e===this};i.prototype.getBones=function(){this._bones.length=0;for(var t=0,e=this._armature.getBones();t=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex0){for(var o=0,l=n;o0){if(this._displayList.length!==e.length){this._displayList.length=e.length}for(var i=0,a=e.length;i0){this._displayList.length=0}if(this._displayIndex>=0&&this._displayIndex=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else if(this._transformDirty||this._parent._childrenTransformDirty){this._transformDirty=true;this._cachedFrameIndex=-1}else if(this._cachedFrameIndex>=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}else if(this._transformDirty||this._parent._childrenTransformDirty){t=-1;this._transformDirty=true;this._cachedFrameIndex=-1}if(this._display===null){return}if(this._blendModeDirty){this._blendModeDirty=false;this._updateBlendMode()}if(this._colorDirty){this._colorDirty=false;this._updateColor()}if(this._meshData!==null&&this._display===this._meshDisplay){var i=this._meshData.weight!==null;if(this._meshDirty||i&&this._isMeshBonesUpdate()){this._meshDirty=false;this._updateMesh()}if(i){if(this._transformDirty){this._transformDirty=false;this._updateTransform(true)}return}}if(this._transformDirty){this._transformDirty=false;if(this._cachedFrameIndex<0){var a=t>=0;this._updateGlobalTransformMatrix(a);if(a&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}this._updateTransform(false)}};i.prototype.updateTransformAndMatrix=function(){if(this._transformDirty){this._transformDirty=false;this._updateGlobalTransformMatrix(false)}};i.prototype.containsPoint=function(t,e){if(this._boundingBoxData===null){return false}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);return this._boundingBoxData.containsPoint(i._helpPoint.x,i._helpPoint.y)};i.prototype.intersectsSegment=function(t,e,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}if(this._boundingBoxData===null){return 0}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);t=i._helpPoint.x;e=i._helpPoint.y;i._helpMatrix.transformPoint(a,r,i._helpPoint);a=i._helpPoint.x;r=i._helpPoint.y;var l=this._boundingBoxData.intersectsSegment(t,e,a,r,n,s,o);if(l>0){if(l===1||l===2){if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n);if(s!==null){s.x=n.x;s.y=n.y}}else if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}else{if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n)}if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}if(o!==null){this.globalTransformMatrix.transformPoint(Math.cos(o.x),Math.sin(o.x),i._helpPoint,true);o.x=Math.atan2(i._helpPoint.y,i._helpPoint.x);this.globalTransformMatrix.transformPoint(Math.cos(o.y),Math.sin(o.y),i._helpPoint,true);o.y=Math.atan2(i._helpPoint.y,i._helpPoint.x)}}return l};i.prototype.invalidUpdate=function(){this._displayDirty=true;this._transformDirty=true};Object.defineProperty(i.prototype,"displayIndex",{get:function(){return this._displayIndex},set:function(t){if(this._setDisplayIndex(t)){this.update(-1)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"displayList",{get:function(){return this._displayList.concat()},set:function(e){var i=this._displayList.concat();var a=new Array;if(this._setDisplayList(e)){this.update(-1)}for(var r=0,n=i;r0){this._animatebles[e-i]=r;this._animatebles[e]=null}r.advanceTime(t)}else{i++}}if(i>0){a=this._animatebles.length;for(;e=0};t.prototype.add=function(t){if(this._animatebles.indexOf(t)<0){this._animatebles.push(t);t.clock=this}};t.prototype.remove=function(t){var e=this._animatebles.indexOf(t);if(e>=0){this._animatebles[e]=null;t.clock=null}};t.prototype.clear=function(){for(var t=0,e=this._animatebles;t0&&i._subFadeState>0){this._armature._dragonBones.bufferObject(i);this._animationStates.length=0;this._lastAnimationState=null}else{var a=i.animationData;var r=a.cacheFrameRate;if(this._animationDirty&&r>0){this._animationDirty=false;for(var n=0,s=this._armature.getBones();n1){for(var f=0,_=0;f0&&i._subFadeState>0){_++;this._armature._dragonBones.bufferObject(i);this._animationDirty=true;if(this._lastAnimationState===i){this._lastAnimationState=null}}else{if(_>0){this._animationStates[f-_]=i}if(this._timelineDirty){i.updateTimelines()}i.advanceTime(t,0)}if(f===e-1&&_>0){this._animationStates.length-=_;if(this._lastAnimationState===null&&this._animationStates.length>0){this._lastAnimationState=this._animationStates[this._animationStates.length-1]}}}this._armature._cacheFrameIndex=-1}else{this._armature._cacheFrameIndex=-1}this._timelineDirty=false};i.prototype.reset=function(){for(var t=0,e=this._animationStates;t1){if(e.position<0){e.position%=a.duration;e.position=a.duration-e.position}else if(e.position===a.duration){e.position-=1e-6}else if(e.position>a.duration){e.position%=a.duration}if(e.duration>0&&e.position+e.duration>a.duration){e.duration=a.duration-e.position}if(e.playTimes<0){e.playTimes=a.playTimes}}else{e.playTimes=1;e.position=0;if(e.duration>0){e.duration=0}}if(e.duration===0){e.duration=-1}this._fadeOut(e);var o=t.BaseObject.borrowObject(t.AnimationState);o.init(this._armature,a,e);this._animationDirty=true;this._armature._cacheFrameIndex=-1;if(this._animationStates.length>0){var l=false;for(var h=0,u=this._animationStates.length;h=this._animationStates[h].layer){}else{l=true;this._animationStates.splice(h+1,0,o);break}}if(!l){this._animationStates.push(o)}}else{this._animationStates.push(o)}for(var f=0,_=this._armature.getSlots();f<_.length;f++){var m=_[f];var p=m.childArmature;if(p!==null&&p.inheritAnimation&&p.animation.hasAnimation(i)&&p.animation.getState(i)===null){p.animation.fadeIn(i)}}if(e.fadeInTime<=0){this._armature.advanceTime(0)}this._lastAnimationState=o;return o};i.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t!==null?t:"";if(t!==null&&t.length>0){this.playConfig(this._animationConfig)}else if(this._lastAnimationState===null){var i=this._armature.armatureData.defaultAnimation;if(i!==null){this._animationConfig.animation=i.name;this.playConfig(this._animationConfig)}}else if(!this._lastAnimationState.isPlaying&&!this._lastAnimationState.isCompleted){this._lastAnimationState.play()}else{this._animationConfig.animation=this._lastAnimationState.name;this.playConfig(this._animationConfig)}return this._lastAnimationState};i.prototype.fadeIn=function(t,e,i,a,r,n){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=0}if(r===void 0){r=null}if(n===void 0){n=3}this._animationConfig.clear();this._animationConfig.fadeOutMode=n;this._animationConfig.playTimes=i;this._animationConfig.layer=a;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=r!==null?r:"";return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByTime=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.position=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByFrame=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*e/a.frameCount}return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByProgress=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*(e>0?e:0)}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStopByTime=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByTime(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByFrame=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByFrame(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByProgress=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByProgress(t,e,1);if(i!==null){i.stop()}return i};i.prototype.getState=function(t){var e=this._animationStates.length;while(e--){var i=this._animationStates[e];if(i.name===t){return i}}return null};i.prototype.hasAnimation=function(t){return t in this._animations};i.prototype.getStates=function(){return this._animationStates};Object.defineProperty(i.prototype,"isPlaying",{get:function(){for(var t=0,e=this._animationStates;t0},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationName",{get:function(){return this._lastAnimationState!==null?this._lastAnimationState.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationNames",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animations",{get:function(){return this._animations},set:function(t){if(this._animations===t){return}this._animationNames.length=0;for(var e in this._animations){delete this._animations[e]}for(var e in t){this._animations[e]=t[e];this._animationNames.push(e)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationConfig",{get:function(){this._animationConfig.clear();return this._animationConfig},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationState",{get:function(){return this._lastAnimationState},enumerable:true,configurable:true});i.prototype.gotoAndPlay=function(t,e,i,a,r,n,s,o,l){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=-1}if(r===void 0){r=0}if(n===void 0){n=null}if(s===void 0){s=3}if(o===void 0){o=true}if(l===void 0){l=true}o;l;this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.fadeOutMode=s;this._animationConfig.playTimes=a;this._animationConfig.layer=r;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=n!==null?n:"";var h=this._animations[t];if(h&&i>0){this._animationConfig.timeScale=h.duration/i}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStop=function(t,e){if(e===void 0){e=0}return this.gotoAndStopByTime(t,e)};Object.defineProperty(i.prototype,"animationList",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationDataList",{get:function(){var t=[];for(var e=0,i=this._animationNames.length;e0;if(this._subFadeState<0){this._subFadeState=0;var a=i?t.EventObject.FADE_OUT:t.EventObject.FADE_IN;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}if(e<0){e=-e}this._fadeTime+=e;if(this._fadeTime>=this.fadeTotalTime){this._subFadeState=1;this._fadeProgress=i?0:1}else if(this._fadeTime>0){this._fadeProgress=i?1-this._fadeTime/this.fadeTotalTime:this._fadeTime/this.fadeTotalTime}else{this._fadeProgress=i?1:0}if(this._subFadeState>0){if(!i){this._playheadState|=1;this._fadeState=0}var a=i?t.EventObject.FADE_OUT_COMPLETE:t.EventObject.FADE_IN_COMPLETE;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}};a.prototype._blendBoneTimline=function(t){var e=t.bone;var i=t.bonePose.result;var a=e.animationPose;var r=this._weightResult>0?this._weightResult:-this._weightResult;if(!e._blendDirty){e._blendDirty=true;e._blendLayer=this.layer;e._blendLayerWeight=r;e._blendLeftWeight=1;a.x=i.x*r;a.y=i.y*r;a.rotation=i.rotation*r;a.skew=i.skew*r;a.scaleX=(i.scaleX-1)*r+1;a.scaleY=(i.scaleY-1)*r+1}else{r*=e._blendLeftWeight;e._blendLayerWeight+=r;a.x+=i.x*r;a.y+=i.y*r;a.rotation+=i.rotation*r;a.skew+=i.skew*r;a.scaleX+=(i.scaleX-1)*r;a.scaleY+=(i.scaleY-1)*r}if(this._fadeState!==0||this._subFadeState!==0){e._transformDirty=true}};a.prototype.init=function(e,i,a){if(this._armature!==null){return}this._armature=e;this.animationData=i;this.resetToPose=a.resetToPose;this.additiveBlending=a.additiveBlending;this.displayControl=a.displayControl;this.actionEnabled=a.actionEnabled;this.layer=a.layer;this.playTimes=a.playTimes;this.timeScale=a.timeScale;this.fadeTotalTime=a.fadeInTime;this.autoFadeOutTime=a.autoFadeOutTime;this.weight=a.weight;this.name=a.name.length>0?a.name:a.animation;this.group=a.group;if(a.pauseFadeIn){this._playheadState=2}else{this._playheadState=3}if(a.duration<0){this._position=0;this._duration=this.animationData.duration;if(a.position!==0){if(this.timeScale>=0){this._time=a.position}else{this._time=a.position-this._duration}}else{this._time=0}}else{this._position=a.position;this._duration=a.duration;this._time=0}if(this.timeScale<0&&this._time===0){this._time=-1e-6}if(this.fadeTotalTime<=0){this._fadeProgress=.999999}if(a.boneMask.length>0){this._boneMask.length=a.boneMask.length;for(var r=0,n=this._boneMask.length;r0;var a=true;var r=true;var n=this._time;this._weightResult=this.weight*this._fadeProgress;this._actionTimeline.update(n);if(i){var s=e*2;this._actionTimeline.currentTime=Math.floor(this._actionTimeline.currentTime*s)/s}if(this._zOrderTimeline!==null){this._zOrderTimeline.update(n)}if(i){var o=Math.floor(this._actionTimeline.currentTime*e);if(this._armature._cacheFrameIndex===o){a=false;r=false}else{this._armature._cacheFrameIndex=o;if(this.animationData.cachedFrames[o]){r=false}else{this.animationData.cachedFrames[o]=true}}}if(a){if(r){var l=null;var h=null;for(var u=0,f=this._boneTimelines.length;u0){if(l._blendLayer!==this.layer){if(l._blendLayerWeight>=l._blendLeftWeight){l._blendLeftWeight=0;l=null}else{l._blendLayer=this.layer;l._blendLeftWeight-=l._blendLayerWeight;l._blendLayerWeight=0}}}else{l=null}}}l=_.bone}if(l!==null){_.update(n);if(u===f-1){this._blendBoneTimline(_)}else{h=_}}}}for(var u=0,f=this._slotTimelines.length;u0){this._subFadeState=0}if(this._actionTimeline.playState>0){if(this.autoFadeOutTime>=0){this.fadeOut(this.autoFadeOutTime)}}}};a.prototype.play=function(){this._playheadState=3};a.prototype.stop=function(){this._playheadState&=1};a.prototype.fadeOut=function(t,e){if(e===void 0){e=true}if(t<0){t=0}if(e){this._playheadState&=2}if(this._fadeState>0){if(t>this.fadeTotalTime-this._fadeTime){return}}else{this._fadeState=1;this._subFadeState=-1;if(t<=0||this._fadeProgress<=0){this._fadeProgress=1e-6}for(var i=0,a=this._boneTimelines;i1e-6?t/this._fadeProgress:0;this._fadeTime=this.fadeTotalTime*(1-this._fadeProgress)};a.prototype.containsBoneMask=function(t){return this._boneMask.length===0||this._boneMask.indexOf(t)>=0};a.prototype.addBoneMask=function(t,e){if(e===void 0){e=true}var i=this._armature.getBone(t);if(i===null){return}if(this._boneMask.indexOf(t)<0){this._boneMask.push(t)}if(e){for(var a=0,r=this._armature.getBones();a=0){this._boneMask.splice(i,1)}if(e){var a=this._armature.getBone(t);if(a!==null){var r=this._armature.getBones();if(this._boneMask.length>0){for(var n=0,s=r;n=0&&a.contains(o)){this._boneMask.splice(l,1)}}}else{for(var h=0,u=r;h0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isFadeComplete",{get:function(){return this._fadeState===0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isPlaying",{get:function(){return(this._playheadState&2)!==0&&this._actionTimeline.playState<=0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isCompleted",{get:function(){return this._actionTimeline.playState>0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentPlayTimes",{get:function(){return this._actionTimeline.currentPlayTimes},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"totalTime",{get:function(){return this._duration},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentTime",{get:function(){return this._actionTimeline.currentTime},set:function(t){var e=this._actionTimeline.currentPlayTimes-(this._actionTimeline.playState>0?1:0);if(t<0||this._duration0&&e===this.playTimes-1&&t===this._duration){t=this._duration-1e-6}if(this._time===t){return}this._time=t;this._actionTimeline.setCurrentTime(this._time);if(this._zOrderTimeline!==null){this._zOrderTimeline.playState=-1}for(var i=0,a=this._boneTimelines;i=0?1:-1;this.currentPlayTimes=1;this.currentTime=this._actionTimeline.currentTime}else if(this._actionTimeline===null||this._timeScale!==1||this._timeOffset!==0){var r=this._animationState.playTimes;var n=r*this._duration;t*=this._timeScale;if(this._timeOffset!==0){t+=this._timeOffset*this._animationData.duration}if(r>0&&(t>=n||t<=-n)){if(this.playState<=0&&this._animationState._playheadState===3){this.playState=1}this.currentPlayTimes=r;if(t<0){this.currentTime=0}else{this.currentTime=this._duration}}else{if(this.playState!==0&&this._animationState._playheadState===3){this.playState=0}if(t<0){t=-t;this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=this._duration-t%this._duration}else{this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=t%this._duration}}this.currentTime+=this._position}else{this.playState=this._actionTimeline.playState;this.currentPlayTimes=this._actionTimeline.currentPlayTimes;this.currentTime=this._actionTimeline.currentTime}if(this.currentPlayTimes===i&&this.currentTime===a){return false}if(e<0&&this.playState!==e||this.playState<=0&&this.currentPlayTimes!==i){this._frameIndex=-1}return true};e.prototype.init=function(t,e,i){this._armature=t;this._animationState=e;this._timelineData=i;this._actionTimeline=this._animationState._actionTimeline;if(this===this._actionTimeline){this._actionTimeline=null}this._frameRate=this._armature.armatureData.frameRate;this._frameRateR=1/this._frameRate;this._position=this._animationState._position;this._duration=this._animationState._duration;this._dragonBonesData=this._armature.armatureData.parent;this._animationData=this._animationState.animationData;if(this._timelineData!==null){this._frameIntArray=this._dragonBonesData.frameIntArray;this._frameFloatArray=this._dragonBonesData.frameFloatArray;this._frameArray=this._dragonBonesData.frameArray;this._timelineArray=this._dragonBonesData.timelineArray;this._frameIndices=this._dragonBonesData.frameIndices;this._frameCount=this._timelineArray[this._timelineData.offset+2];this._frameValueOffset=this._timelineArray[this._timelineData.offset+4];this._timeScale=100/this._timelineArray[this._timelineData.offset+0];this._timeOffset=this._timelineArray[this._timelineData.offset+1]*.01}};e.prototype.fadeOut=function(){};e.prototype.update=function(t){if(this.playState<=0&&this._setCurrentTime(t)){if(this._frameCount>1){var e=Math.floor(this.currentTime*this._frameRate);var i=this._frameIndices[this._timelineData.frameIndicesOffset+e];if(this._frameIndex!==i){this._frameIndex=i;this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5+this._frameIndex];this._onArriveAtFrame()}}else if(this._frameIndex<0){this._frameIndex=0;if(this._timelineData!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5]}this._onArriveAtFrame()}if(this._tweenState!==0){this._onUpdateFrame()}}};return e}(t.BaseObject);t.TimelineState=e;var i=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e._getEasingValue=function(t,e,i){var a=e;switch(t){case 3:a=Math.pow(e,2);break;case 4:a=1-Math.pow(1-e,2);break;case 5:a=.5*(1-Math.cos(e*Math.PI));break}return(a-e)*i+e};e._getEasingCurveValue=function(t,e,i,a){if(t<=0){return 0}else if(t>=1){return 1}var r=i+1;var n=Math.floor(t*r);var s=n===0?0:e[a+n-1];var o=n===r-1?1e4:e[a+n];return(s+(o-s)*(t*r-n))*1e-4};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._tweenType=0;this._curveCount=0;this._framePosition=0;this._frameDurationR=0;this._tweenProgress=0;this._tweenEasing=0};e.prototype._onArriveAtFrame=function(){if(this._frameCount>1&&(this._frameIndex!==this._frameCount-1||this._animationState.playTimes===0||this._animationState.currentPlayTimes0){if(n.hasEvent(t.EventObject.COMPLETE)){h=t.BaseObject.borrowObject(t.EventObject);h.type=t.EventObject.COMPLETE;h.armature=this._armature;h.animationState=this._animationState}}}if(this._frameCount>1){var u=this._timelineData;var f=Math.floor(this.currentTime*this._frameRate);var _=this._frameIndices[u.frameIndicesOffset+f];if(this._frameIndex!==_){var m=this._frameIndex;this._frameIndex=_;if(this._timelineArray!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[u.offset+5+this._frameIndex];if(o){if(m<0){var p=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+p];if(this.currentPlayTimes===a){if(m===_){m=-1}}}while(m>=0){var c=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[c]/this._frameRate;if(this._position<=d&&d<=this._position+this._duration){this._onCrossFrame(m)}if(l!==null&&m===0){this._armature._dragonBones.bufferEvent(l);l=null}if(m>0){m--}else{m=this._frameCount-1}if(m===_){break}}}else{if(m<0){var p=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+p];var c=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[c]/this._frameRate;if(this.currentPlayTimes===a){if(r<=d){if(m>0){m--}else{m=this._frameCount-1}}else if(m===_){m=-1}}}while(m>=0){if(m=0){var t=this._frameArray[this._frameOffset+1];if(t>0){this._armature._sortZOrder(this._frameArray,this._frameOffset+2)}else{this._armature._sortZOrder(null,0)}}};e.prototype._onUpdateFrame=function(){};return e}(t.TimelineState);t.ZOrderTimelineState=i;var a=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.toString=function(){return"[class dragonBones.BoneAllTimelineState]"};i.prototype._onArriveAtFrame=function(){e.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var t=this._dragonBonesData.frameFloatArray;var i=this.bonePose.current;var a=this.bonePose.delta;var r=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*6;i.x=t[r++];i.y=t[r++];i.rotation=t[r++];i.skew=t[r++];i.scaleX=t[r++];i.scaleY=t[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}a.x=t[r++]-i.x;a.y=t[r++]-i.y;a.rotation=t[r++]-i.rotation;a.skew=t[r++]-i.skew;a.scaleX=t[r++]-i.scaleX;a.scaleY=t[r++]-i.scaleY}}else{var i=this.bonePose.current;i.x=0;i.y=0;i.rotation=0;i.skew=0;i.scaleX=1;i.scaleY=1}};i.prototype._onUpdateFrame=function(){e.prototype._onUpdateFrame.call(this);var t=this.bonePose.current;var i=this.bonePose.delta;var a=this.bonePose.result;this.bone._transformDirty=true;if(this._tweenState!==2){this._tweenState=0}var r=this._armature.armatureData.scale;a.x=(t.x+i.x*this._tweenProgress)*r;a.y=(t.y+i.y*this._tweenProgress)*r;a.rotation=t.rotation+i.rotation*this._tweenProgress;a.skew=t.skew+i.skew*this._tweenProgress;a.scaleX=t.scaleX+i.scaleX*this._tweenProgress;a.scaleY=t.scaleY+i.scaleY*this._tweenProgress};i.prototype.fadeOut=function(){var e=this.bonePose.result;e.rotation=t.Transform.normalizeRadian(e.rotation);e.skew=t.Transform.normalizeRadian(e.skew)};return i}(t.BoneTimelineState);t.BoneAllTimelineState=a;var r=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.SlotDislayIndexTimelineState]"};e.prototype._onArriveAtFrame=function(){if(this.playState>=0){var t=this._timelineData!==null?this._frameArray[this._frameOffset+1]:this.slot.slotData.displayIndex;if(this.slot.displayIndex!==t){this.slot._setDisplayIndex(t,true)}}};return e}(t.SlotTimelineState);t.SlotDislayIndexTimelineState=r;var n=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[0,0,0,0,0,0,0,0];e._delta=[0,0,0,0,0,0,0,0];e._result=[0,0,0,0,0,0,0,0];return e}e.toString=function(){return"[class dragonBones.SlotColorTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._dirty=false};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._dragonBonesData.intArray;var i=this._dragonBonesData.frameIntArray;var a=this._animationData.frameIntOffset+this._frameValueOffset+this._frameIndex*1;var r=i[a];this._current[0]=e[r++];this._current[1]=e[r++];this._current[2]=e[r++];this._current[3]=e[r++];this._current[4]=e[r++];this._current[5]=e[r++];this._current[6]=e[r++];this._current[7]=e[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=i[this._animationData.frameIntOffset+this._frameValueOffset]}else{r=i[a+1*1]}this._delta[0]=e[r++]-this._current[0];this._delta[1]=e[r++]-this._current[1];this._delta[2]=e[r++]-this._current[2];this._delta[3]=e[r++]-this._current[3];this._delta[4]=e[r++]-this._current[4];this._delta[5]=e[r++]-this._current[5];this._delta[6]=e[r++]-this._current[6];this._delta[7]=e[r++]-this._current[7]}}else{var n=this.slot.slotData.color;this._current[0]=n.alphaMultiplier*100;this._current[1]=n.redMultiplier*100;this._current[2]=n.greenMultiplier*100;this._current[3]=n.blueMultiplier*100;this._current[4]=n.alphaOffset;this._current[5]=n.redOffset;this._current[6]=n.greenOffset;this._current[7]=n.blueOffset}};e.prototype._onUpdateFrame=function(){t.prototype._onUpdateFrame.call(this);this._dirty=true;if(this._tweenState!==2){this._tweenState=0}this._result[0]=(this._current[0]+this._delta[0]*this._tweenProgress)*.01;this._result[1]=(this._current[1]+this._delta[1]*this._tweenProgress)*.01;this._result[2]=(this._current[2]+this._delta[2]*this._tweenProgress)*.01;this._result[3]=(this._current[3]+this._delta[3]*this._tweenProgress)*.01;this._result[4]=this._current[4]+this._delta[4]*this._tweenProgress;this._result[5]=this._current[5]+this._delta[5]*this._tweenProgress;this._result[6]=this._current[6]+this._delta[6]*this._tweenProgress;this._result[7]=this._current[7]+this._delta[7]*this._tweenProgress};e.prototype.fadeOut=function(){this._tweenState=0;this._dirty=false};e.prototype.update=function(e){t.prototype.update.call(this,e);if(this._tweenState!==0||this._dirty){var i=this.slot._colorTransform;if(this._animationState._fadeState!==0||this._animationState._subFadeState!==0){if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){var a=Math.pow(this._animationState._fadeProgress,4);i.alphaMultiplier+=(this._result[0]-i.alphaMultiplier)*a;i.redMultiplier+=(this._result[1]-i.redMultiplier)*a;i.greenMultiplier+=(this._result[2]-i.greenMultiplier)*a;i.blueMultiplier+=(this._result[3]-i.blueMultiplier)*a;i.alphaOffset+=(this._result[4]-i.alphaOffset)*a;i.redOffset+=(this._result[5]-i.redOffset)*a;i.greenOffset+=(this._result[6]-i.greenOffset)*a;i.blueOffset+=(this._result[7]-i.blueOffset)*a;this.slot._colorDirty=true}}else if(this._dirty){this._dirty=false;if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){i.alphaMultiplier=this._result[0];i.redMultiplier=this._result[1];i.greenMultiplier=this._result[2];i.blueMultiplier=this._result[3];i.alphaOffset=this._result[4];i.redOffset=this._result[5];i.greenOffset=this._result[6];i.blueOffset=this._result[7];this.slot._colorDirty=true}}}};return e}(t.SlotTimelineState);t.SlotColorTimelineState=n;var s=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[];e._delta=[];e._result=[];return e}e.toString=function(){return"[class dragonBones.SlotFFDTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.meshOffset=0;this._dirty=false;this._frameFloatOffset=0;this._valueCount=0;this._ffdCount=0;this._valueOffset=0;this._current.length=0;this._delta.length=0;this._result.length=0};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._tweenState===2;var i=this._dragonBonesData.frameFloatArray;var a=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*this._valueCount;if(e){var r=a+this._valueCount;if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}for(var n=0;n255){return encodeURI(r)}}}return r}return String(r)}return a};a.prototype._getCurvePoint=function(t,e,i,a,r,n,s,o,l,h){var u=1-l;var f=u*u;var _=l*l;var m=u*f;var p=3*l*f;var c=3*u*_;var d=l*_;h.x=m*t+p*i+c*r+d*s;h.y=m*e+p*a+c*n+d*o};a.prototype._samplingEasingCurve=function(t,e){var i=t.length;var a=-2;for(var r=0,n=e.length;r=0&&a+61e-4){var g=(y+d)*.5;this._getCurvePoint(l,h,u,f,_,m,p,c,g,this._helpPoint);if(s-this._helpPoint.x>0){d=g}else{y=g}}e[r]=this._helpPoint.y}};a.prototype._sortActionFrame=function(t,e){return t.frameStart>e.frameStart?1:-1};a.prototype._parseActionDataInFrame=function(t,e,i,r){if(a.EVENT in t){this._mergeActionFrame(t[a.EVENT],e,10,i,r)}if(a.SOUND in t){this._mergeActionFrame(t[a.SOUND],e,11,i,r)}if(a.ACTION in t){this._mergeActionFrame(t[a.ACTION],e,0,i,r)}if(a.EVENTS in t){this._mergeActionFrame(t[a.EVENTS],e,10,i,r)}if(a.ACTIONS in t){this._mergeActionFrame(t[a.ACTIONS],e,0,i,r)}};a.prototype._mergeActionFrame=function(e,a,r,n,s){var o=t.DragonBones.webAssembly?this._armature.actions.size():this._armature.actions.length;var l=this._parseActionData(e,this._armature.actions,r,n,s);var h=null;if(this._actionFrames.length===0){h=new i;h.frameStart=0;this._actionFrames.push(h);h=null}for(var u=0,f=this._actionFrames;u0){var p=r.getBone(_);if(p!==null){m.parent=p}else{(this._cacheBones[_]=this._cacheBones[_]||[]).push(m)}}if(m.name in this._cacheBones){for(var c=0,d=this._cacheBones[m.name];c0){n.root=i.parent}if(t.DragonBones.webAssembly){i.constraints.push_back(n)}else{i.constraints.push(n)}};a.prototype._parseSlot=function(e){var i=t.DragonBones.webAssembly?new Module["SlotData"]:t.BaseObject.borrowObject(t.SlotData);i.displayIndex=a._getNumber(e,a.DISPLAY_INDEX,0);i.zOrder=t.DragonBones.webAssembly?this._armature.sortedSlots.size():this._armature.sortedSlots.length;i.name=a._getString(e,a.NAME,"");i.parent=this._armature.getBone(a._getString(e,a.PARENT,""));if(a.BLEND_MODE in e&&typeof e[a.BLEND_MODE]==="string"){i.blendMode=a._getBlendMode(e[a.BLEND_MODE])}else{i.blendMode=a._getNumber(e,a.BLEND_MODE,0)}if(a.COLOR in e){i.color=t.DragonBones.webAssembly?Module["SlotData"].createColor():t.SlotData.createColor();this._parseColorTransform(e[a.COLOR],i.color)}else{i.color=t.DragonBones.webAssembly?Module["SlotData"].DEFAULT_COLOR:t.SlotData.DEFAULT_COLOR}if(a.ACTIONS in e){var r=this._slotChildActions[i.name]=[];this._parseActionData(e[a.ACTIONS],r,0,null,null)}return i};a.prototype._parseSkin=function(e){var i=t.DragonBones.webAssembly?new Module["SkinData"]:t.BaseObject.borrowObject(t.SkinData);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length===0){i.name=a.DEFAULT_NAME}if(a.SLOT in e){this._skin=i;var r=e[a.SLOT];for(var n=0,s=r;n0?n:r;this._parsePivot(e,o);break;case 1:var l=i=t.DragonBones.webAssembly?new Module["ArmatureDisplayData"]:t.BaseObject.borrowObject(t.ArmatureDisplayData);l.name=r;l.path=n.length>0?n:r;l.inheritAnimation=true;if(a.ACTIONS in e){this._parseActionData(e[a.ACTIONS],l.actions,0,null,null)}else if(this._slot.name in this._slotChildActions){var h=this._skin.getDisplays(this._slot.name);if(h===null?this._slot.displayIndex===0:this._slot.displayIndex===h.length){for(var u=0,f=this._slotChildActions[this._slot.name];u0?n:r;m.inheritAnimation=a._getBoolean(e,a.INHERIT_FFD,true);this._parsePivot(e,m);var p=a._getString(e,a.SHARE,"");if(p.length>0){var c=this._meshs[p];m.offset=c.offset;m.weight=c.weight}else{this._parseMesh(e,m);this._meshs[m.name]=m}break;case 3:var d=this._parseBoundingBox(e);if(d!==null){var y=i=t.DragonBones.webAssembly?new Module["BoundingBoxDisplayData"]:t.BaseObject.borrowObject(t.BoundingBoxDisplayData);y.name=r;y.path=n.length>0?n:r;y.boundingBox=d}break}if(i!==null){i.parent=this._armature;if(a.TRANSFORM in e){this._parseTransform(e[a.TRANSFORM],i.transform,this._armature.scale)}}return i};a.prototype._parsePivot=function(t,e){if(a.PIVOT in t){var i=t[a.PIVOT];e.pivot.x=a._getNumber(i,a.X,0);e.pivot.y=a._getNumber(i,a.Y,0)}else{e.pivot.x=.5;e.pivot.y=.5}};a.prototype._parseMesh=function(e,i){var r=e[a.VERTICES];var n=e[a.UVS];var s=e[a.TRIANGLES];var o=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var l=t.DragonBones.webAssembly?this._floatArrayJson:this._data.floatArray;var h=Math.floor(r.length/2);var u=Math.floor(s.length/3);var f=l.length;var _=f+h*2;i.offset=o.length;o.length+=1+1+1+1+u*3;o[i.offset+0]=h;o[i.offset+1]=u;o[i.offset+2]=f;for(var m=0,p=u*3;mn.width){n.width=h}if(un.height){n.height=u}}}return n};a.prototype._parseAnimation=function(e){var i=t.DragonBones.webAssembly?new Module["AnimationData"]:t.BaseObject.borrowObject(t.AnimationData);i.frameCount=Math.max(a._getNumber(e,a.DURATION,1),1);i.playTimes=a._getNumber(e,a.PLAY_TIMES,1);i.duration=i.frameCount/this._armature.frameRate;i.fadeInTime=a._getNumber(e,a.FADE_IN_TIME,0);i.scale=a._getNumber(e,a.SCALE,1);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length<1){i.name=a.DEFAULT_NAME}if(t.DragonBones.webAssembly){i.frameIntOffset=this._frameIntArrayJson.length;i.frameFloatOffset=this._frameFloatArrayJson.length;i.frameOffset=this._frameArrayJson.length}else{i.frameIntOffset=this._data.frameIntArray.length;i.frameFloatOffset=this._data.frameFloatArray.length;i.frameOffset=this._data.frameArray.length}this._animation=i;if(a.FRAME in e){var r=e[a.FRAME];var n=r.length;if(n>0){for(var s=0,o=0;s0){this._actionFrames.sort(this._sortActionFrame);var D=this._animation.actionTimeline=t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);var T=t.DragonBones.webAssembly?this._timelineArrayJson:this._data.timelineArray;var n=this._actionFrames.length;D.type=0;D.offset=T.length;T.length+=1+1+1+1+1+n;T[D.offset+0]=100;T[D.offset+1]=0;T[D.offset+2]=n;T[D.offset+3]=0;T[D.offset+4]=0;this._timeline=D;if(n===1){D.frameIndicesOffset=-1;T[D.offset+5+0]=this._parseCacheActionFrame(this._actionFrames[0])-this._animation.frameOffset}else{var A=this._animation.frameCount+1;var O=this._data.frameIndices;if(t.DragonBones.webAssembly){D.frameIndicesOffset=O.size();for(var S=0;S0){if(a.CURVE in t){var s=i+1;this._helpArray.length=s;this._samplingEasingCurve(t[a.CURVE],this._helpArray);r.length+=1+1+this._helpArray.length;r[n+1]=2;r[n+2]=s;for(var o=0;o0){var l=this._armature.sortedSlots.length;var h=new Array(l-o.length/2);var u=new Array(l);for(var f=0;f0?l>=this._prevRotation:l<=this._prevRotation){this._prevTweenRotate=this._prevTweenRotate>0?this._prevTweenRotate-1:this._prevTweenRotate+1}l=this._prevRotation+l-this._prevRotation+t.Transform.PI_D*this._prevTweenRotate}}this._prevTweenRotate=a._getNumber(e,a.TWEEN_ROTATE,0);this._prevRotation=l;var h=n.length;n.length+=6;n[h++]=this._helpTransform.x;n[h++]=this._helpTransform.y;n[h++]=l;n[h++]=this._helpTransform.skew;n[h++]=this._helpTransform.scaleX;n[h++]=this._helpTransform.scaleY;this._parseActionDataInFrame(e,i,this._bone,this._slot);return o};a.prototype._parseSlotDisplayIndexFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var s=this._parseFrame(e,i,r,n);n.length+=1;n[s+1]=a._getNumber(e,a.DISPLAY_INDEX,0);this._parseActionDataInFrame(e,i,this._slot.parent,this._slot);return s};a.prototype._parseSlotColorFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameIntArrayJson:this._data.frameIntArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=this._parseTweenFrame(e,i,r,o);var h=-1;if(a.COLOR in e){var u=e[a.COLOR];for(var f in u){f;this._parseColorTransform(u,this._helpColorTransform);h=n.length;n.length+=8;n[h++]=Math.round(this._helpColorTransform.alphaMultiplier*100);n[h++]=Math.round(this._helpColorTransform.redMultiplier*100);n[h++]=Math.round(this._helpColorTransform.greenMultiplier*100);n[h++]=Math.round(this._helpColorTransform.blueMultiplier*100);n[h++]=Math.round(this._helpColorTransform.alphaOffset);n[h++]=Math.round(this._helpColorTransform.redOffset);n[h++]=Math.round(this._helpColorTransform.greenOffset);n[h++]=Math.round(this._helpColorTransform.blueOffset);h-=8;break}}if(h<0){if(this._defalultColorOffset<0){this._defalultColorOffset=h=n.length;n.length+=8;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=0;n[h++]=0;n[h++]=0;n[h++]=0}h=this._defalultColorOffset}var _=s.length;s.length+=1;s[_]=h;return l};a.prototype._parseSlotFFDFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameFloatArrayJson:this._data.frameFloatArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=s.length;var h=this._parseTweenFrame(e,i,r,o);var u=a.VERTICES in e?e[a.VERTICES]:null;var f=a._getNumber(e,a.OFFSET,0);var _=n[this._mesh.offset+0];var m=0;var p=0;var c=0;var d=0;if(this._mesh.weight!==null){var y=this._weightSlotPose[this._mesh.name];this._helpMatrixA.copyFromArray(y,0);s.length+=this._mesh.weight.count*2;c=this._mesh.weight.offset+2+this._mesh.weight.bones.length}else{s.length+=_*2}for(var g=0;g<_*2;g+=2){if(u===null){m=0;p=0}else{if(g=u.length){m=0}else{m=u[g-f]}if(g+1=u.length){p=0}else{p=u[g+1-f]}}if(this._mesh.weight!==null){var v=this._weightBonePoses[this._mesh.name];var b=this._weightBoneIndices[this._mesh.name];var D=n[c++];this._helpMatrixA.transformPoint(m,p,this._helpPoint,true);m=this._helpPoint.x;p=this._helpPoint.y;for(var T=0;T=0||a.DATA_VERSIONS.indexOf(n)>=0){var s=t.DragonBones.webAssembly?new Module["DragonBonesData"]:t.BaseObject.borrowObject(t.DragonBonesData);s.version=r;s.name=a._getString(e,a.NAME,"");s.frameRate=a._getNumber(e,a.FRAME_RATE,24);if(s.frameRate===0){s.frameRate=24}if(a.ARMATURE in e){this._defalultColorOffset=-1;this._data=s;this._parseArray(e);var o=e[a.ARMATURE];for(var l=0,h=o;l0){this._parseWASMArray()}this._data=null}this._rawTextureAtlasIndex=0;if(a.TEXTURE_ATLAS in e){this._rawTextureAtlases=e[a.TEXTURE_ATLAS]}else{this._rawTextureAtlases=null}return s}else{console.assert(false,"Nonsupport data version.")}return null};a.prototype.parseTextureAtlasData=function(e,i,r){if(r===void 0){r=0}console.assert(e!==undefined);if(e===null){if(this._rawTextureAtlases===null){return false}var n=this._rawTextureAtlases[this._rawTextureAtlasIndex++];this.parseTextureAtlasData(n,i,r);if(this._rawTextureAtlasIndex>=this._rawTextureAtlases.length){this._rawTextureAtlasIndex=0;this._rawTextureAtlases=null}return true}i.width=a._getNumber(e,a.WIDTH,0);i.height=a._getNumber(e,a.HEIGHT,0);i.name=a._getString(e,a.NAME,"");i.imagePath=a._getString(e,a.IMAGE_PATH,"");if(r>0){i.scale=r}else{r=i.scale=a._getNumber(e,a.SCALE,i.scale)}r=1/r;if(a.SUB_TEXTURE in e){var s=e[a.SUB_TEXTURE];for(var o=0,l=s.length;o0&&_>0){u.frame=t.DragonBones.webAssembly?Module["TextureData"].createRectangle():t.TextureData.createRectangle();u.frame.x=a._getNumber(h,a.FRAME_X,0)*r;u.frame.y=a._getNumber(h,a.FRAME_Y,0)*r;u.frame.width=f*r;u.frame.height=_*r}i.addTexture(u)}}return true};a.getInstance=function(){if(a._objectDataParserInstance===null){a._objectDataParserInstance=new a}return a._objectDataParserInstance};a._objectDataParserInstance=null;return a}(t.DataParser);t.ObjectDataParser=e;var i=function(){function t(){this.frameStart=0;this.actions=[]}return t}()})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.prototype._inRange=function(t,e,i){return e<=t&&t<=i};i.prototype._decodeUTF8=function(t){var e=-1;var i=-1;var a=65533;var r=0;var n="";var s;var o=0;var l=0;var h=0;var u=0;while(t.length>r){var f=t[r++];if(f===e){if(l!==0){s=a}else{s=i}}else{if(l===0){if(this._inRange(f,0,127)){s=f}else{if(this._inRange(f,194,223)){l=1;u=128;o=f-192}else if(this._inRange(f,224,239)){l=2;u=2048;o=f-224}else if(this._inRange(f,240,244)){l=3;u=65536;o=f-240}else{}o=o*Math.pow(64,l);s=null}}else if(!this._inRange(f,128,191)){o=0;l=0;h=0;u=0;r--;s=f}else{h+=1;o=o+(f-128)*Math.pow(64,l-h);if(h!==l){s=null}else{var _=o;var m=u;o=0;l=0;h=0;u=0;if(this._inRange(_,m,1114111)&&!this._inRange(_,55296,57343)){s=_}else{s=f}}}}if(s!==null&&s!==i){if(s<=65535){if(s>0)n+=String.fromCharCode(s)}else{s-=65536;n+=String.fromCharCode(55296+(s>>10&1023));n+=String.fromCharCode(56320+(s&1023))}}}return n};i.prototype._getUTF16Key=function(t){for(var e=0,i=t.length;e255){return encodeURI(t)}}return t};i.prototype._parseBinaryTimeline=function(e,i,a){if(a===void 0){a=null}var r=a!==null?a:t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);r.type=e;r.offset=i;this._timeline=r;var n=this._timelineArray[r.offset+2];if(n===1){r.frameIndicesOffset=-1}else{var s=this._animation.frameCount+1;var o=this._data.frameIndices;if(t.DragonBones.webAssembly){r.frameIndicesOffset=o.size();for(var l=0;l=0){var r=t.DragonBones.webAssembly?new Module["WeightData"]:t.BaseObject.borrowObject(t.WeightData);var n=this._intArray[i.offset+0];var s=this._intArray[a+0];r.offset=a;if(t.DragonBones.webAssembly){r.bones.resize(s,null);for(var o=0;o0){if(e in this._dragonBonesDataMap){n=this._dragonBonesDataMap[e];s=n.getArmature(i)}}if(s===null&&(e.length===0||this.autoSearch)){for(var o in this._dragonBonesDataMap){n=this._dragonBonesDataMap[o];if(e.length===0||n.autoSearch){s=n.getArmature(i);if(s!==null){e=o;break}}}}if(s!==null){t.dataName=e;t.textureAtlasName=r;t.data=n;t.armature=s;t.skin=null;if(a.length>0){t.skin=s.getSkin(a);if(t.skin===null&&this.autoSearch){for(var o in this._dragonBonesDataMap){var l=this._dragonBonesDataMap[o];var h=l.getArmature(a);if(h!==null){t.skin=h.defaultSkin;break}}}}if(t.skin===null){t.skin=s.defaultSkin}return true}return false};i.prototype._buildBones=function(e,i){var a=e.armature.sortedBones;for(var r=0;r<(t.DragonBones.webAssembly?a.size():a.length);++r){var n=t.DragonBones.webAssembly?a.get(r):a[r];var s=t.DragonBones.webAssembly?new Module["Bone"]:t.BaseObject.borrowObject(t.Bone);s.init(n);if(n.parent!==null){i.addBone(s,n.parent.name)}else{i.addBone(s)}var o=n.constraints;for(var l=0;l<(t.DragonBones.webAssembly?o.size():o.length);++l){var h=t.DragonBones.webAssembly?o.get(l):o[l];var u=i.getBone(h.target.name);if(u===null){continue}var f=h;var _=t.DragonBones.webAssembly?new Module["IKConstraint"]:t.BaseObject.borrowObject(t.IKConstraint);var m=f.root!==null?i.getBone(f.root.name):null;_.target=u;_.bone=s;_.root=m;_.bendPositive=f.bendPositive;_.scaleEnabled=f.scaleEnabled;_.weight=f.weight;if(m!==null){m.addConstraint(_)}else{s.addConstraint(_)}}}};i.prototype._buildSlots=function(t,e){var i=t.skin;var a=t.armature.defaultSkin;if(i===null||a===null){return}var r={};for(var n in a.displays){var s=a.displays[n];r[n]=s}if(i!==a){for(var n in i.displays){var s=i.displays[n];r[n]=s}}for(var o=0,l=t.armature.sortedSlots;o0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var u=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(u.length>0){for(var f=0,_=u;f<_.length;f++){var m=_[f];h._bufferAction(m,true)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype._replaceSlotDisplay=function(t,e,i,a){if(a<0){a=i.displayIndex}if(a<0){a=0}var r=i.displayList;if(r.length<=a){r.length=a+1;for(var n=0,s=r.length;n=0){continue}var s=e.displays[n.name];var o=n.displayList;o.length=s.length;for(var l=0,h=s.length;l0?this.width:i.width;var r=this.height>0?this.height:i.height;for(var n=0,s=this._textureNames;n255){o=encodeURI(o);break}}var u=e.get(o);var f=Math.min(u.region.width,a-u.region.x);var _=Math.min(u.region.height,r-u.region.y);if(!u.renderTexture){var m=new egret.Texture;m._bitmapData=i;if(u.rotated){m.$initData(u.region.x,u.region.y,_,f,0,0,_,f,a,r)}else{m.$initData(u.region.x,u.region.y,f,_,0,0,f,_,a,r)}egret.WebAssemblyNode.setValuesToBitmapData(m);u.setTextureId(m["textureId"]);u.renderTexture=m}}}else{for(var p=0,c=this._textureNames;p0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.getMeshWASMDisplay()}else{n=a.getRawWASMDisplay()}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.getMeshWASMDisplay()}else{n=a.getRawWASMDisplay()}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var u=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(u.length>0){for(var f=0,_=u;f<_.length;f++){var m=_[f];h.animation.fadeIn(m.name)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype.changeSkin=function(e,i,a){if(a===void 0){a=null}var r=e.getSlots();for(var n=0,s=r.size();n=0){continue}var l=i.displays.get(o.name);if(l===null||l===undefined){continue}var h=o.getEgretDisplayList();if(h===null||h===undefined){console.log("Slot does not has displayList"+o.name);continue}var u=l.size();h.resize(u,null);for(var f=0,_=l.size();f<_;++f){var m=l.get(f);var p=this._getSlotDisplay(null,m,null,o);if(p.getDisplayType()==1){var c=t.createEgretDisplay(p,1);h.set(f,c)}else{h.set(f,p)}}o.switchDisplayData(l);o.setEgretDisplayList(h)}};i.prototype.replaceSlotDisplay=function(t,e,i,a,r,n){if(n===void 0){n=-1}var s={};if(!this._fillBuildArmaturePackage(s,t||"",e,"","")||s.skin===null){return}var o=s.skin.getDisplays(i);if(o===null){return}for(var l=0,h=o.size();l void, target: any): void { + this.addEventListener(type, listener, target); + } + /** + * @inheritDoc + */ + public removeEvent(type: EventStringType, listener: (event: EgretEvent) => void, target: any): void { + this.removeEventListener(type, listener, target); + } + /** + * @inheritDoc + */ + public get armature(): Armature { + return this._armature; + } + /** + * @inheritDoc + */ + public get animation(): Animation { + return this._armature.animation; + } + } + + interface PEgretArmatureProxy extends IArmatureProxy { + __parent: any; + _display: EgretArmatureDisplay; + } + + interface PEgretSlot { + __parent: any; + _rawDisplay: egret.Bitmap; + _meshDisplay: egret.Mesh; + _rawDisplayWASM: any; + _meshDisplayWASM: any; + } + + interface PEgretDisplayWrapper { + _display: egret.DisplayObject | Armature | null; + setDisplayInfo(displayID: number, type: DisplayType): void; + setArmature(value: Armature): void; + } + + export interface PEgretTextureAtlasData extends TextureAtlasData { + renderTexture: egret.Texture | null; + textures: any; + __parent: any; + _textureNames: Array; + _texture: egret.Texture | null; + } + + export interface PEgretTextureData extends TextureData { + renderTexture: egret.Texture | null; + __parent: any; + _renderTexture: egret.Texture | null; + } + + export let EgretArmatureProxy: any; + export let EgretSlot: any; + export let EgretTextureAtlasData: any; + export let EgretTextureData: any; + + export function createEgretDisplay(display: egret.DisplayObject | Armature | null, type: DisplayType): any { + const egretDisplayWrapper = new Module["EgretDisplayWASM"]() as PEgretDisplayWrapper; // TODO 是否可以将 EgretDisplayWASM 改为 EgretDisplayWrapper + let wasmId; + if (display === null) { + wasmId = -1; + egretDisplayWrapper.setDisplayInfo(wasmId, type); + } + else if (type === DisplayType.Armature) { + wasmId = (display as any).getEgretArmatureId(); + egretDisplayWrapper.setDisplayInfo(wasmId, type); + egretDisplayWrapper.setArmature(display as Armature); + } + else { + wasmId = (display as any).$waNode.id; + egretDisplayWrapper.setDisplayInfo(wasmId, type); + } + egretDisplayWrapper._display = display; + + return egretDisplayWrapper; + } + + export function egretWASMInit(): void { + /** + * @private + * 扩展 c++ EgretArmatureProxy。(在 js 中构造) + */ + EgretArmatureProxy = Module["EgretArmatureDisplayWASM"].extend("EgretArmatureProxy", { // TODO 是否可以将 EgretArmatureDisplayWASM 改为 EgretArmatureProxy + __construct: function (this: PEgretArmatureProxy, display: EgretArmatureDisplay) { + this.__parent.__construct.call(this); + this._display = display; + }, + __destruct: function (this: PEgretArmatureProxy) { + this.__parent.__destruct.call(this); + this._display = null as any; + }, + clear: function (this: PEgretArmatureProxy): void { // c++ call. + if (this._display) { + this._display.clear(); + } + + this._display = null as any; + }, + debugUpdate: function (this: PEgretArmatureProxy, isEnabled: boolean): void { // c++ call. + this._display.debugUpdate(isEnabled); + }, + //extend c++ + _dispatchEvent: function (this: PEgretArmatureProxy, type: string, eventObject: EventObject): void { // c++ call. + this._display._dispatchEvent(type, eventObject); + }, + //extend c++ + hasEvent: function (this: PEgretArmatureProxy, type: string): boolean { // c++ call. + return this._display.hasEventListener(type); + }, + dispose: function (this: PEgretArmatureProxy, disposeProxy: boolean): void { + // TODO lsc + disposeProxy; + // return this._display.dispose(disposeProxy); + }, + addEvent: function (this: PEgretArmatureProxy, type: string, listener: (event: EgretEvent) => void, target: any): void { // js call. + this._display.addEvent(type, listener, target); + }, + removeEvent: function (this: PEgretArmatureProxy, type: string, listener: (event: EgretEvent) => void, target: any): void { // js call. + this._display.removeEvent(type, listener, target); + } + }); + + /** + * @private + */ + EgretSlot = Module["EgretSlotWASM"].extend("EgretSlotWrapper", { // TODO 是否可以将 EgretSlotWASM 改为 EgretSlot + __construct: function (this: PEgretSlot) { + this.__parent.__construct.call(this); + this._rawDisplay = null as any; + this._meshDisplay = null as any; + this._rawDisplayWASM = null as any; + this._meshDisplayWASM = null as any; + }, + __destruct: function (this: PEgretSlot) { + this.__parent.__destruct.call(this); + this._rawDisplay = null as any; + this._meshDisplay = null as any; + }, + init: function (this: PEgretSlot, slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void { // js -> c++ + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + + this._rawDisplayWASM = createEgretDisplay(this._rawDisplay, DisplayType.Image); + this._meshDisplayWASM = createEgretDisplay(this._meshDisplay, DisplayType.Mesh); + this.__parent.init.call( + this, + slotData, displayDatas, + this._rawDisplayWASM, + this._meshDisplayWASM + ); + }, + getRawDisplay: function (this: PEgretSlot): egret.Bitmap { + return this._rawDisplay; + }, + getMeshDisplay: function (this: PEgretSlot): egret.Mesh { + return this._meshDisplay; + }, + getRawWASMDisplay: function (this: PEgretSlot): any { + return this._rawDisplayWASM; + }, + getMeshWASMDisplay: function (this: PEgretSlot): any { + return this._meshDisplayWASM; + }, + // extend c++ function + getDisplay: function (this: PEgretSlot): egret.DisplayObject | null { // js -> c++ + const displayWrapper: PEgretDisplayWrapper | null = this.__parent.getEgretDisplay.call(this); + if (displayWrapper !== null) { + return displayWrapper._display as any; + } + + return null; + }, + setDisplay: function (this: PEgretSlot, value: egret.DisplayObject | Armature | null): void { // js -> c++ + if (value === this._rawDisplay || value === this._meshDisplay) { + return; + } + + if (value === null || value instanceof egret.Bitmap) { + this.__parent.setEgretDisplay.call(this, createEgretDisplay(value, DisplayType.Image)); + } + else if (value instanceof egret.Mesh) { + this.__parent.setEgretDisplay.call(this, createEgretDisplay(value, DisplayType.Mesh)); + } + else if (value instanceof Module["EgretArmature"]) { + this.__parent.setChildArmature.call(this, value); + } + } + }); + + Object.defineProperty(EgretSlot.prototype, "displayList", { + get: EgretSlot.prototype.getEgretDisplayList, + set: EgretSlot.prototype.setEgretDisplayList, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretSlot.prototype, "rawDisplay", { + get: EgretSlot.prototype.getRawDisplay, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretSlot.prototype, "meshDisplay", { + get: EgretSlot.prototype.getMeshDisplay, + enumerable: true, + configurable: true + }); + Object.defineProperty(EgretSlot.prototype, "display", { + get: EgretSlot.prototype.getDisplay, + set: EgretSlot.prototype.setDisplay, + enumerable: true, + configurable: true + }); + + EgretTextureAtlasData = Module["EgretTextureAtlasDataWASM"].extend("EgretTextureAtlasData", { + __construct: function (this: PEgretTextureAtlasData, rawTextures?: { name: string }[]) { + this.__parent.__construct.call(this); + this._textureNames = []; + this._texture = null; + if (rawTextures) { + for (const texture of rawTextures) { + this._textureNames.push(texture.name); + } + } + }, + __destruct: function (this: PEgretTextureAtlasData) { + this.__parent.__destruct.call(this); + this._textureNames.length = 0; + this._texture = null; + } + }); + + Object.defineProperty((EgretTextureAtlasData as any).prototype, "renderTexture", { + get: function (this: PEgretTextureAtlasData): egret.Texture | null { + return this._texture; + }, + set: function (this: PEgretTextureAtlasData, value: egret.Texture): void { + if (this._texture === value) { + return; + } + if ((value as any)["textureId"] === null || (value as any)["textureId"] === undefined) { + (egret as any).WebAssemblyNode.setValuesToBitmapData(value); + } + this._texture = value; + + const textures = this.textures; + if (this._texture !== null) { + const bitmapData = this._texture.bitmapData; + const textureAtlasWidth = this.width > 0.0 ? this.width : bitmapData.width; + const textureAtlasHeight = this.height > 0.0 ? this.height : bitmapData.height; + for (let k of this._textureNames) { + for (let i = 0, l = k.length; i < l; ++i) { + if (k.charCodeAt(i) > 255) { + k = encodeURI(k); + break; + } + } + + const textureData = textures.get(k) as PEgretTextureData; + const subTextureWidth = Math.min(textureData.region.width, textureAtlasWidth - textureData.region.x); // TODO need remove + const subTextureHeight = Math.min(textureData.region.height, textureAtlasHeight - textureData.region.y); // TODO need remove + + if (!textureData.renderTexture) { + let currTex = new egret.Texture(); + currTex._bitmapData = bitmapData; + if (textureData.rotated) { + currTex.$initData( + textureData.region.x, textureData.region.y, + subTextureHeight, subTextureWidth, + 0, 0, + subTextureHeight, subTextureWidth, + textureAtlasWidth, textureAtlasHeight, + // textureData.rotated + ); + } + else { + currTex.$initData( + textureData.region.x, textureData.region.y, + subTextureWidth, subTextureHeight, + 0, 0, + subTextureWidth, subTextureHeight, + textureAtlasWidth, textureAtlasHeight + ); + } + // Egret 5.0 + (egret as any).WebAssemblyNode.setValuesToBitmapData(currTex); + (textureData as any).setTextureId((currTex as any)["textureId"]); + textureData.renderTexture = currTex; + } + } + } + else { + for (const k of this._textureNames) { + const textureData = textures.get(k) as PEgretTextureData; + textureData.renderTexture = null; + } + } + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + EgretTextureData = Module["EgretTextureDataWASM"].extend("EgretTextureData", { + __construct: function (this: PEgretTextureData) { + this.__parent.__construct.call(this); + this._renderTexture = null; + }, + __destruct: function (this: PEgretTextureData) { + this.__parent.__destruct.call(this); + this._renderTexture = null; + } + }); + + Object.defineProperty((EgretTextureData as any).prototype, "renderTexture", { + get: function (this: PEgretTextureData): egret.Texture | null { + return this._renderTexture; + }, + set: function (this: PEgretTextureData, value: egret.Texture): void { + if (this._renderTexture === value) { + return; + } + + this._renderTexture = value; + }, + enumerable: true, + configurable: true + }); + + /* + * @private + * 扩展 c++ WorldClock。(在 c++ 中构造) + */ + dragonBones.WorldClock = Module["WorldClock"]; + (dragonBones.WorldClock as any).prototype._c_contains = dragonBones.WorldClock.prototype.contains; + (dragonBones.WorldClock as any).prototype._c_add = dragonBones.WorldClock.prototype.add; + (dragonBones.WorldClock as any).prototype._c_remove = dragonBones.WorldClock.prototype.remove; + (dragonBones.WorldClock as any).prototype.contains = function (this: any, value: IAnimatable): boolean { // js call. + if (value instanceof dragonBones.Armature) { + return this._c_contains((value as any).getAnimatable()); + } + + return this._c_contains(value); + }; + (dragonBones.WorldClock as any).prototype.add = function (this: any, value: IAnimatable): void { // js call. + if (value instanceof dragonBones.Armature) { + return this._c_add((value as any).getAnimatable()); + } + + return this._c_add(value); + }; + (dragonBones.WorldClock as any).prototype.remove = function (this: any, value: IAnimatable): void { // js call. + if (value instanceof dragonBones.Armature) { + return this._c_remove((value as any).getAnimatable()); + } + + return this._c_remove(value); + }; + /** + * @private + * 扩展 c++ EgretArmature。(在 js 中构造) + */ + dragonBones.Armature = Module["EgretArmature"]; + (dragonBones.Armature as any).prototype._c_addBone = dragonBones.Armature.prototype.addBone; + (dragonBones.Armature as any).prototype._c_invalidUpdate = dragonBones.Armature.prototype.invalidUpdate; + dragonBones.Armature.prototype.addBone = function (this: any, bone: Bone, name: string) { + if (name === null || name === undefined) { + name = ""; + } + return this._c_addBone(bone, name); + } + dragonBones.Armature.prototype.invalidUpdate = function (this: any, boneName: string | null = null, updateSlotDisplay: boolean = false): void { + if (boneName === null) { + boneName = ""; + } + return this._c_invalidUpdate(boneName, updateSlotDisplay); + } + dragonBones.Armature.prototype.getDisplay = function (this: any) { + return this.proxy._display; + } + Object.defineProperty(dragonBones.Armature.prototype, "display", { + get: function (this: any) { + return this.proxy._display; + }, + enumerable: true, + configurable: true + }); + /** + * @private + * 扩展 c++ Animation + */ + dragonBones.Animation = Module["Animation"]; + (dragonBones.Animation as any).prototype._c_play = dragonBones.Animation.prototype.play; + (dragonBones.Animation as any).prototype._c_fadeIn = dragonBones.Animation.prototype.fadeIn; + dragonBones.Animation.prototype.play = function (this: any, + animationName: string | null = null, playTimes: number = -1): AnimationState | null { + if (animationName === null) { + animationName = ""; + } + return this._c_play(animationName, playTimes); + } + dragonBones.Animation.prototype.fadeIn = function (this: any, + animationName: string, fadeInTime: number = -1.0, playTimes: number = -1, + layer: number = 0, group: string | null = null, fadeOutMode: AnimationFadeOutMode = AnimationFadeOutMode.SameLayerAndGroup + ): AnimationState | null { + if (animationName === null) { + animationName = ""; + } + if (group === null) { + group = ""; + } + return this._c_fadeIn(animationName, fadeInTime, playTimes, layer, group, fadeOutMode); + } + } + + const configTables: { [key: string]: { getter?: string[], setter?: string[], static?: string[], array?: string[] } } = { + ActionData: { + getter: [], + setter: ["type", "bone", "slot", "data"] + }, + DragonBonesData: { + getter: ["frameIndices"], + setter: [], + array: ["armatureNames"] + }, + ArmatureData: { + getter: ["defaultActions", "actions"], + setter: ["aabb", "defaultAnimation", "defaultSkin", "parent"], + array: ["animationNames"] + }, + BoneData: { + getter: ["transform", "constraints"], + setter: ["parent"] + }, + SlotData: { + getter: [], + setter: ["blendMode", "color", "parent"], + static: ["DEFAULT_COLOR"] + }, + ConstraintData: { + getter: [], + setter: ["target", "root", "bone"] + }, + DisplayData: { + getter: ["transform"], + setter: ["type", "parent"] + }, + ImageDisplayData: { + getter: ["pivot"], + setter: ["texture"] + }, + ArmatureDisplayData: { + getter: ["actions"], + setter: [] // armature + }, + MeshDisplayData: { + getter: [], + setter: ["weight"] + }, + WeightData: { + getter: ["bones"], + setter: [] + }, + AnimationData: { + getter: [], + setter: ["actionTimeline", "zOrderTimeline", "parent"] + }, + TimelineData: { + getter: [], + setter: ["type"] + }, + AnimationConfig: { + getter: [], + setter: ["fadeOutMode", "fadeOutTweenType", "fadeInTweenType"] + }, + TextureData: { + getter: ["region"], + setter: ["frame"] + }, + TransformObject: { + getter: ["globalTransformMatrix", "global", "offset", "origin"], + setter: [] + }, + Armature: { + getter: ["armatureData", "animation", "proxy", "eventDispatcher"], + setter: ["clock"] + }, + Slot: { + getter: ["boundingBoxData"], + setter: ["displayIndex", "childArmature"] + }, + Constraint: { + getter: [], + setter: ["target", "bone", "root"] + }, + Animation: { + getter: ["animationConfig"], + setter: [], + array: ["animationNames"] + }, + WorldClock: { + getter: [], + setter: ["clock"], + static: ["clock"] + }, + EventObject: { + getter: ["armature", "bone", "slot", "animationState", "data"], + setter: [] + }, + EgretArmatureDisplayWASM: { + getter: ["armature", "animation"], + setter: [] + }, + DragonBones: { + getter: ["clock"], + setter: [] + } + } + + function descGetter(funcName: string, target: any) { + return { + get: target["_c_get_" + funcName], + enumerable: true, + configurable: true + }; + } + + function descSetter(funcName: string, target: any) { + return { + get: target["_c_get_" + funcName], + set: target["_c_set_" + funcName], + enumerable: true, + configurable: true + }; + } + + function descArrayGetter(funcName: string, target: any) { + target; + return { + get: function (this: any): Array { + let array = this["_js_" + funcName]; + if (!array) { + array = []; + + const vector = this["_c_get_" + funcName](); + for (let i = 0, l = vector.size(); i < l; ++i) { + array[i] = vector.get(i); + } + } + + return array; + }, + enumerable: true, + configurable: true + }; + } + + export function registerGetterSetter(): void { + for (let fieldKey in configTables) { + const getterClass = Module[fieldKey]; + const getterClassProto = Module[fieldKey].prototype; + const getterArray = configTables[fieldKey].getter; + const setterArray = configTables[fieldKey].setter; + const staticArray = configTables[fieldKey].static; + const arrayArray = configTables[fieldKey].array; + + if (getterArray) { + for (let fieldName of getterArray) { + Object.defineProperty(getterClassProto, fieldName, descGetter(fieldName, getterClassProto)); + } + } + + if (setterArray) { + for (let fieldName of setterArray) { + Object.defineProperty(getterClassProto, fieldName, descSetter(fieldName, getterClassProto)); + } + } + + if (staticArray) { + for (let fieldName of staticArray) { + Object.defineProperty(getterClass, fieldName, descSetter(fieldName, getterClass)); + } + } + + if (arrayArray) { + for (let fieldName of arrayArray) { + Object.defineProperty(getterClassProto, fieldName, descArrayGetter(fieldName, getterClass)); + } + } + } + } +} \ No newline at end of file diff --git a/reference/Egret/wasm/src/dragonBones/egret/EgretFactory.ts b/reference/Egret/wasm/src/dragonBones/egret/EgretFactory.ts new file mode 100644 index 0000000..259732c --- /dev/null +++ b/reference/Egret/wasm/src/dragonBones/egret/EgretFactory.ts @@ -0,0 +1,434 @@ +namespace dragonBones { + /** + * Egret 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class EgretFactory extends BaseFactory { + private static _time: number = 0; + private static _dragonBones: DragonBones = null as any; + private static _factory: EgretFactory | null = null; + private static _eventManager: EgretArmatureDisplay; + private static _clockHandler(time: number): boolean { + const dbcore = EgretFactory._dragonBones as any; + // + const objects = dbcore.getObjects(); + for (let i = 0, l = objects.size(); i < l; ++i) { + objects.get(i).returnToPool(); + } + objects.resize(0, null); + // + time *= 0.001; + const passedTime = time - EgretFactory._time; + dbcore.clock.advanceTime(passedTime); + EgretFactory._time = time; + // + const events = dbcore.getEvents(); + for (let i = 0, l = events.size(); i < l; ++i) { + const eventObject = events.get(i); + const armature = eventObject.armature; + const type = eventObject.type; + if (armature === null || armature.display === null || armature.display === undefined) { + console.log("armature display error!"); + } + armature.display._dispatchEvent(type, eventObject); + if (type === EventObject.SOUND_EVENT) { + EgretFactory._eventManager._dispatchEvent(eventObject.type, eventObject); + } + + eventObject.returnToPool(); + } + events.resize(0, null); + + return false; + } + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 5.0 + * @language zh_CN + */ + public static get clock(): any { + return EgretFactory._dragonBones.clock; + } + /** + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + * @language zh_CN + */ + public static get factory(): EgretFactory { + if (EgretFactory._factory === null) { + registerGetterSetter(); + egretWASMInit(); + EgretFactory._factory = new EgretFactory(); + } + + return EgretFactory._factory; + } + /** + * @private + */ + private _rawTextures: any = null; + /** + * @inheritDoc + */ + public constructor() { + super(); + + if (EgretFactory._dragonBones === null) { + dragonBones.DragonBones.webAssembly = true; + const eventDisplay = new EgretArmatureDisplay(); + EgretFactory._eventManager = eventDisplay; + EgretFactory._dragonBones = new Module["DragonBones"](); + EgretFactory._dragonBones.clock.time = egret.getTimer() * 0.001; + egret.startTick(EgretFactory._clockHandler, EgretFactory); + } + } + /** + * @private + */ + protected _isSupportMesh(): boolean { + if (egret.Capabilities.renderMode === "webgl" || egret.Capabilities.runtimeType === egret.RuntimeType.NATIVE) { + return true; + } + + console.warn("Canvas can not support mesh, please change renderMode to webgl."); + + return false; + } + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: any | null, textureAtlas: egret.Texture): TextureAtlasData { + if (textureAtlasData !== null) { + if ((textureAtlas as any)["textureId"] === null) { + (egret as any).WebAssemblyNode.setValuesToBitmapData(textureAtlas); + } + + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = new EgretTextureAtlasData(this._rawTextures); + } + + return textureAtlasData; + } + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature { + const armature = new Module['EgretArmature'](); + const armatureDisplay = new EgretArmatureDisplay(); + const armatureProxy = new EgretArmatureProxy(armatureDisplay); + const displayID = (armatureDisplay as any).$waNode.id; + armature.init( + dataPackage.armature, + armatureProxy, displayID, EgretFactory._dragonBones + ); + armatureDisplay.init(armature); + return armature; + } + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void { + const currentSkin = dataPackage.skin; + const defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + + const currentSkinSlotNames: any = (currentSkin as any).getSkinSlotNames(); + const defaultSkinSlotNames: any = (defaultSkin as any).getSkinSlotNames(); + + const skinSlots: Map> = {}; + // for (let k in defaultSkin.displays) { + for (let i = 0, l = defaultSkinSlotNames.size(); i < l; ++i) { + const slotName = defaultSkinSlotNames.get(i); + const displays = defaultSkin.getDisplays(slotName); + if (displays !== null) { + skinSlots[slotName] = displays; + } + } + + if (currentSkin !== defaultSkin) { + // for (let k in currentSkin.displays) { + for (let i = 0, l = currentSkinSlotNames.size(); i < l; ++i) { + const slotName = currentSkinSlotNames.get(i); + const displays = currentSkin.getDisplays(slotName); + if (displays !== null) { + skinSlots[slotName] = displays; + } + } + } + + // for (const slotData of dataPackage.armature.sortedSlots) { + const slots = dataPackage.armature.sortedSlots as any; + for (let i = 0, l = slots.size(); i < l; ++i) { + const slotData = slots.get(i); + if (!(slotData.name in skinSlots)) { + continue; + } + + const displays = skinSlots[slotData.name]; + const slot = this._buildSlot(dataPackage, slotData, displays, armature); + const displayList = new Module["EgretSlotDisplayVector"](); + for (let i = 0, l = (displays as any).size(); i < l; ++i) { + const displayData = (displays as any).get(i); + if (displayData !== null) { + const display = this._getSlotDisplay(dataPackage, displayData, null, slot); + if (display === null) { + const displayWrapper = createEgretDisplay(display, DisplayType.Image); + displayList.push_back(displayWrapper); + } + else if (display.getDisplayType() === DisplayType.Armature) { + const displayWrapper = createEgretDisplay(display, DisplayType.Armature); + displayList.push_back(displayWrapper); + } + else { + displayList.push_back(display); + } + } + else { + const displayWrapper = createEgretDisplay(null, DisplayType.Image); + displayList.push_back(displayWrapper); + } + } + + armature.addSlot(slot, slotData.parent.name); + (slot as any)._setEgretDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + } + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot { + dataPackage; + armature; + const slot = new EgretSlot() as Slot; + slot.init( + slotData, displays, + new egret.Bitmap(), new egret.Mesh() + ); + + return slot; + } + /** + * @private + */ + public parseTextureAtlasData(rawData: any, textureAtlas: any, name: string | null = null, scale: number = 0.0): TextureAtlasData { + this._rawTextures = rawData ? rawData.SubTexture : null; + + return super.parseTextureAtlasData(rawData, textureAtlas, name, scale); + } + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + public buildArmatureDisplay(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null, textureAtlasName: string | null = null): EgretArmatureDisplay | null { + const armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + EgretFactory.clock.add(armature); + return armature.display as EgretArmatureDisplay; + } + + return null; + } + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public getTextureDisplay(textureName: string, textureAtlasName: string | null = null): egret.Bitmap | null { + const textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName) as any; + if (textureData !== null && textureData.texture === null) { + return new egret.Bitmap(textureData.texture); + } + + return null; + } + /* + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any { + const dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + let display: any = null; + switch (displayData.type) { + case DisplayType.Image: + const imageDisplayData = displayData as ImageDisplayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + + if (rawDisplayData !== null && rawDisplayData.type === DisplayType.Mesh && this._isSupportMesh()) { + display = (slot as any).getMeshWASMDisplay(); + } + else { + display = (slot as any).getRawWASMDisplay(); + } + break; + + case DisplayType.Mesh: + const meshDisplayData = displayData as MeshDisplayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + + if (this._isSupportMesh()) { + display = (slot as any).getMeshWASMDisplay(); + } + else { + display = (slot as any).getRawWASMDisplay(); + } + break; + + case DisplayType.Armature: + const armatureDisplayData = displayData as ArmatureDisplayData; + const childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + const actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (const action of actions) { + childArmature.animation.fadeIn(action.name); // TODO action should be do after advanceTime. + } + } + else { + childArmature.animation.play(); + } + } + + armatureDisplayData.armature = childArmature.armatureData; // + } + + display = childArmature; + break; + } + + return display; + } + /** + * public + */ + public changeSkin(armature: Armature, skin: SkinData, exclude: Array | null = null): void { + // for (const slot of armature.getSlots()) { + let slots = armature.getSlots(); + for (let i = 0, l = (slots as any).size(); i < l; ++i) { + let slot = (slots as any).get(i); + if ((exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + const displays = (skin.displays as any).get(slot.name); + if (displays === null || displays === undefined) { + continue; + } + const displayList = (slot as any).getEgretDisplayList(); // Copy. + if (displayList === null || displayList === undefined) { + console.log("Slot does not has displayList" + slot.name); + continue; + } + const datalen = displays.size(); + displayList.resize(datalen, null);// Modify displayList length. + + for (let i = 0, l = displays.size(); i < l; ++i) { + let currData = displays.get(i); + let currSlot = this._getSlotDisplay(null, currData, null, slot); + if (currSlot.getDisplayType() == DisplayType.Armature) { + let displayWrapper = createEgretDisplay(currSlot, DisplayType.Armature); + displayList.set(i, displayWrapper); + } + else { + displayList.set(i, currSlot); + } + } + + slot.switchDisplayData(displays); + + //TODO + // slot.displayList = displayList; + (slot as any).setEgretDisplayList(displayList); + } + } + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public replaceSlotDisplay(dragonBonesName: string, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex: number = -1): void { + const dataPackage: BuildArmaturePackage = {} as any; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + + const displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + + // for (const display of displays) { + for (let i = 0, l = (displays as any).size(); i < l; ++i) { + let display = (displays as any).get(i); + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + } + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + + if (displayIndex < 0) { + displayIndex = 0; + } + + const displayList = (slot as any).getEgretDisplayList(); // Copy. + if ((displayList as any).size() <= displayIndex) { + (displayList as any).resize(displayIndex + 1, null); + } + + (slot as any).replaceDisplayData(displayData, displayIndex); + if (displayData !== null) { + displayList.set(displayIndex, this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.set(displayIndex, null); + } + (slot as any).setEgretDisplayList(displayList); + } + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public get soundEventManager(): egret.EventDispatcher { + return EgretFactory._eventManager; + } + } +} \ No newline at end of file diff --git a/reference/Egret/wasm/tsconfig.json b/reference/Egret/wasm/tsconfig.json new file mode 100644 index 0000000..a672d0f --- /dev/null +++ b/reference/Egret/wasm/tsconfig.json @@ -0,0 +1,74 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": true, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "outFile": "out/dragonBones-wasm.js", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ], + "files": [ + "./libs/egret-wasm.d.ts", + + "../../DragonBones/src/dragonBones/core/DragonBones.ts", + "../../DragonBones/src/dragonBones/core/BaseObject.ts", + + "../../DragonBones/src/dragonBones/geom/Matrix.ts", + "../../DragonBones/src/dragonBones/geom/Transform.ts", + "../../DragonBones/src/dragonBones/geom/ColorTransform.ts", + "../../DragonBones/src/dragonBones/geom/Point.ts", + "../../DragonBones/src/dragonBones/geom/Rectangle.ts", + + "../../DragonBones/src/dragonBones/model/UserData.ts", + "../../DragonBones/src/dragonBones/model/DragonBonesData.ts", + "../../DragonBones/src/dragonBones/model/ArmatureData.ts", + "../../DragonBones/src/dragonBones/model/ConstraintData.ts", + "../../DragonBones/src/dragonBones/model/DisplayData.ts", + "../../DragonBones/src/dragonBones/model/BoundingBoxData.ts", + "../../DragonBones/src/dragonBones/model/AnimationData.ts", + "../../DragonBones/src/dragonBones/model/AnimationConfig.ts", + "../../DragonBones/src/dragonBones/model/TextureAtlasData.ts", + + "../../DragonBones/src/dragonBones/armature/IArmatureProxy.ts", + "../../DragonBones/src/dragonBones/armature/Armature.ts", + "../../DragonBones/src/dragonBones/armature/TransformObject.ts", + "../../DragonBones/src/dragonBones/armature/Bone.ts", + "../../DragonBones/src/dragonBones/armature/Slot.ts", + "../../DragonBones/src/dragonBones/armature/Constraint.ts", + + "../../DragonBones/src/dragonBones/animation/IAnimatable.ts", + "../../DragonBones/src/dragonBones/animation/WorldClock.ts", + "../../DragonBones/src/dragonBones/animation/Animation.ts", + "../../DragonBones/src/dragonBones/animation/AnimationState.ts", + "../../DragonBones/src/dragonBones/animation/BaseTimelineState.ts", + "../../DragonBones/src/dragonBones/animation/TimelineState.ts", + + "../../DragonBones/src/dragonBones/event/EventObject.ts", + "../../DragonBones/src/dragonBones/event/IEventDispatcher.ts", + + "../../DragonBones/src/dragonBones/parser/DataParser.ts", + "../../DragonBones/src/dragonBones/parser/ObjectDataParser.ts", + "../../DragonBones/src/dragonBones/parser/BinaryDataParser.ts", + + "../../DragonBones/src/dragonBones/factory/BaseFactory.ts", + + "./src/dragonBones/egret/EgretArmatureDisplay.ts", + "./src/dragonBones/egret/EgretFactory.ts" + ] +} \ No newline at end of file diff --git a/reference/LICENSE b/reference/LICENSE new file mode 100644 index 0000000..00b61d6 --- /dev/null +++ b/reference/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2012-2016 DragonBones team and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/reference/Pixi/4.x/README.md b/reference/Pixi/4.x/README.md new file mode 100644 index 0000000..c38b11b --- /dev/null +++ b/reference/Pixi/4.x/README.md @@ -0,0 +1,21 @@ +## How to build +``` +$npm install +$npm run build +``` + +## Project structure +``` + |-- libs + |-- pixi.js.d.ts + |-- node_modules + |-- ... + |-- out + |-- ... + |-- src + |-- ... + |-- ... +``` + +## Pixi declaration +[pixi.js.d.ts](https://github.com/pixijs/pixi-typescript/blob/v4.x/pixi.js.d.ts) \ No newline at end of file diff --git a/reference/Pixi/4.x/out/dragonBones.d.ts b/reference/Pixi/4.x/out/dragonBones.d.ts new file mode 100644 index 0000000..881dd51 --- /dev/null +++ b/reference/Pixi/4.x/out/dragonBones.d.ts @@ -0,0 +1,4623 @@ +declare const Module: any; +declare namespace dragonBones { + /** + * @private + */ + const enum BinaryOffset { + WeigthBoneCount = 0, + WeigthFloatOffset = 1, + WeigthBoneIndices = 2, + MeshVertexCount = 0, + MeshTriangleCount = 1, + MeshFloatOffset = 2, + MeshWeightOffset = 3, + MeshVertexIndices = 4, + TimelineScale = 0, + TimelineOffset = 1, + TimelineKeyFrameCount = 2, + TimelineFrameValueCount = 3, + TimelineFrameValueOffset = 4, + TimelineFrameOffset = 5, + FramePosition = 0, + FrameTweenType = 1, + FrameTweenEasingOrCurveSampleCount = 2, + FrameCurveSamples = 3, + FFDTimelineMeshOffset = 0, + FFDTimelineFFDCount = 1, + FFDTimelineValueCount = 2, + FFDTimelineValueOffset = 3, + FFDTimelineFloatOffset = 4, + } + /** + * @private + */ + const enum ArmatureType { + Armature = 0, + MovieClip = 1, + Stage = 2, + } + /** + * @private + */ + const enum DisplayType { + Image = 0, + Armature = 1, + Mesh = 2, + BoundingBox = 3, + } + /** + * @language zh_CN + * 包围盒类型。 + * @version DragonBones 5.0 + */ + const enum BoundingBoxType { + Rectangle = 0, + Ellipse = 1, + Polygon = 2, + } + /** + * @private + */ + const enum ActionType { + Play = 0, + Frame = 10, + Sound = 11, + } + /** + * @private + */ + const enum BlendMode { + Normal = 0, + Add = 1, + Alpha = 2, + Darken = 3, + Difference = 4, + Erase = 5, + HardLight = 6, + Invert = 7, + Layer = 8, + Lighten = 9, + Multiply = 10, + Overlay = 11, + Screen = 12, + Subtract = 13, + } + /** + * @private + */ + const enum TweenType { + None = 0, + Line = 1, + Curve = 2, + QuadIn = 3, + QuadOut = 4, + QuadInOut = 5, + } + /** + * @private + */ + const enum TimelineType { + Action = 0, + ZOrder = 1, + BoneAll = 10, + BoneT = 11, + BoneR = 12, + BoneS = 13, + BoneX = 14, + BoneY = 15, + BoneRotate = 16, + BoneSkew = 17, + BoneScaleX = 18, + BoneScaleY = 19, + SlotVisible = 23, + SlotDisplay = 20, + SlotColor = 21, + SlotFFD = 22, + AnimationTime = 40, + AnimationWeight = 41, + } + /** + * @private + */ + const enum OffsetMode { + None = 0, + Additive = 1, + Override = 2, + } + /** + * @language zh_CN + * 动画混合的淡出方式。 + * @version DragonBones 4.5 + */ + const enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + None = 0, + /** + * 淡出同层的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer = 1, + /** + * 淡出同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup = 2, + /** + * 淡出同层并且同组的动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup = 3, + /** + * 淡出所有动画。 + * @version DragonBones 4.5 + * @language zh_CN + */ + All = 4, + /** + * 不替换同名动画。 + * @version DragonBones 5.1 + * @language zh_CN + */ + Single = 5, + } + /** + * @private + */ + interface Map { + [key: string]: T; + } + /** + * @private + */ + class DragonBones { + static yDown: boolean; + static debug: boolean; + static debugDraw: boolean; + static webAssembly: boolean; + static readonly VERSION: string; + private readonly _clock; + private readonly _events; + private readonly _objects; + private _eventManager; + constructor(eventManager: IEventDispatcher); + advanceTime(passedTime: number): void; + bufferEvent(value: EventObject): void; + bufferObject(object: BaseObject): void; + readonly clock: WorldClock; + readonly eventManager: IEventDispatcher; + } +} +declare namespace dragonBones { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class BaseObject { + private static _hashCode; + private static _defaultMaxCount; + private static readonly _maxCountMap; + private static readonly _poolsMap; + private static _returnObject(object); + /** + * @private + */ + static toString(): string; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static setMaxCount(objectConstructor: (typeof BaseObject) | null, maxCount: number): void; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + static clearPool(objectConstructor?: (typeof BaseObject) | null): void; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static borrowObject(objectConstructor: { + new (): T; + }): T; + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly hashCode: number; + private _isInPool; + /** + * @private + */ + protected abstract _onClear(): void; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + returnToPool(): void; + } +} +declare namespace dragonBones { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Matrix { + a: number; + b: number; + c: number; + d: number; + tx: number; + ty: number; + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Matrix): Matrix; + /** + * @private + */ + copyFromArray(value: Array, offset?: number): Matrix; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + identity(): Matrix; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + concat(value: Matrix): Matrix; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + invert(): Matrix; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + transformPoint(x: number, y: number, result: { + x: number; + y: number; + }, delta?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class Transform { + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x: number; + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y: number; + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew: number; + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation: number; + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX: number; + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY: number; + /** + * @private + */ + static readonly PI_D: number; + /** + * @private + */ + static readonly PI_H: number; + /** + * @private + */ + static readonly PI_Q: number; + /** + * @private + */ + static readonly RAD_DEG: number; + /** + * @private + */ + static readonly DEG_RAD: number; + /** + * @private + */ + static normalizeRadian(value: number): number; + constructor( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x?: number, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y?: number, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew?: number, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation?: number, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX?: number, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY?: number); + /** + * @private + */ + toString(): string; + /** + * @private + */ + copyFrom(value: Transform): Transform; + /** + * @private + */ + identity(): Transform; + /** + * @private + */ + add(value: Transform): Transform; + /** + * @private + */ + minus(value: Transform): Transform; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fromMatrix(matrix: Matrix): Transform; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + toMatrix(matrix: Matrix): Transform; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ColorTransform { + alphaMultiplier: number; + redMultiplier: number; + greenMultiplier: number; + blueMultiplier: number; + alphaOffset: number; + redOffset: number; + greenOffset: number; + blueOffset: number; + constructor(alphaMultiplier?: number, redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaOffset?: number, redOffset?: number, greenOffset?: number, blueOffset?: number); + copyFrom(value: ColorTransform): void; + identity(): void; + } +} +declare namespace dragonBones { + class Point { + x: number; + y: number; + constructor(x?: number, y?: number); + copyFrom(value: Point): void; + clear(): void; + } +} +declare namespace dragonBones { + class Rectangle { + x: number; + y: number; + width: number; + height: number; + constructor(x?: number, y?: number, width?: number, height?: number); + copyFrom(value: Rectangle): void; + clear(): void; + } +} +declare namespace dragonBones { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + class UserData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly ints: Array; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly floats: Array; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly strings: Array; + /** + * @private + */ + protected _onClear(): void; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getInt(index?: number): number; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getFloat(index?: number): number; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + getString(index?: number): string; + } + /** + * @private + */ + class ActionData extends BaseObject { + static toString(): string; + type: ActionType; + name: string; + bone: BoneData | null; + slot: SlotData | null; + data: UserData | null; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + class DragonBonesData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * 动画帧频。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * 数据版本。 + * @version DragonBones 3.0 + * @language zh_CN + */ + version: string; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly frameIndices: Array; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatureNames: Array; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armatures: Map; + /** + * @private + */ + intArray: Array | Int16Array; + /** + * @private + */ + floatArray: Array | Float32Array; + /** + * @private + */ + frameIntArray: Array | Int16Array; + /** + * @private + */ + frameFloatArray: Array | Float32Array; + /** + * @private + */ + frameArray: Array | Int16Array; + /** + * @private + */ + timelineArray: Array | Uint16Array; + /** + * @private + */ + userData: UserData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addArmature(value: ArmatureData): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + getArmature(name: string): ArmatureData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + dispose(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + class CanvasData extends BaseObject { + /** + * @private + */ + static toString(): string; + hasBackground: boolean; + color: number; + x: number; + y: number; + width: number; + height: number; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class ArmatureData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + type: ArmatureType; + /** + * 动画帧率。 + * @version DragonBones 3.0 + * @language zh_CN + */ + frameRate: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * @private + */ + scale: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly aabb: Rectangle; + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * @private + */ + readonly sortedBones: Array; + /** + * @private + */ + readonly sortedSlots: Array; + /** + * @private + */ + readonly defaultActions: Array; + /** + * @private + */ + readonly actions: Array; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly bones: Map; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly slots: Map; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly skins: Map; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animations: Map; + /** + * 获取默认皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultSkin: SkinData | null; + /** + * 获取默认动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + defaultAnimation: AnimationData | null; + /** + * @private + */ + canvas: CanvasData | null; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的龙骨数据。 + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parent: DragonBonesData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + sortBones(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + setCacheFrame(globalTransformMatrix: Matrix, transform: Transform): number; + /** + * @private + */ + getCacheFrame(globalTransformMatrix: Matrix, transform: Transform, arrayOffset: number): void; + /** + * @private + */ + addBone(value: BoneData): void; + /** + * @private + */ + addSlot(value: SlotData): void; + /** + * @private + */ + addSkin(value: SkinData): void; + /** + * @private + */ + addAnimation(value: AnimationData): void; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + getBone(name: string): BoneData | null; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + getSlot(name: string): SlotData | null; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + getSkin(name: string): SkinData | null; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + getAnimation(name: string): AnimationData | null; + } + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class BoneData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + inheritTranslation: boolean; + /** + * @private + */ + inheritRotation: boolean; + /** + * @private + */ + inheritScale: boolean; + /** + * @private + */ + inheritReflection: boolean; + /** + * @private + */ + length: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly transform: Transform; + /** + * @private + */ + readonly constraints: Array; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData | null; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class SlotData extends BaseObject { + /** + * @private + */ + static readonly DEFAULT_COLOR: ColorTransform; + /** + * @private + */ + static createColor(): ColorTransform; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + blendMode: BlendMode; + /** + * @private + */ + displayIndex: number; + /** + * @private + */ + zOrder: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + color: ColorTransform; + /** + * @private + */ + userData: UserData | null; + /** + * 所属的父骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + parent: BoneData; + /** + * @private + */ + protected _onClear(): void; + } + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + class SkinData extends BaseObject { + static toString(): string; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly displays: Map>; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + addDisplay(slotName: string, value: DisplayData | null): void; + /** + * @private + */ + getDisplay(slotName: string, displayName: string): DisplayData | null; + /** + * @private + */ + getDisplays(slotName: string): Array | null; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class ConstraintData extends BaseObject { + order: number; + target: BoneData; + bone: BoneData; + root: BoneData | null; + protected _onClear(): void; + } + /** + * @private + */ + class IKConstraintData extends ConstraintData { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DisplayData extends BaseObject { + type: DisplayType; + name: string; + path: string; + readonly transform: Transform; + parent: ArmatureData; + protected _onClear(): void; + } + /** + * @private + */ + class ImageDisplayData extends DisplayData { + static toString(): string; + readonly pivot: Point; + texture: TextureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class ArmatureDisplayData extends DisplayData { + static toString(): string; + inheritAnimation: boolean; + readonly actions: Array; + armature: ArmatureData | null; + protected _onClear(): void; + } + /** + * @private + */ + class MeshDisplayData extends ImageDisplayData { + static toString(): string; + inheritAnimation: boolean; + offset: number; + weight: WeightData | null; + protected _onClear(): void; + } + /** + * @private + */ + class BoundingBoxDisplayData extends DisplayData { + static toString(): string; + boundingBox: BoundingBoxData | null; + protected _onClear(): void; + } + /** + * @private + */ + class WeightData extends BaseObject { + static toString(): string; + count: number; + offset: number; + readonly bones: Array; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * @version DragonBones 5.0 + * @language zh_CN + */ + type: BoundingBoxType; + /** + * 边界框颜色。 + * @version DragonBones 5.0 + * @language zh_CN + */ + color: number; + /** + * 边界框宽。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + width: number; + /** + * 边界框高。(本地坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + height: number; + /** + * @private + */ + protected _onClear(): void; + /** + * 是否包含点。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract containsPoint(pX: number, pY: number): boolean; + /** + * 是否与线段相交。 + * @version DragonBones 5.0 + * @language zh_CN + */ + abstract intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA: { + x: number; + y: number; + } | null, intersectionPointB: { + x: number; + y: number; + } | null, normalRadians: { + x: number; + y: number; + } | null): number; + } + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class RectangleBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static _computeOutCode(x, y, xMin, yMin, xMax, yMax); + /** + * @private + */ + static rectangleIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xMin: number, yMin: number, xMax: number, yMax: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class EllipseBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static ellipseIntersectsSegment(xA: number, yA: number, xB: number, yB: number, xC: number, yC: number, widthH: number, heightH: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + class PolygonBoundingBoxData extends BoundingBoxData { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + static polygonIntersectsSegment(xA: number, yA: number, xB: number, yB: number, vertices: Array | Float32Array, offset: number, count: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * @private + */ + count: number; + /** + * @private + */ + offset: number; + /** + * @private + */ + x: number; + /** + * @private + */ + y: number; + /** + * 多边形顶点。 + * @version DragonBones 5.1 + * @language zh_CN + */ + vertices: Array | Float32Array; + /** + * @private + */ + weight: WeightData | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @inherDoc + */ + containsPoint(pX: number, pY: number): boolean; + /** + * @inherDoc + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + } +} +declare namespace dragonBones { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationData extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * @private + */ + frameIntOffset: number; + /** + * @private + */ + frameFloatOffset: number; + /** + * @private + */ + frameOffset: number; + /** + * 持续的帧数。 ([1~N]) + * @version DragonBones 3.0 + * @language zh_CN + */ + frameCount: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 持续时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + duration: number; + /** + * @private + */ + scale: number; + /** + * 淡入时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * @private + */ + cacheFrameRate: number; + /** + * 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * @private + */ + readonly cachedFrames: Array; + /** + * @private + */ + readonly boneTimelines: Map>; + /** + * @private + */ + readonly slotTimelines: Map>; + /** + * @private + */ + readonly boneCachedFrameIndices: Map>; + /** + * @private + */ + readonly slotCachedFrameIndices: Map>; + /** + * @private + */ + actionTimeline: TimelineData | null; + /** + * @private + */ + zOrderTimeline: TimelineData | null; + /** + * @private + */ + parent: ArmatureData; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + cacheFrames(frameRate: number): void; + /** + * @private + */ + addBoneTimeline(bone: BoneData, timeline: TimelineData): void; + /** + * @private + */ + addSlotTimeline(slot: SlotData, timeline: TimelineData): void; + /** + * @private + */ + getBoneTimelines(name: string): Array | null; + /** + * @private + */ + getSlotTimeline(name: string): Array | null; + /** + * @private + */ + getBoneCachedFrameIndices(name: string): Array | null; + /** + * @private + */ + getSlotCachedFrameIndices(name: string): Array | null; + } + /** + * @private + */ + class TimelineData extends BaseObject { + static toString(): string; + type: TimelineType; + offset: number; + frameIndicesOffset: number; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + class AnimationConfig extends BaseObject { + static toString(): string; + /** + * 是否暂停淡出的动画。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeOut: boolean; + /** + * 淡出模式。 + * @default dragonBones.AnimationFadeOutMode.All + * @see dragonBones.AnimationFadeOutMode + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutMode: AnimationFadeOutMode; + /** + * 淡出缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTweenType: TweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeOutTime: number; + /** + * 否能触发行为。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 是否以增加的方式混合。 + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + pauseFadeIn: boolean; + /** + * 是否将没有动画的对象重置为初始值。 + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 淡入缓动方式。 + * @default TweenType.Line + * @see dragonBones.TweenType + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTweenType: TweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + playTimes: number; + /** + * 混合图层,图层高会优先获取混合权重。 + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + layer: number; + /** + * 开始时间。 (以秒为单位) + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + position: number; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + duration: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + fadeInTime: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * 混合权重。 + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + weight: number; + /** + * 动画状态名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + name: string; + /** + * 动画数据名。 + * @version DragonBones 5.0 + * @language zh_CN + */ + animation: string; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * @version DragonBones 5.0 + * @language zh_CN + */ + group: string; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly boneMask: Array; + /** + * @private + */ + protected _onClear(): void; + clear(): void; + copyFrom(value: AnimationConfig): void; + containsBoneMask(name: string): boolean; + addBoneMask(armature: Armature, name: string, recursive?: boolean): void; + removeBoneMask(armature: Armature, name: string, recursive?: boolean): void; + } +} +declare namespace dragonBones { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + width: number; + /** + * @private + */ + height: number; + /** + * 贴图集缩放系数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scale: number; + /** + * 贴图集名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 贴图集图片路径。 + * @version DragonBones 3.0 + * @language zh_CN + */ + imagePath: string; + /** + * @private + */ + readonly textures: Map; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + copyFrom(value: TextureAtlasData): void; + /** + * @private + */ + abstract createTexture(): TextureData; + /** + * @private + */ + addTexture(value: TextureData): void; + /** + * @private + */ + getTexture(name: string): TextureData | null; + } + /** + * @private + */ + abstract class TextureData extends BaseObject { + static createRectangle(): Rectangle; + rotated: boolean; + name: string; + readonly region: Rectangle; + parent: TextureAtlasData; + frame: Rectangle | null; + protected _onClear(): void; + copyFrom(value: TextureData): void; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * 骨架代理接口。 + * @version DragonBones 5.0 + */ + interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + init(armature: Armature): void; + /** + * @private + */ + clear(): void; + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + dispose(disposeProxy: boolean): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @language zh_CN + * 获取骨架。 + * @see dragonBones.Armature + * @version DragonBones 4.5 + */ + readonly armature: Armature; + /** + * @language zh_CN + * 获取动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 4.5 + */ + readonly animation: Animation; + } +} +declare namespace dragonBones { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + class Armature extends BaseObject implements IAnimatable { + static toString(): string; + private static _onSortSlots(a, b); + /** + * 是否继承父骨架的动画状态。 + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + inheritAnimation: boolean; + /** + * @private + */ + debugDraw: boolean; + /** + * 获取骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + */ + armatureData: ArmatureData; + /** + * 用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + private _debugDraw; + private _lockUpdate; + private _bonesDirty; + private _slotsDirty; + private _zOrderDirty; + private _flipX; + private _flipY; + /** + * @internal + * @private + */ + _cacheFrameIndex: number; + private readonly _bones; + private readonly _slots; + private readonly _actions; + private _animation; + private _proxy; + private _display; + /** + * @private + */ + _replaceTextureAtlasData: TextureAtlasData | null; + private _replacedTexture; + /** + * @internal + * @private + */ + _dragonBones: DragonBones; + private _clock; + /** + * @internal + * @private + */ + _parent: Slot | null; + /** + * @private + */ + protected _onClear(): void; + private _sortBones(); + private _sortSlots(); + /** + * @internal + * @private + */ + _sortZOrder(slotIndices: Array | Int16Array | null, offset: number): void; + /** + * @internal + * @private + */ + _addBoneToBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _removeBoneFromBoneList(value: Bone): void; + /** + * @internal + * @private + */ + _addSlotToSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _removeSlotFromSlotList(value: Slot): void; + /** + * @internal + * @private + */ + _bufferAction(action: ActionData, append: boolean): void; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + dispose(): void; + /** + * @private + */ + init(armatureData: ArmatureData, proxy: IArmatureProxy, display: any, dragonBones: DragonBones): void; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(boneName?: string | null, updateSlotDisplay?: boolean): void; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): Slot | null; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): Slot | null; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBone(name: string): Bone | null; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBoneByDisplay(display: any): Bone | null; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlot(name: string): Slot | null; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlotByDisplay(display: any): Slot | null; + /** + * @deprecated + */ + addBone(value: Bone, parentName?: string | null): void; + /** + * @deprecated + */ + removeBone(value: Bone): void; + /** + * @deprecated + */ + addSlot(value: Slot, parentName: string): void; + /** + * @deprecated + */ + removeSlot(value: Slot): void; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + flipX: boolean; + flipY: boolean; + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + cacheFrameRate: number; + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly name: string; + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly animation: Animation; + /** + * @pivate + */ + readonly proxy: IArmatureProxy; + /** + * @pivate + */ + readonly eventDispatcher: IEventDispatcher; + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly display: any; + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + replacedTexture: any; + /** + * @inheritDoc + */ + clock: WorldClock | null; + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly parent: Slot | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + replaceTexture(texture: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + hasEventListener(type: EventStringType): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + addEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + removeEventListener(type: EventStringType, listener: Function, target: any): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + enableAnimationCache(frameRate: number): void; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + } +} +declare namespace dragonBones { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static readonly _helpMatrix: Matrix; + /** + * @private + */ + protected static readonly _helpTransform: Transform; + /** + * @private + */ + protected static readonly _helpPoint: Point; + /** + * 对象的名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + name: string; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly globalTransformMatrix: Matrix; + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly global: Transform; + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly offset: Transform; + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + */ + origin: Transform; + /** + * 可以用于存储临时数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + userData: any; + /** + * @private + */ + protected _globalDirty: boolean; + /** + * @private + */ + _armature: Armature; + /** + * @private + */ + _parent: Bone; + /** + * @private + */ + protected _onClear(): void; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setParent(value: Bone | null): void; + /** + * @private + */ + updateGlobalTransform(): void; + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly armature: Armature; + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly parent: Bone; + } +} +declare namespace dragonBones { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + class Bone extends TransformObject { + static toString(): string; + /** + * @private + */ + offsetMode: OffsetMode; + /** + * @internal + * @private + */ + readonly animationPose: Transform; + /** + * @internal + * @private + */ + readonly constraints: Array; + /** + * @readonly + */ + boneData: BoneData; + /** + * @internal + * @private + */ + _transformDirty: boolean; + /** + * @internal + * @private + */ + _childrenTransformDirty: boolean; + /** + * @internal + * @private + */ + _blendDirty: boolean; + private _localDirty; + private _visible; + private _cachedFrameIndex; + /** + * @internal + * @private + */ + _blendLayer: number; + /** + * @internal + * @private + */ + _blendLeftWeight: number; + /** + * @internal + * @private + */ + _blendLayerWeight: number; + private readonly _bones; + private readonly _slots; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + private _updateGlobalTransformMatrix(isCache); + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + init(boneData: BoneData): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @internal + * @private + */ + updateByConstraint(): void; + /** + * @internal + * @private + */ + addConstraint(constraint: Constraint): void; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(child: TransformObject): boolean; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getBones(): Array; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + getSlots(): Array; + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + visible: boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + readonly length: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + readonly slot: Slot | null; + } +} +declare namespace dragonBones { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * @default null + * @see dragonBones.AnimationState#displayControl + * @see dragonBones.AnimationState#name + * @see dragonBones.AnimationState#group + * @version DragonBones 4.5 + * @language zh_CN + */ + displayController: string | null; + /** + * @readonly + */ + slotData: SlotData; + /** + * @private + */ + protected _displayDirty: boolean; + /** + * @private + */ + protected _zOrderDirty: boolean; + /** + * @private + */ + protected _visibleDirty: boolean; + /** + * @private + */ + protected _blendModeDirty: boolean; + /** + * @private + */ + _colorDirty: boolean; + /** + * @private + */ + _meshDirty: boolean; + /** + * @private + */ + protected _transformDirty: boolean; + /** + * @private + */ + protected _visible: boolean; + /** + * @private + */ + protected _blendMode: BlendMode; + /** + * @private + */ + protected _displayIndex: number; + /** + * @private + */ + protected _animationDisplayIndex: number; + /** + * @private + */ + _zOrder: number; + /** + * @private + */ + protected _cachedFrameIndex: number; + /** + * @private + */ + _pivotX: number; + /** + * @private + */ + _pivotY: number; + /** + * @private + */ + protected readonly _localMatrix: Matrix; + /** + * @private + */ + readonly _colorTransform: ColorTransform; + /** + * @private + */ + readonly _ffdVertices: Array; + /** + * @private + */ + readonly _displayDatas: Array; + /** + * @private + */ + protected readonly _displayList: Array; + /** + * @private + */ + protected readonly _meshBones: Array; + /** + * @internal + * @private + */ + _rawDisplayDatas: Array; + /** + * @private + */ + protected _displayData: DisplayData | null; + /** + * @private + */ + protected _textureData: TextureData | null; + /** + * @private + */ + _meshData: MeshDisplayData | null; + /** + * @private + */ + protected _boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + protected _rawDisplay: any; + /** + * @private + */ + protected _meshDisplay: any; + /** + * @private + */ + protected _display: any; + /** + * @private + */ + protected _childArmature: Armature | null; + /** + * @internal + * @private + */ + _cachedFrameIndices: Array | null; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected abstract _initDisplay(value: any): void; + /** + * @private + */ + protected abstract _disposeDisplay(value: any): void; + /** + * @private + */ + protected abstract _onUpdateDisplay(): void; + /** + * @private + */ + protected abstract _addDisplay(): void; + /** + * @private + */ + protected abstract _replaceDisplay(value: any): void; + /** + * @private + */ + protected abstract _removeDisplay(): void; + /** + * @private + */ + protected abstract _updateZOrder(): void; + /** + * @private + */ + abstract _updateVisible(): void; + /** + * @private + */ + protected abstract _updateBlendMode(): void; + /** + * @private + */ + protected abstract _updateColor(): void; + /** + * @private + */ + protected abstract _updateFrame(): void; + /** + * @private + */ + protected abstract _updateMesh(): void; + /** + * @private + */ + protected abstract _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateDisplayData(): void; + /** + * @private + */ + protected _updateDisplay(): void; + /** + * @private + */ + protected _updateGlobalTransformMatrix(isCache: boolean): void; + /** + * @private + */ + protected _isMeshBonesUpdate(): boolean; + /** + * @internal + * @private + */ + _setArmature(value: Armature | null): void; + /** + * @internal + * @private + */ + _setDisplayIndex(value: number, isAnimation?: boolean): boolean; + /** + * @internal + * @private + */ + _setZorder(value: number): boolean; + /** + * @internal + * @private + */ + _setColor(value: ColorTransform): boolean; + /** + * @private + */ + _setDisplayList(value: Array | null): boolean; + /** + * @private + */ + init(slotData: SlotData, displayDatas: Array, rawDisplay: any, meshDisplay: any): void; + /** + * @internal + * @private + */ + update(cacheFrameIndex: number): void; + /** + * @private + */ + updateTransformAndMatrix(): void; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + containsPoint(x: number, y: number): boolean; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + intersectsSegment(xA: number, yA: number, xB: number, yB: number, intersectionPointA?: { + x: number; + y: number; + } | null, intersectionPointB?: { + x: number; + y: number; + } | null, normalRadians?: { + x: number; + y: number; + } | null): number; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + invalidUpdate(): void; + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + displayIndex: number; + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + displayList: Array; + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + readonly boundingBoxData: BoundingBoxData | null; + /** + * @private + */ + readonly rawDisplay: any; + /** + * @private + */ + readonly meshDisplay: any; + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + display: any; + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + childArmature: Armature | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + getDisplay(): any; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + setDisplay(value: any): void; + } +} +declare namespace dragonBones { + /** + * @private + * @internal + */ + abstract class Constraint extends BaseObject { + protected static readonly _helpMatrix: Matrix; + protected static readonly _helpTransform: Transform; + protected static readonly _helpPoint: Point; + target: Bone; + bone: Bone; + root: Bone | null; + protected _onClear(): void; + abstract update(): void; + } + /** + * @private + * @internal + */ + class IKConstraint extends Constraint { + static toString(): string; + bendPositive: boolean; + scaleEnabled: boolean; + weight: number; + protected _onClear(): void; + private _computeA(); + private _computeB(); + update(): void; + } +} +declare namespace dragonBones { + /** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * @see dragonBones.WorldClock + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + interface IAnimatable { + /** + * 更新时间。 + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 当前所属的 WordClock 实例。 + * @version DragonBones 5.0 + * @language zh_CN + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + time: number; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private readonly _animatebles; + private _clock; + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(time?: number); + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + advanceTime(passedTime: number): void; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + contains(value: IAnimatable): boolean; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + add(value: IAnimatable): void; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + remove(value: IAnimatable): void; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + clear(): void; + /** + * @inheritDoc + */ + clock: WorldClock | null; + } +} +declare namespace dragonBones { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + class Animation extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + private _animationDirty; + /** + * @internal + * @private + */ + _timelineDirty: boolean; + private readonly _animationNames; + private readonly _animationStates; + private readonly _animations; + private _armature; + private _animationConfig; + private _lastAnimationState; + /** + * @private + */ + protected _onClear(): void; + private _fadeOut(animationConfig); + /** + * @internal + * @private + */ + init(armature: Armature): void; + /** + * @internal + * @private + */ + advanceTime(passedTime: number): void; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + reset(): void; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(animationName?: string | null): void; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + playConfig(animationConfig: AnimationConfig): AnimationState | null; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + play(animationName?: string | null, playTimes?: number): AnimationState | null; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + fadeIn(animationName: string, fadeInTime?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode): AnimationState | null; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByTime(animationName: string, time?: number, playTimes?: number): AnimationState | null; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByFrame(animationName: string, frame?: number, playTimes?: number): AnimationState | null; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndPlayByProgress(animationName: string, progress?: number, playTimes?: number): AnimationState | null; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByTime(animationName: string, time?: number): AnimationState | null; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByFrame(animationName: string, frame?: number): AnimationState | null; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + gotoAndStopByProgress(animationName: string, progress?: number): AnimationState | null; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + getState(animationName: string): AnimationState | null; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + hasAnimation(animationName: string): boolean; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + getStates(): Array; + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationName: string; + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly animationNames: Array; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + animations: Map; + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + readonly animationConfig: AnimationConfig; + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly lastAnimationState: AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + gotoAndPlay(animationName: string, fadeInTime?: number, duration?: number, playTimes?: number, layer?: number, group?: string | null, fadeOutMode?: AnimationFadeOutMode, pauseFadeOut?: boolean, pauseFadeIn?: boolean): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + gotoAndStop(animationName: string, time?: number): AnimationState | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationList: Array; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + readonly animationDataList: Array; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class BonePose extends BaseObject { + static toString(): string; + readonly current: Transform; + readonly delta: Transform; + readonly result: Transform; + protected _onClear(): void; + } + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + class AnimationState extends BaseObject { + /** + * @private + */ + static toString(): string; + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * @version DragonBones 5.1 + * @language zh_CN + */ + resetToPose: boolean; + /** + * 是否以增加的方式混合。 + * @version DragonBones 3.0 + * @language zh_CN + */ + additiveBlending: boolean; + /** + * 是否对插槽的显示对象有控制权。 + * @see dragonBones.Slot#displayController + * @version DragonBones 3.0 + * @language zh_CN + */ + displayControl: boolean; + /** + * 是否能触发行为。 + * @version DragonBones 5.0 + * @language zh_CN + */ + actionEnabled: boolean; + /** + * 混合图层。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + layer: number; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * @version DragonBones 3.0 + * @language zh_CN + */ + playTimes: number; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @version DragonBones 3.0 + * @language zh_CN + */ + timeScale: number; + /** + * 混合权重。 + * @version DragonBones 3.0 + * @language zh_CN + */ + weight: number; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * @version DragonBones 3.0 + * @language zh_CN + */ + autoFadeOutTime: number; + /** + * @private + */ + fadeTotalTime: number; + /** + * 动画名称。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + name: string; + /** + * 混合组。 + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + group: string; + /** + * 动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + animationData: AnimationData; + private _timelineDirty; + /** + * @internal + * @private + * xx: Play Enabled, Fade Play Enabled + */ + _playheadState: number; + /** + * @internal + * @private + * -1: Fade in, 0: Fade complete, 1: Fade out; + */ + _fadeState: number; + /** + * @internal + * @private + * -1: Fade start, 0: Fading, 1: Fade complete; + */ + _subFadeState: number; + /** + * @internal + * @private + */ + _position: number; + /** + * @internal + * @private + */ + _duration: number; + private _fadeTime; + private _time; + /** + * @internal + * @private + */ + _fadeProgress: number; + private _weightResult; + private readonly _boneMask; + private readonly _boneTimelines; + private readonly _slotTimelines; + private readonly _bonePoses; + private _armature; + /** + * @internal + * @private + */ + _actionTimeline: ActionTimelineState; + private _zOrderTimeline; + /** + * @private + */ + protected _onClear(): void; + private _isDisabled(slot); + private _advanceFadeTime(passedTime); + private _blendBoneTimline(timeline); + /** + * @private + * @internal + */ + init(armature: Armature, animationData: AnimationData, animationConfig: AnimationConfig): void; + /** + * @private + * @internal + */ + updateTimelines(): void; + /** + * @private + * @internal + */ + advanceTime(passedTime: number, cacheFrameRate: number): void; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + play(): void; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + stop(): void; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + fadeOut(fadeOutTime: number, pausePlayhead?: boolean): void; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + containsBoneMask(name: string): boolean; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + addBoneMask(name: string, recursive?: boolean): void; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeBoneMask(name: string, recursive?: boolean): void; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + removeAllBoneMask(): void; + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeIn: boolean; + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeOut: boolean; + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + readonly isFadeComplete: boolean; + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isPlaying: boolean; + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly isCompleted: boolean; + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly currentPlayTimes: number; + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + readonly totalTime: number; + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + currentTime: number; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + readonly clip: AnimationData; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + const enum TweenState { + None = 0, + Once = 1, + Always = 2, + } + /** + * @internal + * @private + */ + abstract class TimelineState extends BaseObject { + playState: number; + currentPlayTimes: number; + currentTime: number; + protected _tweenState: TweenState; + protected _frameRate: number; + protected _frameValueOffset: number; + protected _frameCount: number; + protected _frameOffset: number; + protected _frameIndex: number; + protected _frameRateR: number; + protected _position: number; + protected _duration: number; + protected _timeScale: number; + protected _timeOffset: number; + protected _dragonBonesData: DragonBonesData; + protected _animationData: AnimationData; + protected _timelineData: TimelineData | null; + protected _armature: Armature; + protected _animationState: AnimationState; + protected _actionTimeline: TimelineState; + protected _frameArray: Array | Int16Array; + protected _frameIntArray: Array | Int16Array; + protected _frameFloatArray: Array | Int16Array; + protected _timelineArray: Array | Uint16Array; + protected _frameIndices: Array; + protected _onClear(): void; + protected abstract _onArriveAtFrame(): void; + protected abstract _onUpdateFrame(): void; + protected _setCurrentTime(passedTime: number): boolean; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + abstract class TweenTimelineState extends TimelineState { + private static _getEasingValue(tweenType, progress, easing); + private static _getEasingCurveValue(progress, samples, count, offset); + protected _tweenType: TweenType; + protected _curveCount: number; + protected _framePosition: number; + protected _frameDurationR: number; + protected _tweenProgress: number; + protected _tweenEasing: number; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + abstract class BoneTimelineState extends TweenTimelineState { + bone: Bone; + bonePose: BonePose; + protected _onClear(): void; + } + /** + * @internal + * @private + */ + abstract class SlotTimelineState extends TweenTimelineState { + slot: Slot; + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @internal + * @private + */ + class ActionTimelineState extends TimelineState { + static toString(): string; + private _onCrossFrame(frameIndex); + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + update(passedTime: number): void; + setCurrentTime(value: number): void; + } + /** + * @internal + * @private + */ + class ZOrderTimelineState extends TimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + } + /** + * @internal + * @private + */ + class BoneAllTimelineState extends BoneTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + } + /** + * @internal + * @private + */ + class SlotDislayIndexTimelineState extends SlotTimelineState { + static toString(): string; + protected _onArriveAtFrame(): void; + } + /** + * @internal + * @private + */ + class SlotColorTimelineState extends SlotTimelineState { + static toString(): string; + private _dirty; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + fadeOut(): void; + update(passedTime: number): void; + } + /** + * @internal + * @private + */ + class SlotFFDTimelineState extends SlotTimelineState { + static toString(): string; + meshOffset: number; + private _dirty; + private _frameFloatOffset; + private _valueCount; + private _ffdCount; + private _valueOffset; + private readonly _current; + private readonly _delta; + private readonly _result; + protected _onClear(): void; + protected _onArriveAtFrame(): void; + protected _onUpdateFrame(): void; + init(armature: Armature, animationState: AnimationState, timelineData: TimelineData | null): void; + fadeOut(): void; + update(passedTime: number): void; + } +} +declare namespace dragonBones { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + class EventObject extends BaseObject { + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly START: string; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly LOOP_COMPLETE: string; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly COMPLETE: string; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN: string; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_IN_COMPLETE: string; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT: string; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FADE_OUT_COMPLETE: string; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly FRAME_EVENT: string; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + static readonly SOUND_EVENT: string; + /** + * @private + */ + static toString(): string; + /** + * @private + */ + time: number; + /** + * 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + type: EventStringType; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * @version DragonBones 4.5 + * @language zh_CN + */ + name: string; + /** + * 发出事件的骨架。 + * @version DragonBones 4.5 + * @language zh_CN + */ + armature: Armature; + /** + * 发出事件的骨骼。 + * @version DragonBones 4.5 + * @language zh_CN + */ + bone: Bone | null; + /** + * 发出事件的插槽。 + * @version DragonBones 4.5 + * @language zh_CN + */ + slot: Slot | null; + /** + * 发出事件的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + animationState: AnimationState; + /** + * 自定义数据 + * @see dragonBones.CustomData + * @version DragonBones 5.0 + * @language zh_CN + */ + data: UserData | null; + /** + * @private + */ + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + type EventStringType = string | "start" | "loopComplete" | "complete" | "fadeIn" | "fadeInComplete" | "fadeOut" | "fadeOutComplete" | "frameEvent" | "soundEvent"; + /** + * 事件接口。 + * @version DragonBones 4.5 + * @language zh_CN + */ + interface IEventDispatcher { + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * 是否包含指定类型的事件。 + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + hasEvent(type: EventStringType): boolean; + /** + * 添加事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + addEvent(type: EventStringType, listener: Function, target: any): void; + /** + * 移除事件。 + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + removeEvent(type: EventStringType, listener: Function, target: any): void; + } +} +declare namespace dragonBones { + /** + * @private + */ + abstract class DataParser { + protected static readonly DATA_VERSION_2_3: string; + protected static readonly DATA_VERSION_3_0: string; + protected static readonly DATA_VERSION_4_0: string; + protected static readonly DATA_VERSION_4_5: string; + protected static readonly DATA_VERSION_5_0: string; + protected static readonly DATA_VERSION: string; + protected static readonly DATA_VERSIONS: Array; + protected static readonly TEXTURE_ATLAS: string; + protected static readonly SUB_TEXTURE: string; + protected static readonly FORMAT: string; + protected static readonly IMAGE_PATH: string; + protected static readonly WIDTH: string; + protected static readonly HEIGHT: string; + protected static readonly ROTATED: string; + protected static readonly FRAME_X: string; + protected static readonly FRAME_Y: string; + protected static readonly FRAME_WIDTH: string; + protected static readonly FRAME_HEIGHT: string; + protected static readonly DRADON_BONES: string; + protected static readonly USER_DATA: string; + protected static readonly ARMATURE: string; + protected static readonly BONE: string; + protected static readonly IK: string; + protected static readonly SLOT: string; + protected static readonly SKIN: string; + protected static readonly DISPLAY: string; + protected static readonly ANIMATION: string; + protected static readonly Z_ORDER: string; + protected static readonly FFD: string; + protected static readonly FRAME: string; + protected static readonly TRANSLATE_FRAME: string; + protected static readonly ROTATE_FRAME: string; + protected static readonly SCALE_FRAME: string; + protected static readonly VISIBLE_FRAME: string; + protected static readonly DISPLAY_FRAME: string; + protected static readonly COLOR_FRAME: string; + protected static readonly DEFAULT_ACTIONS: string; + protected static readonly ACTIONS: string; + protected static readonly EVENTS: string; + protected static readonly INTS: string; + protected static readonly FLOATS: string; + protected static readonly STRINGS: string; + protected static readonly CANVAS: string; + protected static readonly TRANSFORM: string; + protected static readonly PIVOT: string; + protected static readonly AABB: string; + protected static readonly COLOR: string; + protected static readonly VERSION: string; + protected static readonly COMPATIBLE_VERSION: string; + protected static readonly FRAME_RATE: string; + protected static readonly TYPE: string; + protected static readonly SUB_TYPE: string; + protected static readonly NAME: string; + protected static readonly PARENT: string; + protected static readonly TARGET: string; + protected static readonly SHARE: string; + protected static readonly PATH: string; + protected static readonly LENGTH: string; + protected static readonly DISPLAY_INDEX: string; + protected static readonly BLEND_MODE: string; + protected static readonly INHERIT_TRANSLATION: string; + protected static readonly INHERIT_ROTATION: string; + protected static readonly INHERIT_SCALE: string; + protected static readonly INHERIT_REFLECTION: string; + protected static readonly INHERIT_ANIMATION: string; + protected static readonly INHERIT_FFD: string; + protected static readonly BEND_POSITIVE: string; + protected static readonly CHAIN: string; + protected static readonly WEIGHT: string; + protected static readonly FADE_IN_TIME: string; + protected static readonly PLAY_TIMES: string; + protected static readonly SCALE: string; + protected static readonly OFFSET: string; + protected static readonly POSITION: string; + protected static readonly DURATION: string; + protected static readonly TWEEN_TYPE: string; + protected static readonly TWEEN_EASING: string; + protected static readonly TWEEN_ROTATE: string; + protected static readonly TWEEN_SCALE: string; + protected static readonly CURVE: string; + protected static readonly SOUND: string; + protected static readonly EVENT: string; + protected static readonly ACTION: string; + protected static readonly X: string; + protected static readonly Y: string; + protected static readonly SKEW_X: string; + protected static readonly SKEW_Y: string; + protected static readonly SCALE_X: string; + protected static readonly SCALE_Y: string; + protected static readonly VALUE: string; + protected static readonly ROTATE: string; + protected static readonly SKEW: string; + protected static readonly ALPHA_OFFSET: string; + protected static readonly RED_OFFSET: string; + protected static readonly GREEN_OFFSET: string; + protected static readonly BLUE_OFFSET: string; + protected static readonly ALPHA_MULTIPLIER: string; + protected static readonly RED_MULTIPLIER: string; + protected static readonly GREEN_MULTIPLIER: string; + protected static readonly BLUE_MULTIPLIER: string; + protected static readonly UVS: string; + protected static readonly VERTICES: string; + protected static readonly TRIANGLES: string; + protected static readonly WEIGHTS: string; + protected static readonly SLOT_POSE: string; + protected static readonly BONE_POSE: string; + protected static readonly GOTO_AND_PLAY: string; + protected static readonly DEFAULT_NAME: string; + protected static _getArmatureType(value: string): ArmatureType; + protected static _getDisplayType(value: string): DisplayType; + protected static _getBoundingBoxType(value: string): BoundingBoxType; + protected static _getActionType(value: string): ActionType; + protected static _getBlendMode(value: string): BlendMode; + /** + * @private + */ + abstract parseDragonBonesData(rawData: any, scale: number): DragonBonesData | null; + /** + * @private + */ + abstract parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale: number): boolean; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static parseDragonBonesData(rawData: any): DragonBonesData | null; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + static parseTextureAtlasData(rawData: any, scale?: number): any; + } +} +declare namespace dragonBones { + /** + * @private + */ + class ObjectDataParser extends DataParser { + /** + * @private + */ + private _intArrayJson; + private _floatArrayJson; + private _frameIntArrayJson; + private _frameFloatArrayJson; + private _frameArrayJson; + private _timelineArrayJson; + private _intArrayBuffer; + private _floatArrayBuffer; + private _frameIntArrayBuffer; + private _frameFloatArrayBuffer; + private _frameArrayBuffer; + private _timelineArrayBuffer; + protected static _getBoolean(rawData: any, key: string, defaultValue: boolean): boolean; + /** + * @private + */ + protected static _getNumber(rawData: any, key: string, defaultValue: number): number; + /** + * @private + */ + protected static _getString(rawData: any, key: string, defaultValue: string): string; + protected _rawTextureAtlasIndex: number; + protected readonly _rawBones: Array; + protected _data: DragonBonesData; + protected _armature: ArmatureData; + protected _bone: BoneData; + protected _slot: SlotData; + protected _skin: SkinData; + protected _mesh: MeshDisplayData; + protected _animation: AnimationData; + protected _timeline: TimelineData; + protected _rawTextureAtlases: Array | null; + private _defalultColorOffset; + private _prevTweenRotate; + private _prevRotation; + private readonly _helpMatrixA; + private readonly _helpMatrixB; + private readonly _helpTransform; + private readonly _helpColorTransform; + private readonly _helpPoint; + private readonly _helpArray; + private readonly _actionFrames; + private readonly _weightSlotPose; + private readonly _weightBonePoses; + private readonly _weightBoneIndices; + private readonly _cacheBones; + private readonly _meshs; + private readonly _slotChildActions; + /** + * @private + */ + private _getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, t, result); + /** + * @private + */ + private _samplingEasingCurve(curve, samples); + private _sortActionFrame(a, b); + private _parseActionDataInFrame(rawData, frameStart, bone, slot); + private _mergeActionFrame(rawData, frameStart, type, bone, slot); + private _parseCacheActionFrame(frame); + /** + * @private + */ + protected _parseArmature(rawData: any, scale: number): ArmatureData; + /** + * @private + */ + protected _parseBone(rawData: any): BoneData; + /** + * @private + */ + protected _parseIKConstraint(rawData: any): void; + /** + * @private + */ + protected _parseSlot(rawData: any): SlotData; + /** + * @private + */ + protected _parseSkin(rawData: any): SkinData; + /** + * @private + */ + protected _parseDisplay(rawData: any): DisplayData | null; + /** + * @private + */ + protected _parsePivot(rawData: any, display: ImageDisplayData): void; + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parseBoundingBox(rawData: any): BoundingBoxData | null; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseTimeline(rawData: any, type: TimelineType, addIntOffset: boolean, addFloatOffset: boolean, frameValueCount: number, frameParser: (rawData: any, frameStart: number, frameCount: number) => number): TimelineData | null; + /** + * @private + */ + protected _parseBoneTimeline(rawData: any): void; + /** + * @private + */ + protected _parseSlotTimeline(rawData: any): void; + /** + * @private + */ + protected _parseFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseTweenFrame(rawData: any, frameStart: number, frameCount: number, frameArray: Array): number; + /** + * @private + */ + protected _parseZOrderFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseBoneFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotDisplayIndexFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotColorFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseSlotFFDFrame(rawData: any, frameStart: number, frameCount: number): number; + /** + * @private + */ + protected _parseActionData(rawData: any, actions: Array, type: ActionType, bone: BoneData | null, slot: SlotData | null): number; + /** + * @private + */ + protected _parseTransform(rawData: any, transform: Transform, scale: number): void; + /** + * @private + */ + protected _parseColorTransform(rawData: any, color: ColorTransform): void; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @private + */ + protected _parseWASMArray(): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @inheritDoc + */ + parseTextureAtlasData(rawData: any, textureAtlasData: TextureAtlasData, scale?: number): boolean; + /** + * @private + */ + private static _objectDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): ObjectDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BinaryDataParser extends ObjectDataParser { + private _binary; + private _binaryOffset; + private _intArray; + private _floatArray; + private _frameIntArray; + private _frameFloatArray; + private _frameArray; + private _timelineArray; + private _inRange(a, min, max); + private _decodeUTF8(data); + private _getUTF16Key(value); + private _parseBinaryTimeline(type, offset, timelineData?); + /** + * @private + */ + protected _parseMesh(rawData: any, mesh: MeshDisplayData): void; + /** + * @private + */ + protected _parsePolygonBoundingBox(rawData: any): PolygonBoundingBoxData; + /** + * @private + */ + protected _parseAnimation(rawData: any): AnimationData; + /** + * @private + */ + protected _parseArray(rawData: any): void; + /** + * @inheritDoc + */ + parseDragonBonesData(rawData: any, scale?: number): DragonBonesData | null; + /** + * @private + */ + private static _binaryDataParserInstance; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + static getInstance(): BinaryDataParser; + } +} +declare namespace dragonBones { + /** + * @private + */ + class BuildArmaturePackage { + dataName: string; + textureAtlasName: string; + data: DragonBonesData; + armature: ArmatureData; + skin: SkinData | null; + } + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + abstract class BaseFactory { + /** + * @private + */ + protected static _objectParser: ObjectDataParser; + /** + * @private + */ + protected static _binaryParser: BinaryDataParser; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + autoSearch: boolean; + /** + * @private + */ + protected readonly _dragonBonesDataMap: Map; + /** + * @private + */ + protected readonly _textureAtlasDataMap: Map>; + /** + * @private + */ + protected _dragonBones: DragonBones; + /** + * @private + */ + protected _dataParser: DataParser; + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _isSupportMesh(): boolean; + /** + * @private + */ + protected _getTextureData(textureAtlasName: string, textureName: string): TextureData | null; + /** + * @private + */ + protected _fillBuildArmaturePackage(dataPackage: BuildArmaturePackage, dragonBonesName: string, armatureName: string, skinName: string, textureAtlasName: string): boolean; + /** + * @private + */ + protected _buildBones(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _buildSlots(dataPackage: BuildArmaturePackage, armature: Armature): void; + /** + * @private + */ + protected _getSlotDisplay(dataPackage: BuildArmaturePackage | null, displayData: DisplayData, rawDisplayData: DisplayData | null, slot: Slot): any; + /** + * @private + */ + protected _replaceSlotDisplay(dataPackage: BuildArmaturePackage, displayData: DisplayData | null, slot: Slot, displayIndex: number): void; + /** + * @private + */ + protected abstract _buildTextureAtlasData(textureAtlasData: TextureAtlasData | null, textureAtlas: any): TextureAtlasData; + /** + * @private + */ + protected abstract _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected abstract _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseDragonBonesData(rawData: any, name?: string | null, scale?: number): DragonBonesData | null; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + parseTextureAtlasData(rawData: any, textureAtlas: any, name?: string | null, scale?: number): TextureAtlasData; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + updateTextureAtlasData(name: string, textureAtlases: Array): void; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + getDragonBonesData(name: string): DragonBonesData | null; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + addDragonBonesData(data: DragonBonesData, name?: string | null): void; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeDragonBonesData(name: string, disposeData?: boolean): void; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureAtlasData(name: string): Array | null; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + addTextureAtlasData(data: TextureAtlasData, name?: string | null): void; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + removeTextureAtlasData(name: string, disposeData?: boolean): void; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + getArmatureData(name: string, dragonBonesName?: string): ArmatureData | null; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + clear(disposeData?: boolean): void; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + buildArmature(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): Armature | null; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplay(dragonBonesName: string | null, armatureName: string, slotName: string, displayName: string, slot: Slot, displayIndex?: number): void; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + replaceSlotDisplayList(dragonBonesName: string | null, armatureName: string, slotName: string, slot: Slot): void; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + changeSkin(armature: Armature, skin: SkinData, exclude?: Array | null): void; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + copyAnimationsToArmature(toArmature: Armature, fromArmatreName: string, fromSkinName?: string | null, fromDragonBonesDataName?: string | null, replaceOriginalAnimation?: boolean): boolean; + /** + * @private + */ + getAllDragonBonesData(): Map; + /** + * @private + */ + getAllTextureAtlasData(): Map>; + } +} +declare namespace dragonBones { + /** + * @language zh_CN + * Pixi 贴图集数据。 + * @version DragonBones 3.0 + */ + class PixiTextureAtlasData extends TextureAtlasData { + static toString(): string; + private _renderTexture; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + createTexture(): TextureData; + /** + * Pixi 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + renderTexture: PIXI.BaseTexture | null; + } + /** + * @private + */ + class PixiTextureData extends TextureData { + static toString(): string; + renderTexture: PIXI.Texture | null; + constructor(); + protected _onClear(): void; + } +} +declare namespace dragonBones { + /** + * @inheritDoc + */ + class PixiArmatureDisplay extends PIXI.Container implements IArmatureProxy { + private _disposeProxy; + private _armature; + private _debugDrawer; + /** + * @inheritDoc + */ + init(armature: Armature): void; + /** + * @inheritDoc + */ + clear(): void; + /** + * @inheritDoc + */ + dispose(disposeProxy?: boolean): void; + /** + * @inheritDoc + */ + destroy(): void; + /** + * @private + */ + debugUpdate(isEnabled: boolean): void; + /** + * @private + */ + _dispatchEvent(type: EventStringType, eventObject: EventObject): void; + /** + * @inheritDoc + */ + hasEvent(type: EventStringType): boolean; + /** + * @inheritDoc + */ + addEvent(type: EventStringType, listener: (event: EventObject) => void, target: any): void; + /** + * @inheritDoc + */ + removeEvent(type: EventStringType, listener: (event: EventObject) => void, target: any): void; + /** + * @inheritDoc + */ + readonly armature: Armature; + /** + * @inheritDoc + */ + readonly animation: Animation; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.PixiFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + advanceTimeBySelf(on: boolean): void; + } +} +declare namespace dragonBones { + /** + * Pixi 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class PixiSlot extends Slot { + static toString(): string; + private _renderDisplay; + /** + * @private + */ + protected _onClear(): void; + /** + * @private + */ + protected _initDisplay(value: any): void; + /** + * @private + */ + protected _disposeDisplay(value: any): void; + /** + * @private + */ + protected _onUpdateDisplay(): void; + /** + * @private + */ + protected _addDisplay(): void; + /** + * @private + */ + protected _replaceDisplay(value: any): void; + /** + * @private + */ + protected _removeDisplay(): void; + /** + * @private + */ + protected _updateZOrder(): void; + /** + * @internal + * @private + */ + _updateVisible(): void; + /** + * @private + */ + protected _updateBlendMode(): void; + /** + * @private + */ + protected _updateColor(): void; + /** + * @private + */ + protected _updateFrame(): void; + /** + * @private + */ + protected _updateMesh(): void; + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateTransformV3(isSkinnedMesh: boolean): void; + /** + * @private + */ + protected _updateTransformV4(isSkinnedMesh: boolean): void; + } +} +declare namespace dragonBones { + /** + * Pixi 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + class PixiFactory extends BaseFactory { + private static _dragonBonesInstance; + private static _factory; + private static _clockHandler(passedTime); + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + static readonly clock: WorldClock; + /** + * @language zh_CN + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + */ + static readonly factory: PixiFactory; + /** + * @inheritDoc + */ + constructor(dataParser?: DataParser | null); + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: PixiTextureAtlasData | null, textureAtlas: PIXI.BaseTexture | null): PixiTextureAtlasData; + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature; + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + buildArmatureDisplay(armatureName: string, dragonBonesName?: string | null, skinName?: string | null, textureAtlasName?: string | null): PixiArmatureDisplay | null; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + getTextureDisplay(textureName: string, textureAtlasName?: string | null): PIXI.Sprite | null; + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + readonly soundEventManager: PixiArmatureDisplay; + } +} diff --git a/reference/Pixi/4.x/out/dragonBones.js b/reference/Pixi/4.x/out/dragonBones.js new file mode 100644 index 0000000..ab9dd0c --- /dev/null +++ b/reference/Pixi/4.x/out/dragonBones.js @@ -0,0 +1,11273 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DragonBones = (function () { + function DragonBones(eventManager) { + this._clock = new dragonBones.WorldClock(); + this._events = []; + this._objects = []; + this._eventManager = null; + this._eventManager = eventManager; + } + DragonBones.prototype.advanceTime = function (passedTime) { + if (this._objects.length > 0) { + for (var _i = 0, _a = this._objects; _i < _a.length; _i++) { + var object = _a[_i]; + object.returnToPool(); + } + this._objects.length = 0; + } + this._clock.advanceTime(passedTime); + if (this._events.length > 0) { + for (var i = 0; i < this._events.length; ++i) { + var eventObject = this._events[i]; + var armature = eventObject.armature; + armature.eventDispatcher._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type === dragonBones.EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + this.bufferObject(eventObject); + } + this._events.length = 0; + } + }; + DragonBones.prototype.bufferEvent = function (value) { + if (this._events.indexOf(value) < 0) { + this._events.push(value); + } + }; + DragonBones.prototype.bufferObject = function (object) { + if (this._objects.indexOf(object) < 0) { + this._objects.push(object); + } + }; + Object.defineProperty(DragonBones.prototype, "clock", { + get: function () { + return this._clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(DragonBones.prototype, "eventManager", { + get: function () { + return this._eventManager; + }, + enumerable: true, + configurable: true + }); + DragonBones.yDown = true; + DragonBones.debug = false; + DragonBones.debugDraw = false; + DragonBones.webAssembly = false; + DragonBones.VERSION = "5.1.0"; + return DragonBones; + }()); + dragonBones.DragonBones = DragonBones; + if (!console.warn) { + console.warn = function () { }; + } + if (!console.assert) { + console.assert = function () { }; + } +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var BaseObject = (function () { + function BaseObject() { + /** + * 对象的唯一标识。 + * @version DragonBones 4.5 + * @language zh_CN + */ + this.hashCode = BaseObject._hashCode++; + this._isInPool = false; + } + BaseObject._returnObject = function (object) { + var classType = String(object.constructor); + var maxCount = classType in BaseObject._maxCountMap ? BaseObject._defaultMaxCount : BaseObject._maxCountMap[classType]; + var pool = BaseObject._poolsMap[classType] = BaseObject._poolsMap[classType] || []; + if (pool.length < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.push(object); + } + else { + console.assert(false, "The object is already in the pool."); + } + } + else { + } + }; + /** + * @private + */ + BaseObject.toString = function () { + throw new Error(); + }; + /** + * 设置每种对象池的最大缓存数量。 + * @param objectConstructor 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.setMaxCount = function (objectConstructor, maxCount) { + if (maxCount < 0 || maxCount !== maxCount) { + maxCount = 0; + } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + else { + BaseObject._defaultMaxCount = maxCount; + for (var classType in BaseObject._poolsMap) { + if (classType in BaseObject._maxCountMap) { + continue; + } + var pool = BaseObject._poolsMap[classType]; + if (pool.length > maxCount) { + pool.length = maxCount; + } + BaseObject._maxCountMap[classType] = maxCount; + } + } + }; + /** + * 清除对象池缓存的对象。 + * @param objectConstructor 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.clearPool = function (objectConstructor) { + if (objectConstructor === void 0) { objectConstructor = null; } + if (objectConstructor !== null) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + pool.length = 0; + } + } + else { + for (var k in BaseObject._poolsMap) { + var pool = BaseObject._poolsMap[k]; + pool.length = 0; + } + } + }; + /** + * 从对象池中创建指定对象。 + * @param objectConstructor 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.borrowObject = function (objectConstructor) { + var classType = String(objectConstructor); + var pool = classType in BaseObject._poolsMap ? BaseObject._poolsMap[classType] : null; + if (pool !== null && pool.length > 0) { + var object_1 = pool.pop(); + object_1._isInPool = false; + return object_1; + } + var object = new objectConstructor(); + object._onClear(); + return object; + }; + /** + * 清除数据并返还对象池。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseObject.prototype.returnToPool = function () { + this._onClear(); + BaseObject._returnObject(this); + }; + BaseObject._hashCode = 0; + BaseObject._defaultMaxCount = 1000; + BaseObject._maxCountMap = {}; + BaseObject._poolsMap = {}; + return BaseObject; + }()); + dragonBones.BaseObject = BaseObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Matrix = (function () { + function Matrix(a, b, c, d, tx, ty) { + if (a === void 0) { a = 1.0; } + if (b === void 0) { b = 0.0; } + if (c === void 0) { c = 0.0; } + if (d === void 0) { d = 1.0; } + if (tx === void 0) { tx = 0.0; } + if (ty === void 0) { ty = 0.0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * @private + */ + Matrix.prototype.toString = function () { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + }; + /** + * @private + */ + Matrix.prototype.copyFrom = function (value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + return this; + }; + /** + * @private + */ + Matrix.prototype.copyFromArray = function (value, offset) { + if (offset === void 0) { offset = 0; } + this.a = value[offset]; + this.b = value[offset + 1]; + this.c = value[offset + 2]; + this.d = value[offset + 3]; + this.tx = value[offset + 4]; + this.ty = value[offset + 5]; + return this; + }; + /** + * 转换为单位矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.identity = function () { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + }; + /** + * 将当前矩阵与另一个矩阵相乘。 + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.concat = function (value) { + var aA = this.a * value.a; + var bA = 0.0; + var cA = 0.0; + var dA = this.d * value.d; + var txA = this.tx * value.a + value.tx; + var tyA = this.ty * value.d + value.ty; + if (this.b !== 0.0 || this.c !== 0.0) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + if (value.b !== 0.0 || value.c !== 0.0) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + return this; + }; + /** + * 转换为逆矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.invert = function () { + var aA = this.a; + var bA = this.b; + var cA = this.c; + var dA = this.d; + var txA = this.tx; + var tyA = this.ty; + if (bA === 0.0 && cA === 0.0) { + this.b = this.c = 0.0; + if (aA === 0.0 || dA === 0.0) { + this.a = this.b = this.tx = this.ty = 0.0; + } + else { + aA = this.a = 1.0 / aA; + dA = this.d = 1.0 / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + return this; + } + var determinant = aA * dA - bA * cA; + if (determinant === 0.0) { + this.a = this.d = 1.0; + this.b = this.c = 0.0; + this.tx = this.ty = 0.0; + return this; + } + determinant = 1.0 / determinant; + var k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + return this; + }; + /** + * 将矩阵转换应用于指定点。 + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Matrix.prototype.transformPoint = function (x, y, result, delta) { + if (delta === void 0) { delta = false; } + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + }; + return Matrix; + }()); + dragonBones.Matrix = Matrix; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 2D 变换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var Transform = (function () { + function Transform( + /** + * 水平位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + x, + /** + * 垂直位移。 + * @version DragonBones 3.0 + * @language zh_CN + */ + y, + /** + * 倾斜。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + skew, + /** + * 旋转。 (以弧度为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + rotation, + /** + * 水平缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleX, + /** + * 垂直缩放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + scaleY) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (skew === void 0) { skew = 0.0; } + if (rotation === void 0) { rotation = 0.0; } + if (scaleX === void 0) { scaleX = 1.0; } + if (scaleY === void 0) { scaleY = 1.0; } + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + /** + * @private + */ + Transform.normalizeRadian = function (value) { + value = (value + Math.PI) % (Math.PI * 2.0); + value += value > 0.0 ? -Math.PI : Math.PI; + return value; + }; + /** + * @private + */ + Transform.prototype.toString = function () { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + }; + /** + * @private + */ + Transform.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.identity = function () { + this.x = this.y = 0.0; + this.skew = this.rotation = 0.0; + this.scaleX = this.scaleY = 1.0; + return this; + }; + /** + * @private + */ + Transform.prototype.add = function (value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + return this; + }; + /** + * @private + */ + Transform.prototype.minus = function (value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + return this; + }; + /** + * 矩阵转换为变换。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.fromMatrix = function (matrix) { + var backupScaleX = this.scaleX, backupScaleY = this.scaleY; + var PI_Q = Transform.PI_Q; + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = Math.atan(matrix.b / matrix.a); + var skewX = Math.atan(-matrix.c / matrix.d); + this.scaleX = (this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation); + this.scaleY = (skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX); + if (backupScaleX >= 0.0 && this.scaleX < 0.0) { + this.scaleX = -this.scaleX; + this.rotation = this.rotation - Math.PI; + } + if (backupScaleY >= 0.0 && this.scaleY < 0.0) { + this.scaleY = -this.scaleY; + skewX = skewX - Math.PI; + } + this.skew = skewX - this.rotation; + return this; + }; + /** + * 转换为矩阵。 + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Transform.prototype.toMatrix = function (matrix) { + if (this.skew !== 0.0 || this.rotation !== 0.0) { + matrix.a = Math.cos(this.rotation); + matrix.b = Math.sin(this.rotation); + if (this.skew === 0.0) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } + else { + matrix.c = -Math.sin(this.skew + this.rotation); + matrix.d = Math.cos(this.skew + this.rotation); + } + if (this.scaleX !== 1.0) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + if (this.scaleY !== 1.0) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } + else { + matrix.a = this.scaleX; + matrix.b = 0.0; + matrix.c = 0.0; + matrix.d = this.scaleY; + } + matrix.tx = this.x; + matrix.ty = this.y; + return this; + }; + /** + * @private + */ + Transform.PI_D = Math.PI * 2.0; + /** + * @private + */ + Transform.PI_H = Math.PI / 2.0; + /** + * @private + */ + Transform.PI_Q = Math.PI / 4.0; + /** + * @private + */ + Transform.RAD_DEG = 180.0 / Math.PI; + /** + * @private + */ + Transform.DEG_RAD = Math.PI / 180.0; + return Transform; + }()); + dragonBones.Transform = Transform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ColorTransform = (function () { + function ColorTransform(alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier, alphaOffset, redOffset, greenOffset, blueOffset) { + if (alphaMultiplier === void 0) { alphaMultiplier = 1.0; } + if (redMultiplier === void 0) { redMultiplier = 1.0; } + if (greenMultiplier === void 0) { greenMultiplier = 1.0; } + if (blueMultiplier === void 0) { blueMultiplier = 1.0; } + if (alphaOffset === void 0) { alphaOffset = 0; } + if (redOffset === void 0) { redOffset = 0; } + if (greenOffset === void 0) { greenOffset = 0; } + if (blueOffset === void 0) { blueOffset = 0; } + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + ColorTransform.prototype.copyFrom = function (value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + }; + ColorTransform.prototype.identity = function () { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1.0; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + }; + return ColorTransform; + }()); + dragonBones.ColorTransform = ColorTransform; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Point = (function () { + function Point(x, y) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + this.x = x; + this.y = y; + } + Point.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + }; + Point.prototype.clear = function () { + this.x = this.y = 0.0; + }; + return Point; + }()); + dragonBones.Point = Point; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + var Rectangle = (function () { + function Rectangle(x, y, width, height) { + if (x === void 0) { x = 0.0; } + if (y === void 0) { y = 0.0; } + if (width === void 0) { width = 0.0; } + if (height === void 0) { height = 0.0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Rectangle.prototype.copyFrom = function (value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + }; + Rectangle.prototype.clear = function () { + this.x = this.y = 0.0; + this.width = this.height = 0.0; + }; + return Rectangle; + }()); + dragonBones.Rectangle = Rectangle; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 自定义数据。 + * @version DragonBones 5.0 + * @language zh_CN + */ + var UserData = (function (_super) { + __extends(UserData, _super); + function UserData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.ints = []; + /** + * 自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.floats = []; + /** + * 自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.strings = []; + return _this; + } + /** + * @private + */ + UserData.toString = function () { + return "[class dragonBones.UserData]"; + }; + /** + * @private + */ + UserData.prototype._onClear = function () { + this.ints.length = 0; + this.floats.length = 0; + this.strings.length = 0; + }; + /** + * 获取自定义整数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getInt = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.ints.length ? this.ints[index] : 0; + }; + /** + * 获取自定义浮点数。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getFloat = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.floats.length ? this.floats[index] : 0.0; + }; + /** + * 获取自定义字符串。 + * @version DragonBones 5.0 + * @language zh_CN + */ + UserData.prototype.getString = function (index) { + if (index === void 0) { index = 0; } + return index >= 0 && index < this.strings.length ? this.strings[index] : ""; + }; + return UserData; + }(dragonBones.BaseObject)); + dragonBones.UserData = UserData; + /** + * @private + */ + var ActionData = (function (_super) { + __extends(ActionData, _super); + function ActionData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.data = null; // + return _this; + } + ActionData.toString = function () { + return "[class dragonBones.ActionData]"; + }; + ActionData.prototype._onClear = function () { + if (this.data !== null) { + this.data.returnToPool(); + } + this.type = 0 /* Play */; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + }; + return ActionData; + }(dragonBones.BaseObject)); + dragonBones.ActionData = ActionData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + var DragonBonesData = (function (_super) { + __extends(DragonBonesData, _super); + function DragonBonesData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.frameIndices = []; + /** + * @private + */ + _this.cachedFrames = []; + /** + * 所有骨架数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatureNames = []; + /** + * 所有骨架数据。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.armatures = {}; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + DragonBonesData.toString = function () { + return "[class dragonBones.DragonBonesData]"; + }; + /** + * @private + */ + DragonBonesData.prototype._onClear = function () { + for (var k in this.armatures) { + this.armatures[k].returnToPool(); + delete this.armatures[k]; + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.length = 0; + this.cachedFrames.length = 0; + this.armatureNames.length = 0; + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + }; + /** + * @private + */ + DragonBonesData.prototype.addArmature = function (value) { + if (value.name in this.armatures) { + console.warn("Replace armature: " + value.name); + this.armatures[value.name].returnToPool(); + } + value.parent = this; + this.armatures[value.name] = value; + this.armatureNames.push(value.name); + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 3.0 + * @language zh_CN + */ + DragonBonesData.prototype.getArmature = function (name) { + return name in this.armatures ? this.armatures[name] : null; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#removeDragonBonesData() + */ + DragonBonesData.prototype.dispose = function () { + console.warn("已废弃,请参考 @see"); + this.returnToPool(); + }; + return DragonBonesData; + }(dragonBones.BaseObject)); + dragonBones.DragonBonesData = DragonBonesData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var CanvasData = (function (_super) { + __extends(CanvasData, _super); + function CanvasData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + CanvasData.toString = function () { + return "[class dragonBones.CanvasData]"; + }; + /** + * @private + */ + CanvasData.prototype._onClear = function () { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + return CanvasData; + }(dragonBones.BaseObject)); + dragonBones.CanvasData = CanvasData; + /** + * 骨架数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var ArmatureData = (function (_super) { + __extends(ArmatureData, _super); + function ArmatureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.aabb = new dragonBones.Rectangle(); + /** + * 所有动画数据名称。 + * @see #armatures + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animationNames = []; + /** + * @private + */ + _this.sortedBones = []; + /** + * @private + */ + _this.sortedSlots = []; + /** + * @private + */ + _this.defaultActions = []; + /** + * @private + */ + _this.actions = []; + /** + * 所有骨骼数据。 + * @see dragonBones.BoneData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.bones = {}; + /** + * 所有插槽数据。 + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.slots = {}; + /** + * 所有皮肤数据。 + * @see dragonBones.SkinData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.skins = {}; + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.animations = {}; + /** + * @private + */ + _this.canvas = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + ArmatureData.toString = function () { + return "[class dragonBones.ArmatureData]"; + }; + /** + * @private + */ + ArmatureData.prototype._onClear = function () { + for (var _i = 0, _a = this.defaultActions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + for (var _b = 0, _c = this.actions; _b < _c.length; _b++) { + var action = _c[_b]; + action.returnToPool(); + } + for (var k in this.bones) { + this.bones[k].returnToPool(); + delete this.bones[k]; + } + for (var k in this.slots) { + this.slots[k].returnToPool(); + delete this.slots[k]; + } + for (var k in this.skins) { + this.skins[k].returnToPool(); + delete this.skins[k]; + } + for (var k in this.animations) { + this.animations[k].returnToPool(); + delete this.animations[k]; + } + if (this.canvas !== null) { + this.canvas.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.type = 0 /* Armature */; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1.0; + this.name = ""; + this.aabb.clear(); + this.animationNames.length = 0; + this.sortedBones.length = 0; + this.sortedSlots.length = 0; + this.defaultActions.length = 0; + this.actions.length = 0; + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + ArmatureData.prototype.sortBones = function () { + var total = this.sortedBones.length; + if (total <= 0) { + return; + } + var sortHelper = this.sortedBones.concat(); + var index = 0; + var count = 0; + this.sortedBones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this.sortedBones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this.sortedBones.indexOf(bone.parent) < 0) { + continue; + } + this.sortedBones.push(bone); + count++; + } + }; + /** + * @private + */ + ArmatureData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0) { + return; + } + this.cacheFrameRate = frameRate; + for (var k in this.animations) { + this.animations[k].cacheFrames(this.cacheFrameRate); + } + }; + /** + * @private + */ + ArmatureData.prototype.setCacheFrame = function (globalTransformMatrix, transform) { + var dataArray = this.parent.cachedFrames; + var arrayOffset = dataArray.length; + dataArray.length += 10; + dataArray[arrayOffset] = globalTransformMatrix.a; + dataArray[arrayOffset + 1] = globalTransformMatrix.b; + dataArray[arrayOffset + 2] = globalTransformMatrix.c; + dataArray[arrayOffset + 3] = globalTransformMatrix.d; + dataArray[arrayOffset + 4] = globalTransformMatrix.tx; + dataArray[arrayOffset + 5] = globalTransformMatrix.ty; + dataArray[arrayOffset + 6] = transform.rotation; + dataArray[arrayOffset + 7] = transform.skew; + dataArray[arrayOffset + 8] = transform.scaleX; + dataArray[arrayOffset + 9] = transform.scaleY; + return arrayOffset; + }; + /** + * @private + */ + ArmatureData.prototype.getCacheFrame = function (globalTransformMatrix, transform, arrayOffset) { + var dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray[arrayOffset]; + globalTransformMatrix.b = dataArray[arrayOffset + 1]; + globalTransformMatrix.c = dataArray[arrayOffset + 2]; + globalTransformMatrix.d = dataArray[arrayOffset + 3]; + globalTransformMatrix.tx = dataArray[arrayOffset + 4]; + globalTransformMatrix.ty = dataArray[arrayOffset + 5]; + transform.rotation = dataArray[arrayOffset + 6]; + transform.skew = dataArray[arrayOffset + 7]; + transform.scaleX = dataArray[arrayOffset + 8]; + transform.scaleY = dataArray[arrayOffset + 9]; + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + }; + /** + * @private + */ + ArmatureData.prototype.addBone = function (value) { + if (value.name in this.bones) { + console.warn("Replace bone: " + value.name); + this.bones[value.name].returnToPool(); + } + this.bones[value.name] = value; + this.sortedBones.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSlot = function (value) { + if (value.name in this.slots) { + console.warn("Replace slot: " + value.name); + this.slots[value.name].returnToPool(); + } + this.slots[value.name] = value; + this.sortedSlots.push(value); + }; + /** + * @private + */ + ArmatureData.prototype.addSkin = function (value) { + if (value.name in this.skins) { + console.warn("Replace skin: " + value.name); + this.skins[value.name].returnToPool(); + } + this.skins[value.name] = value; + if (this.defaultSkin === null) { + this.defaultSkin = value; + } + }; + /** + * @private + */ + ArmatureData.prototype.addAnimation = function (value) { + if (value.name in this.animations) { + console.warn("Replace animation: " + value.name); + this.animations[value.name].returnToPool(); + } + value.parent = this; + this.animations[value.name] = value; + this.animationNames.push(value.name); + if (this.defaultAnimation === null) { + this.defaultAnimation = value; + } + }; + /** + * 获取骨骼数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.BoneData + * @language zh_CN + */ + ArmatureData.prototype.getBone = function (name) { + return name in this.bones ? this.bones[name] : null; + }; + /** + * 获取插槽数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SlotData + * @language zh_CN + */ + ArmatureData.prototype.getSlot = function (name) { + return name in this.slots ? this.slots[name] : null; + }; + /** + * 获取皮肤数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.SkinData + * @language zh_CN + */ + ArmatureData.prototype.getSkin = function (name) { + return name in this.skins ? this.skins[name] : null; + }; + /** + * 获取动画数据。 + * @param name 数据名称。 + * @version DragonBones 3.0 + * @see dragonBones.AnimationData + * @language zh_CN + */ + ArmatureData.prototype.getAnimation = function (name) { + return name in this.animations ? this.animations[name] : null; + }; + return ArmatureData; + }(dragonBones.BaseObject)); + dragonBones.ArmatureData = ArmatureData; + /** + * 骨骼数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var BoneData = (function (_super) { + __extends(BoneData, _super); + function BoneData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.transform = new dragonBones.Transform(); + /** + * @private + */ + _this.constraints = []; + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + BoneData.toString = function () { + return "[class dragonBones.BoneData]"; + }; + /** + * @private + */ + BoneData.prototype._onClear = function () { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0.0; + this.name = ""; + this.transform.identity(); + this.constraints.length = 0; + this.userData = null; + this.parent = null; + }; + return BoneData; + }(dragonBones.BaseObject)); + dragonBones.BoneData = BoneData; + /** + * 插槽数据。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var SlotData = (function (_super) { + __extends(SlotData, _super); + function SlotData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.color = null; // Initial value. + /** + * @private + */ + _this.userData = null; // Initial value. + return _this; + } + /** + * @private + */ + SlotData.createColor = function () { + return new dragonBones.ColorTransform(); + }; + /** + * @private + */ + SlotData.toString = function () { + return "[class dragonBones.SlotData]"; + }; + /** + * @private + */ + SlotData.prototype._onClear = function () { + if (this.userData !== null) { + this.userData.returnToPool(); + } + this.blendMode = 0 /* Normal */; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + }; + /** + * @private + */ + SlotData.DEFAULT_COLOR = new dragonBones.ColorTransform(); + return SlotData; + }(dragonBones.BaseObject)); + dragonBones.SlotData = SlotData; + /** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * @version DragonBones 3.0 + * @language zh_CN + */ + var SkinData = (function (_super) { + __extends(SkinData, _super); + function SkinData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.displays = {}; + return _this; + } + SkinData.toString = function () { + return "[class dragonBones.SkinData]"; + }; + /** + * @private + */ + SkinData.prototype._onClear = function () { + for (var k in this.displays) { + var slotDisplays = this.displays[k]; + for (var _i = 0, slotDisplays_1 = slotDisplays; _i < slotDisplays_1.length; _i++) { + var display = slotDisplays_1[_i]; + if (display !== null) { + display.returnToPool(); + } + } + delete this.displays[k]; + } + this.name = ""; + // this.displays.clear(); + }; + /** + * @private + */ + SkinData.prototype.addDisplay = function (slotName, value) { + if (!(slotName in this.displays)) { + this.displays[slotName] = []; + } + var slotDisplays = this.displays[slotName]; // TODO clear prev + slotDisplays.push(value); + }; + /** + * @private + */ + SkinData.prototype.getDisplay = function (slotName, displayName) { + var slotDisplays = this.getDisplays(slotName); + if (slotDisplays !== null) { + for (var _i = 0, slotDisplays_2 = slotDisplays; _i < slotDisplays_2.length; _i++) { + var display = slotDisplays_2[_i]; + if (display !== null && display.name === displayName) { + return display; + } + } + } + return null; + }; + /** + * @private + */ + SkinData.prototype.getDisplays = function (slotName) { + if (!(slotName in this.displays)) { + return null; + } + return this.displays[slotName]; + }; + return SkinData; + }(dragonBones.BaseObject)); + dragonBones.SkinData = SkinData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ConstraintData = (function (_super) { + __extends(ConstraintData, _super); + function ConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + ConstraintData.prototype._onClear = function () { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + }; + return ConstraintData; + }(dragonBones.BaseObject)); + dragonBones.ConstraintData = ConstraintData; + /** + * @private + */ + var IKConstraintData = (function (_super) { + __extends(IKConstraintData, _super); + function IKConstraintData() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraintData.toString = function () { + return "[class dragonBones.IKConstraintData]"; + }; + IKConstraintData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + return IKConstraintData; + }(ConstraintData)); + dragonBones.IKConstraintData = IKConstraintData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DisplayData = (function (_super) { + __extends(DisplayData, _super); + function DisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.transform = new dragonBones.Transform(); + return _this; + } + DisplayData.prototype._onClear = function () { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + }; + return DisplayData; + }(dragonBones.BaseObject)); + dragonBones.DisplayData = DisplayData; + /** + * @private + */ + var ImageDisplayData = (function (_super) { + __extends(ImageDisplayData, _super); + function ImageDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.pivot = new dragonBones.Point(); + return _this; + } + ImageDisplayData.toString = function () { + return "[class dragonBones.ImageDisplayData]"; + }; + ImageDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Image */; + this.pivot.clear(); + this.texture = null; + }; + return ImageDisplayData; + }(DisplayData)); + dragonBones.ImageDisplayData = ImageDisplayData; + /** + * @private + */ + var ArmatureDisplayData = (function (_super) { + __extends(ArmatureDisplayData, _super); + function ArmatureDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.actions = []; + return _this; + } + ArmatureDisplayData.toString = function () { + return "[class dragonBones.ArmatureDisplayData]"; + }; + ArmatureDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.actions; _i < _a.length; _i++) { + var action = _a[_i]; + action.returnToPool(); + } + this.type = 1 /* Armature */; + this.inheritAnimation = false; + this.actions.length = 0; + this.armature = null; + }; + return ArmatureDisplayData; + }(DisplayData)); + dragonBones.ArmatureDisplayData = ArmatureDisplayData; + /** + * @private + */ + var MeshDisplayData = (function (_super) { + __extends(MeshDisplayData, _super); + function MeshDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.weight = null; // Initial value. + return _this; + } + MeshDisplayData.toString = function () { + return "[class dragonBones.MeshDisplayData]"; + }; + MeshDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Mesh */; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + }; + return MeshDisplayData; + }(ImageDisplayData)); + dragonBones.MeshDisplayData = MeshDisplayData; + /** + * @private + */ + var BoundingBoxDisplayData = (function (_super) { + __extends(BoundingBoxDisplayData, _super); + function BoundingBoxDisplayData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.boundingBox = null; // Initial value. + return _this; + } + BoundingBoxDisplayData.toString = function () { + return "[class dragonBones.BoundingBoxDisplayData]"; + }; + BoundingBoxDisplayData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.boundingBox !== null) { + this.boundingBox.returnToPool(); + } + this.type = 3 /* BoundingBox */; + this.boundingBox = null; + }; + return BoundingBoxDisplayData; + }(DisplayData)); + dragonBones.BoundingBoxDisplayData = BoundingBoxDisplayData; + /** + * @private + */ + var WeightData = (function (_super) { + __extends(WeightData, _super); + function WeightData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.bones = []; + return _this; + } + WeightData.toString = function () { + return "[class dragonBones.WeightData]"; + }; + WeightData.prototype._onClear = function () { + this.count = 0; + this.offset = 0; + this.bones.length = 0; + }; + return WeightData; + }(dragonBones.BaseObject)); + dragonBones.WeightData = WeightData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 边界框数据基类。 + * @see dragonBones.RectangleData + * @see dragonBones.EllipseData + * @see dragonBones.PolygonData + * @version DragonBones 5.0 + * @language zh_CN + */ + var BoundingBoxData = (function (_super) { + __extends(BoundingBoxData, _super); + function BoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + BoundingBoxData.prototype._onClear = function () { + this.color = 0x000000; + this.width = 0.0; + this.height = 0.0; + }; + return BoundingBoxData; + }(dragonBones.BaseObject)); + dragonBones.BoundingBoxData = BoundingBoxData; + /** + * 矩形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var RectangleBoundingBoxData = (function (_super) { + __extends(RectangleBoundingBoxData, _super); + function RectangleBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + RectangleBoundingBoxData.toString = function () { + return "[class dragonBones.RectangleBoundingBoxData]"; + }; + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + RectangleBoundingBoxData._computeOutCode = function (x, y, xMin, yMin, xMax, yMax) { + var code = 0 /* InSide */; // initialised as being inside of [[clip window]] + if (x < xMin) { + code |= 1 /* Left */; + } + else if (x > xMax) { + code |= 2 /* Right */; + } + if (y < yMin) { + code |= 4 /* Top */; + } + else if (y > yMax) { + code |= 8 /* Bottom */; + } + return code; + }; + /** + * @private + */ + RectangleBoundingBoxData.rectangleIntersectsSegment = function (xA, yA, xB, yB, xMin, yMin, xMax, yMax, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + var inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + if (inSideA && inSideB) { + return -1; + } + var intersectionCount = 0; + var outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + var outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + while (true) { + if ((outcode0 | outcode1) === 0) { + intersectionCount = 2; + break; + } + else if ((outcode0 & outcode1) !== 0) { + break; + } + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + var x = 0.0; + var y = 0.0; + var normalRadian = 0.0; + // At least one endpoint is outside the clip rectangle; pick it. + var outcodeOut = outcode0 !== 0 ? outcode0 : outcode1; + // Now find the intersection point; + if ((outcodeOut & 4 /* Top */) !== 0) { + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + if (normalRadians !== null) { + normalRadian = -Math.PI * 0.5; + } + } + else if ((outcodeOut & 8 /* Bottom */) !== 0) { + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + if (normalRadians !== null) { + normalRadian = Math.PI * 0.5; + } + } + else if ((outcodeOut & 2 /* Right */) !== 0) { + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + if (normalRadians !== null) { + normalRadian = 0; + } + } + else if ((outcodeOut & 1 /* Left */) !== 0) { + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + if (normalRadians !== null) { + normalRadian = Math.PI; + } + } + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut === outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.x = normalRadian; + } + } + else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + if (normalRadians !== null) { + normalRadians.y = normalRadian; + } + } + } + if (intersectionCount) { + if (inSideA) { + intersectionCount = 2; // 10 + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + if (normalRadians !== null) { + normalRadians.x = normalRadians.y + Math.PI; + } + } + else if (inSideB) { + intersectionCount = 1; // 01 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + return intersectionCount; + }; + /** + * @private + */ + RectangleBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 0 /* Rectangle */; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + return false; + }; + /** + * @inherDoc + */ + RectangleBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var widthH = this.width * 0.5; + var heightH = this.height * 0.5; + var intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, -widthH, -heightH, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return RectangleBoundingBoxData; + }(BoundingBoxData)); + dragonBones.RectangleBoundingBoxData = RectangleBoundingBoxData; + /** + * 椭圆边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var EllipseBoundingBoxData = (function (_super) { + __extends(EllipseBoundingBoxData, _super); + function EllipseBoundingBoxData() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EllipseBoundingBoxData.toString = function () { + return "[class dragonBones.EllipseData]"; + }; + /** + * @private + */ + EllipseBoundingBoxData.ellipseIntersectsSegment = function (xA, yA, xB, yB, xC, yC, widthH, heightH, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var d = widthH / heightH; + var dd = d * d; + yA *= d; + yB *= d; + var dX = xB - xA; + var dY = yB - yA; + var lAB = Math.sqrt(dX * dX + dY * dY); + var xD = dX / lAB; + var yD = dY / lAB; + var a = (xC - xA) * xD + (yC - yA) * yD; + var aa = a * a; + var ee = xA * xA + yA * yA; + var rr = widthH * widthH; + var dR = rr - ee + aa; + var intersectionCount = 0; + if (dR >= 0.0) { + var dT = Math.sqrt(dR); + var sA = a - dT; + var sB = a + dT; + var inSideA = sA < 0.0 ? -1 : (sA <= lAB ? 0 : 1); + var inSideB = sB < 0.0 ? -1 : (sB <= lAB ? 0 : 1); + var sideAB = inSideA * inSideB; + if (sideAB < 0) { + return -1; + } + else if (sideAB === 0) { + if (inSideA === -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (inSideB === 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + if (intersectionPointA !== null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = normalRadians.x + Math.PI; + } + } + else { + intersectionCount = 3; // 11 + if (intersectionPointA !== null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + if (intersectionPointB !== null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + return intersectionCount; + }; + /** + * @private + */ + EllipseBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.type = 1 /* Ellipse */; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var widthH = this.width * 0.5; + if (pX >= -widthH && pX <= widthH) { + var heightH = this.height * 0.5; + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + return false; + }; + /** + * @inherDoc + */ + EllipseBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = EllipseBoundingBoxData.ellipseIntersectsSegment(xA, yA, xB, yB, 0.0, 0.0, this.width * 0.5, this.height * 0.5, intersectionPointA, intersectionPointB, normalRadians); + return intersectionCount; + }; + return EllipseBoundingBoxData; + }(BoundingBoxData)); + dragonBones.EllipseBoundingBoxData = EllipseBoundingBoxData; + /** + * 多边形边界框。 + * @version DragonBones 5.1 + * @language zh_CN + */ + var PolygonBoundingBoxData = (function (_super) { + __extends(PolygonBoundingBoxData, _super); + function PolygonBoundingBoxData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.weight = null; // Initial value. + return _this; + } + /** + * @private + */ + PolygonBoundingBoxData.toString = function () { + return "[class dragonBones.PolygonBoundingBoxData]"; + }; + /** + * @private + */ + PolygonBoundingBoxData.polygonIntersectsSegment = function (xA, yA, xB, yB, vertices, offset, count, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (xA === xB) { + xA = xB + 0.000001; + } + if (yA === yB) { + yA = yB + 0.000001; + } + var dXAB = xA - xB; + var dYAB = yA - yB; + var llAB = xA * yB - yA * xB; + var intersectionCount = 0; + var xC = vertices[offset + count - 2]; + var yC = vertices[offset + count - 1]; + var dMin = 0.0; + var dMax = 0.0; + var xMin = 0.0; + var yMin = 0.0; + var xMax = 0.0; + var yMax = 0.0; + for (var i = 0; i < count; i += 2) { + var xD = vertices[offset + i]; + var yD = vertices[offset + i + 1]; + if (xC === xD) { + xC = xD + 0.0001; + } + if (yC === yD) { + yC = yD + 0.0001; + } + var dXCD = xC - xD; + var dYCD = yC - yD; + var llCD = xC * yD - yC * xD; + var ll = dXAB * dYCD - dYAB * dXCD; + var x = (llAB * dXCD - dXAB * llCD) / ll; + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB === 0.0 || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + var y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB === 0.0 || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB !== null) { + var d = x - xA; + if (d < 0.0) { + d = -d; + } + if (intersectionCount === 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + } + else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + if (normalRadians !== null) { + normalRadians.y = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + } + } + } + intersectionCount++; + } + else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + if (normalRadians !== null) { + normalRadians.x = Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5; + normalRadians.y = normalRadians.x; + } + break; + } + } + } + xC = xD; + yC = yD; + } + if (intersectionCount === 1) { + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + if (normalRadians !== null) { + normalRadians.y = normalRadians.x + Math.PI; + } + } + else if (intersectionCount > 1) { + intersectionCount++; + if (intersectionPointA !== null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + if (intersectionPointB !== null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + return intersectionCount; + }; + /** + * @private + */ + PolygonBoundingBoxData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.weight !== null) { + this.weight.returnToPool(); + } + this.type = 2 /* Polygon */; + this.count = 0; + this.offset = 0; + this.x = 0.0; + this.y = 0.0; + this.vertices = null; // + this.weight = null; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.containsPoint = function (pX, pY) { + var isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (var i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + var yA = this.vertices[this.offset + iP + 1]; + var yB = this.vertices[this.offset + i + 1]; + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + var xA = this.vertices[this.offset + iP]; + var xB = this.vertices[this.offset + i]; + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + iP = i; + } + } + return isInSide; + }; + /** + * @inherDoc + */ + PolygonBoundingBoxData.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) !== 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment(xA, yA, xB, yB, this.vertices, this.offset, this.count, intersectionPointA, intersectionPointB, normalRadians); + } + return intersectionCount; + }; + return PolygonBoundingBoxData; + }(BoundingBoxData)); + dragonBones.PolygonBoundingBoxData = PolygonBoundingBoxData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationData = (function (_super) { + __extends(AnimationData, _super); + function AnimationData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.cachedFrames = []; + /** + * @private + */ + _this.boneTimelines = {}; + /** + * @private + */ + _this.slotTimelines = {}; + /** + * @private + */ + _this.boneCachedFrameIndices = {}; + /** + * @private + */ + _this.slotCachedFrameIndices = {}; + /** + * @private + */ + _this.actionTimeline = null; // Initial value. + /** + * @private + */ + _this.zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationData.toString = function () { + return "[class dragonBones.AnimationData]"; + }; + /** + * @private + */ + AnimationData.prototype._onClear = function () { + for (var k in this.boneTimelines) { + for (var kA in this.boneTimelines[k]) { + this.boneTimelines[k][kA].returnToPool(); + } + delete this.boneTimelines[k]; + } + for (var k in this.slotTimelines) { + for (var kA in this.slotTimelines[k]) { + this.slotTimelines[k][kA].returnToPool(); + } + delete this.slotTimelines[k]; + } + for (var k in this.boneCachedFrameIndices) { + delete this.boneCachedFrameIndices[k]; + } + for (var k in this.slotCachedFrameIndices) { + delete this.slotCachedFrameIndices[k]; + } + if (this.actionTimeline !== null) { + this.actionTimeline.returnToPool(); + } + if (this.zOrderTimeline !== null) { + this.zOrderTimeline.returnToPool(); + } + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0.0; + this.scale = 1.0; + this.fadeInTime = 0.0; + this.cacheFrameRate = 0.0; + this.name = ""; + this.cachedFrames.length = 0; + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + }; + /** + * @private + */ + AnimationData.prototype.cacheFrames = function (frameRate) { + if (this.cacheFrameRate > 0.0) { + return; + } + this.cacheFrameRate = Math.max(Math.ceil(frameRate * this.scale), 1.0); + var cacheFrameCount = Math.ceil(this.cacheFrameRate * this.duration) + 1; // Cache one more frame. + this.cachedFrames.length = cacheFrameCount; + for (var i = 0, l = this.cacheFrames.length; i < l; ++i) { + this.cachedFrames[i] = false; + } + for (var _i = 0, _a = this.parent.sortedBones; _i < _a.length; _i++) { + var bone = _a[_i]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.boneCachedFrameIndices[bone.name] = indices; + } + for (var _b = 0, _c = this.parent.sortedSlots; _b < _c.length; _b++) { + var slot = _c[_b]; + var indices = new Array(cacheFrameCount); + for (var i = 0, l = indices.length; i < l; ++i) { + indices[i] = -1; + } + this.slotCachedFrameIndices[slot.name] = indices; + } + }; + /** + * @private + */ + AnimationData.prototype.addBoneTimeline = function (bone, timeline) { + var timelines = bone.name in this.boneTimelines ? this.boneTimelines[bone.name] : (this.boneTimelines[bone.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.addSlotTimeline = function (slot, timeline) { + var timelines = slot.name in this.slotTimelines ? this.slotTimelines[slot.name] : (this.slotTimelines[slot.name] = []); + if (timelines.indexOf(timeline) < 0) { + timelines.push(timeline); + } + }; + /** + * @private + */ + AnimationData.prototype.getBoneTimelines = function (name) { + return name in this.boneTimelines ? this.boneTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotTimeline = function (name) { + return name in this.slotTimelines ? this.slotTimelines[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getBoneCachedFrameIndices = function (name) { + return name in this.boneCachedFrameIndices ? this.boneCachedFrameIndices[name] : null; + }; + /** + * @private + */ + AnimationData.prototype.getSlotCachedFrameIndices = function (name) { + return name in this.slotCachedFrameIndices ? this.slotCachedFrameIndices[name] : null; + }; + return AnimationData; + }(dragonBones.BaseObject)); + dragonBones.AnimationData = AnimationData; + /** + * @private + */ + var TimelineData = (function (_super) { + __extends(TimelineData, _super); + function TimelineData() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineData.toString = function () { + return "[class dragonBones.TimelineData]"; + }; + TimelineData.prototype._onClear = function () { + this.type = 10 /* BoneAll */; + this.offset = 0; + this.frameIndicesOffset = -1; + }; + return TimelineData; + }(dragonBones.BaseObject)); + dragonBones.TimelineData = TimelineData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画配置,描述播放一个动画所需要的全部信息。 + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + var AnimationConfig = (function (_super) { + __extends(AnimationConfig, _super); + function AnimationConfig() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 骨骼遮罩。 + * @version DragonBones 5.0 + * @language zh_CN + */ + _this.boneMask = []; + return _this; + } + AnimationConfig.toString = function () { + return "[class dragonBones.AnimationConfig]"; + }; + /** + * @private + */ + AnimationConfig.prototype._onClear = function () { + this.pauseFadeOut = true; + this.fadeOutMode = 4 /* All */; + this.fadeOutTweenType = 1 /* Line */; + this.fadeOutTime = -1.0; + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = 1 /* Line */; + this.playTimes = -1; + this.layer = 0; + this.position = 0.0; + this.duration = -1.0; + this.timeScale = -100.0; + this.fadeInTime = -1.0; + this.autoFadeOutTime = -1.0; + this.weight = 1.0; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.length = 0; + }; + AnimationConfig.prototype.clear = function () { + this._onClear(); + }; + AnimationConfig.prototype.copyFrom = function (value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + this.boneMask.length = value.boneMask.length; + for (var i = 0, l = this.boneMask.length; i < l; ++i) { + this.boneMask[i] = value.boneMask[i]; + } + }; + AnimationConfig.prototype.containsBoneMask = function (name) { + return this.boneMask.length === 0 || this.boneMask.indexOf(name) >= 0; + }; + AnimationConfig.prototype.addBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = armature.getBone(name); + if (currentBone === null) { + return; + } + if (this.boneMask.indexOf(name) < 0) { + this.boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this.boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + }; + AnimationConfig.prototype.removeBoneMask = function (armature, name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this.boneMask.indexOf(name); + if (index >= 0) { + this.boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = armature.getBone(name); + if (currentBone !== null) { + if (this.boneMask.length > 0) { + for (var _i = 0, _a = armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + var index_1 = this.boneMask.indexOf(bone.name); + if (index_1 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index_1, 1); + } + } + } + else { + for (var _b = 0, _c = armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this.boneMask.push(bone.name); + } + } + } + } + } + }; + return AnimationConfig; + }(dragonBones.BaseObject)); + dragonBones.AnimationConfig = AnimationConfig; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var TextureAtlasData = (function (_super) { + __extends(TextureAtlasData, _super); + function TextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this.textures = {}; + return _this; + } + /** + * @private + */ + TextureAtlasData.prototype._onClear = function () { + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1.0; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + }; + /** + * @private + */ + TextureAtlasData.prototype.copyFrom = function (value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + for (var k in this.textures) { + this.textures[k].returnToPool(); + delete this.textures[k]; + } + // this.textures.clear(); + for (var k in value.textures) { + var texture = this.createTexture(); + texture.copyFrom(value.textures[k]); + this.textures[k] = texture; + } + }; + /** + * @private + */ + TextureAtlasData.prototype.addTexture = function (value) { + if (value.name in this.textures) { + console.warn("Replace texture: " + value.name); + this.textures[value.name].returnToPool(); + } + value.parent = this; + this.textures[value.name] = value; + }; + /** + * @private + */ + TextureAtlasData.prototype.getTexture = function (name) { + return name in this.textures ? this.textures[name] : null; + }; + return TextureAtlasData; + }(dragonBones.BaseObject)); + dragonBones.TextureAtlasData = TextureAtlasData; + /** + * @private + */ + var TextureData = (function (_super) { + __extends(TextureData, _super); + function TextureData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.region = new dragonBones.Rectangle(); + _this.frame = null; // Initial value. + return _this; + } + TextureData.createRectangle = function () { + return new dragonBones.Rectangle(); + }; + TextureData.prototype._onClear = function () { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + }; + TextureData.prototype.copyFrom = function (value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + if (this.frame === null && value.frame !== null) { + this.frame = TextureData.createRectangle(); + } + else if (this.frame !== null && value.frame === null) { + this.frame = null; + } + if (this.frame !== null && value.frame !== null) { + this.frame.copyFrom(value.frame); + } + }; + return TextureData; + }(dragonBones.BaseObject)); + dragonBones.TextureData = TextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones_1) { + /** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * @see dragonBones.ArmatureData + * @see dragonBones.Bone + * @see dragonBones.Slot + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + var Armature = (function (_super) { + __extends(Armature, _super); + function Armature() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._bones = []; + _this._slots = []; + _this._actions = []; + _this._animation = null; // Initial value. + _this._proxy = null; // Initial value. + /** + * @private + */ + _this._replaceTextureAtlasData = null; // Initial value. + _this._clock = null; // Initial value. + return _this; + } + Armature.toString = function () { + return "[class dragonBones.Armature]"; + }; + Armature._onSortSlots = function (a, b) { + return a._zOrder > b._zOrder ? 1 : -1; + }; + /** + * @private + */ + Armature.prototype._onClear = function () { + if (this._clock !== null) { + this._clock.remove(this); + } + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + bone.returnToPool(); + } + for (var _b = 0, _c = this._slots; _b < _c.length; _b++) { + var slot = _c[_b]; + slot.returnToPool(); + } + for (var _d = 0, _e = this._actions; _d < _e.length; _d++) { + var action = _e[_d]; + action.returnToPool(); + } + if (this._animation !== null) { + this._animation.returnToPool(); + } + if (this._proxy !== null) { + this._proxy.clear(); + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + } + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.length = 0; + this._slots.length = 0; + this._actions.length = 0; + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + }; + Armature.prototype._sortBones = function () { + var total = this._bones.length; + if (total <= 0) { + return; + } + var sortHelper = this._bones.concat(); + var index = 0; + var count = 0; + this._bones.length = 0; + while (count < total) { + var bone = sortHelper[index++]; + if (index >= total) { + index = 0; + } + if (this._bones.indexOf(bone) >= 0) { + continue; + } + if (bone.constraints.length > 0) { + var flag = false; + for (var _i = 0, _a = bone.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + if (flag) { + continue; + } + } + if (bone.parent !== null && this._bones.indexOf(bone.parent) < 0) { + continue; + } + this._bones.push(bone); + count++; + } + }; + Armature.prototype._sortSlots = function () { + this._slots.sort(Armature._onSortSlots); + }; + /** + * @internal + * @private + */ + Armature.prototype._sortZOrder = function (slotIndices, offset) { + var slotDatas = this.armatureData.sortedSlots; + var isOriginal = slotIndices === null; + if (this._zOrderDirty || !isOriginal) { + for (var i = 0, l = slotDatas.length; i < l; ++i) { + var slotIndex = isOriginal ? i : slotIndices[offset + i]; + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + var slotData = slotDatas[slotIndex]; + var slot = this.getSlot(slotData.name); + if (slot !== null) { + slot._setZorder(i); + } + } + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addBoneToBoneList = function (value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeBoneFromBoneList = function (value) { + var index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._addSlotToSlotList = function (value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.push(value); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._removeSlotFromSlotList = function (value) { + var index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + }; + /** + * @internal + * @private + */ + Armature.prototype._bufferAction = function (action, append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.push(action); + } + else { + this._actions.unshift(action); + } + } + }; + /** + * 释放骨架。 (回收到对象池) + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.dispose = function () { + if (this.armatureData !== null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + }; + /** + * @private + */ + Armature.prototype.init = function (armatureData, proxy, display, dragonBones) { + if (this.armatureData !== null) { + return; + } + this.armatureData = armatureData; + this._animation = dragonBones_1.BaseObject.borrowObject(dragonBones_1.Animation); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + this._proxy.init(this); + this._animation.init(this); + this._animation.animations = this.armatureData.animations; + }; + /** + * 更新骨架和动画。 + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @see dragonBones.IAnimateble + * @see dragonBones.WorldClock + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.advanceTime = function (passedTime) { + if (this._lockUpdate) { + return; + } + if (this.armatureData === null) { + console.assert(false, "The armature has been disposed."); + return; + } + else if (this.armatureData.parent === null) { + console.assert(false, "The armature data has been disposed."); + return; + } + var prevCacheFrameIndex = this._cacheFrameIndex; + // Update nimation. + this._animation.advanceTime(passedTime); + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex !== prevCacheFrameIndex) { + var i = 0, l = 0; + for (i = 0, l = this._bones.length; i < l; ++i) { + this._bones[i].update(this._cacheFrameIndex); + } + for (i = 0, l = this._slots.length; i < l; ++i) { + this._slots[i].update(this._cacheFrameIndex); + } + } + if (this._actions.length > 0) { + this._lockUpdate = true; + for (var _i = 0, _a = this._actions; _i < _a.length; _i++) { + var action = _a[_i]; + if (action.type === 0 /* Play */) { + this._animation.fadeIn(action.name); + } + } + this._actions.length = 0; + this._lockUpdate = false; + } + // + var drawed = this.debugDraw || dragonBones_1.DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + }; + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @see dragonBones.Bone + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.invalidUpdate = function (boneName, updateSlotDisplay) { + if (boneName === void 0) { boneName = null; } + if (updateSlotDisplay === void 0) { updateSlotDisplay = false; } + if (boneName !== null && boneName.length > 0) { + var bone = this.getBone(boneName); + if (bone !== null) { + bone.invalidUpdate(); + if (updateSlotDisplay) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === bone) { + slot.invalidUpdate(); + } + } + } + } + } + else { + for (var _b = 0, _c = this._bones; _b < _c.length; _b++) { + var bone = _c[_b]; + bone.invalidUpdate(); + } + if (updateSlotDisplay) { + for (var _d = 0, _e = this._slots; _d < _e.length; _d++) { + var slot = _e[_d]; + slot.invalidUpdate(); + } + } + } + }; + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.containsPoint = function (x, y) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.containsPoint(x, y)) { + return slot; + } + } + return null; + }; + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + Armature.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + var isV = xA === xB; + var dMin = 0.0; + var dMax = 0.0; + var intXA = 0.0; + var intYA = 0.0; + var intXB = 0.0; + var intYB = 0.0; + var intAN = 0.0; + var intBN = 0.0; + var intSlotA = null; + var intSlotB = null; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA !== null || intersectionPointB !== null) { + if (intersectionPointA !== null) { + var d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotA === null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + if (normalRadians) { + intAN = normalRadians.x; + } + } + } + if (intersectionPointB !== null) { + var d = intersectionPointB.x - xA; + if (d < 0.0) { + d = -d; + } + if (intSlotB === null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + if (normalRadians !== null) { + intBN = normalRadians.y; + } + } + } + } + else { + intSlotA = slot; + break; + } + } + } + if (intSlotA !== null && intersectionPointA !== null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + if (normalRadians !== null) { + normalRadians.x = intAN; + } + } + if (intSlotB !== null && intersectionPointB !== null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + if (normalRadians !== null) { + normalRadians.y = intBN; + } + } + return intSlotA; + }; + /** + * 获取指定名称的骨骼。 + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBone = function (name) { + for (var _i = 0, _a = this._bones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.name === name) { + return bone; + } + } + return null; + }; + /** + * 通过显示对象获取骨骼。 + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBoneByDisplay = function (display) { + var slot = this.getSlotByDisplay(display); + return slot !== null ? slot.parent : null; + }; + /** + * 获取插槽。 + * @param name 插槽的名称。 + * @returns 插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlot = function (name) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.name === name) { + return slot; + } + } + return null; + }; + /** + * 通过显示对象获取插槽。 + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlotByDisplay = function (display) { + if (display !== null) { + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.display === display) { + return slot; + } + } + } + return null; + }; + /** + * @deprecated + */ + Armature.prototype.addBone = function (value, parentName) { + if (parentName === void 0) { parentName = null; } + console.assert(value !== null); + value._setArmature(this); + value._setParent(parentName !== null ? this.getBone(parentName) : null); + }; + /** + * @deprecated + */ + Armature.prototype.removeBone = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * @deprecated + */ + Armature.prototype.addSlot = function (value, parentName) { + var bone = this.getBone(parentName); + console.assert(value !== null && bone !== null); + value._setArmature(this); + value._setParent(bone); + }; + /** + * @deprecated + */ + Armature.prototype.removeSlot = function (value) { + console.assert(value !== null && value.armature === this); + value._setParent(null); + value._setArmature(null); + }; + /** + * 获取所有骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getBones = function () { + return this._bones; + }; + /** + * 获取所有插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Armature.prototype.getSlots = function () { + return this._slots; + }; + Object.defineProperty(Armature.prototype, "flipX", { + get: function () { + return this._flipX; + }, + set: function (value) { + if (this._flipX === value) { + return; + } + this._flipX = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "flipY", { + get: function () { + return this._flipY; + }, + set: function (value) { + if (this._flipY === value) { + return; + } + this._flipY = value; + this.invalidUpdate(); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "cacheFrameRate", { + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * @see dragonBones.DragonBonesData#frameRate + * @see dragonBones.ArmatureData#frameRate + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this.armatureData.cacheFrameRate; + }, + set: function (value) { + if (this.armatureData.cacheFrameRate !== value) { + this.armatureData.cacheFrames(value); + // Set child armature frameRate. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.cacheFrameRate = value; + } + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "name", { + /** + * 骨架名称。 + * @see dragonBones.ArmatureData#name + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this.armatureData.name; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "animation", { + /** + * 获得动画控制器。 + * @see dragonBones.Animation + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._animation; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "proxy", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "eventDispatcher", { + /** + * @pivate + */ + get: function () { + return this._proxy; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "display", { + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "replacedTexture", { + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + get: function () { + return this._replacedTexture; + }, + set: function (value) { + if (this._replacedTexture === value) { + return; + } + if (this._replaceTextureAtlasData !== null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + this._replacedTexture = value; + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + slot.invalidUpdate(); + slot.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock) { + this._clock.add(this); + } + // Update childArmature clock. + for (var _i = 0, _a = this._slots; _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature.clock = this._clock; + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Armature.prototype, "parent", { + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * @see dragonBones.Slot + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#replacedTexture + */ + Armature.prototype.replaceTexture = function (texture) { + this.replacedTexture = texture; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.hasEventListener = function (type) { + return this._proxy.hasEvent(type); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.addEventListener = function (type, listener, target) { + this._proxy.addEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#eventDispatcher + */ + Armature.prototype.removeEventListener = function (type, listener, target) { + this._proxy.removeEvent(type, listener, target); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #cacheFrameRate + */ + Armature.prototype.enableAnimationCache = function (frameRate) { + this.cacheFrameRate = frameRate; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Armature.prototype.getDisplay = function () { + return this._display; + }; + return Armature; + }(dragonBones_1.BaseObject)); + dragonBones_1.Armature = Armature; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 基础变换对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var TransformObject = (function (_super) { + __extends(TransformObject, _super); + function TransformObject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * 相对于骨架坐标系的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.globalTransformMatrix = new dragonBones.Matrix(); + /** + * 相对于骨架坐标系的变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.global = new dragonBones.Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * @see dragonBones.Transform + * @version DragonBones 3.0 + * @language zh_CN + */ + _this.offset = new dragonBones.Transform(); + return _this; + } + /** + * @private + */ + TransformObject.prototype._onClear = function () { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setArmature = function (value) { + this._armature = value; + }; + /** + * @internal + * @private + */ + TransformObject.prototype._setParent = function (value) { + this._parent = value; + }; + /** + * @private + */ + TransformObject.prototype.updateGlobalTransform = function () { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + }; + Object.defineProperty(TransformObject.prototype, "armature", { + /** + * 所属的骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(TransformObject.prototype, "parent", { + /** + * 所属的父骨骼。 + * @see dragonBones.Bone + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._parent; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + TransformObject._helpMatrix = new dragonBones.Matrix(); + /** + * @private + */ + TransformObject._helpTransform = new dragonBones.Transform(); + /** + * @private + */ + TransformObject._helpPoint = new dragonBones.Point(); + return TransformObject; + }(dragonBones.BaseObject)); + dragonBones.TransformObject = TransformObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * @see dragonBones.BoneData + * @see dragonBones.Armature + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + var Bone = (function (_super) { + __extends(Bone, _super); + function Bone() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @internal + * @private + */ + _this.animationPose = new dragonBones.Transform(); + /** + * @internal + * @private + */ + _this.constraints = []; + _this._bones = []; + _this._slots = []; + return _this; + } + Bone.toString = function () { + return "[class dragonBones.Bone]"; + }; + /** + * @private + */ + Bone.prototype._onClear = function () { + _super.prototype._onClear.call(this); + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.returnToPool(); + } + this.offsetMode = 1 /* Additive */; + this.animationPose.identity(); + this.constraints.length = 0; + this.boneData = null; // + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1.0; + this._blendLayerWeight = 0.0; + this._bones.length = 0; + this._slots.length = 0; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Bone.prototype._updateGlobalTransformMatrix = function (isCache) { + var flipX = this._armature.flipX; + var flipY = this._armature.flipY === dragonBones.DragonBones.yDown; + var global = this.global; + var globalTransformMatrix = this.globalTransformMatrix; + var inherit = this._parent !== null; + var dR = 0.0; + if (this.offsetMode === 1 /* Additive */) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } + else if (this.offsetMode === 0 /* None */) { + global.copyFrom(this.origin).add(this.animationPose); + } + else { + inherit = false; + global.copyFrom(this.offset); + } + if (inherit) { + var parentMatrix = this._parent.globalTransformMatrix; + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } + else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } + else { + this._globalDirty = true; + } + } + else { + if (this.boneData.inheritTranslation) { + var x = global.x; + var y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } + else { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + } + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + if (this._parent.global.scaleX < 0.0) { + dR += Math.PI; + } + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0.0) { + dR -= global.rotation * 2.0; + if (flipX !== flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + global.rotation += dR; + } + else if (flipX || flipY) { + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + } + else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + if (flipY) { + global.y = -global.y; + } + if (flipX && flipY) { + dR = Math.PI; + } + else { + dR = -global.rotation * 2.0; + if (flipX) { + dR += Math.PI; + } + global.skew += Math.PI; + } + global.rotation += dR; + } + global.toMatrix(globalTransformMatrix); + } + }; + /** + * @internal + * @private + */ + Bone.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + var oldSlots = null; + var oldBones = null; + if (this._armature !== null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + this._armature = value; // + if (this._armature !== null) { + this._armature._addBoneToBoneList(this); + } + if (oldSlots !== null) { + for (var _i = 0, oldSlots_1 = oldSlots; _i < oldSlots_1.length; _i++) { + var slot = oldSlots_1[_i]; + if (slot.parent === this) { + slot._setArmature(this._armature); + } + } + } + if (oldBones !== null) { + for (var _a = 0, oldBones_1 = oldBones; _a < oldBones_1.length; _a++) { + var bone = oldBones_1[_a]; + if (bone.parent === this) { + bone._setArmature(this._armature); + } + } + } + }; + /** + * @internal + * @private + */ + Bone.prototype.init = function (boneData) { + if (this.boneData !== null) { + return; + } + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + }; + /** + * @internal + * @private + */ + Bone.prototype.update = function (cacheFrameIndex) { + this._blendDirty = false; + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else { + if (this.constraints.length > 0) { + for (var _i = 0, _a = this.constraints; _i < _a.length; _i++) { + var constraint = _a[_i]; + constraint.update(); + } + } + if (this._transformDirty || + (this._parent !== null && this._parent._childrenTransformDirty)) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } + else { + if (this.constraints.length > 0) { + for (var _b = 0, _c = this.constraints; _b < _c.length; _b++) { + var constraint = _c[_b]; + constraint.update(); + } + } + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } + else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + this._localDirty = true; + }; + /** + * @internal + * @private + */ + Bone.prototype.updateByConstraint = function () { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent !== null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + this._transformDirty = true; + } + }; + /** + * @internal + * @private + */ + Bone.prototype.addConstraint = function (constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.push(constraint); + } + }; + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.invalidUpdate = function () { + this._transformDirty = true; + }; + /** + * 是否包含骨骼或插槽。 + * @returns + * @see dragonBones.TransformObject + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.contains = function (child) { + if (child === this) { + return false; + } + var ancestor = child; + while (ancestor !== this && ancestor !== null) { + ancestor = ancestor.parent; + } + return ancestor === this; + }; + /** + * 所有的子骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getBones = function () { + this._bones.length = 0; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone.parent === this) { + this._bones.push(bone); + } + } + return this._bones; + }; + /** + * 所有的插槽。 + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + Bone.prototype.getSlots = function () { + this._slots.length = 0; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + this._slots.push(slot); + } + } + return this._slots; + }; + Object.defineProperty(Bone.prototype, "visible", { + /** + * 控制此骨骼所有插槽的可见。 + * @default true + * @see dragonBones.Slot + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._visible; + }, + set: function (value) { + if (this._visible === value) { + return; + } + this._visible = value; + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot._parent === this) { + slot._updateVisible(); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "length", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #boneData + * @see #dragonBones.BoneData#length + */ + get: function () { + return this.boneData.length; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Bone.prototype, "slot", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#getSlot() + */ + get: function () { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (slot.parent === this) { + return slot; + } + } + return null; + }, + enumerable: true, + configurable: true + }); + return Bone; + }(dragonBones.TransformObject)); + dragonBones.Bone = Bone; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * @see dragonBones.Armature + * @see dragonBones.Bone + * @see dragonBones.SlotData + * @version DragonBones 3.0 + * @language zh_CN + */ + var Slot = (function (_super) { + __extends(Slot, _super); + function Slot() { + var _this = _super !== null && _super.apply(this, arguments) || this; + /** + * @private + */ + _this._localMatrix = new dragonBones.Matrix(); + /** + * @private + */ + _this._colorTransform = new dragonBones.ColorTransform(); + /** + * @private + */ + _this._ffdVertices = []; + /** + * @private + */ + _this._displayDatas = []; + /** + * @private + */ + _this._displayList = []; + /** + * @private + */ + _this._meshBones = []; + /** + * @private + */ + _this._rawDisplay = null; // Initial value. + /** + * @private + */ + _this._meshDisplay = null; // Initial value. + return _this; + } + /** + * @private + */ + Slot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + var disposeDisplayList = []; + for (var _i = 0, _a = this._displayList; _i < _a.length; _i++) { + var eachDisplay = _a[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _b = 0, disposeDisplayList_1 = disposeDisplayList; _b < disposeDisplayList_1.length; _b++) { + var eachDisplay = disposeDisplayList_1[_b]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + if (this._meshDisplay !== null && this._meshDisplay !== this._rawDisplay) { + this._disposeDisplay(this._meshDisplay); + } + if (this._rawDisplay !== null) { + this._disposeDisplay(this._rawDisplay); + } + this.displayController = null; + this.slotData = null; // + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = 0 /* Normal */; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0.0; + this._pivotY = 0.0; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.length = 0; + this._displayList.length = 0; + this._displayDatas.length = 0; + this._meshBones.length = 0; + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + }; + /** + * @private + */ + Slot.prototype._updateDisplayData = function () { + var prevDisplayData = this._displayData; + var prevTextureData = this._textureData; + var prevMeshData = this._meshData; + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.length) { + this._displayData = this._displayDatas[this._displayIndex]; + } + else { + this._displayData = null; + } + // Update texture and mesh data. + if (this._displayData !== null) { + if (this._displayData.type === 0 /* Image */ || this._displayData.type === 2 /* Mesh */) { + this._textureData = this._displayData.texture; + if (this._displayData.type === 2 /* Mesh */) { + this._meshData = this._displayData; + } + else if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */) { + this._meshData = rawDisplayData; + } + else { + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + } + else { + this._textureData = null; + this._meshData = null; + } + // Update bounding box data. + if (this._displayData !== null && this._displayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = this._displayData.boundingBox; + } + else if (rawDisplayData !== null && rawDisplayData.type === 3 /* BoundingBox */) { + this._boundingBoxData = rawDisplayData.boundingBox; + } + else { + this._boundingBoxData = null; + } + if (this._displayData !== prevDisplayData || this._textureData !== prevTextureData || this._meshData !== prevMeshData) { + // Update pivot offset. + if (this._meshData !== null) { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + else if (this._textureData !== null) { + var imageDisplayData = this._displayData; + var scale = this._armature.armatureData.scale; + var frame = this._textureData.frame; + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + var rect = frame !== null ? frame : this._textureData.region; + var width = rect.width * scale; + var height = rect.height * scale; + if (this._textureData.rotated && frame === null) { + width = rect.height; + height = rect.width; + } + this._pivotX *= width; + this._pivotY *= height; + if (frame !== null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } + else { + this._pivotX = 0.0; + this._pivotY = 0.0; + } + // Update mesh bones and ffd vertices. + if (this._meshData !== prevMeshData) { + if (this._meshData !== null) { + if (this._meshData.weight !== null) { + this._ffdVertices.length = this._meshData.weight.count * 2; + this._meshBones.length = this._meshData.weight.bones.length; + for (var i = 0, l = this._meshBones.length; i < l; ++i) { + this._meshBones[i] = this._armature.getBone(this._meshData.weight.bones[i].name); + } + } + else { + var vertexCount = this._meshData.parent.parent.intArray[this._meshData.offset + 0 /* MeshVertexCount */]; + this._ffdVertices.length = vertexCount * 2; + this._meshBones.length = 0; + } + for (var i = 0, l = this._ffdVertices.length; i < l; ++i) { + this._ffdVertices[i] = 0.0; + } + this._meshDirty = true; + } + else { + this._ffdVertices.length = 0; + this._meshBones.length = 0; + } + } + else if (this._meshData !== null && this._textureData !== prevTextureData) { + this._meshDirty = true; + } + if (this._displayData !== null && rawDisplayData !== null && this._displayData !== rawDisplayData && this._meshData === null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0.0, 0.0, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + // Update original transform. + if (rawDisplayData !== null) { + this.origin = rawDisplayData.transform; + } + else if (this._displayData !== null) { + this.origin = this._displayData.transform; + } + this._displayDirty = true; + this._transformDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._updateDisplay = function () { + var prevDisplay = this._display !== null ? this._display : this._rawDisplay; + var prevChildArmature = this._childArmature; + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._display = this._displayList[this._displayIndex]; + if (this._display !== null && this._display instanceof dragonBones.Armature) { + this._childArmature = this._display; + this._display = this._childArmature.display; + } + else { + this._childArmature = null; + } + } + else { + this._display = null; + this._childArmature = null; + } + // Update display. + var currentDisplay = this._display !== null ? this._display : this._rawDisplay; + if (currentDisplay !== prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + // Update frame. + if (currentDisplay === this._rawDisplay || currentDisplay === this._meshDisplay) { + this._updateFrame(); + } + // Update child armature. + if (this._childArmature !== prevChildArmature) { + if (prevChildArmature !== null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.clock = null; + if (prevChildArmature.inheritAnimation) { + prevChildArmature.animation.reset(); + } + } + if (this._childArmature !== null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.clock = this._armature.clock; + if (this._childArmature.inheritAnimation) { + if (this._childArmature.cacheFrameRate === 0) { + var cacheFrameRate = this._armature.cacheFrameRate; + if (cacheFrameRate !== 0) { + this._childArmature.cacheFrameRate = cacheFrameRate; + } + } + // Child armature action. + var actions = null; + if (this._displayData !== null && this._displayData.type === 1 /* Armature */) { + actions = this._displayData.actions; + } + else { + var rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.length ? this._rawDisplayDatas[this._displayIndex] : null; + if (rawDisplayData !== null && rawDisplayData.type === 1 /* Armature */) { + actions = rawDisplayData.actions; + } + } + if (actions !== null && actions.length > 0) { + for (var _i = 0, actions_1 = actions; _i < actions_1.length; _i++) { + var action = actions_1[_i]; + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } + else { + this._childArmature.animation.play(); + } + } + } + } + }; + /** + * @private + */ + Slot.prototype._updateGlobalTransformMatrix = function (isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } + else { + this._globalDirty = true; + } + }; + /** + * @private + */ + Slot.prototype._isMeshBonesUpdate = function () { + for (var _i = 0, _a = this._meshBones; _i < _a.length; _i++) { + var bone = _a[_i]; + if (bone !== null && bone._childrenTransformDirty) { + return true; + } + } + return false; + }; + /** + * @internal + * @private + */ + Slot.prototype._setArmature = function (value) { + if (this._armature === value) { + return; + } + if (this._armature !== null) { + this._armature._removeSlotFromSlotList(this); + } + this._armature = value; // + this._onUpdateDisplay(); + if (this._armature !== null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } + else { + this._removeDisplay(); + } + }; + /** + * @internal + * @private + */ + Slot.prototype._setDisplayIndex = function (value, isAnimation) { + if (isAnimation === void 0) { isAnimation = false; } + if (isAnimation) { + if (this._animationDisplayIndex === value) { + return false; + } + this._animationDisplayIndex = value; + } + if (this._displayIndex === value) { + return false; + } + this._displayIndex = value; + this._displayDirty = true; + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setZorder = function (value) { + if (this._zOrder === value) { + //return false; + } + this._zOrder = value; + this._zOrderDirty = true; + return this._zOrderDirty; + }; + /** + * @internal + * @private + */ + Slot.prototype._setColor = function (value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + return this._colorDirty; + }; + /** + * @private + */ + Slot.prototype._setDisplayList = function (value) { + if (value !== null && value.length > 0) { + if (this._displayList.length !== value.length) { + this._displayList.length = value.length; + } + for (var i = 0, l = value.length; i < l; ++i) { + var eachDisplay = value[i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + !(eachDisplay instanceof dragonBones.Armature) && this._displayList.indexOf(eachDisplay) < 0) { + this._initDisplay(eachDisplay); + } + this._displayList[i] = eachDisplay; + } + } + else if (this._displayList.length > 0) { + this._displayList.length = 0; + } + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.length) { + this._displayDirty = this._display !== this._displayList[this._displayIndex]; + } + else { + this._displayDirty = this._display !== null; + } + this._updateDisplayData(); + return this._displayDirty; + }; + /** + * @private + */ + Slot.prototype.init = function (slotData, displayDatas, rawDisplay, meshDisplay) { + if (this.slotData !== null) { + return; + } + this.slotData = slotData; + this.name = this.slotData.name; + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + this._displayDatas.length = this._rawDisplayDatas.length; + for (var i = 0, l = this._displayDatas.length; i < l; ++i) { + this._displayDatas[i] = this._rawDisplayDatas[i]; + } + }; + /** + * @internal + * @private + */ + Slot.prototype.update = function (cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + if (this._transformDirty) { + if (this.origin !== null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } + else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + if (cacheFrameIndex >= 0 && this._cachedFrameIndices !== null) { + var cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex]; + if (cachedFrameIndex >= 0 && this._cachedFrameIndex === cachedFrameIndex) { + this._transformDirty = false; + } + else if (cachedFrameIndex >= 0) { + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + else if (this._cachedFrameIndex >= 0) { + this._transformDirty = false; + this._cachedFrameIndices[cacheFrameIndex] = this._cachedFrameIndex; + } + else { + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + else if (this._transformDirty || this._parent._childrenTransformDirty) { + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + if (this._display === null) { + return; + } + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + if (this._meshData !== null && this._display === this._meshDisplay) { + var isSkinned = this._meshData.weight !== null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + return; + } + } + if (this._transformDirty) { + this._transformDirty = false; + if (this._cachedFrameIndex < 0) { + var isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + if (isCache && this._cachedFrameIndices !== null) { + this._cachedFrameIndex = this._cachedFrameIndices[cacheFrameIndex] = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + } + } + else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + this._updateTransform(false); + } + }; + /** + * @private + */ + Slot.prototype.updateTransformAndMatrix = function () { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + }; + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @param color 指定的包围盒颜色。 [0: 与所有包围盒进行判断, N: 仅当包围盒的颜色为 N 时才进行判断] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.containsPoint = function (x, y) { + if (this._boundingBoxData === null) { + return false; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + }; + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + Slot.prototype.intersectsSegment = function (xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians) { + if (intersectionPointA === void 0) { intersectionPointA = null; } + if (intersectionPointB === void 0) { intersectionPointB = null; } + if (normalRadians === void 0) { normalRadians = null; } + if (this._boundingBoxData === null) { + return 0; + } + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + var intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount === 1 || intersectionCount === 2) { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB !== null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } + else if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + else { + if (intersectionPointA !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + if (intersectionPointB !== null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + if (normalRadians !== null) { + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.x), Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + this.globalTransformMatrix.transformPoint(Math.cos(normalRadians.y), Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + return intersectionCount; + }; + /** + * 在下一帧更新显示对象的状态。 + * @version DragonBones 4.5 + * @language zh_CN + */ + Slot.prototype.invalidUpdate = function () { + this._displayDirty = true; + this._transformDirty = true; + }; + Object.defineProperty(Slot.prototype, "displayIndex", { + /** + * 此时显示的显示对象在显示列表中的索引。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._displayIndex; + }, + set: function (value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "displayList", { + /** + * 包含显示对象或子骨架的显示列表。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._displayList.concat(); + }, + set: function (value) { + var backupDisplayList = this._displayList.concat(); // Copy. + var disposeDisplayList = new Array(); + if (this._setDisplayList(value)) { + this.update(-1); + } + // Release replaced displays. + for (var _i = 0, backupDisplayList_1 = backupDisplayList; _i < backupDisplayList_1.length; _i++) { + var eachDisplay = backupDisplayList_1[_i]; + if (eachDisplay !== null && eachDisplay !== this._rawDisplay && eachDisplay !== this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0) { + disposeDisplayList.push(eachDisplay); + } + } + for (var _a = 0, disposeDisplayList_2 = disposeDisplayList; _a < disposeDisplayList_2.length; _a++) { + var eachDisplay = disposeDisplayList_2[_a]; + if (eachDisplay instanceof dragonBones.Armature) { + eachDisplay.dispose(); + } + else { + this._disposeDisplay(eachDisplay); + } + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "boundingBoxData", { + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + */ + get: function () { + return this._boundingBoxData; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "rawDisplay", { + /** + * @private + */ + get: function () { + return this._rawDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "meshDisplay", { + /** + * @private + */ + get: function () { + return this._meshDisplay; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "display", { + /** + * 此时显示的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._display; + }, + set: function (value) { + if (this._display === value) { + return; + } + var displayListLength = this._displayList.length; + if (this._displayIndex < 0 && displayListLength === 0) { + this._displayIndex = 0; + } + if (this._displayIndex < 0) { + return; + } + else { + var replaceDisplayList = this.displayList; // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.length = this._displayIndex + 1; + } + replaceDisplayList[this._displayIndex] = value; + this.displayList = replaceDisplayList; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Slot.prototype, "childArmature", { + /** + * 此时显示的子骨架。 + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._childArmature; + }, + set: function (value) { + if (this._childArmature === value) { + return; + } + this.display = value; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.getDisplay = function () { + return this._display; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #display + */ + Slot.prototype.setDisplay = function (value) { + this.display = value; + }; + return Slot; + }(dragonBones.TransformObject)); + dragonBones.Slot = Slot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + * @internal + */ + var Constraint = (function (_super) { + __extends(Constraint, _super); + function Constraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + Constraint.prototype._onClear = function () { + this.target = null; // + this.bone = null; // + this.root = null; // + }; + Constraint._helpMatrix = new dragonBones.Matrix(); + Constraint._helpTransform = new dragonBones.Transform(); + Constraint._helpPoint = new dragonBones.Point(); + return Constraint; + }(dragonBones.BaseObject)); + dragonBones.Constraint = Constraint; + /** + * @private + * @internal + */ + var IKConstraint = (function (_super) { + __extends(IKConstraint, _super); + function IKConstraint() { + return _super !== null && _super.apply(this, arguments) || this; + } + IKConstraint.toString = function () { + return "[class dragonBones.IKConstraint]"; + }; + IKConstraint.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1.0; + }; + IKConstraint.prototype._computeA = function () { + var ikGlobal = this.target.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + var ikRadian = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadian += Math.PI; + } + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype._computeB = function () { + var boneLength = this.bone.boneData.length; + var parent = this.root; + var ikGlobal = this.target.global; + var parentGlobal = parent.global; + var global = this.bone.global; + var globalTransformMatrix = this.bone.globalTransformMatrix; + var x = globalTransformMatrix.a * boneLength; + var y = globalTransformMatrix.b * boneLength; + var lLL = x * x + y * y; + var lL = Math.sqrt(lLL); + var dX = global.x - parentGlobal.x; + var dY = global.y - parentGlobal.y; + var lPP = dX * dX + dY * dY; + var lP = Math.sqrt(lPP); + var rawRadianA = Math.atan2(dY, dX); + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + var lTT = dX * dX + dY * dY; + var lT = Math.sqrt(lTT); + var ikRadianA = 0.0; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } + else if (lP < lL) { + ikRadianA += Math.PI; + } + } + else { + var h = (lPP - lLL + lTT) / (2.0 * lTT); + var r = Math.sqrt(lPP - h * h * lTT) / lT; + var hX = parentGlobal.x + (dX * h); + var hY = parentGlobal.y + (dY * h); + var rX = -dY * r; + var rY = dX * r; + var isPPR = false; + if (parent._parent !== null) { + var parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0.0; + } + if (isPPR !== this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } + else { + global.x = hX + rX; + global.y = hY + rY; + } + ikRadianA = Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + var dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + var parentRadian = rawRadianA + dR; + global.x = parentGlobal.x + Math.cos(parentRadian) * lP; + global.y = parentGlobal.y + Math.sin(parentRadian) * lP; + var ikRadianB = Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0.0) { + ikRadianB += Math.PI; + } + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + }; + IKConstraint.prototype.update = function () { + if (this.root === null) { + this.bone.updateByConstraint(); + this._computeA(); + } + else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + }; + return IKConstraint; + }(Constraint)); + dragonBones.IKConstraint = IKConstraint; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * @see dragonBones.IAnimateble + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var WorldClock = (function () { + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * @version DragonBones 3.0 + * @language zh_CN + */ + function WorldClock(time) { + if (time === void 0) { time = -1.0; } + /** + * 当前时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + this.time = 0.0; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * @default 1.0 + * @version DragonBones 3.0 + * @language zh_CN + */ + this.timeScale = 1.0; + this._animatebles = []; + this._clock = null; + if (time < 0.0) { + this.time = new Date().getTime() * 0.001; + } + else { + this.time = time; + } + } + /** + * 为所有的 IAnimatable 实例更新时间。 + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.advanceTime = function (passedTime) { + if (passedTime !== passedTime) { + passedTime = 0.0; + } + if (passedTime < 0.0) { + passedTime = new Date().getTime() * 0.001 - this.time; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + if (passedTime < 0.0) { + this.time -= passedTime; + } + else { + this.time += passedTime; + } + if (passedTime === 0.0) { + return; + } + var i = 0, r = 0, l = this._animatebles.length; + for (; i < l; ++i) { + var animatable = this._animatebles[i]; + if (animatable !== null) { + if (r > 0) { + this._animatebles[i - r] = animatable; + this._animatebles[i] = null; + } + animatable.advanceTime(passedTime); + } + else { + r++; + } + } + if (r > 0) { + l = this._animatebles.length; + for (; i < l; ++i) { + var animateble = this._animatebles[i]; + if (animateble !== null) { + this._animatebles[i - r] = animateble; + } + else { + r++; + } + } + this._animatebles.length -= r; + } + }; + /** + * 是否包含 IAnimatable 实例 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.contains = function (value) { + return this._animatebles.indexOf(value) >= 0; + }; + /** + * 添加 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.add = function (value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.push(value); + value.clock = this; + } + }; + /** + * 移除 IAnimatable 实例。 + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.remove = function (value) { + var index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles[index] = null; + value.clock = null; + } + }; + /** + * 清除所有的 IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.prototype.clear = function () { + for (var _i = 0, _a = this._animatebles; _i < _a.length; _i++) { + var animatable = _a[_i]; + if (animatable !== null) { + animatable.clock = null; + } + } + }; + Object.defineProperty(WorldClock.prototype, "clock", { + /** + * @inheritDoc + */ + get: function () { + return this._clock; + }, + set: function (value) { + if (this._clock === value) { + return; + } + if (this._clock !== null) { + this._clock.remove(this); + } + this._clock = value; + if (this._clock !== null) { + this._clock.add(this); + } + }, + enumerable: true, + configurable: true + }); + /** + * 一个可以直接使用的全局 WorldClock 实例. + * @version DragonBones 3.0 + * @language zh_CN + */ + WorldClock.clock = new WorldClock(); + return WorldClock; + }()); + dragonBones.WorldClock = WorldClock; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 动画控制器,用来播放动画数据,管理动画状态。 + * @see dragonBones.AnimationData + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + var Animation = (function (_super) { + __extends(Animation, _super); + function Animation() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._animationNames = []; + _this._animationStates = []; + _this._animations = {}; + _this._animationConfig = null; // Initial value. + return _this; + } + /** + * @private + */ + Animation.toString = function () { + return "[class dragonBones.Animation]"; + }; + /** + * @private + */ + Animation.prototype._onClear = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + for (var k in this._animations) { + delete this._animations[k]; + } + if (this._animationConfig !== null) { + this._animationConfig.returnToPool(); + } + this.timeScale = 1.0; + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.length = 0; + this._animationStates.length = 0; + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + }; + Animation.prototype._fadeOut = function (animationConfig) { + switch (animationConfig.fadeOutMode) { + case 1 /* SameLayer */: + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.layer === animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 2 /* SameGroup */: + for (var _b = 0, _c = this._animationStates; _b < _c.length; _b++) { + var animationState = _c[_b]; + if (animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 3 /* SameLayerAndGroup */: + for (var _d = 0, _e = this._animationStates; _d < _e.length; _d++) { + var animationState = _e[_d]; + if (animationState.layer === animationConfig.layer && + animationState.group === animationConfig.group) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + case 4 /* All */: + for (var _f = 0, _g = this._animationStates; _f < _g.length; _f++) { + var animationState = _g[_f]; + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + case 0 /* None */: + case 5 /* Single */: + default: + break; + } + }; + /** + * @internal + * @private + */ + Animation.prototype.init = function (armature) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this._animationConfig = dragonBones.BaseObject.borrowObject(dragonBones.AnimationConfig); + }; + /** + * @internal + * @private + */ + Animation.prototype.advanceTime = function (passedTime) { + if (passedTime < 0.0) { + passedTime = -passedTime; + } + if (this._armature.inheritAnimation && this._armature._parent !== null) { + passedTime *= this._armature._parent._armature.animation.timeScale; + } + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + var animationStateCount = this._animationStates.length; + if (animationStateCount === 1) { + var animationState = this._animationStates[0]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.length = 0; + this._lastAnimationState = null; + } + else { + var animationData = animationState.animationData; + var cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0.0) { + this._animationDirty = false; + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, cacheFrameRate); + } + } + else if (animationStateCount > 1) { + for (var i = 0, r = 0; i < animationStateCount; ++i) { + var animationState = this._animationStates[i]; + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState === animationState) { + this._lastAnimationState = null; + } + } + else { + if (r > 0) { + this._animationStates[i - r] = animationState; + } + if (this._timelineDirty) { + animationState.updateTimelines(); + } + animationState.advanceTime(passedTime, 0.0); + } + if (i === animationStateCount - 1 && r > 0) { + this._animationStates.length -= r; + if (this._lastAnimationState === null && this._animationStates.length > 0) { + this._lastAnimationState = this._animationStates[this._animationStates.length - 1]; + } + } + } + this._armature._cacheFrameIndex = -1; + } + else { + this._armature._cacheFrameIndex = -1; + } + this._timelineDirty = false; + }; + /** + * 清除所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.reset = function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.returnToPool(); + } + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.length = 0; + this._lastAnimationState = null; + }; + /** + * 暂停播放动画。 + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.stop = function (animationName) { + if (animationName === void 0) { animationName = null; } + if (animationName !== null) { + var animationState = this.getState(animationName); + if (animationState !== null) { + animationState.stop(); + } + } + else { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + animationState.stop(); + } + } + }; + /** + * 通过动画配置来播放动画。 + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationConfig + * @see dragonBones.AnimationState + * @version DragonBones 5.0 + * @beta + * @language zh_CN + */ + Animation.prototype.playConfig = function (animationConfig) { + var animationName = animationConfig.animation; + if (!(animationName in this._animations)) { + console.warn("Non-existent animation.\n", "DragonBones name: " + this._armature.armatureData.parent.name, "Armature name: " + this._armature.name, "Animation name: " + animationName); + return null; + } + var animationData = this._animations[animationName]; + if (animationConfig.fadeOutMode === 5 /* Single */) { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState_1 = _a[_i]; + if (animationState_1.animationData === animationData) { + return animationState_1; + } + } + } + if (this._animationStates.length === 0) { + animationConfig.fadeInTime = 0.0; + } + else if (animationConfig.fadeInTime < 0.0) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + if (animationConfig.fadeOutTime < 0.0) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1.0 / animationData.scale; + } + if (animationData.frameCount > 1) { + if (animationConfig.position < 0.0) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } + else if (animationConfig.position === animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } + else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + if (animationConfig.duration > 0.0 && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } + else { + animationConfig.playTimes = 1; + animationConfig.position = 0.0; + if (animationConfig.duration > 0.0) { + animationConfig.duration = 0.0; + } + } + if (animationConfig.duration === 0.0) { + animationConfig.duration = -1.0; + } + this._fadeOut(animationConfig); + var animationState = dragonBones.BaseObject.borrowObject(dragonBones.AnimationState); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + if (this._animationStates.length > 0) { + var added = false; + for (var i = 0, l = this._animationStates.length; i < l; ++i) { + if (animationState.layer >= this._animationStates[i].layer) { + } + else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + if (!added) { + this._animationStates.push(animationState); + } + } + else { + this._animationStates.push(animationState); + } + // Child armature play same name animation. + for (var _b = 0, _c = this._armature.getSlots(); _b < _c.length; _b++) { + var slot = _c[_b]; + var childArmature = slot.childArmature; + if (childArmature !== null && childArmature.inheritAnimation && + childArmature.animation.hasAnimation(animationName) && + childArmature.animation.getState(animationName) === null) { + childArmature.animation.fadeIn(animationName); // + } + } + if (animationConfig.fadeInTime <= 0.0) { + this._armature.advanceTime(0.0); + } + this._lastAnimationState = animationState; + return animationState; + }; + /** + * 播放动画。 + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.play = function (animationName, playTimes) { + if (animationName === void 0) { animationName = null; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName !== null ? animationName : ""; + if (animationName !== null && animationName.length > 0) { + this.playConfig(this._animationConfig); + } + else if (this._lastAnimationState === null) { + var defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation !== null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } + else if (!this._lastAnimationState.isPlaying && !this._lastAnimationState.isCompleted) { + this._lastAnimationState.play(); + } + else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + return this._lastAnimationState; + }; + /** + * 淡入播放动画。 + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @param resetToPose + * @returns 对应的动画状态。 + * @see dragonBones.AnimationFadeOutMode + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.fadeIn = function (animationName, fadeInTime, playTimes, layer, group, fadeOutMode) { + if (fadeInTime === void 0) { fadeInTime = -1.0; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定时间开始播放动画。 + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByTime = function (animationName, time, playTimes) { + if (time === void 0) { time = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + return this.playConfig(this._animationConfig); + }; + /** + * 从指定帧开始播放动画。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByFrame = function (animationName, frame, playTimes) { + if (frame === void 0) { frame = 0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + return this.playConfig(this._animationConfig); + }; + /** + * 从指定进度开始播放动画。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndPlayByProgress = function (animationName, progress, playTimes) { + if (progress === void 0) { progress = 0.0; } + if (playTimes === void 0) { playTimes = -1; } + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0.0; + this._animationConfig.animation = animationName; + var animationData = animationName in this._animations ? this._animations[animationName] : null; + if (animationData !== null) { + this._animationConfig.position = animationData.duration * (progress > 0.0 ? progress : 0.0); + } + return this.playConfig(this._animationConfig); + }; + /** + * 将动画停止到指定的时间。 + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByTime = function (animationName, time) { + if (time === void 0) { time = 0.0; } + var animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的帧。 + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByFrame = function (animationName, frame) { + if (frame === void 0) { frame = 0; } + var animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 将动画停止到指定的进度。 + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 4.5 + * @language zh_CN + */ + Animation.prototype.gotoAndStopByProgress = function (animationName, progress) { + if (progress === void 0) { progress = 0.0; } + var animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState !== null) { + animationState.stop(); + } + return animationState; + }; + /** + * 获取动画状态。 + * @param animationName 动画状态的名称。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.getState = function (animationName) { + var i = this._animationStates.length; + while (i--) { + var animationState = this._animationStates[i]; + if (animationState.name === animationName) { + return animationState; + } + } + return null; + }; + /** + * 是否包含动画数据。 + * @param animationName 动画数据的名称。 + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + Animation.prototype.hasAnimation = function (animationName) { + return animationName in this._animations; + }; + /** + * 获取所有的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 5.1 + * @language zh_CN + */ + Animation.prototype.getStates = function () { + return this._animationStates; + }; + Object.defineProperty(Animation.prototype, "isPlaying", { + /** + * 动画是否处于播放状态。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (animationState.isPlaying) { + return true; + } + } + return false; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "isCompleted", { + /** + * 所有动画状态是否均已播放完毕。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + for (var _i = 0, _a = this._animationStates; _i < _a.length; _i++) { + var animationState = _a[_i]; + if (!animationState.isCompleted) { + return false; + } + } + return this._animationStates.length > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationName", { + /** + * 上一个正在播放的动画状态名称。 + * @see #lastAnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState !== null ? this._lastAnimationState.name : ""; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationNames", { + /** + * 所有动画数据名称。 + * @see #animations + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animations", { + /** + * 所有动画数据。 + * @see dragonBones.AnimationData + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._animations; + }, + set: function (value) { + if (this._animations === value) { + return; + } + this._animationNames.length = 0; + for (var k in this._animations) { + delete this._animations[k]; + } + for (var k in value) { + this._animations[k] = value[k]; + this._animationNames.push(k); + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationConfig", { + /** + * 一个可以快速使用的动画配置实例。 + * @see dragonBones.AnimationConfig + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + this._animationConfig.clear(); + return this._animationConfig; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "lastAnimationState", { + /** + * 上一个正在播放的动画状态。 + * @see dragonBones.AnimationState + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._lastAnimationState; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see #play() + * @see #fadeIn() + * @see #gotoAndPlayByTime() + * @see #gotoAndPlayByFrame() + * @see #gotoAndPlayByProgress() + */ + Animation.prototype.gotoAndPlay = function (animationName, fadeInTime, duration, playTimes, layer, group, fadeOutMode, pauseFadeOut, pauseFadeIn) { + if (fadeInTime === void 0) { fadeInTime = -1; } + if (duration === void 0) { duration = -1; } + if (playTimes === void 0) { playTimes = -1; } + if (layer === void 0) { layer = 0; } + if (group === void 0) { group = null; } + if (fadeOutMode === void 0) { fadeOutMode = 3 /* SameLayerAndGroup */; } + if (pauseFadeOut === void 0) { pauseFadeOut = true; } + if (pauseFadeIn === void 0) { pauseFadeIn = true; } + pauseFadeOut; + pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group !== null ? group : ""; + var animationData = this._animations[animationName]; + if (animationData && duration > 0.0) { + this._animationConfig.timeScale = animationData.duration / duration; + } + return this.playConfig(this._animationConfig); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see #gotoAndStopByTime() + * @see #gotoAndStopByFrame() + * @see #gotoAndStopByProgress() + */ + Animation.prototype.gotoAndStop = function (animationName, time) { + if (time === void 0) { time = 0; } + return this.gotoAndStopByTime(animationName, time); + }; + Object.defineProperty(Animation.prototype, "animationList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + return this._animationNames; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(Animation.prototype, "animationDataList", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationNames + * @see #animations + */ + get: function () { + var list = []; + for (var i = 0, l = this._animationNames.length; i < l; ++i) { + list.push(this._animations[this._animationNames[i]]); + } + return list; + }, + enumerable: true, + configurable: true + }); + return Animation; + }(dragonBones.BaseObject)); + dragonBones.Animation = Animation; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var BonePose = (function (_super) { + __extends(BonePose, _super); + function BonePose() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.current = new dragonBones.Transform(); + _this.delta = new dragonBones.Transform(); + _this.result = new dragonBones.Transform(); + return _this; + } + BonePose.toString = function () { + return "[class dragonBones.BonePose]"; + }; + BonePose.prototype._onClear = function () { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + }; + return BonePose; + }(dragonBones.BaseObject)); + dragonBones.BonePose = BonePose; + /** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * @see dragonBones.Animation + * @see dragonBones.AnimationData + * @version DragonBones 3.0 + * @language zh_CN + */ + var AnimationState = (function (_super) { + __extends(AnimationState, _super); + function AnimationState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._boneMask = []; + _this._boneTimelines = []; + _this._slotTimelines = []; + _this._bonePoses = {}; + /** + * @internal + * @private + */ + _this._actionTimeline = null; // Initial value. + _this._zOrderTimeline = null; // Initial value. + return _this; + } + /** + * @private + */ + AnimationState.toString = function () { + return "[class dragonBones.AnimationState]"; + }; + /** + * @private + */ + AnimationState.prototype._onClear = function () { + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.returnToPool(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.returnToPool(); + } + for (var k in this._bonePoses) { + this._bonePoses[k].returnToPool(); + delete this._bonePoses[k]; + } + if (this._actionTimeline !== null) { + this._actionTimeline.returnToPool(); + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.returnToPool(); + } + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1.0; + this.weight = 1.0; + this.autoFadeOutTime = 0.0; + this.fadeTotalTime = 0.0; + this.name = ""; + this.group = ""; + this.animationData = null; // + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0.0; + this._duration = 0.0; + this._fadeTime = 0.0; + this._time = 0.0; + this._fadeProgress = 0.0; + this._weightResult = 0.0; + this._boneMask.length = 0; + this._boneTimelines.length = 0; + this._slotTimelines.length = 0; + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + }; + AnimationState.prototype._isDisabled = function (slot) { + if (this.displayControl) { + var displayController = slot.displayController; + if (displayController === null || + displayController === this.name || + displayController === this.group) { + return false; + } + } + return true; + }; + AnimationState.prototype._advanceFadeTime = function (passedTime) { + var isFadeOut = this._fadeState > 0; + if (this._subFadeState < 0) { + this._subFadeState = 0; + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT : dragonBones.EventObject.FADE_IN; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + if (passedTime < 0.0) { + passedTime = -passedTime; + } + this._fadeTime += passedTime; + if (this._fadeTime >= this.fadeTotalTime) { + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0.0 : 1.0; + } + else if (this._fadeTime > 0.0) { + this._fadeProgress = isFadeOut ? (1.0 - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } + else { + this._fadeProgress = isFadeOut ? 1.0 : 0.0; + } + if (this._subFadeState > 0) { + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + var eventType = isFadeOut ? dragonBones.EventObject.FADE_OUT_COMPLETE : dragonBones.EventObject.FADE_IN_COMPLETE; + if (this._armature.eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + }; + AnimationState.prototype._blendBoneTimline = function (timeline) { + var bone = timeline.bone; + var bonePose = timeline.bonePose.result; + var animationPose = bone.animationPose; + var boneWeight = this._weightResult > 0.0 ? this._weightResult : -this._weightResult; + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1.0; + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1.0) * boneWeight + 1.0; + animationPose.scaleY = (bonePose.scaleY - 1.0) * boneWeight + 1.0; + } + else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1.0) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1.0) * boneWeight; + } + if (this._fadeState !== 0 || this._subFadeState !== 0) { + bone._transformDirty = true; + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.init = function (armature, animationData, animationConfig) { + if (this._armature !== null) { + return; + } + this._armature = armature; + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } + else { + this._playheadState = 3; // 11 + } + if (animationConfig.duration < 0.0) { + this._position = 0.0; + this._duration = this.animationData.duration; + if (animationConfig.position !== 0.0) { + if (this.timeScale >= 0.0) { + this._time = animationConfig.position; + } + else { + this._time = animationConfig.position - this._duration; + } + } + else { + this._time = 0.0; + } + } + else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0.0; + } + if (this.timeScale < 0.0 && this._time === 0.0) { + this._time = -0.000001; // Turn to end. + } + if (this.fadeTotalTime <= 0.0) { + this._fadeProgress = 0.999999; // Make different. + } + if (animationConfig.boneMask.length > 0) { + this._boneMask.length = animationConfig.boneMask.length; + for (var i = 0, l = this._boneMask.length; i < l; ++i) { + this._boneMask[i] = animationConfig.boneMask[i]; + } + } + this._actionTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ActionTimelineState); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0.0) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + if (this.animationData.zOrderTimeline !== null) { + this._zOrderTimeline = dragonBones.BaseObject.borrowObject(dragonBones.ZOrderTimelineState); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.updateTimelines = function () { + var boneTimelines = {}; + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + var timelineName = timeline.bone.name; + if (!(timelineName in boneTimelines)) { + boneTimelines[timelineName] = []; + } + boneTimelines[timelineName].push(timeline); + } + for (var _b = 0, _c = this._armature.getBones(); _b < _c.length; _b++) { + var bone = _c[_b]; + var timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + var timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (timelineName in boneTimelines) { + delete boneTimelines[timelineName]; + } + else { + var bonePose = timelineName in this._bonePoses ? this._bonePoses[timelineName] : (this._bonePoses[timelineName] = dragonBones.BaseObject.borrowObject(BonePose)); + if (timelineDatas !== null) { + for (var _d = 0, timelineDatas_1 = timelineDatas; _d < timelineDatas_1.length; _d++) { + var timelineData = timelineDatas_1[_d]; + switch (timelineData.type) { + case 10 /* BoneAll */: + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + case 11 /* BoneT */: + case 12 /* BoneR */: + case 13 /* BoneS */: + // TODO + break; + case 14 /* BoneX */: + case 15 /* BoneY */: + case 16 /* BoneRotate */: + case 17 /* BoneSkew */: + case 18 /* BoneScaleX */: + case 19 /* BoneScaleY */: + // TODO + break; + } + } + } + else if (this.resetToPose) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.BoneAllTimelineState); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + for (var k in boneTimelines) { + for (var _e = 0, _f = boneTimelines[k]; _e < _f.length; _e++) { + var timeline = _f[_e]; + this._boneTimelines.splice(this._boneTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + var slotTimelines = {}; + var ffdFlags = []; + for (var _g = 0, _h = this._slotTimelines; _g < _h.length; _g++) { + var timeline = _h[_g]; + var timelineName = timeline.slot.name; + if (!(timelineName in slotTimelines)) { + slotTimelines[timelineName] = []; + } + slotTimelines[timelineName].push(timeline); + } + for (var _j = 0, _k = this._armature.getSlots(); _j < _k.length; _j++) { + var slot = _k[_j]; + var boneName = slot.parent.name; + if (!this.containsBoneMask(boneName)) { + continue; + } + var timelineName = slot.name; + var timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (timelineName in slotTimelines) { + delete slotTimelines[timelineName]; + } + else { + var displayIndexFlag = false; + var colorFlag = false; + ffdFlags.length = 0; + if (timelineDatas !== null) { + for (var _l = 0, timelineDatas_2 = timelineDatas; _l < timelineDatas_2.length; _l++) { + var timelineData = timelineDatas_2[_l]; + switch (timelineData.type) { + case 20 /* SlotDisplay */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + case 21 /* SlotColor */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + case 22 /* SlotFFD */: + { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + if (this.resetToPose) { + if (!displayIndexFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotDislayIndexTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + if (!colorFlag) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotColorTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + for (var _m = 0, _o = slot._rawDisplayDatas; _m < _o.length; _m++) { + var displayData = _o[_m]; + if (displayData !== null && displayData.type === 2 /* Mesh */ && ffdFlags.indexOf(displayData.offset) < 0) { + var timeline = dragonBones.BaseObject.borrowObject(dragonBones.SlotFFDTimelineState); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + for (var k in slotTimelines) { + for (var _p = 0, _q = slotTimelines[k]; _p < _q.length; _p++) { + var timeline = _q[_p]; + this._slotTimelines.splice(this._slotTimelines.indexOf(timeline), 1); + timeline.returnToPool(); + } + } + }; + /** + * @private + * @internal + */ + AnimationState.prototype.advanceTime = function (passedTime, cacheFrameRate) { + // Update fade time. + if (this._fadeState !== 0 || this._subFadeState !== 0) { + this._advanceFadeTime(passedTime); + } + // Update time. + if (this._playheadState === 3) { + if (this.timeScale !== 1.0) { + passedTime *= this.timeScale; + } + this._time += passedTime; + } + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + if (this.weight === 0.0) { + return; + } + var isCacheEnabled = this._fadeState === 0 && cacheFrameRate > 0.0; + var isUpdateTimeline = true; + var isUpdateBoneTimeline = true; + var time = this._time; + this._weightResult = this.weight * this._fadeProgress; + this._actionTimeline.update(time); // Update main timeline. + if (isCacheEnabled) { + var internval = cacheFrameRate * 2.0; + this._actionTimeline.currentTime = Math.floor(this._actionTimeline.currentTime * internval) / internval; + } + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.update(time); + } + if (isCacheEnabled) { + var cacheFrameIndex = Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex === cacheFrameIndex) { + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } + else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames[cacheFrameIndex]) { + isUpdateBoneTimeline = false; + } + else { + this.animationData.cachedFrames[cacheFrameIndex] = true; + } + } + } + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { + var bone = null; + var prevTimeline = null; // + for (var i = 0, l = this._boneTimelines.length; i < l; ++i) { + var timeline = this._boneTimelines[i]; + if (bone !== timeline.bone) { + if (bone !== null) { + this._blendBoneTimline(prevTimeline); + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0.0) { + if (bone._blendLayer !== this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0.0; + bone = null; + } + else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0.0; + } + } + } + else { + bone = null; + } + } + } + bone = timeline.bone; + } + if (bone !== null) { + timeline.update(time); + if (i === l - 1) { + this._blendBoneTimline(timeline); + } + else { + prevTimeline = timeline; + } + } + } + } + for (var i = 0, l = this._slotTimelines.length; i < l; ++i) { + var timeline = this._slotTimelines[i]; + if (this._isDisabled(timeline.slot)) { + continue; + } + timeline.update(time); + } + } + if (this._fadeState === 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0.0) { + this.fadeOut(this.autoFadeOutTime); + } + } + } + }; + /** + * 继续播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.play = function () { + this._playheadState = 3; // 11 + }; + /** + * 暂停播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.stop = function () { + this._playheadState &= 1; // 0x + }; + /** + * 淡出动画。 + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.fadeOut = function (fadeOutTime, pausePlayhead) { + if (pausePlayhead === void 0) { pausePlayhead = true; } + if (fadeOutTime < 0.0) { + fadeOutTime = 0.0; + } + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { + return; + } + } + else { + this._fadeState = 1; + this._subFadeState = -1; + if (fadeOutTime <= 0.0 || this._fadeProgress <= 0.0) { + this._fadeProgress = 0.000001; // Modify fade progress to different value. + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.fadeOut(); + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.fadeOut(); + } + } + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0.0; + this._fadeTime = this.fadeTotalTime * (1.0 - this._fadeProgress); + }; + /** + * 是否包含骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.containsBoneMask = function (name) { + return this._boneMask.length === 0 || this._boneMask.indexOf(name) >= 0; + }; + /** + * 添加骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.addBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var currentBone = this._armature.getBone(name); + if (currentBone === null) { + return; + } + if (this._boneMask.indexOf(name) < 0) { + this._boneMask.push(name); + } + if (recursive) { + for (var _i = 0, _a = this._armature.getBones(); _i < _a.length; _i++) { + var bone = _a[_i]; + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + this._timelineDirty = true; + }; + /** + * 删除骨骼遮罩。 + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeBoneMask = function (name, recursive) { + if (recursive === void 0) { recursive = true; } + var index = this._boneMask.indexOf(name); + if (index >= 0) { + this._boneMask.splice(index, 1); + } + if (recursive) { + var currentBone = this._armature.getBone(name); + if (currentBone !== null) { + var bones = this._armature.getBones(); + if (this._boneMask.length > 0) { + for (var _i = 0, bones_1 = bones; _i < bones_1.length; _i++) { + var bone = bones_1[_i]; + var index_2 = this._boneMask.indexOf(bone.name); + if (index_2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index_2, 1); + } + } + } + else { + for (var _a = 0, bones_2 = bones; _a < bones_2.length; _a++) { + var bone = bones_2[_a]; + if (bone === currentBone) { + continue; + } + if (!currentBone.contains(bone)) { + this._boneMask.push(bone.name); + } + } + } + } + } + this._timelineDirty = true; + }; + /** + * 删除所有骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + AnimationState.prototype.removeAllBoneMask = function () { + this._boneMask.length = 0; + this._timelineDirty = true; + }; + Object.defineProperty(AnimationState.prototype, "isFadeIn", { + /** + * 是否正在淡入。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState < 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeOut", { + /** + * 是否正在淡出。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isFadeComplete", { + /** + * 是否淡入完毕。 + * @version DragonBones 5.1 + * @language zh_CN + */ + get: function () { + return this._fadeState === 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isPlaying", { + /** + * 是否正在播放。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return (this._playheadState & 2) !== 0 && this._actionTimeline.playState <= 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "isCompleted", { + /** + * 是否播放完毕。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.playState > 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentPlayTimes", { + /** + * 当前播放次数。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentPlayTimes; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "totalTime", { + /** + * 总时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._duration; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "currentTime", { + /** + * 当前播放的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._actionTimeline.currentTime; + }, + set: function (value) { + var currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + if (this.playTimes > 0 && currentPlayTimes === this.playTimes - 1 && value === this._duration) { + value = this._duration - 0.000001; + } + if (this._time === value) { + return; + } + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + if (this._zOrderTimeline !== null) { + this._zOrderTimeline.playState = -1; + } + for (var _i = 0, _a = this._boneTimelines; _i < _a.length; _i++) { + var timeline = _a[_i]; + timeline.playState = -1; + } + for (var _b = 0, _c = this._slotTimelines; _b < _c.length; _b++) { + var timeline = _c[_b]; + timeline.playState = -1; + } + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(AnimationState.prototype, "clip", { + /** + * @deprecated + * 已废弃,请参考 @see + * @see #animationData + */ + get: function () { + return this.animationData; + }, + enumerable: true, + configurable: true + }); + return AnimationState; + }(dragonBones.BaseObject)); + dragonBones.AnimationState = AnimationState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var TimelineState = (function (_super) { + __extends(TimelineState, _super); + function TimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TimelineState.prototype._onClear = function () { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1.0; + this._tweenState = 0 /* None */; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0.0; + this._position = 0.0; + this._duration = 0.0; + this._timeScale = 1.0; + this._timeOffset = 0.0; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + }; + TimelineState.prototype._setCurrentTime = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this._actionTimeline !== null && this._frameCount <= 1) { + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } + else if (this._actionTimeline === null || this._timeScale !== 1.0 || this._timeOffset !== 0.0) { + var playTimes = this._animationState.playTimes; + var totalTime = playTimes * this._duration; + passedTime *= this._timeScale; + if (this._timeOffset !== 0.0) { + passedTime += this._timeOffset * this._animationData.duration; + } + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState === 3) { + this.playState = 1; + } + this.currentPlayTimes = playTimes; + if (passedTime < 0.0) { + this.currentTime = 0.0; + } + else { + this.currentTime = this._duration; + } + } + else { + if (this.playState !== 0 && this._animationState._playheadState === 3) { + this.playState = 0; + } + if (passedTime < 0.0) { + passedTime = -passedTime; + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } + else { + this.currentPlayTimes = Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + this.currentTime += this._position; + } + else { + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + if (this.currentPlayTimes === prevPlayTimes && this.currentTime === prevTime) { + return false; + } + // Clear frame flag when timeline start or loopComplete. + if ((prevState < 0 && this.playState !== prevState) || + (this.playState <= 0 && this.currentPlayTimes !== prevPlayTimes)) { + this._frameIndex = -1; + } + return true; + }; + TimelineState.prototype.init = function (armature, animationState, timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + if (this === this._actionTimeline) { + this._actionTimeline = null; // + } + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1.0 / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + if (this._timelineData !== null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + this._frameCount = this._timelineArray[this._timelineData.offset + 2 /* TimelineKeyFrameCount */]; + this._frameValueOffset = this._timelineArray[this._timelineData.offset + 4 /* TimelineFrameValueOffset */]; + this._timeScale = 100.0 / this._timelineArray[this._timelineData.offset + 0 /* TimelineScale */]; + this._timeOffset = this._timelineArray[this._timelineData.offset + 1 /* TimelineOffset */] * 0.01; + } + }; + TimelineState.prototype.fadeOut = function () { }; + TimelineState.prototype.update = function (passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[this._timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + this._onArriveAtFrame(); + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + } + this._onArriveAtFrame(); + } + if (this._tweenState !== 0 /* None */) { + this._onUpdateFrame(); + } + } + }; + return TimelineState; + }(dragonBones.BaseObject)); + dragonBones.TimelineState = TimelineState; + /** + * @internal + * @private + */ + var TweenTimelineState = (function (_super) { + __extends(TweenTimelineState, _super); + function TweenTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + TweenTimelineState._getEasingValue = function (tweenType, progress, easing) { + var value = progress; + switch (tweenType) { + case 3 /* QuadIn */: + value = Math.pow(progress, 2.0); + break; + case 4 /* QuadOut */: + value = 1.0 - Math.pow(1.0 - progress, 2.0); + break; + case 5 /* QuadInOut */: + value = 0.5 * (1.0 - Math.cos(progress * Math.PI)); + break; + } + return (value - progress) * easing + progress; + }; + TweenTimelineState._getEasingCurveValue = function (progress, samples, count, offset) { + if (progress <= 0.0) { + return 0.0; + } + else if (progress >= 1.0) { + return 1.0; + } + var segmentCount = count + 1; // + 2 - 1 + var valueIndex = Math.floor(progress * segmentCount); + var fromValue = valueIndex === 0 ? 0.0 : samples[offset + valueIndex - 1]; + var toValue = (valueIndex === segmentCount - 1) ? 10000.0 : samples[offset + valueIndex]; + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001; + }; + TweenTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._tweenType = 0 /* None */; + this._curveCount = 0; + this._framePosition = 0.0; + this._frameDurationR = 0.0; + this._tweenProgress = 0.0; + this._tweenEasing = 0.0; + }; + TweenTimelineState.prototype._onArriveAtFrame = function () { + if (this._frameCount > 1 && + (this._frameIndex !== this._frameCount - 1 || + this._animationState.playTimes === 0 || + this._animationState.currentPlayTimes < this._animationState.playTimes - 1)) { + this._tweenType = this._frameArray[this._frameOffset + 1 /* FrameTweenType */]; // TODO recode ture tween type. + this._tweenState = this._tweenType === 0 /* None */ ? 1 /* Once */ : 2 /* Always */; + if (this._tweenType === 2 /* Curve */) { + this._curveCount = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */]; + } + else if (this._tweenType !== 0 /* None */ && this._tweenType !== 1 /* Line */) { + this._tweenEasing = this._frameArray[this._frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] * 0.01; + } + this._framePosition = this._frameArray[this._frameOffset] * this._frameRateR; + if (this._frameIndex === this._frameCount - 1) { + this._frameDurationR = 1.0 / (this._animationData.duration - this._framePosition); + } + else { + var nextFrameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex + 1]; + this._frameDurationR = 1.0 / (this._frameArray[nextFrameOffset] * this._frameRateR - this._framePosition); + } + } + else { + this._tweenState = 1 /* Once */; + } + }; + TweenTimelineState.prototype._onUpdateFrame = function () { + if (this._tweenState === 2 /* Always */) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType === 2 /* Curve */) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + 3 /* FrameCurveSamples */); + } + else if (this._tweenType !== 1 /* Line */) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } + else { + this._tweenProgress = 0.0; + } + }; + return TweenTimelineState; + }(TimelineState)); + dragonBones.TweenTimelineState = TweenTimelineState; + /** + * @internal + * @private + */ + var BoneTimelineState = (function (_super) { + __extends(BoneTimelineState, _super); + function BoneTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.bone = null; // + this.bonePose = null; // + }; + return BoneTimelineState; + }(TweenTimelineState)); + dragonBones.BoneTimelineState = BoneTimelineState; + /** + * @internal + * @private + */ + var SlotTimelineState = (function (_super) { + __extends(SlotTimelineState, _super); + function SlotTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.slot = null; // + }; + return SlotTimelineState; + }(TweenTimelineState)); + dragonBones.SlotTimelineState = SlotTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @internal + * @private + */ + var ActionTimelineState = (function (_super) { + __extends(ActionTimelineState, _super); + function ActionTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ActionTimelineState.toString = function () { + return "[class dragonBones.ActionTimelineState]"; + }; + ActionTimelineState.prototype._onCrossFrame = function (frameIndex) { + var eventDispatcher = this._armature.eventDispatcher; + if (this._animationState.actionEnabled) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */ + frameIndex]; + var actionCount = this._frameArray[frameOffset + 1]; + var actions = this._armature.armatureData.actions; + for (var i = 0; i < actionCount; ++i) { + var actionIndex = this._frameArray[frameOffset + 2 + i]; + var action = actions[actionIndex]; + if (action.type === 0 /* Play */) { + if (action.slot !== null) { + var slot = this._armature.getSlot(action.slot.name); + if (slot !== null) { + var childArmature = slot.childArmature; + if (childArmature !== null) { + childArmature._bufferAction(action, true); + } + } + } + else if (action.bone !== null) { + for (var _i = 0, _a = this._armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + var childArmature = slot.childArmature; + if (childArmature !== null && slot.parent.boneData === action.bone) { + childArmature._bufferAction(action, true); + } + } + } + else { + this._armature._bufferAction(action, true); + } + } + else { + var eventType = action.type === 10 /* Frame */ ? dragonBones.EventObject.FRAME_EVENT : dragonBones.EventObject.SOUND_EVENT; + if (action.type === 11 /* Sound */ || eventDispatcher.hasEvent(eventType)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray[frameOffset] / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + if (action.bone !== null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + if (action.slot !== null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + }; + ActionTimelineState.prototype._onArriveAtFrame = function () { }; + ActionTimelineState.prototype._onUpdateFrame = function () { }; + ActionTimelineState.prototype.update = function (passedTime) { + var prevState = this.playState; + var prevPlayTimes = this.currentPlayTimes; + var prevTime = this.currentTime; + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + var eventDispatcher = this._armature.eventDispatcher; + if (prevState < 0) { + if (this.playState !== prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { + this._armature._sortZOrder(null, 0); + } + prevPlayTimes = this.currentPlayTimes; + if (eventDispatcher.hasEvent(dragonBones.EventObject.START)) { + var eventObject = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + eventObject.type = dragonBones.EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + else { + return; + } + } + var isReverse = this._animationState.timeScale < 0.0; + var loopCompleteEvent = null; + var completeEvent = null; + if (this.currentPlayTimes !== prevPlayTimes) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + loopCompleteEvent.type = dragonBones.EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + if (this.playState > 0) { + if (eventDispatcher.hasEvent(dragonBones.EventObject.COMPLETE)) { + completeEvent = dragonBones.BaseObject.borrowObject(dragonBones.EventObject); + completeEvent.type = dragonBones.EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + } + } + if (this._frameCount > 1) { + var timelineData = this._timelineData; + var timelineFrameIndex = Math.floor(this.currentTime * this._frameRate); // uint + var frameIndex = this._frameIndices[timelineData.frameIndicesOffset + timelineFrameIndex]; + if (this._frameIndex !== frameIndex) { + var crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + this._frameIndex]; + if (isReverse) { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + if (this.currentPlayTimes === prevPlayTimes) { + if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + else { + if (crossedFrameIndex < 0) { + var prevFrameIndex = Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices[timelineData.frameIndicesOffset + prevFrameIndex]; + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } + else { + crossedFrameIndex = this._frameCount - 1; + } + } + else if (crossedFrameIndex === frameIndex) { + crossedFrameIndex = -1; + } + } + } + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } + else { + crossedFrameIndex = 0; + } + var frameOffset = this._animationData.frameOffset + this._timelineArray[timelineData.offset + 5 /* TimelineFrameOffset */ + crossedFrameIndex]; + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + var framePosition = this._frameArray[frameOffset] / this._frameRate; + if (this._position <= framePosition && + framePosition <= this._position + this._duration) { + this._onCrossFrame(crossedFrameIndex); + } + if (loopCompleteEvent !== null && crossedFrameIndex === 0) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + if (crossedFrameIndex === frameIndex) { + break; + } + } + } + } + } + } + else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData !== null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray[this._timelineData.offset + 5 /* TimelineFrameOffset */]; + // Arrive at frame. + var framePosition = this._frameArray[this._frameOffset] / this._frameRate; + if (this.currentPlayTimes === prevPlayTimes) { + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } + else if (this._position <= framePosition) { + if (!isReverse && loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + this._onCrossFrame(this._frameIndex); + } + } + } + if (loopCompleteEvent !== null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + if (completeEvent !== null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + }; + ActionTimelineState.prototype.setCurrentTime = function (value) { + this._setCurrentTime(value); + this._frameIndex = -1; + }; + return ActionTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ActionTimelineState = ActionTimelineState; + /** + * @internal + * @private + */ + var ZOrderTimelineState = (function (_super) { + __extends(ZOrderTimelineState, _super); + function ZOrderTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + ZOrderTimelineState.toString = function () { + return "[class dragonBones.ZOrderTimelineState]"; + }; + ZOrderTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var count = this._frameArray[this._frameOffset + 1]; + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } + else { + this._armature._sortZOrder(null, 0); + } + } + }; + ZOrderTimelineState.prototype._onUpdateFrame = function () { }; + return ZOrderTimelineState; + }(dragonBones.TimelineState)); + dragonBones.ZOrderTimelineState = ZOrderTimelineState; + /** + * @internal + * @private + */ + var BoneAllTimelineState = (function (_super) { + __extends(BoneAllTimelineState, _super); + function BoneAllTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + BoneAllTimelineState.toString = function () { + return "[class dragonBones.BoneAllTimelineState]"; + }; + BoneAllTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + current.x = frameFloatArray[valueOffset++]; + current.y = frameFloatArray[valueOffset++]; + current.rotation = frameFloatArray[valueOffset++]; + current.skew = frameFloatArray[valueOffset++]; + current.scaleX = frameFloatArray[valueOffset++]; + current.scaleY = frameFloatArray[valueOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + delta.x = frameFloatArray[valueOffset++] - current.x; + delta.y = frameFloatArray[valueOffset++] - current.y; + delta.rotation = frameFloatArray[valueOffset++] - current.rotation; + delta.skew = frameFloatArray[valueOffset++] - current.skew; + delta.scaleX = frameFloatArray[valueOffset++] - current.scaleX; + delta.scaleY = frameFloatArray[valueOffset++] - current.scaleY; + } + // else { + // delta.x = 0.0; + // delta.y = 0.0; + // delta.rotation = 0.0; + // delta.skew = 0.0; + // delta.scaleX = 0.0; + // delta.scaleY = 0.0; + // } + } + else { + var current = this.bonePose.current; + current.x = 0.0; + current.y = 0.0; + current.rotation = 0.0; + current.skew = 0.0; + current.scaleX = 1.0; + current.scaleY = 1.0; + } + }; + BoneAllTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + var current = this.bonePose.current; + var delta = this.bonePose.delta; + var result = this.bonePose.result; + this.bone._transformDirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + var scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + }; + BoneAllTimelineState.prototype.fadeOut = function () { + var result = this.bonePose.result; + result.rotation = dragonBones.Transform.normalizeRadian(result.rotation); + result.skew = dragonBones.Transform.normalizeRadian(result.skew); + }; + return BoneAllTimelineState; + }(dragonBones.BoneTimelineState)); + dragonBones.BoneAllTimelineState = BoneAllTimelineState; + /** + * @internal + * @private + */ + var SlotDislayIndexTimelineState = (function (_super) { + __extends(SlotDislayIndexTimelineState, _super); + function SlotDislayIndexTimelineState() { + return _super !== null && _super.apply(this, arguments) || this; + } + SlotDislayIndexTimelineState.toString = function () { + return "[class dragonBones.SlotDislayIndexTimelineState]"; + }; + SlotDislayIndexTimelineState.prototype._onArriveAtFrame = function () { + if (this.playState >= 0) { + var displayIndex = this._timelineData !== null ? this._frameArray[this._frameOffset + 1] : this.slot.slotData.displayIndex; + if (this.slot.displayIndex !== displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + }; + return SlotDislayIndexTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotDislayIndexTimelineState = SlotDislayIndexTimelineState; + /** + * @internal + * @private + */ + var SlotColorTimelineState = (function (_super) { + __extends(SlotColorTimelineState, _super); + function SlotColorTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._delta = [0, 0, 0, 0, 0, 0, 0, 0]; + _this._result = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]; + return _this; + } + SlotColorTimelineState.toString = function () { + return "[class dragonBones.SlotColorTimelineState]"; + }; + SlotColorTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._dirty = false; + }; + SlotColorTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var intArray = this._dragonBonesData.intArray; + var frameIntArray = this._dragonBonesData.frameIntArray; + var valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + var colorOffset = frameIntArray[valueOffset]; + this._current[0] = intArray[colorOffset++]; + this._current[1] = intArray[colorOffset++]; + this._current[2] = intArray[colorOffset++]; + this._current[3] = intArray[colorOffset++]; + this._current[4] = intArray[colorOffset++]; + this._current[5] = intArray[colorOffset++]; + this._current[6] = intArray[colorOffset++]; + this._current[7] = intArray[colorOffset++]; + if (this._tweenState === 2 /* Always */) { + if (this._frameIndex === this._frameCount - 1) { + colorOffset = frameIntArray[this._animationData.frameIntOffset + this._frameValueOffset]; + } + else { + colorOffset = frameIntArray[valueOffset + 1 * 1]; + } + this._delta[0] = intArray[colorOffset++] - this._current[0]; + this._delta[1] = intArray[colorOffset++] - this._current[1]; + this._delta[2] = intArray[colorOffset++] - this._current[2]; + this._delta[3] = intArray[colorOffset++] - this._current[3]; + this._delta[4] = intArray[colorOffset++] - this._current[4]; + this._delta[5] = intArray[colorOffset++] - this._current[5]; + this._delta[6] = intArray[colorOffset++] - this._current[6]; + this._delta[7] = intArray[colorOffset++] - this._current[7]; + } + } + else { + var color = this.slot.slotData.color; + this._current[0] = color.alphaMultiplier * 100.0; + this._current[1] = color.redMultiplier * 100.0; + this._current[2] = color.greenMultiplier * 100.0; + this._current[3] = color.blueMultiplier * 100.0; + this._current[4] = color.alphaOffset; + this._current[5] = color.redOffset; + this._current[6] = color.greenOffset; + this._current[7] = color.blueOffset; + } + }; + SlotColorTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + this._result[0] = (this._current[0] + this._delta[0] * this._tweenProgress) * 0.01; + this._result[1] = (this._current[1] + this._delta[1] * this._tweenProgress) * 0.01; + this._result[2] = (this._current[2] + this._delta[2] * this._tweenProgress) * 0.01; + this._result[3] = (this._current[3] + this._delta[3] * this._tweenProgress) * 0.01; + this._result[4] = this._current[4] + this._delta[4] * this._tweenProgress; + this._result[5] = this._current[5] + this._delta[5] * this._tweenProgress; + this._result[6] = this._current[6] + this._delta[6] * this._tweenProgress; + this._result[7] = this._current[7] + this._delta[7] * this._tweenProgress; + }; + SlotColorTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotColorTimelineState.prototype.update = function (passedTime) { + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._colorTransform; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 4); + result.alphaMultiplier += (this._result[0] - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result[1] - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result[2] - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result[3] - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result[4] - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result[5] - result.redOffset) * fadeProgress; + result.greenOffset += (this._result[6] - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result[7] - result.blueOffset) * fadeProgress; + this.slot._colorDirty = true; + } + } + else if (this._dirty) { + this._dirty = false; + if (result.alphaMultiplier !== this._result[0] || + result.redMultiplier !== this._result[1] || + result.greenMultiplier !== this._result[2] || + result.blueMultiplier !== this._result[3] || + result.alphaOffset !== this._result[4] || + result.redOffset !== this._result[5] || + result.greenOffset !== this._result[6] || + result.blueOffset !== this._result[7]) { + result.alphaMultiplier = this._result[0]; + result.redMultiplier = this._result[1]; + result.greenMultiplier = this._result[2]; + result.blueMultiplier = this._result[3]; + result.alphaOffset = this._result[4]; + result.redOffset = this._result[5]; + result.greenOffset = this._result[6]; + result.blueOffset = this._result[7]; + this.slot._colorDirty = true; + } + } + } + }; + return SlotColorTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotColorTimelineState = SlotColorTimelineState; + /** + * @internal + * @private + */ + var SlotFFDTimelineState = (function (_super) { + __extends(SlotFFDTimelineState, _super); + function SlotFFDTimelineState() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._current = []; + _this._delta = []; + _this._result = []; + return _this; + } + SlotFFDTimelineState.toString = function () { + return "[class dragonBones.SlotFFDTimelineState]"; + }; + SlotFFDTimelineState.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this.meshOffset = 0; + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.length = 0; + this._delta.length = 0; + this._result.length = 0; + }; + SlotFFDTimelineState.prototype._onArriveAtFrame = function () { + _super.prototype._onArriveAtFrame.call(this); + if (this._timelineData !== null) { + var isTween = this._tweenState === 2 /* Always */; + var frameFloatArray = this._dragonBonesData.frameFloatArray; + var valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + if (isTween) { + var nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex === this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = frameFloatArray[nextValueOffset + i] - (this._current[i] = frameFloatArray[valueOffset + i]); + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = frameFloatArray[valueOffset + i]; + } + } + } + else { + for (var i = 0; i < this._valueCount; ++i) { + this._current[i] = 0.0; + } + } + }; + SlotFFDTimelineState.prototype._onUpdateFrame = function () { + _super.prototype._onUpdateFrame.call(this); + this._dirty = true; + if (this._tweenState !== 2 /* Always */) { + this._tweenState = 0 /* None */; + } + for (var i = 0; i < this._valueCount; ++i) { + this._result[i] = this._current[i] + this._delta[i] * this._tweenProgress; + } + }; + SlotFFDTimelineState.prototype.init = function (armature, animationState, timelineData) { + _super.prototype.init.call(this, armature, animationState, timelineData); + if (this._timelineData !== null) { + var frameIntArray = this._dragonBonesData.frameIntArray; + var frameIntOffset = this._animationData.frameIntOffset + this._timelineArray[this._timelineData.offset + 3 /* TimelineFrameValueCount */]; + this.meshOffset = frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */]; + this._ffdCount = frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */]; + this._valueCount = frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */]; + this._valueOffset = frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */]; + this._frameFloatOffset = frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] + this._animationData.frameFloatOffset; + } + else { + this._valueCount = 0; + } + this._current.length = this._valueCount; + this._delta.length = this._valueCount; + this._result.length = this._valueCount; + for (var i = 0; i < this._valueCount; ++i) { + this._delta[i] = 0.0; + } + }; + SlotFFDTimelineState.prototype.fadeOut = function () { + this._tweenState = 0 /* None */; + this._dirty = false; + }; + SlotFFDTimelineState.prototype.update = function (passedTime) { + if (this.slot._meshData === null || (this._timelineData !== null && this.slot._meshData.offset !== this.meshOffset)) { + return; + } + _super.prototype.update.call(this, passedTime); + // Fade animation. + if (this._tweenState !== 0 /* None */ || this._dirty) { + var result = this.slot._ffdVertices; + if (this._timelineData !== null) { + var frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] += (frameFloatArray[this._frameFloatOffset + i] - result[i]) * fadeProgress; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] += (this._result[i - this._valueOffset] - result[i]) * fadeProgress; + } + else { + result[i] += (frameFloatArray[this._frameFloatOffset + i - this._valueCount] - result[i]) * fadeProgress; + } + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result[i] = frameFloatArray[this._frameFloatOffset + i]; + } + else if (i < this._valueOffset + this._valueCount) { + result[i] = this._result[i - this._valueOffset]; + } + else { + result[i] = frameFloatArray[this._frameFloatOffset + i - this._valueCount]; + } + } + this.slot._meshDirty = true; + } + } + else { + this._ffdCount = result.length; // + if (this._animationState._fadeState !== 0 || this._animationState._subFadeState !== 0) { + var fadeProgress = Math.pow(this._animationState._fadeProgress, 2); + for (var i = 0; i < this._ffdCount; ++i) { + result[i] += (0.0 - result[i]) * fadeProgress; + } + this.slot._meshDirty = true; + } + else if (this._dirty) { + this._dirty = false; + for (var i = 0; i < this._ffdCount; ++i) { + result[i] = 0.0; + } + this.slot._meshDirty = true; + } + } + } + }; + return SlotFFDTimelineState; + }(dragonBones.SlotTimelineState)); + dragonBones.SlotFFDTimelineState = SlotFFDTimelineState; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * 事件数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + var EventObject = (function (_super) { + __extends(EventObject, _super); + function EventObject() { + return _super !== null && _super.apply(this, arguments) || this; + } + /** + * @private + */ + EventObject.toString = function () { + return "[class dragonBones.EventObject]"; + }; + /** + * @private + */ + EventObject.prototype._onClear = function () { + this.time = 0.0; + this.type = ""; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + }; + /** + * 动画开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.START = "start"; + /** + * 动画循环播放一次完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.LOOP_COMPLETE = "loopComplete"; + /** + * 动画播放完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.COMPLETE = "complete"; + /** + * 动画淡入开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN = "fadeIn"; + /** + * 动画淡入完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_IN_COMPLETE = "fadeInComplete"; + /** + * 动画淡出开始。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT = "fadeOut"; + /** + * 动画淡出完成。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FADE_OUT_COMPLETE = "fadeOutComplete"; + /** + * 动画帧事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.FRAME_EVENT = "frameEvent"; + /** + * 动画声音事件。 + * @version DragonBones 4.5 + * @language zh_CN + */ + EventObject.SOUND_EVENT = "soundEvent"; + return EventObject; + }(dragonBones.BaseObject)); + dragonBones.EventObject = EventObject; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var DataParser = (function () { + function DataParser() { + } + DataParser._getArmatureType = function (value) { + switch (value.toLowerCase()) { + case "stage": + return 2 /* Stage */; + case "armature": + return 0 /* Armature */; + case "movieclip": + return 1 /* MovieClip */; + default: + return 0 /* Armature */; + } + }; + DataParser._getDisplayType = function (value) { + switch (value.toLowerCase()) { + case "image": + return 0 /* Image */; + case "mesh": + return 2 /* Mesh */; + case "armature": + return 1 /* Armature */; + case "boundingbox": + return 3 /* BoundingBox */; + default: + return 0 /* Image */; + } + }; + DataParser._getBoundingBoxType = function (value) { + switch (value.toLowerCase()) { + case "rectangle": + return 0 /* Rectangle */; + case "ellipse": + return 1 /* Ellipse */; + case "polygon": + return 2 /* Polygon */; + default: + return 0 /* Rectangle */; + } + }; + DataParser._getActionType = function (value) { + switch (value.toLowerCase()) { + case "play": + return 0 /* Play */; + case "frame": + return 10 /* Frame */; + case "sound": + return 11 /* Sound */; + default: + return 0 /* Play */; + } + }; + DataParser._getBlendMode = function (value) { + switch (value.toLowerCase()) { + case "normal": + return 0 /* Normal */; + case "add": + return 1 /* Add */; + case "alpha": + return 2 /* Alpha */; + case "darken": + return 3 /* Darken */; + case "difference": + return 4 /* Difference */; + case "erase": + return 5 /* Erase */; + case "hardlight": + return 6 /* HardLight */; + case "invert": + return 7 /* Invert */; + case "layer": + return 8 /* Layer */; + case "lighten": + return 9 /* Lighten */; + case "multiply": + return 10 /* Multiply */; + case "overlay": + return 11 /* Overlay */; + case "screen": + return 12 /* Screen */; + case "subtract": + return 13 /* Subtract */; + default: + return 0 /* Normal */; + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + DataParser.parseDragonBonesData = function (rawData) { + if (rawData instanceof ArrayBuffer) { + return dragonBones.BinaryDataParser.getInstance().parseDragonBonesData(rawData); + } + else { + return dragonBones.ObjectDataParser.getInstance().parseDragonBonesData(rawData); + } + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parsetTextureAtlasData() + */ + DataParser.parseTextureAtlasData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.warn("已废弃,请参考 @see"); + var textureAtlasData = {}; + var subTextureList = rawData[DataParser.SUB_TEXTURE]; + for (var i = 0, len = subTextureList.length; i < len; i++) { + var subTextureObject = subTextureList[i]; + var subTextureName = subTextureObject[DataParser.NAME]; + var subTextureRegion = new dragonBones.Rectangle(); + var subTextureFrame = null; + subTextureRegion.x = subTextureObject[DataParser.X] / scale; + subTextureRegion.y = subTextureObject[DataParser.Y] / scale; + subTextureRegion.width = subTextureObject[DataParser.WIDTH] / scale; + subTextureRegion.height = subTextureObject[DataParser.HEIGHT] / scale; + if (DataParser.FRAME_WIDTH in subTextureObject) { + subTextureFrame = new dragonBones.Rectangle(); + subTextureFrame.x = subTextureObject[DataParser.FRAME_X] / scale; + subTextureFrame.y = subTextureObject[DataParser.FRAME_Y] / scale; + subTextureFrame.width = subTextureObject[DataParser.FRAME_WIDTH] / scale; + subTextureFrame.height = subTextureObject[DataParser.FRAME_HEIGHT] / scale; + } + textureAtlasData[subTextureName] = { region: subTextureRegion, frame: subTextureFrame, rotated: false }; + } + return textureAtlasData; + }; + DataParser.DATA_VERSION_2_3 = "2.3"; + DataParser.DATA_VERSION_3_0 = "3.0"; + DataParser.DATA_VERSION_4_0 = "4.0"; + DataParser.DATA_VERSION_4_5 = "4.5"; + DataParser.DATA_VERSION_5_0 = "5.0"; + DataParser.DATA_VERSION = DataParser.DATA_VERSION_5_0; + DataParser.DATA_VERSIONS = [ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + ]; + DataParser.TEXTURE_ATLAS = "textureAtlas"; + DataParser.SUB_TEXTURE = "SubTexture"; + DataParser.FORMAT = "format"; + DataParser.IMAGE_PATH = "imagePath"; + DataParser.WIDTH = "width"; + DataParser.HEIGHT = "height"; + DataParser.ROTATED = "rotated"; + DataParser.FRAME_X = "frameX"; + DataParser.FRAME_Y = "frameY"; + DataParser.FRAME_WIDTH = "frameWidth"; + DataParser.FRAME_HEIGHT = "frameHeight"; + DataParser.DRADON_BONES = "dragonBones"; + DataParser.USER_DATA = "userData"; + DataParser.ARMATURE = "armature"; + DataParser.BONE = "bone"; + DataParser.IK = "ik"; + DataParser.SLOT = "slot"; + DataParser.SKIN = "skin"; + DataParser.DISPLAY = "display"; + DataParser.ANIMATION = "animation"; + DataParser.Z_ORDER = "zOrder"; + DataParser.FFD = "ffd"; + DataParser.FRAME = "frame"; + DataParser.TRANSLATE_FRAME = "translateFrame"; + DataParser.ROTATE_FRAME = "rotateFrame"; + DataParser.SCALE_FRAME = "scaleFrame"; + DataParser.VISIBLE_FRAME = "visibleFrame"; + DataParser.DISPLAY_FRAME = "displayFrame"; + DataParser.COLOR_FRAME = "colorFrame"; + DataParser.DEFAULT_ACTIONS = "defaultActions"; + DataParser.ACTIONS = "actions"; + DataParser.EVENTS = "events"; + DataParser.INTS = "ints"; + DataParser.FLOATS = "floats"; + DataParser.STRINGS = "strings"; + DataParser.CANVAS = "canvas"; + DataParser.TRANSFORM = "transform"; + DataParser.PIVOT = "pivot"; + DataParser.AABB = "aabb"; + DataParser.COLOR = "color"; + DataParser.VERSION = "version"; + DataParser.COMPATIBLE_VERSION = "compatibleVersion"; + DataParser.FRAME_RATE = "frameRate"; + DataParser.TYPE = "type"; + DataParser.SUB_TYPE = "subType"; + DataParser.NAME = "name"; + DataParser.PARENT = "parent"; + DataParser.TARGET = "target"; + DataParser.SHARE = "share"; + DataParser.PATH = "path"; + DataParser.LENGTH = "length"; + DataParser.DISPLAY_INDEX = "displayIndex"; + DataParser.BLEND_MODE = "blendMode"; + DataParser.INHERIT_TRANSLATION = "inheritTranslation"; + DataParser.INHERIT_ROTATION = "inheritRotation"; + DataParser.INHERIT_SCALE = "inheritScale"; + DataParser.INHERIT_REFLECTION = "inheritReflection"; + DataParser.INHERIT_ANIMATION = "inheritAnimation"; + DataParser.INHERIT_FFD = "inheritFFD"; + DataParser.BEND_POSITIVE = "bendPositive"; + DataParser.CHAIN = "chain"; + DataParser.WEIGHT = "weight"; + DataParser.FADE_IN_TIME = "fadeInTime"; + DataParser.PLAY_TIMES = "playTimes"; + DataParser.SCALE = "scale"; + DataParser.OFFSET = "offset"; + DataParser.POSITION = "position"; + DataParser.DURATION = "duration"; + DataParser.TWEEN_TYPE = "tweenType"; + DataParser.TWEEN_EASING = "tweenEasing"; + DataParser.TWEEN_ROTATE = "tweenRotate"; + DataParser.TWEEN_SCALE = "tweenScale"; + DataParser.CURVE = "curve"; + DataParser.SOUND = "sound"; + DataParser.EVENT = "event"; + DataParser.ACTION = "action"; + DataParser.X = "x"; + DataParser.Y = "y"; + DataParser.SKEW_X = "skX"; + DataParser.SKEW_Y = "skY"; + DataParser.SCALE_X = "scX"; + DataParser.SCALE_Y = "scY"; + DataParser.VALUE = "value"; + DataParser.ROTATE = "rotate"; + DataParser.SKEW = "skew"; + DataParser.ALPHA_OFFSET = "aO"; + DataParser.RED_OFFSET = "rO"; + DataParser.GREEN_OFFSET = "gO"; + DataParser.BLUE_OFFSET = "bO"; + DataParser.ALPHA_MULTIPLIER = "aM"; + DataParser.RED_MULTIPLIER = "rM"; + DataParser.GREEN_MULTIPLIER = "gM"; + DataParser.BLUE_MULTIPLIER = "bM"; + DataParser.UVS = "uvs"; + DataParser.VERTICES = "vertices"; + DataParser.TRIANGLES = "triangles"; + DataParser.WEIGHTS = "weights"; + DataParser.SLOT_POSE = "slotPose"; + DataParser.BONE_POSE = "bonePose"; + DataParser.GOTO_AND_PLAY = "gotoAndPlay"; + DataParser.DEFAULT_NAME = "default"; + return DataParser; + }()); + dragonBones.DataParser = DataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var ObjectDataParser = (function (_super) { + __extends(ObjectDataParser, _super); + function ObjectDataParser() { + /** + * @private + */ + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._intArrayJson = []; + _this._floatArrayJson = []; + _this._frameIntArrayJson = []; + _this._frameFloatArrayJson = []; + _this._frameArrayJson = []; + _this._timelineArrayJson = []; + _this._rawTextureAtlasIndex = 0; + _this._rawBones = []; + _this._data = null; // + _this._armature = null; // + _this._bone = null; // + _this._slot = null; // + _this._skin = null; // + _this._mesh = null; // + _this._animation = null; // + _this._timeline = null; // + _this._rawTextureAtlases = null; + _this._defalultColorOffset = -1; + _this._prevTweenRotate = 0; + _this._prevRotation = 0.0; + _this._helpMatrixA = new dragonBones.Matrix(); + _this._helpMatrixB = new dragonBones.Matrix(); + _this._helpTransform = new dragonBones.Transform(); + _this._helpColorTransform = new dragonBones.ColorTransform(); + _this._helpPoint = new dragonBones.Point(); + _this._helpArray = []; + _this._actionFrames = []; + _this._weightSlotPose = {}; + _this._weightBonePoses = {}; + _this._weightBoneIndices = {}; + _this._cacheBones = {}; + _this._meshs = {}; + _this._slotChildActions = {}; + return _this; + } + ObjectDataParser._getBoolean = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "boolean") { + return value; + } + else if (type === "string") { + switch (value) { + case "0": + case "NaN": + case "": + case "false": + case "null": + case "undefined": + return false; + default: + return true; + } + } + else { + return !!value; + } + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getNumber = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + if (value === null || value === "NaN") { + return defaultValue; + } + return +value || 0; + } + return defaultValue; + }; + /** + * @private + */ + ObjectDataParser._getString = function (rawData, key, defaultValue) { + if (key in rawData) { + var value = rawData[key]; + var type = typeof value; + if (type === "string") { + if (dragonBones.DragonBones.webAssembly) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + } + return value; + } + return String(value); + } + return defaultValue; + }; + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + /** + * @private + */ + ObjectDataParser.prototype._getCurvePoint = function (x1, y1, x2, y2, x3, y3, x4, y4, t, result) { + var l_t = 1.0 - t; + var powA = l_t * l_t; + var powB = t * t; + var kA = l_t * powA; + var kB = 3.0 * t * powA; + var kC = 3.0 * l_t * powB; + var kD = t * powB; + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + }; + /** + * @private + */ + ObjectDataParser.prototype._samplingEasingCurve = function (curve, samples) { + var curveCount = curve.length; + var stepIndex = -2; + for (var i = 0, l = samples.length; i < l; ++i) { + var t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve[stepIndex + 6] : 1) < t) { + stepIndex += 6; + } + var isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + var x1 = isInCurve ? curve[stepIndex] : 0.0; + var y1 = isInCurve ? curve[stepIndex + 1] : 0.0; + var x2 = curve[stepIndex + 2]; + var y2 = curve[stepIndex + 3]; + var x3 = curve[stepIndex + 4]; + var y3 = curve[stepIndex + 5]; + var x4 = isInCurve ? curve[stepIndex + 6] : 1.0; + var y4 = isInCurve ? curve[stepIndex + 7] : 1.0; + var lower = 0.0; + var higher = 1.0; + while (higher - lower > 0.0001) { + var percentage = (higher + lower) * 0.5; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0.0) { + lower = percentage; + } + else { + higher = percentage; + } + } + samples[i] = this._helpPoint.y; + } + }; + ObjectDataParser.prototype._sortActionFrame = function (a, b) { + return a.frameStart > b.frameStart ? 1 : -1; + }; + ObjectDataParser.prototype._parseActionDataInFrame = function (rawData, frameStart, bone, slot) { + if (ObjectDataParser.EVENT in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENT], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.SOUND in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.SOUND], frameStart, 11 /* Sound */, bone, slot); + } + if (ObjectDataParser.ACTION in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTION], frameStart, 0 /* Play */, bone, slot); + } + if (ObjectDataParser.EVENTS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.EVENTS], frameStart, 10 /* Frame */, bone, slot); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._mergeActionFrame(rawData[ObjectDataParser.ACTIONS], frameStart, 0 /* Play */, bone, slot); + } + }; + ObjectDataParser.prototype._mergeActionFrame = function (rawData, frameStart, type, bone, slot) { + var actionOffset = dragonBones.DragonBones.webAssembly ? this._armature.actions.size() : this._armature.actions.length; + var actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + var frame = null; + if (this._actionFrames.length === 0) { + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.push(frame); + frame = null; + } + for (var _i = 0, _a = this._actionFrames; _i < _a.length; _i++) { + var eachFrame = _a[_i]; + if (eachFrame.frameStart === frameStart) { + frame = eachFrame; + break; + } + } + if (frame === null) { + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.push(frame); + } + for (var i = 0; i < actionCount; ++i) { + frame.actions.push(actionOffset + i); + } + }; + ObjectDataParser.prototype._parseCacheActionFrame = function (frame) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = frameArray.length; + var actionCount = frame.actions.length; + frameArray.length += 1 + 1 + actionCount; + frameArray[frameOffset + 0 /* FramePosition */] = frame.frameStart; + frameArray[frameOffset + 0 /* FramePosition */ + 1] = actionCount; // Action count. + for (var i = 0; i < actionCount; ++i) { + frameArray[frameOffset + 0 /* FramePosition */ + 2 + i] = frame.actions[i]; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArmature = function (rawData, scale) { + // const armature = BaseObject.borrowObject(ArmatureData); + var armature = dragonBones.DragonBones.webAssembly ? new Module["ArmatureData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureData); + armature.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + armature.type = ObjectDataParser._getArmatureType(rawData[ObjectDataParser.TYPE]); + } + else { + armature.type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, 0 /* Armature */); + } + if (armature.frameRate === 0) { + armature.frameRate = 24; + } + this._armature = armature; + if (ObjectDataParser.AABB in rawData) { + var rawAABB = rawData[ObjectDataParser.AABB]; + armature.aabb.x = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.X, 0.0); + armature.aabb.y = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.Y, 0.0); + armature.aabb.width = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.WIDTH, 0.0); + armature.aabb.height = ObjectDataParser._getNumber(rawAABB, ObjectDataParser.HEIGHT, 0.0); + } + if (ObjectDataParser.CANVAS in rawData) { + var rawCanvas = rawData[ObjectDataParser.CANVAS]; + var canvas = dragonBones.BaseObject.borrowObject(dragonBones.CanvasData); + if (ObjectDataParser.COLOR in rawCanvas) { + ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } + else { + canvas.hasBackground = false; + } + canvas.color = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.X, 0); + canvas.y = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = ObjectDataParser._getNumber(rawCanvas, ObjectDataParser.HEIGHT, 0); + armature.canvas = canvas; + } + if (ObjectDataParser.BONE in rawData) { + var rawBones = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawBones_1 = rawBones; _i < rawBones_1.length; _i++) { + var rawBone = rawBones_1[_i]; + var parentName = ObjectDataParser._getString(rawBone, ObjectDataParser.PARENT, ""); + var bone = this._parseBone(rawBone); + if (parentName.length > 0) { + var parent_1 = armature.getBone(parentName); + if (parent_1 !== null) { + bone.parent = parent_1; + } + else { + (this._cacheBones[parentName] = this._cacheBones[parentName] || []).push(bone); + } + } + if (bone.name in this._cacheBones) { + for (var _a = 0, _b = this._cacheBones[bone.name]; _a < _b.length; _a++) { + var child = _b[_a]; + child.parent = bone; + } + delete this._cacheBones[bone.name]; + } + armature.addBone(bone); + this._rawBones.push(bone); // Raw bone sort. + } + } + if (ObjectDataParser.IK in rawData) { + var rawIKS = rawData[ObjectDataParser.IK]; + for (var _c = 0, rawIKS_1 = rawIKS; _c < rawIKS_1.length; _c++) { + var rawIK = rawIKS_1[_c]; + this._parseIKConstraint(rawIK); + } + } + armature.sortBones(); + if (ObjectDataParser.SLOT in rawData) { + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _d = 0, rawSlots_1 = rawSlots; _d < rawSlots_1.length; _d++) { + var rawSlot = rawSlots_1[_d]; + armature.addSlot(this._parseSlot(rawSlot)); + } + } + if (ObjectDataParser.SKIN in rawData) { + var rawSkins = rawData[ObjectDataParser.SKIN]; + for (var _e = 0, rawSkins_1 = rawSkins; _e < rawSkins_1.length; _e++) { + var rawSkin = rawSkins_1[_e]; + armature.addSkin(this._parseSkin(rawSkin)); + } + } + if (ObjectDataParser.ANIMATION in rawData) { + var rawAnimations = rawData[ObjectDataParser.ANIMATION]; + for (var _f = 0, rawAnimations_1 = rawAnimations; _f < rawAnimations_1.length; _f++) { + var rawAnimation = rawAnimations_1[_f]; + var animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + if (ObjectDataParser.DEFAULT_ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.DEFAULT_ACTIONS], armature.defaultActions, 0 /* Play */, null, null); + } + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armature.actions, 0 /* Play */, null, null); + } + // for (const action of armature.defaultActions) { // Set default animation from default action. + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? armature.defaultActions.size() : armature.defaultActions.length); ++i) { + var action = dragonBones.DragonBones.webAssembly ? armature.defaultActions.get(i) : armature.defaultActions[i]; + if (action.type === 0 /* Play */) { + var animation = armature.getAnimation(action.name); + if (animation !== null) { + armature.defaultAnimation = animation; + } + break; + } + } + // Clear helper. + this._rawBones.length = 0; + this._armature = null; + for (var k in this._meshs) { + delete this._meshs[k]; + } + for (var k in this._cacheBones) { + delete this._cacheBones[k]; + } + for (var k in this._slotChildActions) { + delete this._slotChildActions[k]; + } + for (var k in this._weightSlotPose) { + delete this._weightSlotPose[k]; + } + for (var k in this._weightBonePoses) { + delete this._weightBonePoses[k]; + } + for (var k in this._weightBoneIndices) { + delete this._weightBoneIndices[k]; + } + return armature; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBone = function (rawData) { + // const bone = BaseObject.borrowObject(BoneData); + var bone = dragonBones.DragonBones.webAssembly ? new Module["BoneData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoneData); + bone.inheritTranslation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = ObjectDataParser._getNumber(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], bone.transform, this._armature.scale); + } + return bone; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseIKConstraint = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, (ObjectDataParser.BONE in rawData) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + var target = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.TARGET, "")); + if (target === null) { + return; + } + // const constraint = BaseObject.borrowObject(IKConstraintData); + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraintData"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraintData); + constraint.bendPositive = ObjectDataParser._getBoolean(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = ObjectDataParser._getBoolean(rawData, ObjectDataParser.SCALE, false); + constraint.weight = ObjectDataParser._getNumber(rawData, ObjectDataParser.WEIGHT, 1.0); + constraint.bone = bone; + constraint.target = target; + var chain = ObjectDataParser._getNumber(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + if (dragonBones.DragonBones.webAssembly) { + bone.constraints.push_back(constraint); + } + else { + bone.constraints.push(constraint); + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlot = function (rawData) { + // const slot = BaseObject.borrowObject(SlotData); + var slot = dragonBones.DragonBones.webAssembly ? new Module["SlotData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SlotData); + slot.displayIndex = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = dragonBones.DragonBones.webAssembly ? this._armature.sortedSlots.size() : this._armature.sortedSlots.length; + slot.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.PARENT, "")); // + if (ObjectDataParser.BLEND_MODE in rawData && typeof rawData[ObjectDataParser.BLEND_MODE] === "string") { + slot.blendMode = ObjectDataParser._getBlendMode(rawData[ObjectDataParser.BLEND_MODE]); + } + else { + slot.blendMode = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLEND_MODE, 0 /* Normal */); + } + if (ObjectDataParser.COLOR in rawData) { + // slot.color = SlotData.createColor(); + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].createColor() : dragonBones.SlotData.createColor(); + this._parseColorTransform(rawData[ObjectDataParser.COLOR], slot.color); + } + else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = dragonBones.DragonBones.webAssembly ? Module["SlotData"].DEFAULT_COLOR : dragonBones.SlotData.DEFAULT_COLOR; + } + if (ObjectDataParser.ACTIONS in rawData) { + var actions = this._slotChildActions[slot.name] = []; + this._parseActionData(rawData[ObjectDataParser.ACTIONS], actions, 0 /* Play */, null, null); + } + return slot; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSkin = function (rawData) { + // const skin = BaseObject.borrowObject(SkinData); + var skin = dragonBones.DragonBones.webAssembly ? new Module["SkinData"]() : dragonBones.BaseObject.borrowObject(dragonBones.SkinData); + skin.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length === 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + if (ObjectDataParser.SLOT in rawData) { + this._skin = skin; + var rawSlots = rawData[ObjectDataParser.SLOT]; + for (var _i = 0, rawSlots_2 = rawSlots; _i < rawSlots_2.length; _i++) { + var rawSlot = rawSlots_2[_i]; + var slotName = ObjectDataParser._getString(rawSlot, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot !== null) { + this._slot = slot; + if (ObjectDataParser.DISPLAY in rawSlot) { + var rawDisplays = rawSlot[ObjectDataParser.DISPLAY]; + for (var _a = 0, rawDisplays_1 = rawDisplays; _a < rawDisplays_1.length; _a++) { + var rawDisplay = rawDisplays_1[_a]; + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + this._slot = null; // + } + } + this._skin = null; // + } + return skin; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseDisplay = function (rawData) { + var display = null; + var name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + var path = ObjectDataParser._getString(rawData, ObjectDataParser.PATH, ""); + var type = 0 /* Image */; + if (ObjectDataParser.TYPE in rawData && typeof rawData[ObjectDataParser.TYPE] === "string") { + type = ObjectDataParser._getDisplayType(rawData[ObjectDataParser.TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.TYPE, type); + } + switch (type) { + case 0 /* Image */: + // const imageDisplay = display = BaseObject.borrowObject(ImageDisplayData); + var imageDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ImageDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ImageDisplayData); + imageDisplay.name = name; + imageDisplay.path = path.length > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + case 1 /* Armature */: + // const armatureDisplay = display = BaseObject.borrowObject(ArmatureDisplayData); + var armatureDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["ArmatureDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ArmatureDisplayData); + armatureDisplay.name = name; + armatureDisplay.path = path.length > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + if (ObjectDataParser.ACTIONS in rawData) { + this._parseActionData(rawData[ObjectDataParser.ACTIONS], armatureDisplay.actions, 0 /* Play */, null, null); + } + else if (this._slot.name in this._slotChildActions) { + var displays = this._skin.getDisplays(this._slot.name); + if (displays === null ? this._slot.displayIndex === 0 : this._slot.displayIndex === displays.length) { + for (var _i = 0, _a = this._slotChildActions[this._slot.name]; _i < _a.length; _i++) { + var action = _a[_i]; + if (dragonBones.DragonBones.webAssembly) { + armatureDisplay.actions.push_back(action); + } + else { + armatureDisplay.actions.push(action); + } + } + delete this._slotChildActions[this._slot.name]; + } + } + break; + case 2 /* Mesh */: + // const meshDisplay = display = BaseObject.borrowObject(MeshDisplayData); + var meshDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["MeshDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.MeshDisplayData); + meshDisplay.name = name; + meshDisplay.path = path.length > 0 ? path : name; + meshDisplay.inheritAnimation = ObjectDataParser._getBoolean(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + var shareName = ObjectDataParser._getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length > 0) { + var shareMesh = this._meshs[shareName]; + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } + else { + this._parseMesh(rawData, meshDisplay); + this._meshs[meshDisplay.name] = meshDisplay; + } + break; + case 3 /* BoundingBox */: + var boundingBox = this._parseBoundingBox(rawData); + if (boundingBox !== null) { + // const boundingBoxDisplay = display = BaseObject.borrowObject(BoundingBoxDisplayData); + var boundingBoxDisplay = display = dragonBones.DragonBones.webAssembly ? new Module["BoundingBoxDisplayData"]() : dragonBones.BaseObject.borrowObject(dragonBones.BoundingBoxDisplayData); + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + if (display !== null) { + display.parent = this._armature; + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], display.transform, this._armature.scale); + } + } + return display; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePivot = function (rawData, display) { + if (ObjectDataParser.PIVOT in rawData) { + var rawPivot = rawData[ObjectDataParser.PIVOT]; + display.pivot.x = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.X, 0.0); + display.pivot.y = ObjectDataParser._getNumber(rawPivot, ObjectDataParser.Y, 0.0); + } + else { + display.pivot.x = 0.5; + display.pivot.y = 0.5; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseMesh = function (rawData, mesh) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var rawUVs = rawData[ObjectDataParser.UVS]; + var rawTriangles = rawData[ObjectDataParser.TRIANGLES]; + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + var vertexCount = Math.floor(rawVertices.length / 2); // uint + var triangleCount = Math.floor(rawTriangles.length / 3); // uint + var vertexOffset = floatArray.length; + var uvOffset = vertexOffset + vertexCount * 2; + mesh.offset = intArray.length; + intArray.length += 1 + 1 + 1 + 1 + triangleCount * 3; + intArray[mesh.offset + 0 /* MeshVertexCount */] = vertexCount; + intArray[mesh.offset + 1 /* MeshTriangleCount */] = triangleCount; + intArray[mesh.offset + 2 /* MeshFloatOffset */] = vertexOffset; + for (var i = 0, l = triangleCount * 3; i < l; ++i) { + intArray[mesh.offset + 4 /* MeshVertexIndices */ + i] = rawTriangles[i]; + } + floatArray.length += vertexCount * 2 + vertexCount * 2; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray[vertexOffset + i] = rawVertices[i]; + floatArray[uvOffset + i] = rawUVs[i]; + } + if (ObjectDataParser.WEIGHTS in rawData) { + var rawWeights = rawData[ObjectDataParser.WEIGHTS]; + var rawSlotPose = rawData[ObjectDataParser.SLOT_POSE]; + var rawBonePoses = rawData[ObjectDataParser.BONE_POSE]; + var weightBoneIndices = new Array(); + var weightBoneCount = Math.floor(rawBonePoses.length / 7); // uint + var floatOffset = floatArray.length; + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + weight.count = (rawWeights.length - vertexCount) / 2; + weight.offset = intArray.length; + weight.bones.length = weightBoneCount; + weightBoneIndices.length = weightBoneCount; + intArray.length += 1 + 1 + weightBoneCount + vertexCount + weight.count; + intArray[weight.offset + 1 /* WeigthFloatOffset */] = floatOffset; + for (var i = 0; i < weightBoneCount; ++i) { + var rawBoneIndex = rawBonePoses[i * 7]; // uint + var bone = this._rawBones[rawBoneIndex]; + weight.bones[i] = bone; + weightBoneIndices[i] = rawBoneIndex; + if (dragonBones.DragonBones.webAssembly) { + for (var j = 0; j < this._armature.sortedBones.size(); j++) { + if (this._armature.sortedBones.get(j) === bone) { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = j; + } + } + } + else { + intArray[weight.offset + 2 /* WeigthBoneIndices */ + i] = this._armature.sortedBones.indexOf(bone); + } + } + floatArray.length += weight.count * 3; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + for (var i = 0, iW = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + var iD = i * 2; + var vertexBoneCount = intArray[iB++] = rawWeights[iW++]; // uint + var x = floatArray[vertexOffset + iD]; + var y = floatArray[vertexOffset + iD + 1]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var rawBoneIndex = rawWeights[iW++]; // uint + var bone = this._rawBones[rawBoneIndex]; + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray[iB++] = weight.bones.indexOf(bone); + floatArray[iV++] = rawWeights[iW++]; + floatArray[iV++] = this._helpPoint.x; + floatArray[iV++] = this._helpPoint.y; + } + } + mesh.weight = weight; + // + this._weightSlotPose[mesh.name] = rawSlotPose; + this._weightBonePoses[mesh.name] = rawBonePoses; + this._weightBoneIndices[mesh.name] = weightBoneIndices; + } + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoundingBox = function (rawData) { + var boundingBox = null; + var type = 0 /* Rectangle */; + if (ObjectDataParser.SUB_TYPE in rawData && typeof rawData[ObjectDataParser.SUB_TYPE] === "string") { + type = ObjectDataParser._getBoundingBoxType(rawData[ObjectDataParser.SUB_TYPE]); + } + else { + type = ObjectDataParser._getNumber(rawData, ObjectDataParser.SUB_TYPE, type); + } + switch (type) { + case 0 /* Rectangle */: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["RectangleBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.RectangleBoundingBoxData); + break; + case 1 /* Ellipse */: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = dragonBones.DragonBones.webAssembly ? new Module["EllipseBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.EllipseBoundingBoxData); + break; + case 2 /* Polygon */: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + if (boundingBox !== null) { + boundingBox.color = ObjectDataParser._getNumber(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type === 0 /* Rectangle */ || boundingBox.type === 1 /* Ellipse */) { + boundingBox.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0.0); + boundingBox.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0.0); + } + } + return boundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + var rawVertices = rawData[ObjectDataParser.VERTICES]; + var floatArray = dragonBones.DragonBones.webAssembly ? this._floatArrayJson : this._data.floatArray; + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = floatArray.length; + polygonBoundingBox.count = rawVertices.length; + polygonBoundingBox.vertices = floatArray; + floatArray.length += polygonBoundingBox.count; + for (var i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + var iN = i + 1; + var x = rawVertices[i]; + var y = rawVertices[iN]; + floatArray[polygonBoundingBox.offset + i] = x; + floatArray[polygonBoundingBox.offset + iN] = y; + // AABB. + if (i === 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } + else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } + else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } + else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + return polygonBoundingBox; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(ObjectDataParser._getNumber(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = ObjectDataParser._getNumber(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = ObjectDataParser._getNumber(rawData, ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0); + animation.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + if (dragonBones.DragonBones.webAssembly) { + animation.frameIntOffset = this._frameIntArrayJson.length; + animation.frameFloatOffset = this._frameFloatArrayJson.length; + animation.frameOffset = this._frameArrayJson.length; + } + else { + animation.frameIntOffset = this._data.frameIntArray.length; + animation.frameFloatOffset = this._data.frameFloatArray.length; + animation.frameOffset = this._data.frameArray.length; + } + this._animation = animation; + if (ObjectDataParser.FRAME in rawData) { + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount > 0) { + for (var i = 0, frameStart = 0; i < keyFrameCount; ++i) { + var rawFrame = rawFrames[i]; + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + if (ObjectDataParser.Z_ORDER in rawData) { + this._animation.zOrderTimeline = this._parseTimeline(rawData[ObjectDataParser.Z_ORDER], 1 /* ZOrder */, false, false, 0, this._parseZOrderFrame); + } + if (ObjectDataParser.BONE in rawData) { + var rawTimelines = rawData[ObjectDataParser.BONE]; + for (var _i = 0, rawTimelines_1 = rawTimelines; _i < rawTimelines_1.length; _i++) { + var rawTimeline = rawTimelines_1[_i]; + this._parseBoneTimeline(rawTimeline); + } + } + if (ObjectDataParser.SLOT in rawData) { + var rawTimelines = rawData[ObjectDataParser.SLOT]; + for (var _a = 0, rawTimelines_2 = rawTimelines; _a < rawTimelines_2.length; _a++) { + var rawTimeline = rawTimelines_2[_a]; + this._parseSlotTimeline(rawTimeline); + } + } + if (ObjectDataParser.FFD in rawData) { + var rawTimelines = rawData[ObjectDataParser.FFD]; + for (var _b = 0, rawTimelines_3 = rawTimelines; _b < rawTimelines_3.length; _b++) { + var rawTimeline = rawTimelines_3[_b]; + var slotName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.SLOT, ""); + var displayName = ObjectDataParser._getString(rawTimeline, ObjectDataParser.NAME, ""); + var slot = this._armature.getSlot(slotName); + if (slot === null) { + continue; + } + this._slot = slot; + this._mesh = this._meshs[displayName]; + var timelineFFD = this._parseTimeline(rawTimeline, 22 /* SlotFFD */, false, true, 0, this._parseSlotFFDFrame); + if (timelineFFD !== null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + this._slot = null; // + this._mesh = null; // + } + } + if (this._actionFrames.length > 0) { + this._actionFrames.sort(this._sortActionFrame); + // const timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData); + var timeline = this._animation.actionTimeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var keyFrameCount = this._actionFrames.length; + timeline.type = 0 /* Action */; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = 100; + timelineArray[timeline.offset + 1 /* TimelineOffset */] = 0; + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = 0; + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = this._parseCacheActionFrame(this._actionFrames[0]) - this._animation.frameOffset; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + //(frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var frame = this._actionFrames[iK]; + frameStart = frame.frameStart; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._actionFrames[iK + 1].frameStart - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = this._parseCacheActionFrame(frame) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + this._actionFrames.length = 0; + } + this._animation = null; // + return animation; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTimeline = function (rawData, type, addIntOffset, addFloatOffset, frameValueCount, frameParser) { + if (!(ObjectDataParser.FRAME in rawData)) { + return null; + } + var rawFrames = rawData[ObjectDataParser.FRAME]; + var keyFrameCount = rawFrames.length; + if (keyFrameCount === 0) { + return null; + } + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntArrayLength = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson.length : this._data.frameIntArray.length; + var frameFloatArrayLength = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson.length : this._data.frameFloatArray.length; + // const timeline = BaseObject.borrowObject(TimelineData); + var timeline = dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData); + timeline.type = type; + timeline.offset = timelineArray.length; + timelineArray.length += 1 + 1 + 1 + 1 + 1 + keyFrameCount; + timelineArray[timeline.offset + 0 /* TimelineScale */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, 1.0) * 100); + timelineArray[timeline.offset + 1 /* TimelineOffset */] = Math.round(ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0.0) * 100); + timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */] = keyFrameCount; + timelineArray[timeline.offset + 3 /* TimelineFrameValueCount */] = frameValueCount; + if (addIntOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameIntArrayLength - this._animation.frameIntOffset; + } + else if (addFloatOffset) { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = frameFloatArrayLength - this._animation.frameFloatOffset; + } + else { + timelineArray[timeline.offset + 4 /* TimelineFrameValueOffset */] = 0; + } + this._timeline = timeline; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + 0] = frameParser.call(this, rawFrames[0], 0, 0) - this._animation.frameOffset; + } + else { + var frameIndices = this._data.frameIndices; + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // frameIndices.resize( frameIndices.size() + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + var rawFrame = rawFrames[iK]; + frameStart = i; + frameCount = ObjectDataParser._getNumber(rawFrame, ObjectDataParser.DURATION, 1); + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK] = frameParser.call(this, rawFrame, frameStart, frameCount) - this._animation.frameOffset; + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneTimeline = function (rawData) { + var bone = this._armature.getBone(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (bone === null) { + return; + } + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + var timeline = this._parseTimeline(rawData, 10 /* BoneAll */, false, true, 6, this._parseBoneFrame); + if (timeline !== null) { + this._animation.addBoneTimeline(bone, timeline); + } + this._bone = null; // + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotTimeline = function (rawData) { + var slot = this._armature.getSlot(ObjectDataParser._getString(rawData, ObjectDataParser.NAME, "")); + if (slot === null) { + return; + } + this._slot = slot; + var displayIndexTimeline = this._parseTimeline(rawData, 20 /* SlotDisplay */, false, false, 0, this._parseSlotDisplayIndexFrame); + if (displayIndexTimeline !== null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + var colorTimeline = this._parseTimeline(rawData, 21 /* SlotColor */, true, false, 1, this._parseSlotColorFrame); + if (colorTimeline !== null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + this._slot = null; // + }; + /** + * @private + */ + ObjectDataParser.prototype._parseFrame = function (rawData, frameStart, frameCount, frameArray) { + rawData; + frameCount; + var frameOffset = frameArray.length; + frameArray.length += 1; + frameArray[frameOffset + 0 /* FramePosition */] = frameStart; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTweenFrame = function (rawData, frameStart, frameCount, frameArray) { + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (frameCount > 0) { + if (ObjectDataParser.CURVE in rawData) { + var sampleCount = frameCount + 1; + this._helpArray.length = sampleCount; + this._samplingEasingCurve(rawData[ObjectDataParser.CURVE], this._helpArray); + frameArray.length += 1 + 1 + this._helpArray.length; + frameArray[frameOffset + 1 /* FrameTweenType */] = 2 /* Curve */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = sampleCount; + for (var i = 0; i < sampleCount; ++i) { + frameArray[frameOffset + 3 /* FrameCurveSamples */ + i] = Math.round(this._helpArray[i] * 10000.0); + } + } + else { + var noTween = -2.0; + var tweenEasing = noTween; + if (ObjectDataParser.TWEEN_EASING in rawData) { + tweenEasing = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + if (tweenEasing === noTween) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + else if (tweenEasing === 0.0) { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 1 /* Line */; + } + else if (tweenEasing < 0.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 3 /* QuadIn */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(-tweenEasing * 100.0); + } + else if (tweenEasing <= 1.0) { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 4 /* QuadOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0); + } + else { + frameArray.length += 1 + 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 5 /* QuadInOut */; + frameArray[frameOffset + 2 /* FrameTweenEasingOrCurveSampleCount */] = Math.round(tweenEasing * 100.0 - 100.0); + } + } + } + else { + frameArray.length += 1; + frameArray[frameOffset + 1 /* FrameTweenType */] = 0 /* None */; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseZOrderFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + if (ObjectDataParser.Z_ORDER in rawData) { + var rawZOrder = rawData[ObjectDataParser.Z_ORDER]; + if (rawZOrder.length > 0) { + var slotCount = this._armature.sortedSlots.length; + var unchanged = new Array(slotCount - rawZOrder.length / 2); + var zOrders = new Array(slotCount); + for (var i_1 = 0; i_1 < slotCount; ++i_1) { + zOrders[i_1] = -1; + } + var originalIndex = 0; + var unchangedIndex = 0; + for (var i_2 = 0, l = rawZOrder.length; i_2 < l; i_2 += 2) { + var slotIndex = rawZOrder[i_2]; + var zOrderOffset = rawZOrder[i_2 + 1]; + while (originalIndex !== slotIndex) { + unchanged[unchangedIndex++] = originalIndex++; + } + zOrders[originalIndex + zOrderOffset] = originalIndex++; + } + while (originalIndex < slotCount) { + unchanged[unchangedIndex++] = originalIndex++; + } + frameArray.length += 1 + slotCount; + frameArray[frameOffset + 1] = slotCount; + var i = slotCount; + while (i--) { + if (zOrders[i] === -1) { + frameArray[frameOffset + 2 + i] = unchanged[--unchangedIndex]; + } + else { + frameArray[frameOffset + 2 + i] = zOrders[i]; + } + } + return frameOffset; + } + } + frameArray.length += 1; + frameArray[frameOffset + 1] = 0; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseBoneFrame = function (rawData, frameStart, frameCount) { + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + this._helpTransform.identity(); + if (ObjectDataParser.TRANSFORM in rawData) { + this._parseTransform(rawData[ObjectDataParser.TRANSFORM], this._helpTransform, 1.0); + } + // Modify rotation. + var rotation = this._helpTransform.rotation; + if (frameStart !== 0) { + if (this._prevTweenRotate === 0) { + rotation = this._prevRotation + dragonBones.Transform.normalizeRadian(rotation - this._prevRotation); + } + else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + rotation = this._prevRotation + rotation - this._prevRotation + dragonBones.Transform.PI_D * this._prevTweenRotate; + } + } + this._prevTweenRotate = ObjectDataParser._getNumber(rawData, ObjectDataParser.TWEEN_ROTATE, 0.0); + this._prevRotation = rotation; + var frameFloatOffset = frameFloatArray.length; + frameFloatArray.length += 6; + frameFloatArray[frameFloatOffset++] = this._helpTransform.x; + frameFloatArray[frameFloatOffset++] = this._helpTransform.y; + frameFloatArray[frameFloatOffset++] = rotation; + frameFloatArray[frameFloatOffset++] = this._helpTransform.skew; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleX; + frameFloatArray[frameFloatOffset++] = this._helpTransform.scaleY; + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotDisplayIndexFrame = function (rawData, frameStart, frameCount) { + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + frameArray.length += 1; + frameArray[frameOffset + 1] = ObjectDataParser._getNumber(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotColorFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var colorOffset = -1; + if (ObjectDataParser.COLOR in rawData) { + var rawColor = rawData[ObjectDataParser.COLOR]; + for (var k in rawColor) { + k; + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueMultiplier * 100); + intArray[colorOffset++] = Math.round(this._helpColorTransform.alphaOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.redOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.greenOffset); + intArray[colorOffset++] = Math.round(this._helpColorTransform.blueOffset); + colorOffset -= 8; + break; + } + } + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length; + intArray.length += 8; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 100; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + intArray[colorOffset++] = 0; + } + colorOffset = this._defalultColorOffset; + } + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1; + frameIntArray[frameIntOffset] = colorOffset; + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseSlotFFDFrame = function (rawData, frameStart, frameCount) { + var intArray = dragonBones.DragonBones.webAssembly ? this._intArrayJson : this._data.intArray; + var frameFloatArray = dragonBones.DragonBones.webAssembly ? this._frameFloatArrayJson : this._data.frameFloatArray; + var frameArray = dragonBones.DragonBones.webAssembly ? this._frameArrayJson : this._data.frameArray; + var frameFloatOffset = frameFloatArray.length; + var frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + var rawVertices = ObjectDataParser.VERTICES in rawData ? rawData[ObjectDataParser.VERTICES] : null; + var offset = ObjectDataParser._getNumber(rawData, ObjectDataParser.OFFSET, 0); // uint + var vertexCount = intArray[this._mesh.offset + 0 /* MeshVertexCount */]; + var x = 0.0; + var y = 0.0; + var iB = 0; + var iV = 0; + if (this._mesh.weight !== null) { + var rawSlotPose = this._weightSlotPose[this._mesh.name]; + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.length += this._mesh.weight.count * 2; + iB = this._mesh.weight.offset + 2 /* WeigthBoneIndices */ + this._mesh.weight.bones.length; + } + else { + frameFloatArray.length += vertexCount * 2; + } + for (var i = 0; i < vertexCount * 2; i += 2) { + if (rawVertices === null) { + x = 0.0; + y = 0.0; + } + else { + if (i < offset || i - offset >= rawVertices.length) { + x = 0.0; + } + else { + x = rawVertices[i - offset]; + } + if (i + 1 < offset || i + 1 - offset >= rawVertices.length) { + y = 0.0; + } + else { + y = rawVertices[i + 1 - offset]; + } + } + if (this._mesh.weight !== null) { + var rawBonePoses = this._weightBonePoses[this._mesh.name]; + var weightBoneIndices = this._weightBoneIndices[this._mesh.name]; + var vertexBoneCount = intArray[iB++]; + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + for (var j = 0; j < vertexBoneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._mesh.weight.bones[boneIndex]; + var rawBoneIndex = this._rawBones.indexOf(bone); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.x; + frameFloatArray[frameFloatOffset + iV++] = this._helpPoint.y; + } + } + else { + frameFloatArray[frameFloatOffset + i] = x; + frameFloatArray[frameFloatOffset + i + 1] = y; + } + } + if (frameStart === 0) { + var frameIntArray = dragonBones.DragonBones.webAssembly ? this._frameIntArrayJson : this._data.frameIntArray; + var timelineArray = dragonBones.DragonBones.webAssembly ? this._timelineArrayJson : this._data.timelineArray; + var frameIntOffset = frameIntArray.length; + frameIntArray.length += 1 + 1 + 1 + 1 + 1; + frameIntArray[frameIntOffset + 0 /* FFDTimelineMeshOffset */] = this._mesh.offset; + frameIntArray[frameIntOffset + 1 /* FFDTimelineFFDCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 2 /* FFDTimelineValueCount */] = frameFloatArray.length - frameFloatOffset; + frameIntArray[frameIntOffset + 3 /* FFDTimelineValueOffset */] = 0; + frameIntArray[frameIntOffset + 4 /* FFDTimelineFloatOffset */] = frameFloatOffset; + timelineArray[this._timeline.offset + 3 /* TimelineFrameValueCount */] = frameIntOffset - this._animation.frameIntOffset; + } + return frameOffset; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseActionData = function (rawData, actions, type, bone, slot) { + var actionCount = 0; + if (typeof rawData === "string") { + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + action.type = type; + action.name = rawData; + action.bone = bone; + action.slot = slot; + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + else if (rawData instanceof Array) { + for (var _i = 0, rawData_1 = rawData; _i < rawData_1.length; _i++) { + var rawAction = rawData_1[_i]; + // const action = BaseObject.borrowObject(ActionData); + var action = dragonBones.DragonBones.webAssembly ? new Module["ActionData"]() : dragonBones.BaseObject.borrowObject(dragonBones.ActionData); + if (ObjectDataParser.GOTO_AND_PLAY in rawAction) { + action.type = 0 /* Play */; + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } + else { + if (ObjectDataParser.TYPE in rawAction && typeof rawAction[ObjectDataParser.TYPE] === "string") { + action.type = ObjectDataParser._getActionType(rawAction[ObjectDataParser.TYPE]); + } + else { + action.type = ObjectDataParser._getNumber(rawAction, ObjectDataParser.TYPE, type); + } + action.name = ObjectDataParser._getString(rawAction, ObjectDataParser.NAME, ""); + } + if (ObjectDataParser.BONE in rawAction) { + var boneName = ObjectDataParser._getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } + else { + action.bone = bone; + } + if (ObjectDataParser.SLOT in rawAction) { + var slotName = ObjectDataParser._getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } + else { + action.slot = slot; + } + if (ObjectDataParser.INTS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawInts = rawAction[ObjectDataParser.INTS]; + for (var _a = 0, rawInts_1 = rawInts; _a < rawInts_1.length; _a++) { + var rawValue = rawInts_1[_a]; + dragonBones.DragonBones.webAssembly ? action.data.ints.push_back(rawValue) : action.data.ints.push(rawValue); + } + } + if (ObjectDataParser.FLOATS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawFloats = rawAction[ObjectDataParser.FLOATS]; + for (var _b = 0, rawFloats_1 = rawFloats; _b < rawFloats_1.length; _b++) { + var rawValue = rawFloats_1[_b]; + dragonBones.DragonBones.webAssembly ? action.data.floats.push_back(rawValue) : action.data.floats.push(rawValue); + } + } + if (ObjectDataParser.STRINGS in rawAction) { + if (action.data === null) { + // action.data = BaseObject.borrowObject(UserData); + action.data = dragonBones.DragonBones.webAssembly ? new Module["UserData"]() : dragonBones.BaseObject.borrowObject(dragonBones.UserData); + } + var rawStrings = rawAction[ObjectDataParser.STRINGS]; + for (var _c = 0, rawStrings_1 = rawStrings; _c < rawStrings_1.length; _c++) { + var rawValue = rawStrings_1[_c]; + dragonBones.DragonBones.webAssembly ? action.data.strings.push_back(rawValue) : action.data.strings.push(rawValue); + } + } + dragonBones.DragonBones.webAssembly ? actions.push_back(action) : actions.push(action); + actionCount++; + } + } + return actionCount; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseTransform = function (rawData, transform, scale) { + transform.x = ObjectDataParser._getNumber(rawData, ObjectDataParser.X, 0.0) * scale; + transform.y = ObjectDataParser._getNumber(rawData, ObjectDataParser.Y, 0.0) * scale; + if (ObjectDataParser.ROTATE in rawData || ObjectDataParser.SKEW in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.ROTATE, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW, 0.0) * dragonBones.Transform.DEG_RAD); + } + else if (ObjectDataParser.SKEW_X in rawData || ObjectDataParser.SKEW_Y in rawData) { + transform.rotation = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_Y, 0.0) * dragonBones.Transform.DEG_RAD); + transform.skew = dragonBones.Transform.normalizeRadian(ObjectDataParser._getNumber(rawData, ObjectDataParser.SKEW_X, 0.0) * dragonBones.Transform.DEG_RAD) - transform.rotation; + } + transform.scaleX = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_X, 1.0); + transform.scaleY = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE_Y, 1.0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseColorTransform = function (rawData, color) { + color.alphaMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01; + color.redMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01; + color.greenMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01; + color.blueMultiplier = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01; + color.alphaOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = ObjectDataParser._getNumber(rawData, ObjectDataParser.BLUE_OFFSET, 0); + }; + /** + * @private + */ + ObjectDataParser.prototype._parseArray = function (rawData) { + rawData; + if (dragonBones.DragonBones.webAssembly) { + return; + } + this._data.intArray = []; + this._data.floatArray = []; + this._data.frameIntArray = []; + this._data.frameFloatArray = []; + this._data.frameArray = []; + this._data.timelineArray = []; + }; + /** + * @private + */ + ObjectDataParser.prototype._parseWASMArray = function () { + var intArrayBuf = Module._malloc(this._intArrayJson.length * 2); + this._intArrayBuffer = new Int16Array(Module.HEAP16.buffer, intArrayBuf, this._intArrayJson.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + for (var i1 = 0; i1 < this._intArrayJson.length; ++i1) { + this._intArrayBuffer[i1] = this._intArrayJson[i1]; + } + var floatArrayBuf = Module._malloc(this._floatArrayJson.length * 4); + // Module.HEAPF32.set(this._floatArrayJson, floatArrayBuf); + this._floatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, this._floatArrayJson.length); + for (var i2 = 0; i2 < this._floatArrayJson.length; ++i2) { + this._floatArrayBuffer[i2] = this._floatArrayJson[i2]; + } + var frameIntArrayBuf = Module._malloc(this._frameIntArrayJson.length * 2); + // Module.HEAP16.set(this._frameIntArrayJson, frameIntArrayBuf); + this._frameIntArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, this._frameIntArrayJson.length); + for (var i3 = 0; i3 < this._frameIntArrayJson.length; ++i3) { + this._frameIntArrayBuffer[i3] = this._frameIntArrayJson[i3]; + } + var frameFloatArrayBuf = Module._malloc(this._frameFloatArrayJson.length * 4); + // Module.HEAPF32.set(this._frameFloatArrayJson, frameFloatArrayBuf); + this._frameFloatArrayBuffer = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, this._frameFloatArrayJson.length); + for (var i4 = 0; i4 < this._frameFloatArrayJson.length; ++i4) { + this._frameFloatArrayBuffer[i4] = this._frameFloatArrayJson[i4]; + } + var frameArrayBuf = Module._malloc(this._frameArrayJson.length * 2); + // Module.HEAP16.set(this._frameArrayJson, frameArrayBuf); + this._frameArrayBuffer = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, this._frameArrayJson.length); + for (var i5 = 0; i5 < this._frameArrayJson.length; ++i5) { + this._frameArrayBuffer[i5] = this._frameArrayJson[i5]; + } + var timelineArrayBuf = Module._malloc(this._timelineArrayJson.length * 2); + // Module.HEAPU16.set(this._timelineArrayJson, timelineArrayBuf); + this._timelineArrayBuffer = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, this._timelineArrayJson.length); + for (var i6 = 0; i6 < this._timelineArrayJson.length; ++i6) { + this._timelineArrayBuffer[i6] = this._timelineArrayJson[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined); + var version = ObjectDataParser._getString(rawData, ObjectDataParser.VERSION, ""); + var compatibleVersion = ObjectDataParser._getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + if (ObjectDataParser.DATA_VERSIONS.indexOf(version) >= 0 || + ObjectDataParser.DATA_VERSIONS.indexOf(compatibleVersion) >= 0) { + // const data = BaseObject.borrowObject(DragonBonesData); + var data = dragonBones.DragonBones.webAssembly ? new Module["DragonBonesData"]() : dragonBones.BaseObject.borrowObject(dragonBones.DragonBonesData); + data.version = version; + data.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = ObjectDataParser._getNumber(rawData, ObjectDataParser.FRAME_RATE, 24); + if (data.frameRate === 0) { + data.frameRate = 24; + } + if (ObjectDataParser.ARMATURE in rawData) { + this._defalultColorOffset = -1; + this._data = data; + this._parseArray(rawData); + var rawArmatures = rawData[ObjectDataParser.ARMATURE]; + for (var _i = 0, rawArmatures_1 = rawArmatures; _i < rawArmatures_1.length; _i++) { + var rawArmature = rawArmatures_1[_i]; + data.addArmature(this._parseArmature(rawArmature, scale)); + } + if (this._intArrayJson.length > 0) { + this._parseWASMArray(); + } + this._data = null; + } + this._rawTextureAtlasIndex = 0; + if (ObjectDataParser.TEXTURE_ATLAS in rawData) { + this._rawTextureAtlases = rawData[ObjectDataParser.TEXTURE_ATLAS]; + } + else { + this._rawTextureAtlases = null; + } + return data; + } + else { + console.assert(false, "Nonsupport data version."); + } + return null; + }; + /** + * @inheritDoc + */ + ObjectDataParser.prototype.parseTextureAtlasData = function (rawData, textureAtlasData, scale) { + if (scale === void 0) { scale = 0.0; } + console.assert(rawData !== undefined); + if (rawData === null) { + if (this._rawTextureAtlases === null) { + return false; + } + var rawTextureAtlas = this._rawTextureAtlases[this._rawTextureAtlasIndex++]; + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + return true; + } + // Texture format. + textureAtlasData.width = ObjectDataParser._getNumber(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = ObjectDataParser._getNumber(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = ObjectDataParser._getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = ObjectDataParser._getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + if (scale > 0.0) { + textureAtlasData.scale = scale; + } + else { + scale = textureAtlasData.scale = ObjectDataParser._getNumber(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + scale = 1.0 / scale; // + if (ObjectDataParser.SUB_TEXTURE in rawData) { + var rawTextures = rawData[ObjectDataParser.SUB_TEXTURE]; + for (var i = 0, l = rawTextures.length; i < l; ++i) { + var rawTexture = rawTextures[i]; + var textureData = textureAtlasData.createTexture(); + textureData.rotated = ObjectDataParser._getBoolean(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = ObjectDataParser._getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.X, 0.0) * scale; + textureData.region.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.Y, 0.0) * scale; + textureData.region.width = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.WIDTH, 0.0) * scale; + textureData.region.height = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.HEIGHT, 0.0) * scale; + var frameWidth = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_WIDTH, -1.0); + var frameHeight = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1.0); + if (frameWidth > 0.0 && frameHeight > 0.0) { + textureData.frame = dragonBones.DragonBones.webAssembly ? Module["TextureData"].createRectangle() : dragonBones.TextureData.createRectangle(); + textureData.frame.x = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_X, 0.0) * scale; + textureData.frame.y = ObjectDataParser._getNumber(rawTexture, ObjectDataParser.FRAME_Y, 0.0) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + textureAtlasData.addTexture(textureData); + } + } + return true; + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + ObjectDataParser.getInstance = function () { + if (ObjectDataParser._objectDataParserInstance === null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + return ObjectDataParser._objectDataParserInstance; + }; + /** + * @private + */ + ObjectDataParser._objectDataParserInstance = null; + return ObjectDataParser; + }(dragonBones.DataParser)); + dragonBones.ObjectDataParser = ObjectDataParser; + var ActionFrame = (function () { + function ActionFrame() { + this.frameStart = 0; + this.actions = []; + } + return ActionFrame; + }()); +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BinaryDataParser = (function (_super) { + __extends(BinaryDataParser, _super); + function BinaryDataParser() { + return _super !== null && _super.apply(this, arguments) || this; + } + BinaryDataParser.prototype._inRange = function (a, min, max) { + return min <= a && a <= max; + }; + BinaryDataParser.prototype._decodeUTF8 = function (data) { + var EOF_byte = -1; + var EOF_code_point = -1; + var FATAL_POINT = 0xFFFD; + var pos = 0; + var result = ""; + var code_point; + var utf8_code_point = 0; + var utf8_bytes_needed = 0; + var utf8_bytes_seen = 0; + var utf8_lower_boundary = 0; + while (data.length > pos) { + var _byte = data[pos++]; + if (_byte === EOF_byte) { + if (utf8_bytes_needed !== 0) { + code_point = FATAL_POINT; + } + else { + code_point = EOF_code_point; + } + } + else { + if (utf8_bytes_needed === 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } + else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } + else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } + else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } + else { + } + utf8_code_point = utf8_code_point * Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } + else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } + else { + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + if (utf8_bytes_seen !== utf8_bytes_needed) { + code_point = null; + } + else { + var cp = utf8_code_point; + var lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } + else { + code_point = _byte; + } + } + } + } + //Decode string + if (code_point !== null && code_point !== EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) + result += String.fromCharCode(code_point); + } + else { + code_point -= 0x10000; + result += String.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += String.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + return result; + }; + BinaryDataParser.prototype._getUTF16Key = function (value) { + for (var i = 0, l = value.length; i < l; ++i) { + if (value.charCodeAt(i) > 255) { + return encodeURI(value); + } + } + return value; + }; + BinaryDataParser.prototype._parseBinaryTimeline = function (type, offset, timelineData) { + if (timelineData === void 0) { timelineData = null; } + // const timeline = timelineData !== null ? timelineData : BaseObject.borrowObject(TimelineData); + var timeline = timelineData !== null ? timelineData : (dragonBones.DragonBones.webAssembly ? new Module["TimelineData"]() : dragonBones.BaseObject.borrowObject(dragonBones.TimelineData)); + timeline.type = type; + timeline.offset = offset; + this._timeline = timeline; + var keyFrameCount = this._timelineArray[timeline.offset + 2 /* TimelineKeyFrameCount */]; + if (keyFrameCount === 1) { + timeline.frameIndicesOffset = -1; + } + else { + var totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + var frameIndices = this._data.frameIndices; + if (dragonBones.DragonBones.webAssembly) { + timeline.frameIndicesOffset = frameIndices.size(); + // (frameIndices as any).resize(timeline.frameIndicesOffset + totalFrameCount); + for (var j = 0; j < totalFrameCount; ++j) { + frameIndices.push_back(0); + } + } + else { + timeline.frameIndicesOffset = frameIndices.length; + frameIndices.length += totalFrameCount; + } + for (var i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK]]; + if (iK === keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + else { + frameCount = this._frameArray[this._animation.frameOffset + this._timelineArray[timeline.offset + 5 /* TimelineFrameOffset */ + iK + 1]] - frameStart; + } + iK++; + } + if (dragonBones.DragonBones.webAssembly) { + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + else { + frameIndices[timeline.frameIndicesOffset + i] = iK - 1; + } + } + } + this._timeline = null; // + return timeline; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseMesh = function (rawData, mesh) { + mesh.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + var weightOffset = this._intArray[mesh.offset + 3 /* MeshWeightOffset */]; + if (weightOffset >= 0) { + // const weight = BaseObject.borrowObject(WeightData); + var weight = dragonBones.DragonBones.webAssembly ? new Module["WeightData"]() : dragonBones.BaseObject.borrowObject(dragonBones.WeightData); + var vertexCount = this._intArray[mesh.offset + 0 /* MeshVertexCount */]; + var boneCount = this._intArray[weightOffset + 0 /* WeigthBoneCount */]; + weight.offset = weightOffset; + if (dragonBones.DragonBones.webAssembly) { + weight.bones.resize(boneCount, null); + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones.set(i, this._rawBones[boneIndex]); + } + } + else { + weight.bones.length = boneCount; + for (var i = 0; i < boneCount; ++i) { + var boneIndex = this._intArray[weightOffset + 2 /* WeigthBoneIndices */ + i]; + weight.bones[i] = this._rawBones[boneIndex]; + } + } + var boneIndicesOffset = weightOffset + 2 /* WeigthBoneIndices */ + boneCount; + for (var i = 0, l = vertexCount; i < l; ++i) { + var vertexBoneCount = this._intArray[boneIndicesOffset++]; + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + mesh.weight = weight; + } + }; + /** + * @private + */ + BinaryDataParser.prototype._parsePolygonBoundingBox = function (rawData) { + // const polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData); + var polygonBoundingBox = dragonBones.DragonBones.webAssembly ? new Module["PolygonBoundingBoxData"]() : dragonBones.BaseObject.borrowObject(dragonBones.PolygonBoundingBoxData); + polygonBoundingBox.offset = rawData[dragonBones.ObjectDataParser.OFFSET]; + polygonBoundingBox.vertices = this._floatArray; + return polygonBoundingBox; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseAnimation = function (rawData) { + // const animation = BaseObject.borrowObject(AnimationData); + var animation = dragonBones.DragonBones.webAssembly ? new Module["AnimationData"]() : dragonBones.BaseObject.borrowObject(dragonBones.AnimationData); + animation.frameCount = Math.max(dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.DURATION, 1), 1); + animation.playTimes = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.FADE_IN_TIME, 0.0); + animation.scale = dragonBones.ObjectDataParser._getNumber(rawData, dragonBones.ObjectDataParser.SCALE, 1.0); + animation.name = dragonBones.ObjectDataParser._getString(rawData, dragonBones.ObjectDataParser.NAME, dragonBones.ObjectDataParser.DEFAULT_NAME); + if (animation.name.length === 0) { + animation.name = dragonBones.ObjectDataParser.DEFAULT_NAME; + } + // Offsets. + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + animation.frameIntOffset = offsets[0]; + animation.frameFloatOffset = offsets[1]; + animation.frameOffset = offsets[2]; + this._animation = animation; + if (dragonBones.ObjectDataParser.ACTION in rawData) { + animation.actionTimeline = this._parseBinaryTimeline(0 /* Action */, rawData[dragonBones.ObjectDataParser.ACTION]); + } + if (dragonBones.ObjectDataParser.Z_ORDER in rawData) { + animation.zOrderTimeline = this._parseBinaryTimeline(1 /* ZOrder */, rawData[dragonBones.ObjectDataParser.Z_ORDER]); + } + if (dragonBones.ObjectDataParser.BONE in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.BONE]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var bone = this._armature.getBone(k); + if (bone === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + if (dragonBones.ObjectDataParser.SLOT in rawData) { + var rawTimeliness = rawData[dragonBones.ObjectDataParser.SLOT]; + for (var k in rawTimeliness) { + var rawTimelines = rawTimeliness[k]; + if (dragonBones.DragonBones.webAssembly) { + k = this._getUTF16Key(k); + } + var slot = this._armature.getSlot(k); + if (slot === null) { + continue; + } + for (var i = 0, l = rawTimelines.length; i < l; i += 2) { + var timelineType = rawTimelines[i]; + var timelineOffset = rawTimelines[i + 1]; + var timeline = this._parseBinaryTimeline(timelineType, timelineOffset); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + this._animation = null; + return animation; + }; + /** + * @private + */ + BinaryDataParser.prototype._parseArray = function (rawData) { + var offsets = rawData[dragonBones.ObjectDataParser.OFFSET]; + if (dragonBones.DragonBones.webAssembly) { + var tmpIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + var tmpFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + var tmpFrameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + var tmpFrameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + var tmpTimelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + var intArrayBuf = Module._malloc(tmpIntArray.length * tmpIntArray.BYTES_PER_ELEMENT); + var floatArrayBuf = Module._malloc(tmpFloatArray.length * tmpFloatArray.BYTES_PER_ELEMENT); + var frameIntArrayBuf = Module._malloc(tmpFrameIntArray.length * tmpFrameIntArray.BYTES_PER_ELEMENT); + var frameFloatArrayBuf = Module._malloc(tmpFrameFloatArray.length * tmpFrameFloatArray.BYTES_PER_ELEMENT); + var frameArrayBuf = Module._malloc(tmpFrameArray.length * tmpFrameArray.BYTES_PER_ELEMENT); + var timelineArrayBuf = Module._malloc(tmpTimelineArray.length * tmpTimelineArray.BYTES_PER_ELEMENT); + this._intArray = new Int16Array(Module.HEAP16.buffer, intArrayBuf, tmpIntArray.length); + this._floatArray = new Float32Array(Module.HEAPF32.buffer, floatArrayBuf, tmpFloatArray.length); + this._frameIntArray = new Int16Array(Module.HEAP16.buffer, frameIntArrayBuf, tmpFrameIntArray.length); + this._frameFloatArray = new Float32Array(Module.HEAPF32.buffer, frameFloatArrayBuf, tmpFrameFloatArray.length); + this._frameArray = new Int16Array(Module.HEAP16.buffer, frameArrayBuf, tmpFrameArray.length); + this._timelineArray = new Uint16Array(Module.HEAPU16.buffer, timelineArrayBuf, tmpTimelineArray.length); + // Module.HEAP16.set(tmpIntArray, intArrayBuf); + // Module.HEAPF32.set(tmpFloatArray, floatArrayBuf); + // Module.HEAP16.set(tmpFrameIntArray, frameIntArrayBuf); + // Module.HEAPF32.set(tmpFrameFloatArray, frameFloatArrayBuf); + // Module.HEAP16.set(tmpFrameArray, frameArrayBuf); + // Module.HEAPU16.set(tmpTimelineArray, timelineArrayBuf); + for (var i1 = 0; i1 < tmpIntArray.length; ++i1) { + this._intArray[i1] = tmpIntArray[i1]; + } + for (var i2 = 0; i2 < tmpFloatArray.length; ++i2) { + this._floatArray[i2] = tmpFloatArray[i2]; + } + for (var i3 = 0; i3 < tmpFrameIntArray.length; ++i3) { + this._frameIntArray[i3] = tmpFrameIntArray[i3]; + } + for (var i4 = 0; i4 < tmpFrameFloatArray.length; ++i4) { + this._frameFloatArray[i4] = tmpFrameFloatArray[i4]; + } + for (var i5 = 0; i5 < tmpFrameArray.length; ++i5) { + this._frameArray[i5] = tmpFrameArray[i5]; + } + for (var i6 = 0; i6 < tmpTimelineArray.length; ++i6) { + this._timelineArray[i6] = tmpTimelineArray[i6]; + } + Module['DragonBonesData'].setDragonBoneData(this._data); + Module.ccall('set_dbData_buffer_ptr', 'number', ['number', 'number', 'number', 'number', 'number', 'number'], [intArrayBuf, floatArrayBuf, frameIntArrayBuf, frameFloatArrayBuf, frameArrayBuf, timelineArrayBuf]); + } + else { + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets[0], offsets[1] / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets[2], offsets[3] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets[4], offsets[5] / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets[6], offsets[7] / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets[8], offsets[9] / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets[10], offsets[11] / Uint16Array.BYTES_PER_ELEMENT); + } + }; + /** + * @inheritDoc + */ + BinaryDataParser.prototype.parseDragonBonesData = function (rawData, scale) { + if (scale === void 0) { scale = 1; } + console.assert(rawData !== null && rawData !== undefined && rawData instanceof ArrayBuffer); + var tag = new Uint8Array(rawData, 0, 8); + if (tag[0] !== "D".charCodeAt(0) || + tag[1] !== "B".charCodeAt(0) || + tag[2] !== "D".charCodeAt(0) || + tag[3] !== "T".charCodeAt(0)) { + console.assert(false, "Nonsupport data."); + return null; + } + var headerLength = new Uint32Array(rawData, 8, 1)[0]; + var headerBytes = new Uint8Array(rawData, 8 + 4, headerLength); + var headerString = this._decodeUTF8(headerBytes); + var header = JSON.parse(headerString); + this._binary = rawData; + this._binaryOffset = 8 + 4 + headerLength; + return _super.prototype.parseDragonBonesData.call(this, header, scale); + }; + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.BaseFactory#parseDragonBonesData() + */ + BinaryDataParser.getInstance = function () { + if (BinaryDataParser._binaryDataParserInstance === null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + return BinaryDataParser._binaryDataParserInstance; + }; + /** + * @private + */ + BinaryDataParser._binaryDataParserInstance = null; + return BinaryDataParser; + }(dragonBones.ObjectDataParser)); + dragonBones.BinaryDataParser = BinaryDataParser; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @private + */ + var BuildArmaturePackage = (function () { + function BuildArmaturePackage() { + this.dataName = ""; + this.textureAtlasName = ""; + this.skin = null; + } + return BuildArmaturePackage; + }()); + dragonBones.BuildArmaturePackage = BuildArmaturePackage; + /** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * @see dragonBones.DragonBonesData + * @see dragonBones.TextureAtlasData + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + var BaseFactory = (function () { + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + function BaseFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * @see dragonBones.DragonBonesData#autoSearch + * @see dragonBones.TextureAtlasData#autoSearch + * @version DragonBones 4.5 + * @language zh_CN + */ + this.autoSearch = false; + /** + * @private + */ + this._dragonBonesDataMap = {}; + /** + * @private + */ + this._textureAtlasDataMap = {}; + /** + * @private + */ + this._dragonBones = null; + /** + * @private + */ + this._dataParser = null; + if (BaseFactory._objectParser === null) { + BaseFactory._objectParser = new dragonBones.ObjectDataParser(); + } + if (BaseFactory._binaryParser === null) { + BaseFactory._binaryParser = new dragonBones.BinaryDataParser(); + } + this._dataParser = dataParser !== null ? dataParser : BaseFactory._objectParser; + } + /** + * @private + */ + BaseFactory.prototype._isSupportMesh = function () { + return true; + }; + /** + * @private + */ + BaseFactory.prototype._getTextureData = function (textureAtlasName, textureName) { + if (textureAtlasName in this._textureAtlasDataMap) { + for (var _i = 0, _a = this._textureAtlasDataMap[textureAtlasName]; _i < _a.length; _i++) { + var textureAtlasData = _a[_i]; + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + if (this.autoSearch) { + for (var k in this._textureAtlasDataMap) { + for (var _b = 0, _c = this._textureAtlasDataMap[k]; _b < _c.length; _b++) { + var textureAtlasData = _c[_b]; + if (textureAtlasData.autoSearch) { + var textureData = textureAtlasData.getTexture(textureName); + if (textureData !== null) { + return textureData; + } + } + } + } + } + return null; + }; + /** + * @private + */ + BaseFactory.prototype._fillBuildArmaturePackage = function (dataPackage, dragonBonesName, armatureName, skinName, textureAtlasName) { + var dragonBonesData = null; + var armatureData = null; + if (dragonBonesName.length > 0) { + if (dragonBonesName in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[dragonBonesName]; + armatureData = dragonBonesData.getArmature(armatureName); + } + } + if (armatureData === null && (dragonBonesName.length === 0 || this.autoSearch)) { + for (var k in this._dragonBonesDataMap) { + dragonBonesData = this._dragonBonesDataMap[k]; + if (dragonBonesName.length === 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData !== null) { + dragonBonesName = k; + break; + } + } + } + } + if (armatureData !== null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + if (skinName.length > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin === null && this.autoSearch) { + for (var k in this._dragonBonesDataMap) { + var skinDragonBonesData = this._dragonBonesDataMap[k]; + var skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData !== null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + if (dataPackage.skin === null) { + dataPackage.skin = armatureData.defaultSkin; + } + return true; + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype._buildBones = function (dataPackage, armature) { + var bones = dataPackage.armature.sortedBones; + for (var i = 0; i < (dragonBones.DragonBones.webAssembly ? bones.size() : bones.length); ++i) { + var boneData = dragonBones.DragonBones.webAssembly ? bones.get(i) : bones[i]; + var bone = dragonBones.DragonBones.webAssembly ? new Module["Bone"]() : dragonBones.BaseObject.borrowObject(dragonBones.Bone); + bone.init(boneData); + if (boneData.parent !== null) { + armature.addBone(bone, boneData.parent.name); + } + else { + armature.addBone(bone); + } + var constraints = boneData.constraints; + for (var j = 0; j < (dragonBones.DragonBones.webAssembly ? constraints.size() : constraints.length); ++j) { + var constraintData = dragonBones.DragonBones.webAssembly ? constraints.get(j) : constraints[j]; + var target = armature.getBone(constraintData.target.name); + if (target === null) { + continue; + } + // TODO more constraint type. + var ikConstraintData = constraintData; + var constraint = dragonBones.DragonBones.webAssembly ? new Module["IKConstraint"]() : dragonBones.BaseObject.borrowObject(dragonBones.IKConstraint); + var root = ikConstraintData.root !== null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + if (root !== null) { + root.addConstraint(constraint); + } + else { + bone.addConstraint(constraint); + } + } + } + }; + /** + * @private + */ + BaseFactory.prototype._buildSlots = function (dataPackage, armature) { + var currentSkin = dataPackage.skin; + var defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin === null || defaultSkin === null) { + return; + } + var skinSlots = {}; + for (var k in defaultSkin.displays) { + var displays = defaultSkin.displays[k]; + skinSlots[k] = displays; + } + if (currentSkin !== defaultSkin) { + for (var k in currentSkin.displays) { + var displays = currentSkin.displays[k]; + skinSlots[k] = displays; + } + } + for (var _i = 0, _a = dataPackage.armature.sortedSlots; _i < _a.length; _i++) { + var slotData = _a[_i]; + if (!(slotData.name in skinSlots)) { + continue; + } + var displays = skinSlots[slotData.name]; + var slot = this._buildSlot(dataPackage, slotData, displays, armature); + var displayList = new Array(); + for (var _b = 0, displays_1 = displays; _b < displays_1.length; _b++) { + var displayData = displays_1[_b]; + if (displayData !== null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } + else { + displayList.push(null); + } + } + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + }; + /** + * @private + */ + BaseFactory.prototype._getSlotDisplay = function (dataPackage, displayData, rawDisplayData, slot) { + var dataName = dataPackage !== null ? dataPackage.dataName : displayData.parent.parent.name; + var display = null; + switch (displayData.type) { + case 0 /* Image */: + var imageDisplayData = displayData; + if (imageDisplayData.texture === null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + if (rawDisplayData !== null && rawDisplayData.type === 2 /* Mesh */ && this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 2 /* Mesh */: + var meshDisplayData = displayData; + if (meshDisplayData.texture === null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } + else if (dataPackage !== null && dataPackage.textureAtlasName.length > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + if (this._isSupportMesh()) { + display = slot.meshDisplay; + } + else { + display = slot.rawDisplay; + } + break; + case 1 /* Armature */: + var armatureDisplayData = displayData; + var childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage !== null ? dataPackage.textureAtlasName : null); + if (childArmature !== null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + var actions = armatureDisplayData.actions.length > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.length > 0) { + for (var _i = 0, actions_2 = actions; _i < actions_2.length; _i++) { + var action = actions_2[_i]; + childArmature._bufferAction(action, true); + } + } + else { + childArmature.animation.play(); + } + } + armatureDisplayData.armature = childArmature.armatureData; // + } + display = childArmature; + break; + } + return display; + }; + /** + * @private + */ + BaseFactory.prototype._replaceSlotDisplay = function (dataPackage, displayData, slot, displayIndex) { + if (displayIndex < 0) { + displayIndex = slot.displayIndex; + } + if (displayIndex < 0) { + displayIndex = 0; + } + var displayList = slot.displayList; // Copy. + if (displayList.length <= displayIndex) { + displayList.length = displayIndex + 1; + for (var i = 0, l = displayList.length; i < l; ++i) { + if (!displayList[i]) { + displayList[i] = null; + } + } + } + if (slot._displayDatas.length <= displayIndex) { + slot._displayDatas.length = displayIndex + 1; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + if (!slot._displayDatas[i]) { + slot._displayDatas[i] = null; + } + } + } + slot._displayDatas[displayIndex] = displayData; + if (displayData !== null) { + displayList[displayIndex] = this._getSlotDisplay(dataPackage, displayData, displayIndex < slot._rawDisplayDatas.length ? slot._rawDisplayDatas[displayIndex] : null, slot); + } + else { + displayList[displayIndex] = null; + } + slot.displayList = displayList; + }; + /** + * 解析并添加龙骨数据。 + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseDragonBonesData = function (rawData, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 1.0; } + var dragonBonesData = null; + if (rawData instanceof ArrayBuffer) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } + else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + while (true) { + var textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } + else { + textureAtlasData.returnToPool(); + break; + } + } + if (dragonBonesData !== null) { + this.addDragonBonesData(dragonBonesData, name); + } + return dragonBonesData; + }; + /** + * 解析并添加贴图集数据。 + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.parseTextureAtlasData = function (rawData, textureAtlas, name, scale) { + if (name === void 0) { name = null; } + if (scale === void 0) { scale = 0.0; } + var textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas || null); + this.addTextureAtlasData(textureAtlasData, name); + return textureAtlasData; + }; + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.updateTextureAtlasData = function (name, textureAtlases) { + var textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas !== null) { + for (var i = 0, l = textureAtlasDatas.length; i < l; ++i) { + if (i < textureAtlases.length) { + this._buildTextureAtlasData(textureAtlasDatas[i], textureAtlases[i]); + } + } + } + }; + /** + * 获取指定名称的龙骨数据。 + * @param name 数据名称。 + * @returns DragonBonesData + * @see #parseDragonBonesData() + * @see #addDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getDragonBonesData = function (name) { + return (name in this._dragonBonesDataMap) ? this._dragonBonesDataMap[name] : null; + }; + /** + * 添加龙骨数据。 + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #removeDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addDragonBonesData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + if (name in this._dragonBonesDataMap) { + if (this._dragonBonesDataMap[name] === data) { + return; + } + console.warn("Replace data: " + name); + this._dragonBonesDataMap[name].returnToPool(); + } + this._dragonBonesDataMap[name] = data; + }; + /** + * 移除龙骨数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseDragonBonesData() + * @see #getDragonBonesData() + * @see #addDragonBonesData() + * @see dragonBones.DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeDragonBonesData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[name]); + } + delete this._dragonBonesDataMap[name]; + } + }; + /** + * 获取指定名称的贴图集数据列表。 + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @see #parseTextureAtlasData() + * @see #addTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.getTextureAtlasData = function (name) { + return (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : null; + }; + /** + * 添加贴图集数据。 + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #removeTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.addTextureAtlasData = function (data, name) { + if (name === void 0) { name = null; } + name = name !== null ? name : data.name; + var textureAtlasList = (name in this._textureAtlasDataMap) ? this._textureAtlasDataMap[name] : (this._textureAtlasDataMap[name] = []); + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.push(data); + } + }; + /** + * 移除贴图集数据。 + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @see #parseTextureAtlasData() + * @see #getTextureAtlasData() + * @see #addTextureAtlasData() + * @see dragonBones.TextureAtlasData + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.removeTextureAtlasData = function (name, disposeData) { + if (disposeData === void 0) { disposeData = true; } + if (name in this._textureAtlasDataMap) { + var textureAtlasDataList = this._textureAtlasDataMap[name]; + if (disposeData) { + for (var _i = 0, textureAtlasDataList_1 = textureAtlasDataList; _i < textureAtlasDataList_1.length; _i++) { + var textureAtlasData = textureAtlasDataList_1[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[name]; + } + }; + /** + * 获取骨架数据。 + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @see dragonBones.ArmatureData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.getArmatureData = function (name, dragonBonesName) { + if (dragonBonesName === void 0) { dragonBonesName = ""; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + return dataPackage.armature; + }; + /** + * 清除所有的数据。 + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.clear = function (disposeData) { + if (disposeData === void 0) { disposeData = true; } + for (var k in this._dragonBonesDataMap) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap[k]); + } + delete this._dragonBonesDataMap[k]; + } + for (var k in this._textureAtlasDataMap) { + if (disposeData) { + var textureAtlasDataList = this._textureAtlasDataMap[k]; + for (var _i = 0, textureAtlasDataList_2 = textureAtlasDataList; _i < textureAtlasDataList_2.length; _i++) { + var textureAtlasData = textureAtlasDataList_2[_i]; + this._dragonBones.bufferObject(textureAtlasData); + } + } + delete this._textureAtlasDataMap[k]; + } + }; + /** + * 创建一个骨架。 + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @see dragonBones.ArmatureData + * @see dragonBones.Armature + * @version DragonBones 3.0 + * @language zh_CN + */ + BaseFactory.prototype.buildArmature = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, skinName || "", textureAtlasName || "")) { + console.warn("No armature data. " + armatureName + ", " + (dragonBonesName !== null ? dragonBonesName : "")); + return null; + } + var armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0.0); // Update armature pose. + return armature; + }; + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplay = function (dragonBonesName, armatureName, slotName, displayName, slot, displayIndex) { + if (displayIndex === void 0) { displayIndex = -1; } + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + for (var _i = 0, displays_2 = displays; _i < displays_2.length; _i++) { + var display = displays_2[_i]; + if (display !== null && display.name === displayName) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + }; + /** + * 用指定资源列表替换插槽的显示对象列表。 + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.replaceSlotDisplayList = function (dragonBonesName, armatureName, slotName, slot) { + var dataPackage = {}; + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName || "", armatureName, "", "") || dataPackage.skin === null) { + return; + } + var displays = dataPackage.skin.getDisplays(slotName); + if (displays === null) { + return; + } + var displayIndex = 0; + for (var _i = 0, displays_3 = displays; _i < displays_3.length; _i++) { + var displayData = displays_3[_i]; + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + }; + /** + * 更换骨架皮肤。 + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @see dragonBones.Armature + * @see dragonBones.SkinData + * @version DragonBones 5.1 + * @language zh_CN + */ + BaseFactory.prototype.changeSkin = function (armature, skin, exclude) { + if (exclude === void 0) { exclude = null; } + for (var _i = 0, _a = armature.getSlots(); _i < _a.length; _i++) { + var slot = _a[_i]; + if (!(slot.name in skin.displays) || (exclude !== null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + var displays = skin.displays[slot.name]; + var displayList = slot.displayList; // Copy. + displayList.length = displays.length; // Modify displayList length. + for (var i = 0, l = displays.length; i < l; ++i) { + var displayData = displays[i]; + if (displayData !== null) { + displayList[i] = this._getSlotDisplay(null, displayData, null, slot); + } + else { + displayList[i] = null; + } + } + slot._rawDisplayDatas = displays; + slot._displayDatas.length = displays.length; + for (var i = 0, l = slot._displayDatas.length; i < l; ++i) { + slot._displayDatas[i] = displays[i]; + } + slot.displayList = displayList; + } + }; + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @see dragonBones.Armature + * @see dragonBones.ArmatureData + * @version DragonBones 4.5 + * @language zh_CN + */ + BaseFactory.prototype.copyAnimationsToArmature = function (toArmature, fromArmatreName, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation) { + if (fromSkinName === void 0) { fromSkinName = null; } + if (fromDragonBonesDataName === void 0) { fromDragonBonesDataName = null; } + if (replaceOriginalAnimation === void 0) { replaceOriginalAnimation = true; } + var dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage(dataPackage, fromDragonBonesDataName || "", fromArmatreName, fromSkinName || "", "")) { + var fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.animation.animations = fromArmatureData.animations; + } + else { + var animations = {}; + for (var animationName in toArmature.animation.animations) { + animations[animationName] = toArmature.animation.animations[animationName]; + } + for (var animationName in fromArmatureData.animations) { + animations[animationName] = fromArmatureData.animations[animationName]; + } + toArmature.animation.animations = animations; + } + if (dataPackage.skin) { + var slots = toArmature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var toSlot = slots[i]; + var toSlotDisplayList = toSlot.displayList; + for (var j = 0, lJ = toSlotDisplayList.length; j < lJ; ++j) { + var toDisplayObject = toSlotDisplayList[j]; + if (toDisplayObject instanceof dragonBones.Armature) { + var displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays !== null && j < displays.length) { + var fromDisplayData = displays[j]; + if (fromDisplayData !== null && fromDisplayData.type === 1 /* Armature */) { + this.copyAnimationsToArmature(toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + return true; + } + } + return false; + }; + /** + * @private + */ + BaseFactory.prototype.getAllDragonBonesData = function () { + return this._dragonBonesDataMap; + }; + /** + * @private + */ + BaseFactory.prototype.getAllTextureAtlasData = function () { + return this._textureAtlasDataMap; + }; + /** + * @private + */ + BaseFactory._objectParser = null; + /** + * @private + */ + BaseFactory._binaryParser = null; + return BaseFactory; + }()); + dragonBones.BaseFactory = BaseFactory; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @language zh_CN + * Pixi 贴图集数据。 + * @version DragonBones 3.0 + */ + var PixiTextureAtlasData = (function (_super) { + __extends(PixiTextureAtlasData, _super); + function PixiTextureAtlasData() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._renderTexture = null; // Initial value. + return _this; + } + PixiTextureAtlasData.toString = function () { + return "[class dragonBones.PixiTextureAtlasData]"; + }; + /** + * @private + */ + PixiTextureAtlasData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + this.renderTexture = null; + }; + /** + * @private + */ + PixiTextureAtlasData.prototype.createTexture = function () { + return dragonBones.BaseObject.borrowObject(PixiTextureData); + }; + Object.defineProperty(PixiTextureAtlasData.prototype, "renderTexture", { + /** + * Pixi 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + get: function () { + return this._renderTexture; + }, + set: function (value) { + if (this._renderTexture === value) { + return; + } + this._renderTexture = value; + if (this._renderTexture !== null) { + for (var k in this.textures) { + var textureData = this.textures[k]; + textureData.renderTexture = new PIXI.Texture(this._renderTexture, textureData.region, // No need to set frame. + textureData.region, new PIXI.Rectangle(0, 0, textureData.region.width, textureData.region.height), textureData.rotated // .d.ts bug + ); + } + } + else { + for (var k in this.textures) { + var textureData = this.textures[k]; + textureData.renderTexture = null; + } + } + }, + enumerable: true, + configurable: true + }); + return PixiTextureAtlasData; + }(dragonBones.TextureAtlasData)); + dragonBones.PixiTextureAtlasData = PixiTextureAtlasData; + /** + * @private + */ + var PixiTextureData = (function (_super) { + __extends(PixiTextureData, _super); + function PixiTextureData() { + var _this = _super.call(this) || this; + _this.renderTexture = null; // Initial value. + return _this; + } + PixiTextureData.toString = function () { + return "[class dragonBones.PixiTextureData]"; + }; + PixiTextureData.prototype._onClear = function () { + _super.prototype._onClear.call(this); + if (this.renderTexture !== null) { + this.renderTexture.destroy(); + } + this.renderTexture = null; + }; + return PixiTextureData; + }(dragonBones.TextureData)); + dragonBones.PixiTextureData = PixiTextureData; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * @inheritDoc + */ + var PixiArmatureDisplay = (function (_super) { + __extends(PixiArmatureDisplay, _super); + function PixiArmatureDisplay() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._disposeProxy = false; + _this._armature = null; + _this._debugDrawer = null; + return _this; + } + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.init = function (armature) { + this._armature = armature; + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.clear = function () { + if (this._debugDrawer !== null) { + this._debugDrawer.destroy(true); + } + this._disposeProxy = false; + this._armature = null; + this._debugDrawer = null; + _super.prototype.destroy.call(this); + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.dispose = function (disposeProxy) { + if (disposeProxy === void 0) { disposeProxy = true; } + this._disposeProxy = disposeProxy; + if (this._armature !== null) { + this._armature.dispose(); + this._armature = null; + } + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.destroy = function () { + this.dispose(); + }; + /** + * @private + */ + PixiArmatureDisplay.prototype.debugUpdate = function (isEnabled) { + if (isEnabled) { + if (this._debugDrawer === null) { + this._debugDrawer = new PIXI.Sprite(); + var boneDrawer_1 = new PIXI.Graphics(); + this._debugDrawer.addChild(boneDrawer_1); + } + this.addChild(this._debugDrawer); + var boneDrawer = this._debugDrawer.getChildAt(0); + boneDrawer.clear(); + var bones = this._armature.getBones(); + for (var i = 0, l = bones.length; i < l; ++i) { + var bone = bones[i]; + var boneLength = bone.boneData.length; + var startX = bone.globalTransformMatrix.tx; + var startY = bone.globalTransformMatrix.ty; + var endX = startX + bone.globalTransformMatrix.a * boneLength; + var endY = startY + bone.globalTransformMatrix.b * boneLength; + boneDrawer.lineStyle(2.0, 0x00FFFF, 0.7); + boneDrawer.moveTo(startX, startY); + boneDrawer.lineTo(endX, endY); + boneDrawer.lineStyle(0.0, 0, 0.0); + boneDrawer.beginFill(0x00FFFF, 0.7); + boneDrawer.drawCircle(startX, startY, 3.0); + boneDrawer.endFill(); + } + var slots = this._armature.getSlots(); + for (var i = 0, l = slots.length; i < l; ++i) { + var slot = slots[i]; + var boundingBoxData = slot.boundingBoxData; + if (boundingBoxData) { + var child = this._debugDrawer.getChildByName(slot.name); + if (!child) { + child = new PIXI.Graphics(); + child.name = slot.name; + this._debugDrawer.addChild(child); + } + child.clear(); + child.beginFill(0xFF00FF, 0.3); + switch (boundingBoxData.type) { + case 0 /* Rectangle */: + child.drawRect(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 1 /* Ellipse */: + child.drawEllipse(-boundingBoxData.width * 0.5, -boundingBoxData.height * 0.5, boundingBoxData.width, boundingBoxData.height); + break; + case 2 /* Polygon */: + var polygon = boundingBoxData; + var vertices = polygon.vertices; + for (var i_3 = 0, l_1 = polygon.count; i_3 < l_1; i_3 += 2) { + if (i_3 === 0) { + child.moveTo(vertices[i_3], vertices[i_3 + 1]); + } + else { + child.lineTo(vertices[i_3], vertices[i_3 + 1]); + } + } + break; + default: + break; + } + child.endFill(); + slot.updateTransformAndMatrix(); + slot.updateGlobalTransform(); + var transform = slot.global; + child.setTransform(transform.x, transform.y, transform.scaleX, transform.scaleY, transform.rotation, transform.skew, 0.0, slot._pivotX, slot._pivotY); + } + else { + var child = this._debugDrawer.getChildByName(slot.name); + if (child) { + this._debugDrawer.removeChild(child); + } + } + } + } + else if (this._debugDrawer && this._debugDrawer.parent === this) { + this.removeChild(this._debugDrawer); + } + }; + /** + * @private + */ + PixiArmatureDisplay.prototype._dispatchEvent = function (type, eventObject) { + this.emit(type, eventObject); + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.hasEvent = function (type) { + return this.listeners(type, true); // .d.ts bug + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.addEvent = function (type, listener, target) { + this.addListener(type, listener, target); + }; + /** + * @inheritDoc + */ + PixiArmatureDisplay.prototype.removeEvent = function (type, listener, target) { + this.removeListener(type, listener, target); + }; + Object.defineProperty(PixiArmatureDisplay.prototype, "armature", { + /** + * @inheritDoc + */ + get: function () { + return this._armature; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PixiArmatureDisplay.prototype, "animation", { + /** + * @inheritDoc + */ + get: function () { + return this._armature.animation; + }, + enumerable: true, + configurable: true + }); + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.PixiFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + PixiArmatureDisplay.prototype.advanceTimeBySelf = function (on) { + if (on) { + this._armature.clock = dragonBones.PixiFactory.clock; + } + else { + this._armature.clock = null; + } + }; + return PixiArmatureDisplay; + }(PIXI.Container)); + dragonBones.PixiArmatureDisplay = PixiArmatureDisplay; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Pixi 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var PixiSlot = (function (_super) { + __extends(PixiSlot, _super); + function PixiSlot() { + return _super !== null && _super.apply(this, arguments) || this; + } + PixiSlot.toString = function () { + return "[class dragonBones.PixiSlot]"; + }; + /** + * @private + */ + PixiSlot.prototype._onClear = function () { + _super.prototype._onClear.call(this); + this._updateTransform = PIXI.VERSION[0] === "3" ? this._updateTransformV3 : this._updateTransformV4; + this._renderDisplay = null; + }; + /** + * @private + */ + PixiSlot.prototype._initDisplay = function (value) { + value; + }; + /** + * @private + */ + PixiSlot.prototype._disposeDisplay = function (value) { + value.destroy(); + }; + /** + * @private + */ + PixiSlot.prototype._onUpdateDisplay = function () { + this._renderDisplay = (this._display ? this._display : this._rawDisplay); + }; + /** + * @private + */ + PixiSlot.prototype._addDisplay = function () { + var container = this._armature.display; + container.addChild(this._renderDisplay); + }; + /** + * @private + */ + PixiSlot.prototype._replaceDisplay = function (value) { + var container = this._armature.display; + var prevDisplay = value; + container.addChild(this._renderDisplay); + container.swapChildren(this._renderDisplay, prevDisplay); + container.removeChild(prevDisplay); + }; + /** + * @private + */ + PixiSlot.prototype._removeDisplay = function () { + this._renderDisplay.parent.removeChild(this._renderDisplay); + }; + /** + * @private + */ + PixiSlot.prototype._updateZOrder = function () { + var container = this._armature.display; + var index = container.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + container.addChildAt(this._renderDisplay, this._zOrder); + }; + /** + * @internal + * @private + */ + PixiSlot.prototype._updateVisible = function () { + this._renderDisplay.visible = this._parent.visible; + }; + /** + * @private + */ + PixiSlot.prototype._updateBlendMode = function () { + switch (this._blendMode) { + case 0 /* Normal */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.NORMAL; + break; + case 1 /* Add */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.ADD; + break; + case 3 /* Darken */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.DARKEN; + break; + case 4 /* Difference */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.DIFFERENCE; + break; + case 6 /* HardLight */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.HARD_LIGHT; + break; + case 9 /* Lighten */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.LIGHTEN; + break; + case 10 /* Multiply */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.MULTIPLY; + break; + case 11 /* Overlay */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.OVERLAY; + break; + case 12 /* Screen */: + this._renderDisplay.blendMode = PIXI.BLEND_MODES.SCREEN; + break; + default: + break; + } + }; + /** + * @private + */ + PixiSlot.prototype._updateColor = function () { + this._renderDisplay.alpha = this._colorTransform.alphaMultiplier; + // TODO + }; + /** + * @private + */ + PixiSlot.prototype._updateFrame = function () { + var meshData = this._display === this._meshDisplay ? this._meshData : null; + var currentTextureData = this._textureData; + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + var currentTextureAtlasData = currentTextureData.parent; + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.PixiTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData; + } + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name); + } + var renderTexture = currentTextureData.renderTexture; + if (renderTexture !== null) { + var currentTextureAtlas = currentTextureData.renderTexture; + if (meshData !== null) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var triangleCount = intArray[meshData.offset + 1 /* MeshTriangleCount */]; + var verticesOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + var uvOffset = verticesOffset + vertexCount * 2; + var meshDisplay = this._renderDisplay; + var textureAtlasWidth = currentTextureAtlasData.width > 0.0 ? currentTextureAtlasData.width : currentTextureAtlas.width; + var textureAtlasHeight = currentTextureAtlasData.height > 0.0 ? currentTextureAtlasData.height : currentTextureAtlas.height; + meshDisplay.vertices = new Float32Array(vertexCount * 2); + meshDisplay.uvs = new Float32Array(vertexCount * 2); + meshDisplay.indices = new Uint16Array(triangleCount * 3); + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshDisplay.vertices[i] = floatArray[verticesOffset + i]; + meshDisplay.uvs[i] = floatArray[uvOffset + i]; + } + for (var i = 0; i < triangleCount * 3; ++i) { + meshDisplay.indices[i] = intArray[meshData.offset + 4 /* MeshVertexIndices */ + i]; + } + for (var i = 0, l = meshDisplay.uvs.length; i < l; i += 2) { + var u = meshDisplay.uvs[i]; + var v = meshDisplay.uvs[i + 1]; + meshDisplay.uvs[i] = (currentTextureData.region.x + u * currentTextureData.region.width) / textureAtlasWidth; + meshDisplay.uvs[i + 1] = (currentTextureData.region.y + v * currentTextureData.region.height) / textureAtlasHeight; + } + meshDisplay.texture = renderTexture; + //meshDisplay.dirty = true; // Pixi 3.x + meshDisplay.dirty++; // Pixi 4.x Can not support change mesh vertice count. + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.texture = renderTexture; + } + this._updateVisible(); + return; + } + } + if (meshData !== null) { + var meshDisplay = this._renderDisplay; + meshDisplay.texture = null; + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + meshDisplay.visible = false; + } + else { + var normalDisplay = this._renderDisplay; + normalDisplay.texture = null; + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + normalDisplay.visible = false; + } + }; + /** + * @private + */ + PixiSlot.prototype._updateMesh = function () { + var hasFFD = this._ffdVertices.length > 0; + var meshData = this._meshData; + var weight = meshData.weight; + var meshDisplay = this._renderDisplay; + if (weight !== null) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var weightFloatOffset = intArray[weight.offset + 1 /* WeigthFloatOffset */]; + for (var i = 0, iD = 0, iB = weight.offset + 2 /* WeigthBoneIndices */ + weight.bones.length, iV = weightFloatOffset, iF = 0; i < vertexCount; ++i) { + var boneCount = intArray[iB++]; + var xG = 0.0, yG = 0.0; + for (var j = 0; j < boneCount; ++j) { + var boneIndex = intArray[iB++]; + var bone = this._meshBones[boneIndex]; + if (bone !== null) { + var matrix = bone.globalTransformMatrix; + var weight_1 = floatArray[iV++]; + var xL = floatArray[iV++]; + var yL = floatArray[iV++]; + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight_1; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight_1; + } + } + meshDisplay.vertices[iD++] = xG; + meshDisplay.vertices[iD++] = yG; + } + } + else if (hasFFD) { + var data = meshData.parent.parent; + var intArray = data.intArray; + var floatArray = data.floatArray; + var vertexCount = intArray[meshData.offset + 0 /* MeshVertexCount */]; + var vertexOffset = intArray[meshData.offset + 2 /* MeshFloatOffset */]; + for (var i = 0, l = vertexCount * 2; i < l; ++i) { + meshDisplay.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + } + }; + /** + * @private + */ + PixiSlot.prototype._updateTransform = function (isSkinnedMesh) { + isSkinnedMesh; + throw new Error(); + }; + /** + * @private + */ + PixiSlot.prototype._updateTransformV3 = function (isSkinnedMesh) { + if (isSkinnedMesh) { + this._renderDisplay.setTransform(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0); + } + else { + this.updateGlobalTransform(); // Update transform. + var transform = this.global; + var x = transform.x - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + var y = transform.y - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + if (this._renderDisplay === this._rawDisplay || this._renderDisplay === this._meshDisplay) { + this._renderDisplay.setTransform(x, y, transform.scaleX, transform.scaleY, transform.rotation, transform.skew, 0.0); + } + else { + this._renderDisplay.position.set(x, y); + this._renderDisplay.rotation = transform.rotation; + this._renderDisplay.skew.set(-transform.skew, 0.0); + this._renderDisplay.scale.set(transform.scaleX, transform.scaleY); + } + } + }; + /** + * @private + */ + PixiSlot.prototype._updateTransformV4 = function (isSkinnedMesh) { + if (isSkinnedMesh) { + this._renderDisplay.setTransform(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0); + } + else { + this.updateGlobalTransform(); // Update transform. + var transform = this.global; + if (this._renderDisplay === this._rawDisplay || this._renderDisplay === this._meshDisplay) { + this._renderDisplay.setTransform(transform.x, transform.y, transform.scaleX, transform.scaleY, transform.rotation, -transform.skew, 0.0, this._pivotX, this._pivotY); + } + else { + var x = transform.x - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + var y = transform.y - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + this._renderDisplay.position.set(x, y); + this._renderDisplay.rotation = transform.rotation; + this._renderDisplay.skew.set(-transform.skew, 0.0); + this._renderDisplay.scale.set(transform.scaleX, transform.scaleY); + } + } + }; + return PixiSlot; + }(dragonBones.Slot)); + dragonBones.PixiSlot = PixiSlot; +})(dragonBones || (dragonBones = {})); +var dragonBones; +(function (dragonBones) { + /** + * Pixi 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + var PixiFactory = (function (_super) { + __extends(PixiFactory, _super); + /** + * @inheritDoc + */ + function PixiFactory(dataParser) { + if (dataParser === void 0) { dataParser = null; } + var _this = _super.call(this, dataParser) || this; + if (PixiFactory._dragonBonesInstance === null) { + var eventManager = new dragonBones.PixiArmatureDisplay(); + PixiFactory._dragonBonesInstance = new dragonBones.DragonBones(eventManager); + PIXI.ticker.shared.add(PixiFactory._clockHandler, PixiFactory); + } + _this._dragonBones = PixiFactory._dragonBonesInstance; + return _this; + } + PixiFactory._clockHandler = function (passedTime) { + // PixiFactory._dragonBonesInstance.advanceTime(PIXI.ticker.shared.elapsedMS * passedTime * 0.001); + passedTime; + PixiFactory._dragonBonesInstance.advanceTime(-1); + }; + Object.defineProperty(PixiFactory, "clock", { + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + get: function () { + return PixiFactory._dragonBonesInstance.clock; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(PixiFactory, "factory", { + /** + * @language zh_CN + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + */ + get: function () { + if (PixiFactory._factory === null) { + PixiFactory._factory = new PixiFactory(); + } + return PixiFactory._factory; + }, + enumerable: true, + configurable: true + }); + /** + * @private + */ + PixiFactory.prototype._buildTextureAtlasData = function (textureAtlasData, textureAtlas) { + if (textureAtlasData) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = dragonBones.BaseObject.borrowObject(dragonBones.PixiTextureAtlasData); + } + return textureAtlasData; + }; + /** + * @private + */ + PixiFactory.prototype._buildArmature = function (dataPackage) { + var armature = dragonBones.BaseObject.borrowObject(dragonBones.Armature); + var armatureDisplay = new dragonBones.PixiArmatureDisplay(); + armature.init(dataPackage.armature, armatureDisplay, armatureDisplay, this._dragonBones); + return armature; + }; + /** + * @private + */ + PixiFactory.prototype._buildSlot = function (dataPackage, slotData, displays, armature) { + dataPackage; + armature; + var slot = dragonBones.BaseObject.borrowObject(dragonBones.PixiSlot); + slot.init(slotData, displays, new PIXI.Sprite(), new PIXI.mesh.Mesh(null, null, null, null, PIXI.mesh.Mesh.DRAW_MODES.TRIANGLES)); + return slot; + }; + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + PixiFactory.prototype.buildArmatureDisplay = function (armatureName, dragonBonesName, skinName, textureAtlasName) { + if (dragonBonesName === void 0) { dragonBonesName = null; } + if (skinName === void 0) { skinName = null; } + if (textureAtlasName === void 0) { textureAtlasName = null; } + var armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + return armature.display; + } + return null; + }; + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + PixiFactory.prototype.getTextureDisplay = function (textureName, textureAtlasName) { + if (textureAtlasName === void 0) { textureAtlasName = null; } + var textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName); + if (textureData !== null && textureData.renderTexture !== null) { + return new PIXI.Sprite(textureData.renderTexture); + } + return null; + }; + Object.defineProperty(PixiFactory.prototype, "soundEventManager", { + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + get: function () { + return this._dragonBones.eventManager; + }, + enumerable: true, + configurable: true + }); + PixiFactory._dragonBonesInstance = null; + PixiFactory._factory = null; + return PixiFactory; + }(dragonBones.BaseFactory)); + dragonBones.PixiFactory = PixiFactory; +})(dragonBones || (dragonBones = {})); +//# sourceMappingURL=dragonBones.js.map \ No newline at end of file diff --git a/reference/Pixi/4.x/out/dragonBones.min.js b/reference/Pixi/4.x/out/dragonBones.min.js new file mode 100644 index 0000000..738078e --- /dev/null +++ b/reference/Pixi/4.x/out/dragonBones.min.js @@ -0,0 +1 @@ +"use strict";var __extends=this&&this.__extends||function(){var t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var i in e)if(e.hasOwnProperty(i))t[i]=e[i]};return function(e,i){t(e,i);function a(){this.constructor=e}e.prototype=i===null?Object.create(i):(a.prototype=i.prototype,new a)}}();var dragonBones;(function(t){var e=function(){function e(e){this._clock=new t.WorldClock;this._events=[];this._objects=[];this._eventManager=null;this._eventManager=e}e.prototype.advanceTime=function(e){if(this._objects.length>0){for(var i=0,a=this._objects;i0){for(var n=0;ni){r.length=i}t._maxCountMap[a]=i}else{t._defaultMaxCount=i;for(var a in t._poolsMap){if(a in t._maxCountMap){continue}var r=t._poolsMap[a];if(r.length>i){r.length=i}t._maxCountMap[a]=i}}};t.clearPool=function(e){if(e===void 0){e=null}if(e!==null){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){a.length=0}}else{for(var r in t._poolsMap){var a=t._poolsMap[r];a.length=0}}};t.borrowObject=function(e){var i=String(e);var a=i in t._poolsMap?t._poolsMap[i]:null;if(a!==null&&a.length>0){var r=a.pop();r._isInPool=false;return r}var n=new e;n._onClear();return n};t.prototype.returnToPool=function(){this._onClear();t._returnObject(this)};t._hashCode=0;t._defaultMaxCount=1e3;t._maxCountMap={};t._poolsMap={};return t}();t.BaseObject=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=1}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}this.a=t;this.b=e;this.c=i;this.d=a;this.tx=r;this.ty=n}t.prototype.toString=function(){return"[object dragonBones.Matrix] a:"+this.a+" b:"+this.b+" c:"+this.c+" d:"+this.d+" tx:"+this.tx+" ty:"+this.ty};t.prototype.copyFrom=function(t){this.a=t.a;this.b=t.b;this.c=t.c;this.d=t.d;this.tx=t.tx;this.ty=t.ty;return this};t.prototype.copyFromArray=function(t,e){if(e===void 0){e=0}this.a=t[e];this.b=t[e+1];this.c=t[e+2];this.d=t[e+3];this.tx=t[e+4];this.ty=t[e+5];return this};t.prototype.identity=function(){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this};t.prototype.concat=function(t){var e=this.a*t.a;var i=0;var a=0;var r=this.d*t.d;var n=this.tx*t.a+t.tx;var s=this.ty*t.d+t.ty;if(this.b!==0||this.c!==0){e+=this.b*t.c;i+=this.b*t.d;a+=this.c*t.a;r+=this.c*t.b}if(t.b!==0||t.c!==0){i+=this.a*t.b;a+=this.d*t.c;n+=this.ty*t.c;s+=this.tx*t.b}this.a=e;this.b=i;this.c=a;this.d=r;this.tx=n;this.ty=s;return this};t.prototype.invert=function(){var t=this.a;var e=this.b;var i=this.c;var a=this.d;var r=this.tx;var n=this.ty;if(e===0&&i===0){this.b=this.c=0;if(t===0||a===0){this.a=this.b=this.tx=this.ty=0}else{t=this.a=1/t;a=this.d=1/a;this.tx=-t*r;this.ty=-a*n}return this}var s=t*a-e*i;if(s===0){this.a=this.d=1;this.b=this.c=0;this.tx=this.ty=0;return this}s=1/s;var o=this.a=a*s;e=this.b=-e*s;i=this.c=-i*s;a=this.d=t*s;this.tx=-(o*r+i*n);this.ty=-(e*r+a*n);return this};t.prototype.transformPoint=function(t,e,i,a){if(a===void 0){a=false}i.x=this.a*t+this.c*e;i.y=this.b*t+this.d*e;if(!a){i.x+=this.tx;i.y+=this.ty}};return t}();t.Matrix=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}if(r===void 0){r=1}if(n===void 0){n=1}this.x=t;this.y=e;this.skew=i;this.rotation=a;this.scaleX=r;this.scaleY=n}t.normalizeRadian=function(t){t=(t+Math.PI)%(Math.PI*2);t+=t>0?-Math.PI:Math.PI;return t};t.prototype.toString=function(){return"[object dragonBones.Transform] x:"+this.x+" y:"+this.y+" skewX:"+this.skew*180/Math.PI+" skewY:"+this.rotation*180/Math.PI+" scaleX:"+this.scaleX+" scaleY:"+this.scaleY};t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.skew=t.skew;this.rotation=t.rotation;this.scaleX=t.scaleX;this.scaleY=t.scaleY;return this};t.prototype.identity=function(){this.x=this.y=0;this.skew=this.rotation=0;this.scaleX=this.scaleY=1;return this};t.prototype.add=function(t){this.x+=t.x;this.y+=t.y;this.skew+=t.skew;this.rotation+=t.rotation;this.scaleX*=t.scaleX;this.scaleY*=t.scaleY;return this};t.prototype.minus=function(t){this.x-=t.x;this.y-=t.y;this.skew-=t.skew;this.rotation-=t.rotation;this.scaleX/=t.scaleX;this.scaleY/=t.scaleY;return this};t.prototype.fromMatrix=function(e){var i=this.scaleX,a=this.scaleY;var r=t.PI_Q;this.x=e.tx;this.y=e.ty;this.rotation=Math.atan(e.b/e.a);var n=Math.atan(-e.c/e.d);this.scaleX=this.rotation>-r&&this.rotation-r&&n=0&&this.scaleX<0){this.scaleX=-this.scaleX;this.rotation=this.rotation-Math.PI}if(a>=0&&this.scaleY<0){this.scaleY=-this.scaleY;n=n-Math.PI}this.skew=n-this.rotation;return this};t.prototype.toMatrix=function(t){if(this.skew!==0||this.rotation!==0){t.a=Math.cos(this.rotation);t.b=Math.sin(this.rotation);if(this.skew===0){t.c=-t.b;t.d=t.a}else{t.c=-Math.sin(this.skew+this.rotation);t.d=Math.cos(this.skew+this.rotation)}if(this.scaleX!==1){t.a*=this.scaleX;t.b*=this.scaleX}if(this.scaleY!==1){t.c*=this.scaleY;t.d*=this.scaleY}}else{t.a=this.scaleX;t.b=0;t.c=0;t.d=this.scaleY}t.tx=this.x;t.ty=this.y;return this};t.PI_D=Math.PI*2;t.PI_H=Math.PI/2;t.PI_Q=Math.PI/4;t.RAD_DEG=180/Math.PI;t.DEG_RAD=Math.PI/180;return t}();t.Transform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a,r,n,s,o){if(t===void 0){t=1}if(e===void 0){e=1}if(i===void 0){i=1}if(a===void 0){a=1}if(r===void 0){r=0}if(n===void 0){n=0}if(s===void 0){s=0}if(o===void 0){o=0}this.alphaMultiplier=t;this.redMultiplier=e;this.greenMultiplier=i;this.blueMultiplier=a;this.alphaOffset=r;this.redOffset=n;this.greenOffset=s;this.blueOffset=o}t.prototype.copyFrom=function(t){this.alphaMultiplier=t.alphaMultiplier;this.redMultiplier=t.redMultiplier;this.greenMultiplier=t.greenMultiplier;this.blueMultiplier=t.blueMultiplier;this.alphaOffset=t.alphaOffset;this.redOffset=t.redOffset;this.greenOffset=t.greenOffset;this.blueOffset=t.blueOffset};t.prototype.identity=function(){this.alphaMultiplier=this.redMultiplier=this.greenMultiplier=this.blueMultiplier=1;this.alphaOffset=this.redOffset=this.greenOffset=this.blueOffset=0};return t}();t.ColorTransform=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e){if(t===void 0){t=0}if(e===void 0){e=0}this.x=t;this.y=e}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y};t.prototype.clear=function(){this.x=this.y=0};return t}();t.Point=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(){function t(t,e,i,a){if(t===void 0){t=0}if(e===void 0){e=0}if(i===void 0){i=0}if(a===void 0){a=0}this.x=t;this.y=e;this.width=i;this.height=a}t.prototype.copyFrom=function(t){this.x=t.x;this.y=t.y;this.width=t.width;this.height=t.height};t.prototype.clear=function(){this.x=this.y=0;this.width=this.height=0};return t}();t.Rectangle=e})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.ints=[];e.floats=[];e.strings=[];return e}e.toString=function(){return"[class dragonBones.UserData]"};e.prototype._onClear=function(){this.ints.length=0;this.floats.length=0;this.strings.length=0};e.prototype.getInt=function(t){if(t===void 0){t=0}return t>=0&&t=0&&t=0&&t=t){i=0}if(this.sortedBones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s0){return}this.cacheFrameRate=t;for(var e in this.animations){this.animations[e].cacheFrames(this.cacheFrameRate)}};i.prototype.setCacheFrame=function(t,e){var i=this.parent.cachedFrames;var a=i.length;i.length+=10;i[a]=t.a;i[a+1]=t.b;i[a+2]=t.c;i[a+3]=t.d;i[a+4]=t.tx;i[a+5]=t.ty;i[a+6]=e.rotation;i[a+7]=e.skew;i[a+8]=e.scaleX;i[a+9]=e.scaleY;return a};i.prototype.getCacheFrame=function(t,e,i){var a=this.parent.cachedFrames;t.a=a[i];t.b=a[i+1];t.c=a[i+2];t.d=a[i+3];t.tx=a[i+4];t.ty=a[i+5];e.rotation=a[i+6];e.skew=a[i+7];e.scaleX=a[i+8];e.scaleY=a[i+9];e.x=t.tx;e.y=t.ty};i.prototype.addBone=function(t){if(t.name in this.bones){console.warn("Replace bone: "+t.name);this.bones[t.name].returnToPool()}this.bones[t.name]=t;this.sortedBones.push(t)};i.prototype.addSlot=function(t){if(t.name in this.slots){console.warn("Replace slot: "+t.name);this.slots[t.name].returnToPool()}this.slots[t.name]=t;this.sortedSlots.push(t)};i.prototype.addSkin=function(t){if(t.name in this.skins){console.warn("Replace skin: "+t.name);this.skins[t.name].returnToPool()}this.skins[t.name]=t;if(this.defaultSkin===null){this.defaultSkin=t}};i.prototype.addAnimation=function(t){if(t.name in this.animations){console.warn("Replace animation: "+t.name);this.animations[t.name].returnToPool()}t.parent=this;this.animations[t.name]=t;this.animationNames.push(t.name);if(this.defaultAnimation===null){this.defaultAnimation=t}};i.prototype.getBone=function(t){return t in this.bones?this.bones[t]:null};i.prototype.getSlot=function(t){return t in this.slots?this.slots[t]:null};i.prototype.getSkin=function(t){return t in this.skins?this.skins[t]:null};i.prototype.getAnimation=function(t){return t in this.animations?this.animations[t]:null};return i}(t.BaseObject);t.ArmatureData=i;var a=function(e){__extends(i,e);function i(){var i=e!==null&&e.apply(this,arguments)||this;i.transform=new t.Transform;i.constraints=[];i.userData=null;return i}i.toString=function(){return"[class dragonBones.BoneData]"};i.prototype._onClear=function(){for(var t=0,e=this.constraints;tr){s|=2}if(en){s|=8}return s};e.rectangleIntersectsSegment=function(t,i,a,r,n,s,o,l,h,u,f){if(h===void 0){h=null}if(u===void 0){u=null}if(f===void 0){f=null}var _=t>n&&ts&&in&&as&&r=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){return true}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=this.width*.5;var h=this.height*.5;var u=e.rectangleIntersectsSegment(t,i,a,r,-l,-h,l,h,n,s,o);return u};return e}(e);t.RectangleBoundingBoxData=i;var a=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.EllipseData]"};e.ellipseIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h,u){if(l===void 0){l=null}if(h===void 0){h=null}if(u===void 0){u=null}var f=s/o;var _=f*f;e*=f;a*=f;var m=i-t;var p=a-e;var c=Math.sqrt(m*m+p*p);var d=m/c;var y=p/c;var g=(r-t)*d+(n-e)*y;var v=g*g;var b=t*t+e*e;var D=s*s;var T=D-b+v;var A=0;if(T>=0){var O=Math.sqrt(T);var B=g-O;var x=g+O;var S=B<0?-1:B<=c?0:1;var M=x<0?-1:x<=c?0:1;var w=S*M;if(w<0){return-1}else if(w===0){if(S===-1){A=2;i=t+x*d;a=(e+x*y)/f;if(l!==null){l.x=i;l.y=a}if(h!==null){h.x=i;h.y=a}if(u!==null){u.x=Math.atan2(a/D*_,i/D);u.y=u.x+Math.PI}}else if(M===1){A=1;t=t+B*d;e=(e+B*y)/f;if(l!==null){l.x=t;l.y=e}if(h!==null){h.x=t;h.y=e}if(u!==null){u.x=Math.atan2(e/D*_,t/D);u.y=u.x+Math.PI}}else{A=3;if(l!==null){l.x=t+B*d;l.y=(e+B*y)/f;if(u!==null){u.x=Math.atan2(l.y/D*_,l.x/D)}}if(h!==null){h.x=t+x*d;h.y=(e+x*y)/f;if(u!==null){u.y=Math.atan2(h.y/D*_,h.x/D)}}}}}return A};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.type=1};e.prototype.containsPoint=function(t,e){var i=this.width*.5;if(t>=-i&&t<=i){var a=this.height*.5;if(e>=-a&&e<=a){e*=i/a;return Math.sqrt(t*t+e*e)<=i}}return false};e.prototype.intersectsSegment=function(t,i,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}var l=e.ellipseIntersectsSegment(t,i,a,r,0,0,this.width*.5,this.height*.5,n,s,o);return l};return e}(e);t.EllipseBoundingBoxData=a;var r=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e.weight=null;return e}e.toString=function(){return"[class dragonBones.PolygonBoundingBoxData]"};e.polygonIntersectsSegment=function(t,e,i,a,r,n,s,o,l,h){if(o===void 0){o=null}if(l===void 0){l=null}if(h===void 0){h=null}if(t===i){t=i+1e-6}if(e===a){e=a+1e-6}var u=t-i;var f=e-a;var _=t*a-e*i;var m=0;var p=r[n+s-2];var c=r[n+s-1];var d=0;var y=0;var g=0;var v=0;var b=0;var D=0;for(var T=0;T=p&&w<=A||w>=A&&w<=p)&&(u===0||w>=t&&w<=i||w>=i&&w<=t)){var E=(_*x-f*S)/M;if((E>=c&&E<=O||E>=O&&E<=c)&&(f===0||E>=e&&E<=a||E>=a&&E<=e)){if(l!==null){var P=w-t;if(P<0){P=-P}if(m===0){d=P;y=P;g=w;v=E;b=w;D=E;if(h!==null){h.x=Math.atan2(O-c,A-p)-Math.PI*.5;h.y=h.x}}else{if(Py){y=P;b=w;D=E;if(h!==null){h.y=Math.atan2(O-c,A-p)-Math.PI*.5}}}m++}else{g=w;v=E;b=w;D=E;m++;if(h!==null){h.x=Math.atan2(O-c,A-p)-Math.PI*.5;h.y=h.x}break}}}p=A;c=O}if(m===1){if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=g;l.y=v}if(h!==null){h.y=h.x+Math.PI}}else if(m>1){m++;if(o!==null){o.x=g;o.y=v}if(l!==null){l.x=b;l.y=D}}return m};e.prototype._onClear=function(){t.prototype._onClear.call(this);if(this.weight!==null){this.weight.returnToPool()}this.type=2;this.count=0;this.offset=0;this.x=0;this.y=0;this.vertices=null;this.weight=null};e.prototype.containsPoint=function(t,e){var i=false;if(t>=this.x&&t<=this.width&&e>=this.y&&e<=this.height){for(var a=0,r=this.count,n=r-2;a=e||s=e){var l=this.vertices[this.offset+n];var h=this.vertices[this.offset+a];if((e-o)*(l-h)/(s-o)+h0){return}this.cacheFrameRate=Math.max(Math.ceil(t*this.scale),1);var e=Math.ceil(this.cacheFrameRate*this.duration)+1;this.cachedFrames.length=e;for(var i=0,a=this.cacheFrames.length;i=0};e.prototype.addBoneMask=function(t,e,i){if(i===void 0){i=true}var a=t.getBone(e);if(a===null){return}if(this.boneMask.indexOf(e)<0){this.boneMask.push(e)}if(i){for(var r=0,n=t.getBones();r=0){this.boneMask.splice(a,1)}if(i){var r=t.getBone(e);if(r!==null){if(this.boneMask.length>0){for(var n=0,s=t.getBones();n=0&&r.contains(o)){this.boneMask.splice(l,1)}}}else{for(var h=0,u=t.getBones();he._zOrder?1:-1};i.prototype._onClear=function(){if(this._clock!==null){this._clock.remove(this)}for(var t=0,e=this._bones;t=t){i=0}if(this._bones.indexOf(r)>=0){continue}if(r.constraints.length>0){var n=false;for(var s=0,o=r.constraints;s=n){continue}var o=i[s];var l=this.getSlot(o.name);if(l!==null){l._setZorder(r)}}this._slotsDirty=true;this._zOrderDirty=!a}};i.prototype._addBoneToBoneList=function(t){if(this._bones.indexOf(t)<0){this._bonesDirty=true;this._bones.push(t);this._animation._timelineDirty=true}};i.prototype._removeBoneFromBoneList=function(t){var e=this._bones.indexOf(t);if(e>=0){this._bones.splice(e,1);this._animation._timelineDirty=true}};i.prototype._addSlotToSlotList=function(t){if(this._slots.indexOf(t)<0){this._slotsDirty=true;this._slots.push(t);this._animation._timelineDirty=true}};i.prototype._removeSlotFromSlotList=function(t){var e=this._slots.indexOf(t);if(e>=0){this._slots.splice(e,1);this._animation._timelineDirty=true}};i.prototype._bufferAction=function(t,e){if(this._actions.indexOf(t)<0){if(e){this._actions.push(t)}else{this._actions.unshift(t)}}};i.prototype.dispose=function(){if(this.armatureData!==null){this._lockUpdate=true;this._dragonBones.bufferObject(this)}};i.prototype.init=function(e,i,a,r){if(this.armatureData!==null){return}this.armatureData=e;this._animation=t.BaseObject.borrowObject(t.Animation);this._proxy=i;this._display=a;this._dragonBones=r;this._proxy.init(this);this._animation.init(this);this._animation.animations=this.armatureData.animations};i.prototype.advanceTime=function(e){if(this._lockUpdate){return}if(this.armatureData===null){console.assert(false,"The armature has been disposed.");return}else if(this.armatureData.parent===null){console.assert(false,"The armature data has been disposed.");return}var i=this._cacheFrameIndex;this._animation.advanceTime(e);if(this._bonesDirty){this._bonesDirty=false;this._sortBones()}if(this._slotsDirty){this._slotsDirty=false;this._sortSlots()}if(this._cacheFrameIndex<0||this._cacheFrameIndex!==i){var a=0,r=0;for(a=0,r=this._bones.length;a0){this._lockUpdate=true;for(var n=0,s=this._actions;n0){var i=this.getBone(t);if(i!==null){i.invalidUpdate();if(e){for(var a=0,r=this._slots;a0){if(r!==null||n!==null){if(r!==null){var T=o?r.y-e:r.x-t;if(T<0){T=-T}if(d===null||Th){h=T;_=n.x;m=n.y;y=b;if(s!==null){c=s.y}}}}else{d=b;break}}}if(d!==null&&r!==null){r.x=u;r.y=f;if(s!==null){s.x=p}}if(y!==null&&n!==null){n.x=_;n.y=m;if(s!==null){s.y=c}}return d};i.prototype.getBone=function(t){for(var e=0,i=this._bones;e=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else{if(this.constraints.length>0){for(var i=0,a=this.constraints;i=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}}else{if(this.constraints.length>0){for(var n=0,s=this.constraints;n=0;if(this._localDirty){this._updateGlobalTransformMatrix(o)}if(o&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}}else if(this._childrenTransformDirty){this._childrenTransformDirty=false}this._localDirty=true};i.prototype.updateByConstraint=function(){if(this._localDirty){this._localDirty=false;if(this._transformDirty||this._parent!==null&&this._parent._childrenTransformDirty){this._updateGlobalTransformMatrix(true)}this._transformDirty=true}};i.prototype.addConstraint=function(t){if(this.constraints.indexOf(t)<0){this.constraints.push(t)}};i.prototype.invalidUpdate=function(){this._transformDirty=true};i.prototype.contains=function(t){if(t===this){return false}var e=t;while(e!==this&&e!==null){e=e.parent}return e===this};i.prototype.getBones=function(){this._bones.length=0;for(var t=0,e=this._armature.getBones();t=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex=0&&this._displayIndex0){for(var o=0,l=n;o0){if(this._displayList.length!==e.length){this._displayList.length=e.length}for(var i=0,a=e.length;i0){this._displayList.length=0}if(this._displayIndex>=0&&this._displayIndex=0&&this._cachedFrameIndices!==null){var e=this._cachedFrameIndices[t];if(e>=0&&this._cachedFrameIndex===e){this._transformDirty=false}else if(e>=0){this._transformDirty=true;this._cachedFrameIndex=e}else if(this._transformDirty||this._parent._childrenTransformDirty){this._transformDirty=true;this._cachedFrameIndex=-1}else if(this._cachedFrameIndex>=0){this._transformDirty=false;this._cachedFrameIndices[t]=this._cachedFrameIndex}else{this._transformDirty=true;this._cachedFrameIndex=-1}}else if(this._transformDirty||this._parent._childrenTransformDirty){t=-1;this._transformDirty=true;this._cachedFrameIndex=-1}if(this._display===null){return}if(this._blendModeDirty){this._blendModeDirty=false;this._updateBlendMode()}if(this._colorDirty){this._colorDirty=false;this._updateColor()}if(this._meshData!==null&&this._display===this._meshDisplay){var i=this._meshData.weight!==null;if(this._meshDirty||i&&this._isMeshBonesUpdate()){this._meshDirty=false;this._updateMesh()}if(i){if(this._transformDirty){this._transformDirty=false;this._updateTransform(true)}return}}if(this._transformDirty){this._transformDirty=false;if(this._cachedFrameIndex<0){var a=t>=0;this._updateGlobalTransformMatrix(a);if(a&&this._cachedFrameIndices!==null){this._cachedFrameIndex=this._cachedFrameIndices[t]=this._armature.armatureData.setCacheFrame(this.globalTransformMatrix,this.global)}}else{this._armature.armatureData.getCacheFrame(this.globalTransformMatrix,this.global,this._cachedFrameIndex)}this._updateTransform(false)}};i.prototype.updateTransformAndMatrix=function(){if(this._transformDirty){this._transformDirty=false;this._updateGlobalTransformMatrix(false)}};i.prototype.containsPoint=function(t,e){if(this._boundingBoxData===null){return false}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);return this._boundingBoxData.containsPoint(i._helpPoint.x,i._helpPoint.y)};i.prototype.intersectsSegment=function(t,e,a,r,n,s,o){if(n===void 0){n=null}if(s===void 0){s=null}if(o===void 0){o=null}if(this._boundingBoxData===null){return 0}this.updateTransformAndMatrix();i._helpMatrix.copyFrom(this.globalTransformMatrix);i._helpMatrix.invert();i._helpMatrix.transformPoint(t,e,i._helpPoint);t=i._helpPoint.x;e=i._helpPoint.y;i._helpMatrix.transformPoint(a,r,i._helpPoint);a=i._helpPoint.x;r=i._helpPoint.y;var l=this._boundingBoxData.intersectsSegment(t,e,a,r,n,s,o);if(l>0){if(l===1||l===2){if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n);if(s!==null){s.x=n.x;s.y=n.y}}else if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}else{if(n!==null){this.globalTransformMatrix.transformPoint(n.x,n.y,n)}if(s!==null){this.globalTransformMatrix.transformPoint(s.x,s.y,s)}}if(o!==null){this.globalTransformMatrix.transformPoint(Math.cos(o.x),Math.sin(o.x),i._helpPoint,true);o.x=Math.atan2(i._helpPoint.y,i._helpPoint.x);this.globalTransformMatrix.transformPoint(Math.cos(o.y),Math.sin(o.y),i._helpPoint,true);o.y=Math.atan2(i._helpPoint.y,i._helpPoint.x)}}return l};i.prototype.invalidUpdate=function(){this._displayDirty=true;this._transformDirty=true};Object.defineProperty(i.prototype,"displayIndex",{get:function(){return this._displayIndex},set:function(t){if(this._setDisplayIndex(t)){this.update(-1)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"displayList",{get:function(){return this._displayList.concat()},set:function(e){var i=this._displayList.concat();var a=new Array;if(this._setDisplayList(e)){this.update(-1)}for(var r=0,n=i;r0){this._animatebles[e-i]=r;this._animatebles[e]=null}r.advanceTime(t)}else{i++}}if(i>0){a=this._animatebles.length;for(;e=0};t.prototype.add=function(t){if(this._animatebles.indexOf(t)<0){this._animatebles.push(t);t.clock=this}};t.prototype.remove=function(t){var e=this._animatebles.indexOf(t);if(e>=0){this._animatebles[e]=null;t.clock=null}};t.prototype.clear=function(){for(var t=0,e=this._animatebles;t0&&i._subFadeState>0){this._armature._dragonBones.bufferObject(i);this._animationStates.length=0;this._lastAnimationState=null}else{var a=i.animationData;var r=a.cacheFrameRate;if(this._animationDirty&&r>0){this._animationDirty=false;for(var n=0,s=this._armature.getBones();n1){for(var f=0,_=0;f0&&i._subFadeState>0){_++;this._armature._dragonBones.bufferObject(i);this._animationDirty=true;if(this._lastAnimationState===i){this._lastAnimationState=null}}else{if(_>0){this._animationStates[f-_]=i}if(this._timelineDirty){i.updateTimelines()}i.advanceTime(t,0)}if(f===e-1&&_>0){this._animationStates.length-=_;if(this._lastAnimationState===null&&this._animationStates.length>0){this._lastAnimationState=this._animationStates[this._animationStates.length-1]}}}this._armature._cacheFrameIndex=-1}else{this._armature._cacheFrameIndex=-1}this._timelineDirty=false};i.prototype.reset=function(){for(var t=0,e=this._animationStates;t1){if(e.position<0){e.position%=a.duration;e.position=a.duration-e.position}else if(e.position===a.duration){e.position-=1e-6}else if(e.position>a.duration){e.position%=a.duration}if(e.duration>0&&e.position+e.duration>a.duration){e.duration=a.duration-e.position}if(e.playTimes<0){e.playTimes=a.playTimes}}else{e.playTimes=1;e.position=0;if(e.duration>0){e.duration=0}}if(e.duration===0){e.duration=-1}this._fadeOut(e);var o=t.BaseObject.borrowObject(t.AnimationState);o.init(this._armature,a,e);this._animationDirty=true;this._armature._cacheFrameIndex=-1;if(this._animationStates.length>0){var l=false;for(var h=0,u=this._animationStates.length;h=this._animationStates[h].layer){}else{l=true;this._animationStates.splice(h+1,0,o);break}}if(!l){this._animationStates.push(o)}}else{this._animationStates.push(o)}for(var f=0,_=this._armature.getSlots();f<_.length;f++){var m=_[f];var p=m.childArmature;if(p!==null&&p.inheritAnimation&&p.animation.hasAnimation(i)&&p.animation.getState(i)===null){p.animation.fadeIn(i)}}if(e.fadeInTime<=0){this._armature.advanceTime(0)}this._lastAnimationState=o;return o};i.prototype.play=function(t,e){if(t===void 0){t=null}if(e===void 0){e=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t!==null?t:"";if(t!==null&&t.length>0){this.playConfig(this._animationConfig)}else if(this._lastAnimationState===null){var i=this._armature.armatureData.defaultAnimation;if(i!==null){this._animationConfig.animation=i.name;this.playConfig(this._animationConfig)}}else if(!this._lastAnimationState.isPlaying&&!this._lastAnimationState.isCompleted){this._lastAnimationState.play()}else{this._animationConfig.animation=this._lastAnimationState.name;this.playConfig(this._animationConfig)}return this._lastAnimationState};i.prototype.fadeIn=function(t,e,i,a,r,n){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=0}if(r===void 0){r=null}if(n===void 0){n=3}this._animationConfig.clear();this._animationConfig.fadeOutMode=n;this._animationConfig.playTimes=i;this._animationConfig.layer=a;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=r!==null?r:"";return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByTime=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.position=e;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByFrame=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*e/a.frameCount}return this.playConfig(this._animationConfig)};i.prototype.gotoAndPlayByProgress=function(t,e,i){if(e===void 0){e=0}if(i===void 0){i=-1}this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.playTimes=i;this._animationConfig.fadeInTime=0;this._animationConfig.animation=t;var a=t in this._animations?this._animations[t]:null;if(a!==null){this._animationConfig.position=a.duration*(e>0?e:0)}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStopByTime=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByTime(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByFrame=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByFrame(t,e,1);if(i!==null){i.stop()}return i};i.prototype.gotoAndStopByProgress=function(t,e){if(e===void 0){e=0}var i=this.gotoAndPlayByProgress(t,e,1);if(i!==null){i.stop()}return i};i.prototype.getState=function(t){var e=this._animationStates.length;while(e--){var i=this._animationStates[e];if(i.name===t){return i}}return null};i.prototype.hasAnimation=function(t){return t in this._animations};i.prototype.getStates=function(){return this._animationStates};Object.defineProperty(i.prototype,"isPlaying",{get:function(){for(var t=0,e=this._animationStates;t0},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationName",{get:function(){return this._lastAnimationState!==null?this._lastAnimationState.name:""},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationNames",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animations",{get:function(){return this._animations},set:function(t){if(this._animations===t){return}this._animationNames.length=0;for(var e in this._animations){delete this._animations[e]}for(var e in t){this._animations[e]=t[e];this._animationNames.push(e)}},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationConfig",{get:function(){this._animationConfig.clear();return this._animationConfig},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"lastAnimationState",{get:function(){return this._lastAnimationState},enumerable:true,configurable:true});i.prototype.gotoAndPlay=function(t,e,i,a,r,n,s,o,l){if(e===void 0){e=-1}if(i===void 0){i=-1}if(a===void 0){a=-1}if(r===void 0){r=0}if(n===void 0){n=null}if(s===void 0){s=3}if(o===void 0){o=true}if(l===void 0){l=true}o;l;this._animationConfig.clear();this._animationConfig.resetToPose=true;this._animationConfig.fadeOutMode=s;this._animationConfig.playTimes=a;this._animationConfig.layer=r;this._animationConfig.fadeInTime=e;this._animationConfig.animation=t;this._animationConfig.group=n!==null?n:"";var h=this._animations[t];if(h&&i>0){this._animationConfig.timeScale=h.duration/i}return this.playConfig(this._animationConfig)};i.prototype.gotoAndStop=function(t,e){if(e===void 0){e=0}return this.gotoAndStopByTime(t,e)};Object.defineProperty(i.prototype,"animationList",{get:function(){return this._animationNames},enumerable:true,configurable:true});Object.defineProperty(i.prototype,"animationDataList",{get:function(){var t=[];for(var e=0,i=this._animationNames.length;e0;if(this._subFadeState<0){this._subFadeState=0;var a=i?t.EventObject.FADE_OUT:t.EventObject.FADE_IN;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}if(e<0){e=-e}this._fadeTime+=e;if(this._fadeTime>=this.fadeTotalTime){this._subFadeState=1;this._fadeProgress=i?0:1}else if(this._fadeTime>0){this._fadeProgress=i?1-this._fadeTime/this.fadeTotalTime:this._fadeTime/this.fadeTotalTime}else{this._fadeProgress=i?1:0}if(this._subFadeState>0){if(!i){this._playheadState|=1;this._fadeState=0}var a=i?t.EventObject.FADE_OUT_COMPLETE:t.EventObject.FADE_IN_COMPLETE;if(this._armature.eventDispatcher.hasEvent(a)){var r=t.BaseObject.borrowObject(t.EventObject);r.type=a;r.armature=this._armature;r.animationState=this;this._armature._dragonBones.bufferEvent(r)}}};a.prototype._blendBoneTimline=function(t){var e=t.bone;var i=t.bonePose.result;var a=e.animationPose;var r=this._weightResult>0?this._weightResult:-this._weightResult;if(!e._blendDirty){e._blendDirty=true;e._blendLayer=this.layer;e._blendLayerWeight=r;e._blendLeftWeight=1;a.x=i.x*r;a.y=i.y*r;a.rotation=i.rotation*r;a.skew=i.skew*r;a.scaleX=(i.scaleX-1)*r+1;a.scaleY=(i.scaleY-1)*r+1}else{r*=e._blendLeftWeight;e._blendLayerWeight+=r;a.x+=i.x*r;a.y+=i.y*r;a.rotation+=i.rotation*r;a.skew+=i.skew*r;a.scaleX+=(i.scaleX-1)*r;a.scaleY+=(i.scaleY-1)*r}if(this._fadeState!==0||this._subFadeState!==0){e._transformDirty=true}};a.prototype.init=function(e,i,a){if(this._armature!==null){return}this._armature=e;this.animationData=i;this.resetToPose=a.resetToPose;this.additiveBlending=a.additiveBlending;this.displayControl=a.displayControl;this.actionEnabled=a.actionEnabled;this.layer=a.layer;this.playTimes=a.playTimes;this.timeScale=a.timeScale;this.fadeTotalTime=a.fadeInTime;this.autoFadeOutTime=a.autoFadeOutTime;this.weight=a.weight;this.name=a.name.length>0?a.name:a.animation;this.group=a.group;if(a.pauseFadeIn){this._playheadState=2}else{this._playheadState=3}if(a.duration<0){this._position=0;this._duration=this.animationData.duration;if(a.position!==0){if(this.timeScale>=0){this._time=a.position}else{this._time=a.position-this._duration}}else{this._time=0}}else{this._position=a.position;this._duration=a.duration;this._time=0}if(this.timeScale<0&&this._time===0){this._time=-1e-6}if(this.fadeTotalTime<=0){this._fadeProgress=.999999}if(a.boneMask.length>0){this._boneMask.length=a.boneMask.length;for(var r=0,n=this._boneMask.length;r0;var a=true;var r=true;var n=this._time;this._weightResult=this.weight*this._fadeProgress;this._actionTimeline.update(n);if(i){var s=e*2;this._actionTimeline.currentTime=Math.floor(this._actionTimeline.currentTime*s)/s}if(this._zOrderTimeline!==null){this._zOrderTimeline.update(n)}if(i){var o=Math.floor(this._actionTimeline.currentTime*e);if(this._armature._cacheFrameIndex===o){a=false;r=false}else{this._armature._cacheFrameIndex=o;if(this.animationData.cachedFrames[o]){r=false}else{this.animationData.cachedFrames[o]=true}}}if(a){if(r){var l=null;var h=null;for(var u=0,f=this._boneTimelines.length;u0){if(l._blendLayer!==this.layer){if(l._blendLayerWeight>=l._blendLeftWeight){l._blendLeftWeight=0;l=null}else{l._blendLayer=this.layer;l._blendLeftWeight-=l._blendLayerWeight;l._blendLayerWeight=0}}}else{l=null}}}l=_.bone}if(l!==null){_.update(n);if(u===f-1){this._blendBoneTimline(_)}else{h=_}}}}for(var u=0,f=this._slotTimelines.length;u0){this._subFadeState=0}if(this._actionTimeline.playState>0){if(this.autoFadeOutTime>=0){this.fadeOut(this.autoFadeOutTime)}}}};a.prototype.play=function(){this._playheadState=3};a.prototype.stop=function(){this._playheadState&=1};a.prototype.fadeOut=function(t,e){if(e===void 0){e=true}if(t<0){t=0}if(e){this._playheadState&=2}if(this._fadeState>0){if(t>this.fadeTotalTime-this._fadeTime){return}}else{this._fadeState=1;this._subFadeState=-1;if(t<=0||this._fadeProgress<=0){this._fadeProgress=1e-6}for(var i=0,a=this._boneTimelines;i1e-6?t/this._fadeProgress:0;this._fadeTime=this.fadeTotalTime*(1-this._fadeProgress)};a.prototype.containsBoneMask=function(t){return this._boneMask.length===0||this._boneMask.indexOf(t)>=0};a.prototype.addBoneMask=function(t,e){if(e===void 0){e=true}var i=this._armature.getBone(t);if(i===null){return}if(this._boneMask.indexOf(t)<0){this._boneMask.push(t)}if(e){for(var a=0,r=this._armature.getBones();a=0){this._boneMask.splice(i,1)}if(e){var a=this._armature.getBone(t);if(a!==null){var r=this._armature.getBones();if(this._boneMask.length>0){for(var n=0,s=r;n=0&&a.contains(o)){this._boneMask.splice(l,1)}}}else{for(var h=0,u=r;h0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isFadeComplete",{get:function(){return this._fadeState===0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isPlaying",{get:function(){return(this._playheadState&2)!==0&&this._actionTimeline.playState<=0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"isCompleted",{get:function(){return this._actionTimeline.playState>0},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentPlayTimes",{get:function(){return this._actionTimeline.currentPlayTimes},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"totalTime",{get:function(){return this._duration},enumerable:true,configurable:true});Object.defineProperty(a.prototype,"currentTime",{get:function(){return this._actionTimeline.currentTime},set:function(t){var e=this._actionTimeline.currentPlayTimes-(this._actionTimeline.playState>0?1:0);if(t<0||this._duration0&&e===this.playTimes-1&&t===this._duration){t=this._duration-1e-6}if(this._time===t){return}this._time=t;this._actionTimeline.setCurrentTime(this._time);if(this._zOrderTimeline!==null){this._zOrderTimeline.playState=-1}for(var i=0,a=this._boneTimelines;i=0?1:-1;this.currentPlayTimes=1;this.currentTime=this._actionTimeline.currentTime}else if(this._actionTimeline===null||this._timeScale!==1||this._timeOffset!==0){var r=this._animationState.playTimes;var n=r*this._duration;t*=this._timeScale;if(this._timeOffset!==0){t+=this._timeOffset*this._animationData.duration}if(r>0&&(t>=n||t<=-n)){if(this.playState<=0&&this._animationState._playheadState===3){this.playState=1}this.currentPlayTimes=r;if(t<0){this.currentTime=0}else{this.currentTime=this._duration}}else{if(this.playState!==0&&this._animationState._playheadState===3){this.playState=0}if(t<0){t=-t;this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=this._duration-t%this._duration}else{this.currentPlayTimes=Math.floor(t/this._duration);this.currentTime=t%this._duration}}this.currentTime+=this._position}else{this.playState=this._actionTimeline.playState;this.currentPlayTimes=this._actionTimeline.currentPlayTimes;this.currentTime=this._actionTimeline.currentTime}if(this.currentPlayTimes===i&&this.currentTime===a){return false}if(e<0&&this.playState!==e||this.playState<=0&&this.currentPlayTimes!==i){this._frameIndex=-1}return true};e.prototype.init=function(t,e,i){this._armature=t;this._animationState=e;this._timelineData=i;this._actionTimeline=this._animationState._actionTimeline;if(this===this._actionTimeline){this._actionTimeline=null}this._frameRate=this._armature.armatureData.frameRate;this._frameRateR=1/this._frameRate;this._position=this._animationState._position;this._duration=this._animationState._duration;this._dragonBonesData=this._armature.armatureData.parent;this._animationData=this._animationState.animationData;if(this._timelineData!==null){this._frameIntArray=this._dragonBonesData.frameIntArray;this._frameFloatArray=this._dragonBonesData.frameFloatArray;this._frameArray=this._dragonBonesData.frameArray;this._timelineArray=this._dragonBonesData.timelineArray;this._frameIndices=this._dragonBonesData.frameIndices;this._frameCount=this._timelineArray[this._timelineData.offset+2];this._frameValueOffset=this._timelineArray[this._timelineData.offset+4];this._timeScale=100/this._timelineArray[this._timelineData.offset+0];this._timeOffset=this._timelineArray[this._timelineData.offset+1]*.01}};e.prototype.fadeOut=function(){};e.prototype.update=function(t){if(this.playState<=0&&this._setCurrentTime(t)){if(this._frameCount>1){var e=Math.floor(this.currentTime*this._frameRate);var i=this._frameIndices[this._timelineData.frameIndicesOffset+e];if(this._frameIndex!==i){this._frameIndex=i;this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5+this._frameIndex];this._onArriveAtFrame()}}else if(this._frameIndex<0){this._frameIndex=0;if(this._timelineData!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[this._timelineData.offset+5]}this._onArriveAtFrame()}if(this._tweenState!==0){this._onUpdateFrame()}}};return e}(t.BaseObject);t.TimelineState=e;var i=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e._getEasingValue=function(t,e,i){var a=e;switch(t){case 3:a=Math.pow(e,2);break;case 4:a=1-Math.pow(1-e,2);break;case 5:a=.5*(1-Math.cos(e*Math.PI));break}return(a-e)*i+e};e._getEasingCurveValue=function(t,e,i,a){if(t<=0){return 0}else if(t>=1){return 1}var r=i+1;var n=Math.floor(t*r);var s=n===0?0:e[a+n-1];var o=n===r-1?1e4:e[a+n];return(s+(o-s)*(t*r-n))*1e-4};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._tweenType=0;this._curveCount=0;this._framePosition=0;this._frameDurationR=0;this._tweenProgress=0;this._tweenEasing=0};e.prototype._onArriveAtFrame=function(){if(this._frameCount>1&&(this._frameIndex!==this._frameCount-1||this._animationState.playTimes===0||this._animationState.currentPlayTimes0){if(n.hasEvent(t.EventObject.COMPLETE)){h=t.BaseObject.borrowObject(t.EventObject);h.type=t.EventObject.COMPLETE;h.armature=this._armature;h.animationState=this._animationState}}}if(this._frameCount>1){var u=this._timelineData;var f=Math.floor(this.currentTime*this._frameRate);var _=this._frameIndices[u.frameIndicesOffset+f];if(this._frameIndex!==_){var m=this._frameIndex;this._frameIndex=_;if(this._timelineArray!==null){this._frameOffset=this._animationData.frameOffset+this._timelineArray[u.offset+5+this._frameIndex];if(o){if(m<0){var p=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+p];if(this.currentPlayTimes===a){if(m===_){m=-1}}}while(m>=0){var c=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[c]/this._frameRate;if(this._position<=d&&d<=this._position+this._duration){this._onCrossFrame(m)}if(l!==null&&m===0){this._armature._dragonBones.bufferEvent(l);l=null}if(m>0){m--}else{m=this._frameCount-1}if(m===_){break}}}else{if(m<0){var p=Math.floor(r*this._frameRate);m=this._frameIndices[u.frameIndicesOffset+p];var c=this._animationData.frameOffset+this._timelineArray[u.offset+5+m];var d=this._frameArray[c]/this._frameRate;if(this.currentPlayTimes===a){if(r<=d){if(m>0){m--}else{m=this._frameCount-1}}else if(m===_){m=-1}}}while(m>=0){if(m=0){var t=this._frameArray[this._frameOffset+1];if(t>0){this._armature._sortZOrder(this._frameArray,this._frameOffset+2)}else{this._armature._sortZOrder(null,0)}}};e.prototype._onUpdateFrame=function(){};return e}(t.TimelineState);t.ZOrderTimelineState=i;var a=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.toString=function(){return"[class dragonBones.BoneAllTimelineState]"};i.prototype._onArriveAtFrame=function(){e.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var t=this._dragonBonesData.frameFloatArray;var i=this.bonePose.current;var a=this.bonePose.delta;var r=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*6;i.x=t[r++];i.y=t[r++];i.rotation=t[r++];i.skew=t[r++];i.scaleX=t[r++];i.scaleY=t[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}a.x=t[r++]-i.x;a.y=t[r++]-i.y;a.rotation=t[r++]-i.rotation;a.skew=t[r++]-i.skew;a.scaleX=t[r++]-i.scaleX;a.scaleY=t[r++]-i.scaleY}}else{var i=this.bonePose.current;i.x=0;i.y=0;i.rotation=0;i.skew=0;i.scaleX=1;i.scaleY=1}};i.prototype._onUpdateFrame=function(){e.prototype._onUpdateFrame.call(this);var t=this.bonePose.current;var i=this.bonePose.delta;var a=this.bonePose.result;this.bone._transformDirty=true;if(this._tweenState!==2){this._tweenState=0}var r=this._armature.armatureData.scale;a.x=(t.x+i.x*this._tweenProgress)*r;a.y=(t.y+i.y*this._tweenProgress)*r;a.rotation=t.rotation+i.rotation*this._tweenProgress;a.skew=t.skew+i.skew*this._tweenProgress;a.scaleX=t.scaleX+i.scaleX*this._tweenProgress;a.scaleY=t.scaleY+i.scaleY*this._tweenProgress};i.prototype.fadeOut=function(){var e=this.bonePose.result;e.rotation=t.Transform.normalizeRadian(e.rotation);e.skew=t.Transform.normalizeRadian(e.skew)};return i}(t.BoneTimelineState);t.BoneAllTimelineState=a;var r=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}e.toString=function(){return"[class dragonBones.SlotDislayIndexTimelineState]"};e.prototype._onArriveAtFrame=function(){if(this.playState>=0){var t=this._timelineData!==null?this._frameArray[this._frameOffset+1]:this.slot.slotData.displayIndex;if(this.slot.displayIndex!==t){this.slot._setDisplayIndex(t,true)}}};return e}(t.SlotTimelineState);t.SlotDislayIndexTimelineState=r;var n=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[0,0,0,0,0,0,0,0];e._delta=[0,0,0,0,0,0,0,0];e._result=[0,0,0,0,0,0,0,0];return e}e.toString=function(){return"[class dragonBones.SlotColorTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this._dirty=false};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._dragonBonesData.intArray;var i=this._dragonBonesData.frameIntArray;var a=this._animationData.frameIntOffset+this._frameValueOffset+this._frameIndex*1;var r=i[a];this._current[0]=e[r++];this._current[1]=e[r++];this._current[2]=e[r++];this._current[3]=e[r++];this._current[4]=e[r++];this._current[5]=e[r++];this._current[6]=e[r++];this._current[7]=e[r++];if(this._tweenState===2){if(this._frameIndex===this._frameCount-1){r=i[this._animationData.frameIntOffset+this._frameValueOffset]}else{r=i[a+1*1]}this._delta[0]=e[r++]-this._current[0];this._delta[1]=e[r++]-this._current[1];this._delta[2]=e[r++]-this._current[2];this._delta[3]=e[r++]-this._current[3];this._delta[4]=e[r++]-this._current[4];this._delta[5]=e[r++]-this._current[5];this._delta[6]=e[r++]-this._current[6];this._delta[7]=e[r++]-this._current[7]}}else{var n=this.slot.slotData.color;this._current[0]=n.alphaMultiplier*100;this._current[1]=n.redMultiplier*100;this._current[2]=n.greenMultiplier*100;this._current[3]=n.blueMultiplier*100;this._current[4]=n.alphaOffset;this._current[5]=n.redOffset;this._current[6]=n.greenOffset;this._current[7]=n.blueOffset}};e.prototype._onUpdateFrame=function(){t.prototype._onUpdateFrame.call(this);this._dirty=true;if(this._tweenState!==2){this._tweenState=0}this._result[0]=(this._current[0]+this._delta[0]*this._tweenProgress)*.01;this._result[1]=(this._current[1]+this._delta[1]*this._tweenProgress)*.01;this._result[2]=(this._current[2]+this._delta[2]*this._tweenProgress)*.01;this._result[3]=(this._current[3]+this._delta[3]*this._tweenProgress)*.01;this._result[4]=this._current[4]+this._delta[4]*this._tweenProgress;this._result[5]=this._current[5]+this._delta[5]*this._tweenProgress;this._result[6]=this._current[6]+this._delta[6]*this._tweenProgress;this._result[7]=this._current[7]+this._delta[7]*this._tweenProgress};e.prototype.fadeOut=function(){this._tweenState=0;this._dirty=false};e.prototype.update=function(e){t.prototype.update.call(this,e);if(this._tweenState!==0||this._dirty){var i=this.slot._colorTransform;if(this._animationState._fadeState!==0||this._animationState._subFadeState!==0){if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){var a=Math.pow(this._animationState._fadeProgress,4);i.alphaMultiplier+=(this._result[0]-i.alphaMultiplier)*a;i.redMultiplier+=(this._result[1]-i.redMultiplier)*a;i.greenMultiplier+=(this._result[2]-i.greenMultiplier)*a;i.blueMultiplier+=(this._result[3]-i.blueMultiplier)*a;i.alphaOffset+=(this._result[4]-i.alphaOffset)*a;i.redOffset+=(this._result[5]-i.redOffset)*a;i.greenOffset+=(this._result[6]-i.greenOffset)*a;i.blueOffset+=(this._result[7]-i.blueOffset)*a;this.slot._colorDirty=true}}else if(this._dirty){this._dirty=false;if(i.alphaMultiplier!==this._result[0]||i.redMultiplier!==this._result[1]||i.greenMultiplier!==this._result[2]||i.blueMultiplier!==this._result[3]||i.alphaOffset!==this._result[4]||i.redOffset!==this._result[5]||i.greenOffset!==this._result[6]||i.blueOffset!==this._result[7]){i.alphaMultiplier=this._result[0];i.redMultiplier=this._result[1];i.greenMultiplier=this._result[2];i.blueMultiplier=this._result[3];i.alphaOffset=this._result[4];i.redOffset=this._result[5];i.greenOffset=this._result[6];i.blueOffset=this._result[7];this.slot._colorDirty=true}}}};return e}(t.SlotTimelineState);t.SlotColorTimelineState=n;var s=function(t){__extends(e,t);function e(){var e=t!==null&&t.apply(this,arguments)||this;e._current=[];e._delta=[];e._result=[];return e}e.toString=function(){return"[class dragonBones.SlotFFDTimelineState]"};e.prototype._onClear=function(){t.prototype._onClear.call(this);this.meshOffset=0;this._dirty=false;this._frameFloatOffset=0;this._valueCount=0;this._ffdCount=0;this._valueOffset=0;this._current.length=0;this._delta.length=0;this._result.length=0};e.prototype._onArriveAtFrame=function(){t.prototype._onArriveAtFrame.call(this);if(this._timelineData!==null){var e=this._tweenState===2;var i=this._dragonBonesData.frameFloatArray;var a=this._animationData.frameFloatOffset+this._frameValueOffset+this._frameIndex*this._valueCount;if(e){var r=a+this._valueCount;if(this._frameIndex===this._frameCount-1){r=this._animationData.frameFloatOffset+this._frameValueOffset}for(var n=0;n255){return encodeURI(r)}}}return r}return String(r)}return a};a.prototype._getCurvePoint=function(t,e,i,a,r,n,s,o,l,h){var u=1-l;var f=u*u;var _=l*l;var m=u*f;var p=3*l*f;var c=3*u*_;var d=l*_;h.x=m*t+p*i+c*r+d*s;h.y=m*e+p*a+c*n+d*o};a.prototype._samplingEasingCurve=function(t,e){var i=t.length;var a=-2;for(var r=0,n=e.length;r=0&&a+61e-4){var g=(y+d)*.5;this._getCurvePoint(l,h,u,f,_,m,p,c,g,this._helpPoint);if(s-this._helpPoint.x>0){d=g}else{y=g}}e[r]=this._helpPoint.y}};a.prototype._sortActionFrame=function(t,e){return t.frameStart>e.frameStart?1:-1};a.prototype._parseActionDataInFrame=function(t,e,i,r){if(a.EVENT in t){this._mergeActionFrame(t[a.EVENT],e,10,i,r)}if(a.SOUND in t){this._mergeActionFrame(t[a.SOUND],e,11,i,r)}if(a.ACTION in t){this._mergeActionFrame(t[a.ACTION],e,0,i,r)}if(a.EVENTS in t){this._mergeActionFrame(t[a.EVENTS],e,10,i,r)}if(a.ACTIONS in t){this._mergeActionFrame(t[a.ACTIONS],e,0,i,r)}};a.prototype._mergeActionFrame=function(e,a,r,n,s){var o=t.DragonBones.webAssembly?this._armature.actions.size():this._armature.actions.length;var l=this._parseActionData(e,this._armature.actions,r,n,s);var h=null;if(this._actionFrames.length===0){h=new i;h.frameStart=0;this._actionFrames.push(h);h=null}for(var u=0,f=this._actionFrames;u0){var p=r.getBone(_);if(p!==null){m.parent=p}else{(this._cacheBones[_]=this._cacheBones[_]||[]).push(m)}}if(m.name in this._cacheBones){for(var c=0,d=this._cacheBones[m.name];c0){n.root=i.parent}if(t.DragonBones.webAssembly){i.constraints.push_back(n)}else{i.constraints.push(n)}};a.prototype._parseSlot=function(e){var i=t.DragonBones.webAssembly?new Module["SlotData"]:t.BaseObject.borrowObject(t.SlotData);i.displayIndex=a._getNumber(e,a.DISPLAY_INDEX,0);i.zOrder=t.DragonBones.webAssembly?this._armature.sortedSlots.size():this._armature.sortedSlots.length;i.name=a._getString(e,a.NAME,"");i.parent=this._armature.getBone(a._getString(e,a.PARENT,""));if(a.BLEND_MODE in e&&typeof e[a.BLEND_MODE]==="string"){i.blendMode=a._getBlendMode(e[a.BLEND_MODE])}else{i.blendMode=a._getNumber(e,a.BLEND_MODE,0)}if(a.COLOR in e){i.color=t.DragonBones.webAssembly?Module["SlotData"].createColor():t.SlotData.createColor();this._parseColorTransform(e[a.COLOR],i.color)}else{i.color=t.DragonBones.webAssembly?Module["SlotData"].DEFAULT_COLOR:t.SlotData.DEFAULT_COLOR}if(a.ACTIONS in e){var r=this._slotChildActions[i.name]=[];this._parseActionData(e[a.ACTIONS],r,0,null,null)}return i};a.prototype._parseSkin=function(e){var i=t.DragonBones.webAssembly?new Module["SkinData"]:t.BaseObject.borrowObject(t.SkinData);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length===0){i.name=a.DEFAULT_NAME}if(a.SLOT in e){this._skin=i;var r=e[a.SLOT];for(var n=0,s=r;n0?n:r;this._parsePivot(e,o);break;case 1:var l=i=t.DragonBones.webAssembly?new Module["ArmatureDisplayData"]:t.BaseObject.borrowObject(t.ArmatureDisplayData);l.name=r;l.path=n.length>0?n:r;l.inheritAnimation=true;if(a.ACTIONS in e){this._parseActionData(e[a.ACTIONS],l.actions,0,null,null)}else if(this._slot.name in this._slotChildActions){var h=this._skin.getDisplays(this._slot.name);if(h===null?this._slot.displayIndex===0:this._slot.displayIndex===h.length){for(var u=0,f=this._slotChildActions[this._slot.name];u0?n:r;m.inheritAnimation=a._getBoolean(e,a.INHERIT_FFD,true);this._parsePivot(e,m);var p=a._getString(e,a.SHARE,"");if(p.length>0){var c=this._meshs[p];m.offset=c.offset;m.weight=c.weight}else{this._parseMesh(e,m);this._meshs[m.name]=m}break;case 3:var d=this._parseBoundingBox(e);if(d!==null){var y=i=t.DragonBones.webAssembly?new Module["BoundingBoxDisplayData"]:t.BaseObject.borrowObject(t.BoundingBoxDisplayData);y.name=r;y.path=n.length>0?n:r;y.boundingBox=d}break}if(i!==null){i.parent=this._armature;if(a.TRANSFORM in e){this._parseTransform(e[a.TRANSFORM],i.transform,this._armature.scale)}}return i};a.prototype._parsePivot=function(t,e){if(a.PIVOT in t){var i=t[a.PIVOT];e.pivot.x=a._getNumber(i,a.X,0);e.pivot.y=a._getNumber(i,a.Y,0)}else{e.pivot.x=.5;e.pivot.y=.5}};a.prototype._parseMesh=function(e,i){var r=e[a.VERTICES];var n=e[a.UVS];var s=e[a.TRIANGLES];var o=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var l=t.DragonBones.webAssembly?this._floatArrayJson:this._data.floatArray;var h=Math.floor(r.length/2);var u=Math.floor(s.length/3);var f=l.length;var _=f+h*2;i.offset=o.length;o.length+=1+1+1+1+u*3;o[i.offset+0]=h;o[i.offset+1]=u;o[i.offset+2]=f;for(var m=0,p=u*3;mn.width){n.width=h}if(un.height){n.height=u}}}return n};a.prototype._parseAnimation=function(e){var i=t.DragonBones.webAssembly?new Module["AnimationData"]:t.BaseObject.borrowObject(t.AnimationData);i.frameCount=Math.max(a._getNumber(e,a.DURATION,1),1);i.playTimes=a._getNumber(e,a.PLAY_TIMES,1);i.duration=i.frameCount/this._armature.frameRate;i.fadeInTime=a._getNumber(e,a.FADE_IN_TIME,0);i.scale=a._getNumber(e,a.SCALE,1);i.name=a._getString(e,a.NAME,a.DEFAULT_NAME);if(i.name.length<1){i.name=a.DEFAULT_NAME}if(t.DragonBones.webAssembly){i.frameIntOffset=this._frameIntArrayJson.length;i.frameFloatOffset=this._frameFloatArrayJson.length;i.frameOffset=this._frameArrayJson.length}else{i.frameIntOffset=this._data.frameIntArray.length;i.frameFloatOffset=this._data.frameFloatArray.length;i.frameOffset=this._data.frameArray.length}this._animation=i;if(a.FRAME in e){var r=e[a.FRAME];var n=r.length;if(n>0){for(var s=0,o=0;s0){this._actionFrames.sort(this._sortActionFrame);var D=this._animation.actionTimeline=t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);var T=t.DragonBones.webAssembly?this._timelineArrayJson:this._data.timelineArray;var n=this._actionFrames.length;D.type=0;D.offset=T.length;T.length+=1+1+1+1+1+n;T[D.offset+0]=100;T[D.offset+1]=0;T[D.offset+2]=n;T[D.offset+3]=0;T[D.offset+4]=0;this._timeline=D;if(n===1){D.frameIndicesOffset=-1;T[D.offset+5+0]=this._parseCacheActionFrame(this._actionFrames[0])-this._animation.frameOffset}else{var A=this._animation.frameCount+1;var O=this._data.frameIndices;if(t.DragonBones.webAssembly){D.frameIndicesOffset=O.size();for(var B=0;B0){if(a.CURVE in t){var s=i+1;this._helpArray.length=s;this._samplingEasingCurve(t[a.CURVE],this._helpArray);r.length+=1+1+this._helpArray.length;r[n+1]=2;r[n+2]=s;for(var o=0;o0){var l=this._armature.sortedSlots.length;var h=new Array(l-o.length/2);var u=new Array(l);for(var f=0;f0?l>=this._prevRotation:l<=this._prevRotation){this._prevTweenRotate=this._prevTweenRotate>0?this._prevTweenRotate-1:this._prevTweenRotate+1}l=this._prevRotation+l-this._prevRotation+t.Transform.PI_D*this._prevTweenRotate}}this._prevTweenRotate=a._getNumber(e,a.TWEEN_ROTATE,0);this._prevRotation=l;var h=n.length;n.length+=6;n[h++]=this._helpTransform.x;n[h++]=this._helpTransform.y;n[h++]=l;n[h++]=this._helpTransform.skew;n[h++]=this._helpTransform.scaleX;n[h++]=this._helpTransform.scaleY;this._parseActionDataInFrame(e,i,this._bone,this._slot);return o};a.prototype._parseSlotDisplayIndexFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var s=this._parseFrame(e,i,r,n);n.length+=1;n[s+1]=a._getNumber(e,a.DISPLAY_INDEX,0);this._parseActionDataInFrame(e,i,this._slot.parent,this._slot);return s};a.prototype._parseSlotColorFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameIntArrayJson:this._data.frameIntArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=this._parseTweenFrame(e,i,r,o);var h=-1;if(a.COLOR in e){var u=e[a.COLOR];for(var f in u){f;this._parseColorTransform(u,this._helpColorTransform);h=n.length;n.length+=8;n[h++]=Math.round(this._helpColorTransform.alphaMultiplier*100);n[h++]=Math.round(this._helpColorTransform.redMultiplier*100);n[h++]=Math.round(this._helpColorTransform.greenMultiplier*100);n[h++]=Math.round(this._helpColorTransform.blueMultiplier*100);n[h++]=Math.round(this._helpColorTransform.alphaOffset);n[h++]=Math.round(this._helpColorTransform.redOffset);n[h++]=Math.round(this._helpColorTransform.greenOffset);n[h++]=Math.round(this._helpColorTransform.blueOffset);h-=8;break}}if(h<0){if(this._defalultColorOffset<0){this._defalultColorOffset=h=n.length;n.length+=8;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=100;n[h++]=0;n[h++]=0;n[h++]=0;n[h++]=0}h=this._defalultColorOffset}var _=s.length;s.length+=1;s[_]=h;return l};a.prototype._parseSlotFFDFrame=function(e,i,r){var n=t.DragonBones.webAssembly?this._intArrayJson:this._data.intArray;var s=t.DragonBones.webAssembly?this._frameFloatArrayJson:this._data.frameFloatArray;var o=t.DragonBones.webAssembly?this._frameArrayJson:this._data.frameArray;var l=s.length;var h=this._parseTweenFrame(e,i,r,o);var u=a.VERTICES in e?e[a.VERTICES]:null;var f=a._getNumber(e,a.OFFSET,0);var _=n[this._mesh.offset+0];var m=0;var p=0;var c=0;var d=0;if(this._mesh.weight!==null){var y=this._weightSlotPose[this._mesh.name];this._helpMatrixA.copyFromArray(y,0);s.length+=this._mesh.weight.count*2;c=this._mesh.weight.offset+2+this._mesh.weight.bones.length}else{s.length+=_*2}for(var g=0;g<_*2;g+=2){if(u===null){m=0;p=0}else{if(g=u.length){m=0}else{m=u[g-f]}if(g+1=u.length){p=0}else{p=u[g+1-f]}}if(this._mesh.weight!==null){var v=this._weightBonePoses[this._mesh.name];var b=this._weightBoneIndices[this._mesh.name];var D=n[c++];this._helpMatrixA.transformPoint(m,p,this._helpPoint,true);m=this._helpPoint.x;p=this._helpPoint.y;for(var T=0;T=0||a.DATA_VERSIONS.indexOf(n)>=0){var s=t.DragonBones.webAssembly?new Module["DragonBonesData"]:t.BaseObject.borrowObject(t.DragonBonesData);s.version=r;s.name=a._getString(e,a.NAME,"");s.frameRate=a._getNumber(e,a.FRAME_RATE,24);if(s.frameRate===0){s.frameRate=24}if(a.ARMATURE in e){this._defalultColorOffset=-1;this._data=s;this._parseArray(e);var o=e[a.ARMATURE];for(var l=0,h=o;l0){this._parseWASMArray()}this._data=null}this._rawTextureAtlasIndex=0;if(a.TEXTURE_ATLAS in e){this._rawTextureAtlases=e[a.TEXTURE_ATLAS]}else{this._rawTextureAtlases=null}return s}else{console.assert(false,"Nonsupport data version.")}return null};a.prototype.parseTextureAtlasData=function(e,i,r){if(r===void 0){r=0}console.assert(e!==undefined);if(e===null){if(this._rawTextureAtlases===null){return false}var n=this._rawTextureAtlases[this._rawTextureAtlasIndex++];this.parseTextureAtlasData(n,i,r);if(this._rawTextureAtlasIndex>=this._rawTextureAtlases.length){this._rawTextureAtlasIndex=0;this._rawTextureAtlases=null}return true}i.width=a._getNumber(e,a.WIDTH,0);i.height=a._getNumber(e,a.HEIGHT,0);i.name=a._getString(e,a.NAME,"");i.imagePath=a._getString(e,a.IMAGE_PATH,"");if(r>0){i.scale=r}else{r=i.scale=a._getNumber(e,a.SCALE,i.scale)}r=1/r;if(a.SUB_TEXTURE in e){var s=e[a.SUB_TEXTURE];for(var o=0,l=s.length;o0&&_>0){u.frame=t.DragonBones.webAssembly?Module["TextureData"].createRectangle():t.TextureData.createRectangle();u.frame.x=a._getNumber(h,a.FRAME_X,0)*r;u.frame.y=a._getNumber(h,a.FRAME_Y,0)*r;u.frame.width=f*r;u.frame.height=_*r}i.addTexture(u)}}return true};a.getInstance=function(){if(a._objectDataParserInstance===null){a._objectDataParserInstance=new a}return a._objectDataParserInstance};a._objectDataParserInstance=null;return a}(t.DataParser);t.ObjectDataParser=e;var i=function(){function t(){this.frameStart=0;this.actions=[]}return t}()})(dragonBones||(dragonBones={}));var dragonBones;(function(t){var e=function(e){__extends(i,e);function i(){return e!==null&&e.apply(this,arguments)||this}i.prototype._inRange=function(t,e,i){return e<=t&&t<=i};i.prototype._decodeUTF8=function(t){var e=-1;var i=-1;var a=65533;var r=0;var n="";var s;var o=0;var l=0;var h=0;var u=0;while(t.length>r){var f=t[r++];if(f===e){if(l!==0){s=a}else{s=i}}else{if(l===0){if(this._inRange(f,0,127)){s=f}else{if(this._inRange(f,194,223)){l=1;u=128;o=f-192}else if(this._inRange(f,224,239)){l=2;u=2048;o=f-224}else if(this._inRange(f,240,244)){l=3;u=65536;o=f-240}else{}o=o*Math.pow(64,l);s=null}}else if(!this._inRange(f,128,191)){o=0;l=0;h=0;u=0;r--;s=f}else{h+=1;o=o+(f-128)*Math.pow(64,l-h);if(h!==l){s=null}else{var _=o;var m=u;o=0;l=0;h=0;u=0;if(this._inRange(_,m,1114111)&&!this._inRange(_,55296,57343)){s=_}else{s=f}}}}if(s!==null&&s!==i){if(s<=65535){if(s>0)n+=String.fromCharCode(s)}else{s-=65536;n+=String.fromCharCode(55296+(s>>10&1023));n+=String.fromCharCode(56320+(s&1023))}}}return n};i.prototype._getUTF16Key=function(t){for(var e=0,i=t.length;e255){return encodeURI(t)}}return t};i.prototype._parseBinaryTimeline=function(e,i,a){if(a===void 0){a=null}var r=a!==null?a:t.DragonBones.webAssembly?new Module["TimelineData"]:t.BaseObject.borrowObject(t.TimelineData);r.type=e;r.offset=i;this._timeline=r;var n=this._timelineArray[r.offset+2];if(n===1){r.frameIndicesOffset=-1}else{var s=this._animation.frameCount+1;var o=this._data.frameIndices;if(t.DragonBones.webAssembly){r.frameIndicesOffset=o.size();for(var l=0;l=0){var r=t.DragonBones.webAssembly?new Module["WeightData"]:t.BaseObject.borrowObject(t.WeightData);var n=this._intArray[i.offset+0];var s=this._intArray[a+0];r.offset=a;if(t.DragonBones.webAssembly){r.bones.resize(s,null);for(var o=0;o0){if(e in this._dragonBonesDataMap){n=this._dragonBonesDataMap[e];s=n.getArmature(i)}}if(s===null&&(e.length===0||this.autoSearch)){for(var o in this._dragonBonesDataMap){n=this._dragonBonesDataMap[o];if(e.length===0||n.autoSearch){s=n.getArmature(i);if(s!==null){e=o;break}}}}if(s!==null){t.dataName=e;t.textureAtlasName=r;t.data=n;t.armature=s;t.skin=null;if(a.length>0){t.skin=s.getSkin(a);if(t.skin===null&&this.autoSearch){for(var o in this._dragonBonesDataMap){var l=this._dragonBonesDataMap[o];var h=l.getArmature(a);if(h!==null){t.skin=h.defaultSkin;break}}}}if(t.skin===null){t.skin=s.defaultSkin}return true}return false};i.prototype._buildBones=function(e,i){var a=e.armature.sortedBones;for(var r=0;r<(t.DragonBones.webAssembly?a.size():a.length);++r){var n=t.DragonBones.webAssembly?a.get(r):a[r];var s=t.DragonBones.webAssembly?new Module["Bone"]:t.BaseObject.borrowObject(t.Bone);s.init(n);if(n.parent!==null){i.addBone(s,n.parent.name)}else{i.addBone(s)}var o=n.constraints;for(var l=0;l<(t.DragonBones.webAssembly?o.size():o.length);++l){var h=t.DragonBones.webAssembly?o.get(l):o[l];var u=i.getBone(h.target.name);if(u===null){continue}var f=h;var _=t.DragonBones.webAssembly?new Module["IKConstraint"]:t.BaseObject.borrowObject(t.IKConstraint);var m=f.root!==null?i.getBone(f.root.name):null;_.target=u;_.bone=s;_.root=m;_.bendPositive=f.bendPositive;_.scaleEnabled=f.scaleEnabled;_.weight=f.weight;if(m!==null){m.addConstraint(_)}else{s.addConstraint(_)}}}};i.prototype._buildSlots=function(t,e){var i=t.skin;var a=t.armature.defaultSkin;if(i===null||a===null){return}var r={};for(var n in a.displays){var s=a.displays[n];r[n]=s}if(i!==a){for(var n in i.displays){var s=i.displays[n];r[n]=s}}for(var o=0,l=t.armature.sortedSlots;o0){s.texture=this._getTextureData(t.textureAtlasName,e.path)}if(i!==null&&i.type===2&&this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 2:var o=e;if(o.texture===null){o.texture=this._getTextureData(r,o.path)}else if(t!==null&&t.textureAtlasName.length>0){o.texture=this._getTextureData(t.textureAtlasName,o.path)}if(this._isSupportMesh()){n=a.meshDisplay}else{n=a.rawDisplay}break;case 1:var l=e;var h=this.buildArmature(l.path,r,null,t!==null?t.textureAtlasName:null);if(h!==null){h.inheritAnimation=l.inheritAnimation;if(!h.inheritAnimation){var u=l.actions.length>0?l.actions:h.armatureData.defaultActions;if(u.length>0){for(var f=0,_=u;f<_.length;f++){var m=_[f];h._bufferAction(m,true)}}else{h.animation.play()}}l.armature=h.armatureData}n=h;break}return n};i.prototype._replaceSlotDisplay=function(t,e,i,a){if(a<0){a=i.displayIndex}if(a<0){a=0}var r=i.displayList;if(r.length<=a){r.length=a+1;for(var n=0,s=r.length;n=0){continue}var s=e.displays[n.name];var o=n.displayList;o.length=s.length;for(var l=0,h=s.length;l=0&&this._display!==null&&i!==null){var a=i.parent;if(this._armature.replacedTexture!==null&&this._rawDisplayDatas.indexOf(this._displayData)>=0){if(this._armature._replaceTextureAtlasData===null){a=t.BaseObject.borrowObject(t.PixiTextureAtlasData);a.copyFrom(i.parent);a.renderTexture=this._armature.replacedTexture;this._armature._replaceTextureAtlasData=a}else{a=this._armature._replaceTextureAtlasData}i=a.getTexture(i.name)}var r=i.renderTexture;if(r!==null){var n=i.renderTexture;if(e!==null){var s=e.parent.parent;var o=s.intArray;var l=s.floatArray;var h=o[e.offset+0];var u=o[e.offset+1];var f=o[e.offset+2];var _=f+h*2;var m=this._renderDisplay;var p=a.width>0?a.width:n.width;var c=a.height>0?a.height:n.height;m.vertices=new Float32Array(h*2);m.uvs=new Float32Array(h*2);m.indices=new Uint16Array(u*3);for(var d=0,y=h*2;d0;var e=this._meshData;var i=e.weight;var a=this._renderDisplay;if(i!==null){var r=e.parent.parent;var n=r.intArray;var s=r.floatArray;var o=n[e.offset+0];var l=n[i.offset+1];for(var h=0,u=0,f=i.offset+2+i.bones.length,_=l,m=0;h void, target: any): void { + this.addListener(type, listener, target); + } + /** + * @inheritDoc + */ + public removeEvent(type: EventStringType, listener: (event: EventObject) => void, target: any): void { + this.removeListener(type, listener, target); + } + /** + * @inheritDoc + */ + public get armature(): Armature { + return this._armature; + } + /** + * @inheritDoc + */ + public get animation(): Animation { + return this._armature.animation; + } + + /** + * @deprecated + * 已废弃,请参考 @see + * @see dragonBones.Armature#clock + * @see dragonBones.PixiFactory#clock + * @see dragonBones.Animation#timescale + * @see dragonBones.Animation#stop() + */ + public advanceTimeBySelf(on: boolean): void { + if (on) { + this._armature.clock = PixiFactory.clock; + } + else { + this._armature.clock = null; + } + } + } +} \ No newline at end of file diff --git a/reference/Pixi/4.x/src/dragonBones/pixi/PixiFactory.ts b/reference/Pixi/4.x/src/dragonBones/pixi/PixiFactory.ts new file mode 100644 index 0000000..7c6f559 --- /dev/null +++ b/reference/Pixi/4.x/src/dragonBones/pixi/PixiFactory.ts @@ -0,0 +1,136 @@ +namespace dragonBones { + /** + * Pixi 工厂。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class PixiFactory extends BaseFactory { + private static _dragonBonesInstance: DragonBones = null as any; + private static _factory: PixiFactory = null as any; + private static _clockHandler(passedTime: number): void { + // PixiFactory._dragonBonesInstance.advanceTime(PIXI.ticker.shared.elapsedMS * passedTime * 0.001); + passedTime; + PixiFactory._dragonBonesInstance.advanceTime(-1); + } + /** + * 一个可以直接使用的全局 WorldClock 实例。(由引擎驱动) + * @version DragonBones 5.0 + * @language zh_CN + */ + public static get clock(): WorldClock { + return PixiFactory._dragonBonesInstance.clock; + } + /** + * @language zh_CN + * 一个可以直接使用的全局工厂实例。 + * @version DragonBones 4.7 + */ + public static get factory(): PixiFactory { + if (PixiFactory._factory === null) { + PixiFactory._factory = new PixiFactory(); + } + + return PixiFactory._factory; + } + /** + * @inheritDoc + */ + public constructor(dataParser: DataParser | null = null) { + super(dataParser); + + if (PixiFactory._dragonBonesInstance === null) { + const eventManager = new PixiArmatureDisplay(); + PixiFactory._dragonBonesInstance = new DragonBones(eventManager); + PIXI.ticker.shared.add(PixiFactory._clockHandler, PixiFactory); + } + + this._dragonBones = PixiFactory._dragonBonesInstance; + } + /** + * @private + */ + protected _buildTextureAtlasData(textureAtlasData: PixiTextureAtlasData | null, textureAtlas: PIXI.BaseTexture | null): PixiTextureAtlasData { + if (textureAtlasData) { + textureAtlasData.renderTexture = textureAtlas; + } + else { + textureAtlasData = BaseObject.borrowObject(PixiTextureAtlasData); + } + + return textureAtlasData; + } + /** + * @private + */ + protected _buildArmature(dataPackage: BuildArmaturePackage): Armature { + const armature = BaseObject.borrowObject(Armature); + const armatureDisplay = new PixiArmatureDisplay(); + + armature.init( + dataPackage.armature, + armatureDisplay, armatureDisplay, this._dragonBones + ); + + return armature; + } + /** + * @private + */ + protected _buildSlot(dataPackage: BuildArmaturePackage, slotData: SlotData, displays: Array, armature: Armature): Slot { + dataPackage; + armature; + const slot = BaseObject.borrowObject(PixiSlot); + + slot.init( + slotData, displays, + new PIXI.Sprite(), new PIXI.mesh.Mesh(null as any, null as any, null as any, null as any, PIXI.mesh.Mesh.DRAW_MODES.TRIANGLES) + ); + + return slot; + } + /** + * 创建一个指定名称的骨架。 + * @param armatureName 骨架名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,如果多个数据中包含同名的骨架数据,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据。 + * @returns 骨架的显示容器。 + * @see dragonBones.EgretArmatureDisplay + * @version DragonBones 4.5 + * @language zh_CN + */ + public buildArmatureDisplay(armatureName: string, dragonBonesName: string | null = null, skinName: string | null = null, textureAtlasName: string | null = null): PixiArmatureDisplay | null { + const armature = this.buildArmature(armatureName, dragonBonesName, skinName, textureAtlasName); + if (armature !== null) { + this._dragonBones.clock.add(armature); + + return armature.display as PixiArmatureDisplay; + } + + return null; + } + /** + * 获取带有指定贴图的显示对象。 + * @param textureName 指定的贴图名称。 + * @param textureAtlasName 指定的贴图集数据名称,如果未设置,将检索所有的贴图集数据。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public getTextureDisplay(textureName: string, textureAtlasName: string | null = null): PIXI.Sprite | null { + const textureData = this._getTextureData(textureAtlasName !== null ? textureAtlasName : "", textureName) as PixiTextureData; + if (textureData !== null && textureData.renderTexture !== null) { + return new PIXI.Sprite(textureData.renderTexture); + } + + return null; + } + /** + * 获取全局声音事件管理器。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public get soundEventManager(): PixiArmatureDisplay { + return this._dragonBones.eventManager as PixiArmatureDisplay; + } + } +} \ No newline at end of file diff --git a/reference/Pixi/4.x/src/dragonBones/pixi/PixiSlot.ts b/reference/Pixi/4.x/src/dragonBones/pixi/PixiSlot.ts new file mode 100644 index 0000000..2090d7c --- /dev/null +++ b/reference/Pixi/4.x/src/dragonBones/pixi/PixiSlot.ts @@ -0,0 +1,348 @@ +namespace dragonBones { + /** + * Pixi 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + */ + export class PixiSlot extends Slot { + public static toString(): string { + return "[class dragonBones.PixiSlot]"; + } + + private _renderDisplay: PIXI.DisplayObject; + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + this._updateTransform = PIXI.VERSION[0] === "3" ? this._updateTransformV3 : this._updateTransformV4; + this._renderDisplay = null as any; + } + /** + * @private + */ + protected _initDisplay(value: any): void { + value; + } + /** + * @private + */ + protected _disposeDisplay(value: any): void { + (value as PIXI.DisplayObject).destroy(); + } + /** + * @private + */ + protected _onUpdateDisplay(): void { + this._renderDisplay = (this._display ? this._display : this._rawDisplay) as PIXI.DisplayObject; + } + /** + * @private + */ + protected _addDisplay(): void { + const container = this._armature.display as PixiArmatureDisplay; + container.addChild(this._renderDisplay); + } + /** + * @private + */ + protected _replaceDisplay(value: any): void { + const container = this._armature.display as PixiArmatureDisplay; + const prevDisplay = value as PIXI.DisplayObject; + container.addChild(this._renderDisplay); + container.swapChildren(this._renderDisplay, prevDisplay); + container.removeChild(prevDisplay); + } + /** + * @private + */ + protected _removeDisplay(): void { + this._renderDisplay.parent.removeChild(this._renderDisplay); + } + /** + * @private + */ + protected _updateZOrder(): void { + const container = this._armature.display as PixiArmatureDisplay; + const index = container.getChildIndex(this._renderDisplay); + if (index === this._zOrder) { + return; + } + + container.addChildAt(this._renderDisplay, this._zOrder); + } + /** + * @internal + * @private + */ + public _updateVisible(): void { + this._renderDisplay.visible = this._parent.visible; + } + /** + * @private + */ + protected _updateBlendMode(): void { + switch (this._blendMode) { + case BlendMode.Normal: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.NORMAL; + break; + + case BlendMode.Add: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.ADD; + break; + + case BlendMode.Darken: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.DARKEN; + break; + + case BlendMode.Difference: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.DIFFERENCE; + break; + + case BlendMode.HardLight: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.HARD_LIGHT; + break; + + case BlendMode.Lighten: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.LIGHTEN; + break; + + case BlendMode.Multiply: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.MULTIPLY; + break; + + case BlendMode.Overlay: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.OVERLAY; + break; + + case BlendMode.Screen: + (this._renderDisplay as PIXI.Sprite).blendMode = PIXI.BLEND_MODES.SCREEN; + break; + + default: + break; + } + } + /** + * @private + */ + protected _updateColor(): void { + this._renderDisplay.alpha = this._colorTransform.alphaMultiplier; + // TODO + } + /** + * @private + */ + protected _updateFrame(): void { + const meshData = this._display === this._meshDisplay ? this._meshData : null; + let currentTextureData = this._textureData as (PixiTextureData | null); + + if (this._displayIndex >= 0 && this._display !== null && currentTextureData !== null) { + let currentTextureAtlasData = currentTextureData.parent as PixiTextureAtlasData; + if (this._armature.replacedTexture !== null && this._rawDisplayDatas.indexOf(this._displayData) >= 0) { // Update replaced texture atlas. + if (this._armature._replaceTextureAtlasData === null) { + currentTextureAtlasData = BaseObject.borrowObject(PixiTextureAtlasData); + currentTextureAtlasData.copyFrom(currentTextureData.parent); + currentTextureAtlasData.renderTexture = this._armature.replacedTexture; + this._armature._replaceTextureAtlasData = currentTextureAtlasData; + } + else { + currentTextureAtlasData = this._armature._replaceTextureAtlasData as PixiTextureAtlasData; + } + + currentTextureData = currentTextureAtlasData.getTexture(currentTextureData.name) as PixiTextureData; + } + + const renderTexture = currentTextureData.renderTexture; + if (renderTexture !== null) { + const currentTextureAtlas = currentTextureData.renderTexture as PIXI.Texture; + if (meshData !== null) { // Mesh. + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const triangleCount = intArray[meshData.offset + BinaryOffset.MeshTriangleCount]; + const verticesOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + const uvOffset = verticesOffset + vertexCount * 2; + + const meshDisplay = this._renderDisplay as PIXI.mesh.Mesh; + const textureAtlasWidth = currentTextureAtlasData.width > 0.0 ? currentTextureAtlasData.width : currentTextureAtlas.width; + const textureAtlasHeight = currentTextureAtlasData.height > 0.0 ? currentTextureAtlasData.height : currentTextureAtlas.height; + + meshDisplay.vertices = new Float32Array(vertexCount * 2) as any; + meshDisplay.uvs = new Float32Array(vertexCount * 2) as any; + meshDisplay.indices = new Uint16Array(triangleCount * 3) as any; + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshDisplay.vertices[i] = floatArray[verticesOffset + i]; + meshDisplay.uvs[i] = floatArray[uvOffset + i]; + } + + for (let i = 0; i < triangleCount * 3; ++i) { + meshDisplay.indices[i] = intArray[meshData.offset + BinaryOffset.MeshVertexIndices + i]; + } + + for (let i = 0, l = meshDisplay.uvs.length; i < l; i += 2) { + const u = meshDisplay.uvs[i]; + const v = meshDisplay.uvs[i + 1]; + meshDisplay.uvs[i] = (currentTextureData.region.x + u * currentTextureData.region.width) / textureAtlasWidth; + meshDisplay.uvs[i + 1] = (currentTextureData.region.y + v * currentTextureData.region.height) / textureAtlasHeight; + } + + meshDisplay.texture = renderTexture as any; + //meshDisplay.dirty = true; // Pixi 3.x + meshDisplay.dirty++; // Pixi 4.x Can not support change mesh vertice count. + } + else { // Normal texture. + const normalDisplay = this._renderDisplay as PIXI.Sprite; + normalDisplay.texture = renderTexture; + } + + this._updateVisible(); + return; + } + } + + if (meshData !== null) { + const meshDisplay = this._renderDisplay as PIXI.mesh.Mesh; + meshDisplay.texture = null as any; + meshDisplay.x = 0.0; + meshDisplay.y = 0.0; + meshDisplay.visible = false; + } + else { + const normalDisplay = this._renderDisplay as PIXI.Sprite; + normalDisplay.texture = null as any; + normalDisplay.x = 0.0; + normalDisplay.y = 0.0; + normalDisplay.visible = false; + } + } + /** + * @private + */ + protected _updateMesh(): void { + const hasFFD = this._ffdVertices.length > 0; + const meshData = this._meshData as MeshDisplayData; + const weight = meshData.weight; + const meshDisplay = this._renderDisplay as PIXI.mesh.Mesh; + + if (weight !== null) { + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const weightFloatOffset = intArray[weight.offset + BinaryOffset.WeigthFloatOffset]; + + for ( + let i = 0, iD = 0, iB = weight.offset + BinaryOffset.WeigthBoneIndices + weight.bones.length, iV = weightFloatOffset, iF = 0; + i < vertexCount; + ++i + ) { + const boneCount = intArray[iB++]; + let xG = 0.0, yG = 0.0; + for (let j = 0; j < boneCount; ++j) { + const boneIndex = intArray[iB++]; + const bone = this._meshBones[boneIndex]; + if (bone !== null) { + const matrix = bone.globalTransformMatrix; + const weight = floatArray[iV++]; + let xL = floatArray[iV++]; + let yL = floatArray[iV++]; + + if (hasFFD) { + xL += this._ffdVertices[iF++]; + yL += this._ffdVertices[iF++]; + } + + xG += (matrix.a * xL + matrix.c * yL + matrix.tx) * weight; + yG += (matrix.b * xL + matrix.d * yL + matrix.ty) * weight; + } + } + + meshDisplay.vertices[iD++] = xG; + meshDisplay.vertices[iD++] = yG; + } + } + else if (hasFFD) { + const data = meshData.parent.parent; + const intArray = data.intArray; + const floatArray = data.floatArray; + const vertexCount = intArray[meshData.offset + BinaryOffset.MeshVertexCount]; + const vertexOffset = intArray[meshData.offset + BinaryOffset.MeshFloatOffset]; + + for (let i = 0, l = vertexCount * 2; i < l; ++i) { + meshDisplay.vertices[i] = floatArray[vertexOffset + i] + this._ffdVertices[i]; + } + } + } + /** + * @private + */ + protected _updateTransform(isSkinnedMesh: boolean): void { + isSkinnedMesh; + throw new Error(); + } + /** + * @private + */ + protected _updateTransformV3(isSkinnedMesh: boolean): void { + if (isSkinnedMesh) { // Identity transform. + this._renderDisplay.setTransform(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0); + } + else { + this.updateGlobalTransform(); // Update transform. + + const transform = this.global; + const x = transform.x - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + const y = transform.y - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + + if (this._renderDisplay === this._rawDisplay || this._renderDisplay === this._meshDisplay) { + this._renderDisplay.setTransform( + x, y, + transform.scaleX, transform.scaleY, + transform.rotation, + transform.skew, 0.0, + ); + } + else { + this._renderDisplay.position.set(x, y); + this._renderDisplay.rotation = transform.rotation; + this._renderDisplay.skew.set(-transform.skew, 0.0); + this._renderDisplay.scale.set(transform.scaleX, transform.scaleY); + } + } + } + /** + * @private + */ + protected _updateTransformV4(isSkinnedMesh: boolean): void { + if (isSkinnedMesh) { // Identity transform. + this._renderDisplay.setTransform(0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0); + } + else { + this.updateGlobalTransform(); // Update transform. + + const transform = this.global; + + if (this._renderDisplay === this._rawDisplay || this._renderDisplay === this._meshDisplay) { + this._renderDisplay.setTransform( + transform.x, transform.y, + transform.scaleX, transform.scaleY, + transform.rotation, + -transform.skew, 0.0, + this._pivotX, this._pivotY + ); + } + else { + const x = transform.x - (this.globalTransformMatrix.a * this._pivotX + this.globalTransformMatrix.c * this._pivotY); + const y = transform.y - (this.globalTransformMatrix.b * this._pivotX + this.globalTransformMatrix.d * this._pivotY); + this._renderDisplay.position.set(x, y); + this._renderDisplay.rotation = transform.rotation; + this._renderDisplay.skew.set(-transform.skew, 0.0); + this._renderDisplay.scale.set(transform.scaleX, transform.scaleY); + } + } + } + } +} \ No newline at end of file diff --git a/reference/Pixi/4.x/src/dragonBones/pixi/PixiTextureAtlasData.ts b/reference/Pixi/4.x/src/dragonBones/pixi/PixiTextureAtlasData.ts new file mode 100644 index 0000000..109283f --- /dev/null +++ b/reference/Pixi/4.x/src/dragonBones/pixi/PixiTextureAtlasData.ts @@ -0,0 +1,91 @@ +namespace dragonBones { + /** + * @language zh_CN + * Pixi 贴图集数据。 + * @version DragonBones 3.0 + */ + export class PixiTextureAtlasData extends TextureAtlasData { + public static toString(): string { + return "[class dragonBones.PixiTextureAtlasData]"; + } + + private _renderTexture: PIXI.BaseTexture | null = null; // Initial value. + /** + * @private + */ + protected _onClear(): void { + super._onClear(); + + if (this.renderTexture !== null) { + //this.texture.dispose(); + } + + this.renderTexture = null; + } + /** + * @private + */ + public createTexture(): TextureData { + return BaseObject.borrowObject(PixiTextureData); + } + /** + * Pixi 贴图。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public get renderTexture(): PIXI.BaseTexture | null { + return this._renderTexture; + } + public set renderTexture(value: PIXI.BaseTexture | null) { + if (this._renderTexture === value) { + return; + } + + this._renderTexture = value; + + if (this._renderTexture !== null) { + for (let k in this.textures) { + const textureData = this.textures[k] as PixiTextureData; + + textureData.renderTexture = new PIXI.Texture( + this._renderTexture, + textureData.region as PIXI.Rectangle, // No need to set frame. + textureData.region as PIXI.Rectangle, + new PIXI.Rectangle(0, 0, textureData.region.width, textureData.region.height), + textureData.rotated as any // .d.ts bug + ); + } + } + else { + for (let k in this.textures) { + const textureData = this.textures[k] as PixiTextureData; + textureData.renderTexture = null; + } + } + } + } + /** + * @private + */ + export class PixiTextureData extends TextureData { + public static toString(): string { + return "[class dragonBones.PixiTextureData]"; + } + + public renderTexture: PIXI.Texture | null = null; // Initial value. + + public constructor() { + super(); + } + + protected _onClear(): void { + super._onClear(); + + if (this.renderTexture !== null) { + this.renderTexture.destroy(); + } + + this.renderTexture = null; + } + } +} \ No newline at end of file diff --git a/reference/Pixi/4.x/tsconfig.json b/reference/Pixi/4.x/tsconfig.json new file mode 100644 index 0000000..6c84e14 --- /dev/null +++ b/reference/Pixi/4.x/tsconfig.json @@ -0,0 +1,77 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": true, + "declaration": true, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "outFile": "out/dragonBones.js", + "lib": [ + "es5", + "dom", + "es2015.promise" + ] + }, + "exclude": [ + "node_modules", + "out" + ], + "files": [ + "./libs/pixi.js.d.ts", + "../../DragonBones/src/dragonBones/modules.ts", + + "../../DragonBones/src/dragonBones/core/DragonBones.ts", + "../../DragonBones/src/dragonBones/core/BaseObject.ts", + + "../../DragonBones/src/dragonBones/geom/Matrix.ts", + "../../DragonBones/src/dragonBones/geom/Transform.ts", + "../../DragonBones/src/dragonBones/geom/ColorTransform.ts", + "../../DragonBones/src/dragonBones/geom/Point.ts", + "../../DragonBones/src/dragonBones/geom/Rectangle.ts", + + "../../DragonBones/src/dragonBones/model/UserData.ts", + "../../DragonBones/src/dragonBones/model/DragonBonesData.ts", + "../../DragonBones/src/dragonBones/model/ArmatureData.ts", + "../../DragonBones/src/dragonBones/model/ConstraintData.ts", + "../../DragonBones/src/dragonBones/model/DisplayData.ts", + "../../DragonBones/src/dragonBones/model/BoundingBoxData.ts", + "../../DragonBones/src/dragonBones/model/AnimationData.ts", + "../../DragonBones/src/dragonBones/model/AnimationConfig.ts", + "../../DragonBones/src/dragonBones/model/TextureAtlasData.ts", + + "../../DragonBones/src/dragonBones/armature/IArmatureProxy.ts", + "../../DragonBones/src/dragonBones/armature/Armature.ts", + "../../DragonBones/src/dragonBones/armature/TransformObject.ts", + "../../DragonBones/src/dragonBones/armature/Bone.ts", + "../../DragonBones/src/dragonBones/armature/Slot.ts", + "../../DragonBones/src/dragonBones/armature/Constraint.ts", + + "../../DragonBones/src/dragonBones/animation/IAnimatable.ts", + "../../DragonBones/src/dragonBones/animation/WorldClock.ts", + "../../DragonBones/src/dragonBones/animation/Animation.ts", + "../../DragonBones/src/dragonBones/animation/AnimationState.ts", + "../../DragonBones/src/dragonBones/animation/BaseTimelineState.ts", + "../../DragonBones/src/dragonBones/animation/TimelineState.ts", + + "../../DragonBones/src/dragonBones/event/EventObject.ts", + "../../DragonBones/src/dragonBones/event/IEventDispatcher.ts", + + "../../DragonBones/src/dragonBones/parser/DataParser.ts", + "../../DragonBones/src/dragonBones/parser/ObjectDataParser.ts", + "../../DragonBones/src/dragonBones/parser/BinaryDataParser.ts", + + "../../DragonBones/src/dragonBones/factory/BaseFactory.ts", + + "./src/dragonBones/pixi/PixiTextureAtlasData.ts", + "./src/dragonBones/pixi/PixiArmatureDisplay.ts", + "./src/dragonBones/pixi/PixiSlot.ts", + "./src/dragonBones/pixi/PixiFactory.ts" + ] +} \ No newline at end of file diff --git a/reference/Pixi/4.x/tslint.json b/reference/Pixi/4.x/tslint.json new file mode 100644 index 0000000..eeb58d1 --- /dev/null +++ b/reference/Pixi/4.x/tslint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "no-unused-expression": true, + "no-unreachable": true, + "no-duplicate-variable": true, + "no-duplicate-key": true, + "no-unused-variable": true, + "curly": false, + "class-name": true, + "triple-equals": true, + "semicolon": [ + true + ] + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/README.md b/reference/Pixi/Demos/README.md new file mode 100644 index 0000000..87314a4 --- /dev/null +++ b/reference/Pixi/Demos/README.md @@ -0,0 +1,28 @@ +## How to run +``` +$npm install +$npm run start +``` + +## Project structure +``` + |-- libs + |-- dragonBones + |-- dragonBones.js + |-- ... + |-- pixi + |-- pixi.js + |-- ... + |-- node_modules + |-- ... + |-- out + |-- ... + |-- resource + |-- ... + |-- src + |-- ... + |-- ... +``` + +## Pixijs +[pixi.js](https://github.com/pixijs/pixi.js/releases/) \ No newline at end of file diff --git a/reference/Pixi/Demos/index.html b/reference/Pixi/Demos/index.html new file mode 100644 index 0000000..40e3eb3 --- /dev/null +++ b/reference/Pixi/Demos/index.html @@ -0,0 +1,29 @@ + + + + + + DragonBones + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/reference/Pixi/Demos/out/AnimationBaseTest.js b/reference/Pixi/Demos/out/AnimationBaseTest.js new file mode 100644 index 0000000..edd68bc --- /dev/null +++ b/reference/Pixi/Demos/out/AnimationBaseTest.js @@ -0,0 +1,107 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var AnimationBaseTest = (function (_super) { + __extends(AnimationBaseTest, _super); + function AnimationBaseTest() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._isTouched = false; + return _this; + } + AnimationBaseTest.prototype._onStart = function () { + var _this = this; + PIXI.loader + .add("dragonBonesData", "./resource/assets/animation_base_test_ske.json") + .add("textureData", "./resource/assets/animation_base_test_tex.json") + .add("texture", "./resource/assets/animation_base_test_tex.png"); + PIXI.loader.once("complete", function (loader, resources) { + var factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dragonBonesData"].data); + factory.parseTextureAtlasData(resources["textureData"].data, resources["texture"].texture); + _this._armatureDisplay = factory.buildArmatureDisplay("progressBar"); + _this._armatureDisplay.x = _this.stage.width * 0.5; + _this._armatureDisplay.y = _this.stage.height * 0.5; + _this.stage.addChild(_this._armatureDisplay); + // Test animation event + _this._armatureDisplay.addListener(dragonBones.EventObject.START, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.LOOP_COMPLETE, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.COMPLETE, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.FADE_IN, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.FADE_IN_COMPLETE, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.FADE_OUT, _this._animationEventHandler, _this); + _this._armatureDisplay.addListener(dragonBones.EventObject.FADE_OUT_COMPLETE, _this._animationEventHandler, _this); + // Test frame event + _this._armatureDisplay.addListener(dragonBones.EventObject.FRAME_EVENT, _this._animationEventHandler, _this); + // Test animation config. + // const animaitonConfig = this._armatureDisplay.animation.animationConfig; + // animaitonConfig.name = "test"; // Animation state name. + // animaitonConfig.animation = "idle"; // Animation name. + // animaitonConfig.playTimes = 1; // Play one time. + // animaitonConfig.playTimes = 3; // Play several times. + // animaitonConfig.playTimes = 0; // Loop play. + // animaitonConfig.timeScale = 1.0; // Play speed. + // animaitonConfig.timeScale = -1.0; // Reverse play. + // animaitonConfig.position = 1.0; // Goto and play. + // animaitonConfig.duration = 3.0; // Interval play. + // this._armatureDisplay.animation.playConfig(animaitonConfig); + _this._armatureDisplay.animation.play("idle", 1); + // + _this.stage.interactive = true; + _this.stage.addListener("touchstart", _this._touchHandler, _this); + _this.stage.addListener("touchend", _this._touchHandler, _this); + _this.stage.addListener("touchmove", _this._touchHandler, _this); + _this.stage.addListener("mousedown", _this._touchHandler, _this); + _this.stage.addListener("mouseup", _this._touchHandler, _this); + _this.stage.addListener("mousemove", _this._touchHandler, _this); + var text = new PIXI.Text("", { align: "center" }); + text.text = "Click to control animation play progress."; + text.scale.x = 0.7; + text.scale.y = 0.7; + text.x = (_this.renderer.width - text.width) * 0.5; + text.y = _this.renderer.height - 60; + _this._stage.addChild(text); + // + _this._startRenderTick(); + }); + PIXI.loader.load(); + }; + AnimationBaseTest.prototype._touchHandler = function (event) { + var progress = Math.min(Math.max((event.data.global.x - this._armatureDisplay.x + 300) / 600, 0.0), 1.0); + switch (event.type) { + case "touchstart": + case "mousedown": + this._isTouched = true; + // this._armatureDisplay.animation.gotoAndPlayByTime("idle", 0.5, 1); + // this._armatureDisplay.animation.gotoAndStopByTime("idle", 1); + // this._armatureDisplay.animation.gotoAndPlayByFrame("idle", 25, 2); + // this._armatureDisplay.animation.gotoAndStopByFrame("idle", 50); + // this._armatureDisplay.animation.gotoAndPlayByProgress("idle", progress, 3); + this._armatureDisplay.animation.gotoAndStopByProgress("idle", progress); + break; + case "touchend": + case "mouseup": + this._isTouched = false; + this._armatureDisplay.animation.play(); + break; + case "touchmove": + case "mousemove": + if (this._isTouched) { + var animationState = this._armatureDisplay.animation.getState("idle"); + animationState.currentTime = animationState.totalTime * progress; + } + break; + } + }; + AnimationBaseTest.prototype._animationEventHandler = function (event) { + console.log(event.animationState.name, event.type, event.name ? event.name : ""); + }; + return AnimationBaseTest; +}(BaseTest)); diff --git a/reference/Pixi/Demos/out/BaseTest.js b/reference/Pixi/Demos/out/BaseTest.js new file mode 100644 index 0000000..ede5b97 --- /dev/null +++ b/reference/Pixi/Demos/out/BaseTest.js @@ -0,0 +1,36 @@ +"use strict"; +var BaseTest = (function () { + function BaseTest() { + this._renderer = new PIXI.WebGLRenderer(1136, 640); + this._stage = new PIXI.Container(); + this._backgroud = new PIXI.Sprite(PIXI.Texture.EMPTY); + this._renderer.backgroundColor = 0x666666; + this._backgroud.width = this._renderer.width; + this._backgroud.height = this._renderer.height; + this._stage.addChild(this._backgroud); + document.body.appendChild(this._renderer.view); + this._onStart(); + } + BaseTest.prototype._renderHandler = function (deltaTime) { + this._renderer.render(this._stage); + }; + BaseTest.prototype._startRenderTick = function () { + // Make sure render after dragonBones update. + PIXI.ticker.shared.add(this._renderHandler, this); + }; + Object.defineProperty(BaseTest.prototype, "renderer", { + get: function () { + return this._renderer; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(BaseTest.prototype, "stage", { + get: function () { + return this._stage; + }, + enumerable: true, + configurable: true + }); + return BaseTest; +}()); diff --git a/reference/Pixi/Demos/out/CoreElement.js b/reference/Pixi/Demos/out/CoreElement.js new file mode 100644 index 0000000..da04538 --- /dev/null +++ b/reference/Pixi/Demos/out/CoreElement.js @@ -0,0 +1,458 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var coreElement; +(function (coreElement) { + var Game = (function (_super) { + __extends(Game, _super); + function Game() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._left = false; + _this._right = false; + _this._bullets = []; + return _this; + } + Game.prototype._onStart = function () { + var _this = this; + PIXI.loader + .add("dataA", "./resource/assets/core_element/mecha_1502b_ske.json") + .add("textureDataA", "./resource/assets/core_element/mecha_1502b_tex.json") + .add("textureA", "./resource/assets/core_element/mecha_1502b_tex.png") + .add("dataB", "./resource/assets/core_element/skin_1502b_ske.json") + .add("textureDataB", "./resource/assets/core_element/skin_1502b_tex.json") + .add("textureB", "./resource/assets/core_element/skin_1502b_tex.png") + .add("dataC", "./resource/assets/core_element/weapon_1000_ske.json") + .add("textureDataC", "./resource/assets/core_element/weapon_1000_tex.json") + .add("textureC", "./resource/assets/core_element/weapon_1000_tex.png"); + PIXI.loader.once("complete", function (loader, resources) { + Game.STAGE_WIDTH = _this._stage.width; + Game.STAGE_HEIGHT = _this._stage.height; + Game.GROUND = Game.STAGE_HEIGHT - 150; + Game.instance = _this; + PIXI.ticker.shared.add(_this._enterFrameHandler, _this); + var factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dataA"].data); + factory.parseTextureAtlasData(resources["textureDataA"].data, resources["textureA"].texture); + factory.parseDragonBonesData(resources["dataB"].data); + factory.parseTextureAtlasData(resources["textureDataB"].data, resources["textureB"].texture); + factory.parseDragonBonesData(resources["dataC"].data); + factory.parseTextureAtlasData(resources["textureDataC"].data, resources["textureC"].texture); + _this._player = new Mecha(); + // Listener. + _this._stage.interactive = true; + _this._stage.addListener('touchstart', _this._touchHandler, _this); + _this._stage.addListener('touchend', _this._touchHandler, _this); + _this._stage.addListener('touchmove', _this._touchHandler, _this); + _this._stage.addListener('mousedown', _this._touchHandler, _this); + _this._stage.addListener('mouseup', _this._touchHandler, _this); + _this._stage.addListener('mousemove', _this._touchHandler, _this); + _this._stage.addChild(_this._backgroud); + document.addEventListener("keydown", _this._keyHandler); + document.addEventListener("keyup", _this._keyHandler); + // Info. + var text = new PIXI.Text("", { align: "center" }); + text.text = "Press W/A/S/D to move. Press Q/E to switch weapons. Press SPACE to switch skin.\nMouse Move to aim. Click to fire."; + text.scale.x = 0.7; + text.scale.y = 0.7; + text.x = (Game.STAGE_WIDTH - text.width) * 0.5; + text.y = Game.STAGE_HEIGHT - 60; + _this._stage.addChild(text); + // + _this._startRenderTick(); + }); + PIXI.loader.load(); + }; + Game.prototype._touchHandler = function (event) { + this._player.aim(event.data.global.x, event.data.global.y); + if (event.type === 'touchstart' || event.type === 'mousedown') { + this._player.attack(true); + } + else if (event.type === 'touchend' || event.type === 'mouseup') { + this._player.attack(false); + } + }; + Game.prototype._keyHandler = function (event) { + var isDown = event.type === "keydown"; + switch (event.keyCode) { + case 37: + case 65: + Game.instance._left = isDown; + Game.instance._updateMove(-1); + break; + case 39: + case 68: + Game.instance._right = isDown; + Game.instance._updateMove(1); + break; + case 38: + case 87: + if (isDown) { + Game.instance._player.jump(); + } + break; + case 83: + case 40: + Game.instance._player.squat(isDown); + break; + case 81: + if (isDown) { + Game.instance._player.switchWeaponR(); + } + break; + case 69: + if (isDown) { + Game.instance._player.switchWeaponL(); + } + break; + case 32: + if (isDown) { + Game.instance._player.switchSkin(); + } + break; + } + }; + Game.prototype._enterFrameHandler = function (deltaTime) { + if (this._player) { + this._player.update(); + } + var i = this._bullets.length; + while (i--) { + var bullet = this._bullets[i]; + if (bullet.update()) { + this._bullets.splice(i, 1); + } + } + }; + Game.prototype._updateMove = function (dir) { + if (this._left && this._right) { + this._player.move(dir); + } + else if (this._left) { + this._player.move(-1); + } + else if (this._right) { + this._player.move(1); + } + else { + this._player.move(0); + } + }; + Game.prototype.addBullet = function (bullet) { + this._bullets.push(bullet); + }; + Game.G = 0.6; + return Game; + }(BaseTest)); + coreElement.Game = Game; + var Mecha = (function () { + function Mecha() { + this._isJumpingA = false; + this._isJumpingB = false; + this._isSquating = false; + this._isAttackingA = false; + this._isAttackingB = false; + this._weaponRIndex = 0; + this._weaponLIndex = 0; + this._skinIndex = 0; + this._faceDir = 1; + this._aimDir = 0; + this._moveDir = 0; + this._aimRadian = 0.0; + this._speedX = 0.0; + this._speedY = 0.0; + this._aimState = null; + this._walkState = null; + this._attackState = null; + this._target = new PIXI.Point(); + this._helpPoint = new PIXI.Point(); + this._armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay("mecha_1502b"); + this._armatureDisplay.x = Game.STAGE_WIDTH * 0.5; + this._armatureDisplay.y = Game.GROUND; + this._armature = this._armatureDisplay.armature; + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_IN_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_OUT_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.COMPLETE, this._animationEventHandler, this); + // Get weapon childArmature. + this._weaponL = this._armature.getSlot("weapon_l").childArmature; + this._weaponR = this._armature.getSlot("weapon_r").childArmature; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + Game.instance.stage.addChild(this._armatureDisplay); + this._updateAnimation(); + } + Mecha.prototype.move = function (dir) { + if (this._moveDir === dir) { + return; + } + this._moveDir = dir; + this._updateAnimation(); + }; + Mecha.prototype.jump = function () { + if (this._isJumpingA) { + return; + } + this._isJumpingA = true; + this._armature.animation.fadeIn("jump_1", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + this._walkState = null; + }; + Mecha.prototype.squat = function (isSquating) { + if (this._isSquating === isSquating) { + return; + } + this._isSquating = isSquating; + this._updateAnimation(); + }; + Mecha.prototype.attack = function (isAttacking) { + if (this._isAttackingA === isAttacking) { + return; + } + this._isAttackingA = isAttacking; + }; + Mecha.prototype.switchWeaponL = function () { + this._weaponL.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + this._weaponLIndex++; + this._weaponLIndex %= Mecha.WEAPON_L_LIST.length; + var weaponName = Mecha.WEAPON_L_LIST[this._weaponLIndex]; + this._weaponL = dragonBones.PixiFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_l").childArmature = this._weaponL; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + }; + Mecha.prototype.switchWeaponR = function () { + this._weaponR.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + this._weaponRIndex++; + this._weaponRIndex %= Mecha.WEAPON_R_LIST.length; + var weaponName = Mecha.WEAPON_R_LIST[this._weaponRIndex]; + this._weaponR = dragonBones.PixiFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_r").childArmature = this._weaponR; + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + }; + Mecha.prototype.switchSkin = function () { + this._skinIndex++; + this._skinIndex %= Mecha.SKINS.length; + var skinName = Mecha.SKINS[this._skinIndex]; + var skinData = dragonBones.PixiFactory.factory.getArmatureData(skinName).defaultSkin; + dragonBones.PixiFactory.factory.changeSkin(this._armature, skinData, ["weapon_l", "weapon_r"]); + }; + Mecha.prototype.aim = function (x, y) { + this._target.x = x; + this._target.y = y; + }; + Mecha.prototype.update = function () { + this._updatePosition(); + this._updateAim(); + this._updateAttack(); + }; + Mecha.prototype._animationEventHandler = function (event) { + switch (event.type) { + case dragonBones.EventObject.FADE_IN_COMPLETE: + if (event.animationState.name === "jump_1") { + this._isJumpingB = true; + this._speedY = -Mecha.JUMP_SPEED; + if (this._moveDir !== 0) { + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + this._armature.animation.fadeIn("jump_2", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + } + break; + case dragonBones.EventObject.FADE_OUT_COMPLETE: + if (event.animationState.name === "attack_01") { + this._isAttackingB = false; + this._attackState = null; + } + break; + case dragonBones.EventObject.COMPLETE: + if (event.animationState.name === "jump_4") { + this._isJumpingA = false; + this._isJumpingB = false; + this._updateAnimation(); + } + break; + } + }; + Mecha.prototype._frameEventHandler = function (event) { + if (event.name === "fire") { + this._helpPoint.x = event.bone.global.x; + this._helpPoint.y = event.bone.global.y; + this._helpPoint.copy(event.armature.display.toGlobal(this._helpPoint)); + this._fire(this._helpPoint); + } + }; + Mecha.prototype._fire = function (firePoint) { + var radian = this._faceDir < 0 ? Math.PI - this._aimRadian : this._aimRadian; + var bullet = new Bullet("bullet_01", "fire_effect_01", radian + Math.random() * 0.02 - 0.01, 40, firePoint); + Game.instance.addBullet(bullet); + }; + Mecha.prototype._updateAnimation = function () { + if (this._isJumpingA) { + return; + } + if (this._isSquating) { + this._speedX = 0; + this._armature.animation.fadeIn("squat", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + this._walkState = null; + return; + } + if (this._moveDir === 0) { + this._speedX = 0; + this._armature.animation.fadeIn("idle", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + this._walkState = null; + } + else { + if (this._walkState === null) { + this._walkState = this._armature.animation.fadeIn("walk", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP); + this._walkState.resetToPose = false; + } + if (this._moveDir * this._faceDir > 0) { + this._walkState.timeScale = Mecha.MAX_MOVE_SPEED_FRONT / Mecha.NORMALIZE_MOVE_SPEED; + } + else { + this._walkState.timeScale = -Mecha.MAX_MOVE_SPEED_BACK / Mecha.NORMALIZE_MOVE_SPEED; + } + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + }; + Mecha.prototype._updatePosition = function () { + if (this._speedX !== 0.0) { + this._armatureDisplay.x += this._speedX; + if (this._armatureDisplay.x < 0) { + this._armatureDisplay.x = 0; + } + else if (this._armatureDisplay.x > Game.STAGE_WIDTH) { + this._armatureDisplay.x = Game.STAGE_WIDTH; + } + } + if (this._speedY !== 0.0) { + if (this._speedY < 5.0 && this._speedY + Game.G >= 5.0) { + this._armature.animation.fadeIn("jump_3", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + } + this._speedY += Game.G; + this._armatureDisplay.y += this._speedY; + if (this._armatureDisplay.y > Game.GROUND) { + this._armatureDisplay.y = Game.GROUND; + this._speedY = 0.0; + this._armature.animation.fadeIn("jump_4", -1.0, -1, 0, Mecha.NORMAL_ANIMATION_GROUP).resetToPose = false; + } + } + }; + Mecha.prototype._updateAim = function () { + this._faceDir = this._target.x > this._armatureDisplay.x ? 1 : -1; + if (this._armatureDisplay.armature.flipX !== this._faceDir < 0) { + this._armatureDisplay.armature.flipX = !this._armatureDisplay.armature.flipX; + if (this._moveDir !== 0) { + this._updateAnimation(); + } + } + var aimOffsetY = this._armature.getBone("chest").global.y * this._armatureDisplay.scale.y; + if (this._faceDir > 0) { + this._aimRadian = Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + } + else { + this._aimRadian = Math.PI - Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + if (this._aimRadian > Math.PI) { + this._aimRadian -= Math.PI * 2.0; + } + } + var aimDir = 0; + if (this._aimRadian > 0.0) { + aimDir = -1; + } + else { + aimDir = 1; + } + if (this._aimState === null || this._aimDir !== aimDir) { + this._aimDir = aimDir; + // Animation mixing. + if (this._aimDir >= 0) { + this._aimState = this._armature.animation.fadeIn("aim_up", -1.0, -1, 0, Mecha.AIM_ANIMATION_GROUP); + } + else { + this._aimState = this._armature.animation.fadeIn("aim_down", -1.0, -1, 0, Mecha.AIM_ANIMATION_GROUP); + } + this._aimState.resetToPose = false; + } + this._aimState.weight = Math.abs(this._aimRadian / Math.PI * 2); + this._armature.invalidUpdate(); + }; + Mecha.prototype._updateAttack = function () { + if (!this._isAttackingA || this._isAttackingB) { + return; + } + this._isAttackingB = true; + this._attackState = this._armature.animation.fadeIn("attack_01", -1.0, -1, 0, Mecha.ATTACK_ANIMATION_GROUP); + this._attackState.resetToPose = false; + this._attackState.autoFadeOutTime = this._attackState.fadeTotalTime; + }; + Mecha.JUMP_SPEED = 20; + Mecha.NORMALIZE_MOVE_SPEED = 3.6; + Mecha.MAX_MOVE_SPEED_FRONT = Mecha.NORMALIZE_MOVE_SPEED * 1.4; + Mecha.MAX_MOVE_SPEED_BACK = Mecha.NORMALIZE_MOVE_SPEED * 1.0; + Mecha.NORMAL_ANIMATION_GROUP = "normal"; + Mecha.AIM_ANIMATION_GROUP = "aim"; + Mecha.ATTACK_ANIMATION_GROUP = "attack"; + Mecha.WEAPON_L_LIST = ["weapon_1502b_l", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d", "weapon_1005e"]; + Mecha.WEAPON_R_LIST = ["weapon_1502b_r", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d"]; + Mecha.SKINS = ["mecha_1502b", "skin_a", "skin_b", "skin_c"]; + return Mecha; + }()); + var Bullet = (function () { + function Bullet(armatureName, effectArmatureName, radian, speed, position) { + this._speedX = 0.0; + this._speedY = 0.0; + this._effecDisplay = null; + this._speedX = Math.cos(radian) * speed; + this._speedY = Math.sin(radian) * speed; + this._armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay(armatureName); + this._armatureDisplay.x = position.x + Math.random() * 2 - 1; + this._armatureDisplay.y = position.y + Math.random() * 2 - 1; + this._armatureDisplay.rotation = radian; + if (effectArmatureName !== null) { + this._effecDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay(effectArmatureName); + this._effecDisplay.rotation = radian; + this._effecDisplay.x = this._armatureDisplay.x; + this._effecDisplay.y = this._armatureDisplay.y; + this._effecDisplay.scale.set(1 + Math.random() * 1, 1 + Math.random() * 0.5); + if (Math.random() < 0.5) { + this._effecDisplay.scale.y *= -1; + } + Game.instance.stage.addChild(this._effecDisplay); + this._effecDisplay.animation.play("idle"); + } + Game.instance.stage.addChild(this._armatureDisplay); + this._armatureDisplay.animation.play("idle"); + } + Bullet.prototype.update = function () { + this._armatureDisplay.x += this._speedX; + this._armatureDisplay.y += this._speedY; + if (this._armatureDisplay.x < -100.0 || this._armatureDisplay.x >= Game.STAGE_WIDTH + 100.0 || + this._armatureDisplay.y < -100.0 || this._armatureDisplay.y >= Game.STAGE_HEIGHT + 100.0) { + Game.instance.stage.removeChild(this._armatureDisplay); + this._armatureDisplay.dispose(); + if (this._effecDisplay !== null) { + Game.instance.stage.removeChild(this._effecDisplay); + this._effecDisplay.dispose(); + } + return true; + } + return false; + }; + return Bullet; + }()); +})(coreElement || (coreElement = {})); diff --git a/reference/Pixi/Demos/out/HelloDragonBones.js b/reference/Pixi/Demos/out/HelloDragonBones.js new file mode 100644 index 0000000..580e902 --- /dev/null +++ b/reference/Pixi/Demos/out/HelloDragonBones.js @@ -0,0 +1,55 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +/** + * How to use + * 1. Load data. + * + * 2. Parse data. + * factory.parseDragonBonesData(); + * factory.parseTextureAtlasData(); + * + * 3. Build armature. + * armatureDisplay = factory.buildArmatureDisplay("armatureName"); + * + * 4. Play animation. + * armatureDisplay.animation.play("animationName"); + * + * 5. Add armature to stage. + * addChild(armatureDisplay); + */ +var HelloDragonBones = (function (_super) { + __extends(HelloDragonBones, _super); + function HelloDragonBones() { + return _super !== null && _super.apply(this, arguments) || this; + } + HelloDragonBones.prototype._onStart = function () { + var _this = this; + PIXI.loader + .add("dragonBonesData", "./resource/assets/dragon_boy_ske.dbbin", { loadType: PIXI.loaders.Resource.LOAD_TYPE.XHR, xhrType: PIXI.loaders.Resource.XHR_RESPONSE_TYPE.BUFFER }) + .add("textureData", "./resource/assets/dragon_boy_tex.json") + .add("texture", "./resource/assets/dragon_boy_tex.png"); + PIXI.loader.once("complete", function (loader, resources) { + var factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dragonBonesData"].data); + factory.parseTextureAtlasData(resources["textureData"].data, resources["texture"].texture); + var armatureDisplay = factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.animation.play("walk"); + _this.stage.addChild(armatureDisplay); + armatureDisplay.x = _this._renderer.width * 0.5; + armatureDisplay.y = _this._renderer.height * 0.5 + 100; + // + _this._startRenderTick(); + }); + PIXI.loader.load(); + }; + return HelloDragonBones; +}(BaseTest)); diff --git a/reference/Pixi/Demos/out/PerformanceTest.js b/reference/Pixi/Demos/out/PerformanceTest.js new file mode 100644 index 0000000..010a753 --- /dev/null +++ b/reference/Pixi/Demos/out/PerformanceTest.js @@ -0,0 +1,133 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var PerformanceTest = (function (_super) { + __extends(PerformanceTest, _super); + function PerformanceTest() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._addingArmature = false; + _this._removingArmature = false; + _this._text = new PIXI.Text("", { align: "center" }); + _this._armatures = []; + return _this; + } + PerformanceTest.prototype._onStart = function () { + var _this = this; + PIXI.loader + .add("dragonBonesData", "./resource/assets/dragon_boy_ske.json") + .add("textureData", "./resource/assets/dragon_boy_tex.json") + .add("texture", "./resource/assets/dragon_boy_tex.png"); + PIXI.loader.once("complete", function (loader, resources) { + _this._resources = resources; + // + _this._text.scale.x = 0.7; + _this._text.scale.y = 0.7; + _this.stage.addChild(_this._text); + // + _this._stage.interactive = true; + _this._stage.addListener("touchstart", _this._touchHandler, _this); + _this._stage.addListener("touchend", _this._touchHandler, _this); + _this._stage.addListener("mousedown", _this._touchHandler, _this); + _this._stage.addListener("mouseup", _this._touchHandler, _this); + PIXI.ticker.shared.add(_this._enterFrameHandler, _this); + for (var i = 0; i < 100; ++i) { + _this._addArmature(); + } + _this._resetPosition(); + _this._updateText(); + // + _this._startRenderTick(); + }); + PIXI.loader.load(); + }; + PerformanceTest.prototype._enterFrameHandler = function (deltaTime) { + if (this._addingArmature) { + for (var i = 0; i < 10; ++i) { + this._addArmature(); + } + this._resetPosition(); + this._updateText(); + } + if (this._removingArmature) { + for (var i = 0; i < 10; ++i) { + this._removeArmature(); + } + this._resetPosition(); + this._updateText(); + } + }; + PerformanceTest.prototype._touchHandler = function (event) { + switch (event.type) { + case "touchstart": + case "mousedown": + var touchRight = event.data.global.x > this._renderer.width * 0.5; + this._addingArmature = touchRight; + this._removingArmature = !touchRight; + break; + case "touchend": + case "mouseup": + this._addingArmature = false; + this._removingArmature = false; + break; + } + }; + PerformanceTest.prototype._addArmature = function () { + if (this._armatures.length === 0) { + dragonBones.PixiFactory.factory.parseDragonBonesData(this._resources["dragonBonesData"].data); + dragonBones.PixiFactory.factory.parseTextureAtlasData(this._resources["textureData"].data, this._resources["texture"].texture); + } + var armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.armature.cacheFrameRate = 24; + armatureDisplay.animation.play("walk", 0); + armatureDisplay.scale.set(0.7, 0.7); + this.stage.addChild(armatureDisplay); + this._armatures.push(armatureDisplay); + }; + PerformanceTest.prototype._removeArmature = function () { + if (this._armatures.length === 0) { + return; + } + var armatureDisplay = this._armatures.pop(); + this.stage.removeChild(armatureDisplay); + armatureDisplay.dispose(); + if (this._armatures.length === 0) { + dragonBones.PixiFactory.factory.clear(true); + dragonBones.BaseObject.clearPool(); + } + }; + PerformanceTest.prototype._resetPosition = function () { + var armatureCount = this._armatures.length; + if (armatureCount === 0) { + return; + } + var paddingH = 50; + var paddingV = 150; + var gapping = 100; + var stageWidth = this.renderer.width - paddingH * 2; + var columnCount = Math.floor(stageWidth / gapping); + var paddingHModify = (this.renderer.width - columnCount * gapping) * 0.5; + var dX = stageWidth / columnCount; + var dY = (this.renderer.height - paddingV * 2) / Math.ceil(armatureCount / columnCount); + for (var i = 0, l = armatureCount; i < l; ++i) { + var armatureDisplay = this._armatures[i]; + var lineY = Math.floor(i / columnCount); + armatureDisplay.x = (i % columnCount) * dX + paddingHModify; + armatureDisplay.y = lineY * dY + paddingV; + } + }; + PerformanceTest.prototype._updateText = function () { + this._text.text = "Count: " + this._armatures.length + " \nTouch screen left to decrease count / right to increase count."; + this._text.x = (this.renderer.width - this._text.width) * 0.5; + this._text.y = this.renderer.height - 60; + this.stage.addChild(this._text); + }; + return PerformanceTest; +}(BaseTest)); diff --git a/reference/Pixi/Demos/out/ReplaceSlotDisplay.js b/reference/Pixi/Demos/out/ReplaceSlotDisplay.js new file mode 100644 index 0000000..99d02f2 --- /dev/null +++ b/reference/Pixi/Demos/out/ReplaceSlotDisplay.js @@ -0,0 +1,87 @@ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +var ReplaceSlotDisplay = (function (_super) { + __extends(ReplaceSlotDisplay, _super); + function ReplaceSlotDisplay() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._displayIndex = 0; + _this._replaceDisplays = [ + // Replace normal display. + "display0002", "display0003", "display0004", "display0005", "display0006", "display0007", "display0008", "display0009", "display0010", + // Replace mesh display. + "meshA", "meshB", "meshC", + ]; + _this._factory = dragonBones.PixiFactory.factory; + return _this; + } + ReplaceSlotDisplay.prototype._onStart = function () { + var _this = this; + PIXI.loader + .add("dragonBonesDataA", "./resource/assets/replace_slot_display/main_ske.json") + .add("textureDataA", "./resource/assets/replace_slot_display/main_tex.json") + .add("textureA", "./resource/assets/replace_slot_display/main_tex.png") + .add("dragonBonesDataB", "./resource/assets/replace_slot_display/replace_ske.json") + .add("textureDataB", "./resource/assets/replace_slot_display/replace_tex.json") + .add("textureB", "./resource/assets/replace_slot_display/replace_tex.png"); + PIXI.loader.once("complete", function (loader, resources) { + _this._factory.parseDragonBonesData(resources["dragonBonesDataA"].data); + _this._factory.parseTextureAtlasData(resources["textureDataA"].data, resources["textureA"].texture); + _this._factory.parseDragonBonesData(resources["dragonBonesDataB"].data); + _this._factory.parseTextureAtlasData(resources["textureDataB"].data, resources["textureB"].texture); + _this._armatureDisplay = _this._factory.buildArmatureDisplay("MyArmature"); + _this._armatureDisplay.animation.timeScale = 0.1; + _this._armatureDisplay.animation.play(); + _this._armatureDisplay.x = _this.stage.width * 0.5; + _this._armatureDisplay.y = _this.stage.height * 0.5; + _this.stage.addChild(_this._armatureDisplay); + var touchHandler = function (event) { + _this._replaceDisplay(); + }; + _this.stage.interactive = true; + _this.stage.addListener("touchstart", touchHandler, _this); + _this.stage.addListener("mousedown", touchHandler, _this); + // + _this._startRenderTick(); + }); + PIXI.loader.load(); + }; + ReplaceSlotDisplay.prototype._replaceDisplay = function () { + this._displayIndex = (this._displayIndex + 1) % this._replaceDisplays.length; + var replaceDisplayName = this._replaceDisplays[this._displayIndex]; + if (replaceDisplayName.indexOf("mesh") >= 0) { + switch (replaceDisplayName) { + case "meshA": + // Normal to mesh. + this._factory.replaceSlotDisplay("replace", "MyMesh", "meshA", "weapon_1004_1", this._armatureDisplay.armature.getSlot("weapon")); + // Replace mesh texture. + this._factory.replaceSlotDisplay("replace", "MyDisplay", "ball", "display0002", this._armatureDisplay.armature.getSlot("mesh")); + break; + case "meshB": + // Normal to mesh. + this._factory.replaceSlotDisplay("replace", "MyMesh", "meshB", "weapon_1004_1", this._armatureDisplay.armature.getSlot("weapon")); + // Replace mesh texture. + this._factory.replaceSlotDisplay("replace", "MyDisplay", "ball", "display0003", this._armatureDisplay.armature.getSlot("mesh")); + break; + case "meshC": + // Back to normal. + this._factory.replaceSlotDisplay("replace", "MyMesh", "mesh", "weapon_1004_1", this._armatureDisplay.armature.getSlot("weapon")); + // Replace mesh texture. + this._factory.replaceSlotDisplay("replace", "MyDisplay", "ball", "display0005", this._armatureDisplay.armature.getSlot("mesh")); + break; + } + } + else { + this._factory.replaceSlotDisplay("replace", "MyDisplay", "ball", replaceDisplayName, this._armatureDisplay.armature.getSlot("ball")); + } + }; + return ReplaceSlotDisplay; +}(BaseTest)); diff --git a/reference/Pixi/Demos/package.json b/reference/Pixi/Demos/package.json new file mode 100644 index 0000000..c086727 --- /dev/null +++ b/reference/Pixi/Demos/package.json @@ -0,0 +1,16 @@ +{ + "name": "dragonbones-pixi-demos", + "version": "5.1.0", + "main": "", + "scripts": { + "start": "tsc & copyfiles -u 3 -s ../4.x/out/* libs/dragonBones/ & anywhere", + "upgradeA": "cd .. & cd 4.x & npm run build & cd .. & cd Demos", + "upgradeB": "copyfiles -u 3 ../4.x/out/* libs/dragonBones/", + "upgrade": "npm run upgradeA & npm run upgradeB" + }, + "devDependencies": { + "anywhere": "^1.4.0", + "copyfiles": "^1.2.0", + "typescript": "^2.4.2" + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/animation_base_test_ske.json b/reference/Pixi/Demos/resource/assets/animation_base_test_ske.json new file mode 100644 index 0000000..067c964 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/animation_base_test_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"aabb":{"width":611,"y":-82.37399983406067,"height":97.37399983406067,"x":-300},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"idle"}],"skin":[{"name":"","slot":[{"display":[{"path":"_texture/track","type":"image","name":"_texture/track","transform":{}}],"name":"track"},{"display":[{"path":"_texture/thrmb","type":"image","name":"_texture/thrmb","transform":{"x":-33}}],"name":"thrmb"},{"display":[{"transform":{"skX":-0.8115,"skY":-0.8115},"path":"loading","type":"armature","name":"loading","filterType":"armature"}],"name":"loading"},{"display":[{"path":"_texture/bar","type":"image","name":"_texture/bar","transform":{"x":300}}],"name":"bar"}]}],"bone":[{"name":"root","transform":{}},{"inheritScale":0,"transform":{},"name":"track","parent":"root"},{"inheritScale":0,"transform":{"x":-300},"name":"bar","parent":"root"},{"inheritScale":0,"transform":{"x":300},"name":"thrmb","parent":"root"},{"transform":{"skX":0.8115,"y":-50,"skY":0.8115},"name":"loading","parent":"root"}],"slot":[{"name":"track","parent":"track","color":{}},{"z":1,"name":"bar","parent":"bar","color":{}},{"z":2,"name":"thrmb","parent":"thrmb","color":{}},{"z":3,"name":"loading","parent":"loading","color":{}}],"animation":[{"frame":[{"duration":50,"tweenEasing":null,"events":[{"name":"startEvent"}]},{"duration":50,"tweenEasing":null,"events":[{"name":"middleEvent"}]},{"duration":0,"tweenEasing":null,"events":[{"name":"completeEvent"}]}],"duration":100,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"track"},{"frame":[{"transform":{"scX":0.01},"tweenEasing":0,"duration":100},{"transform":{},"tweenEasing":null,"duration":0}],"name":"bar"},{"frame":[{"transform":{"scX":0.5,"scY":0.5,"x":-600},"tweenEasing":0,"duration":5},{"transform":{"x":-565},"tweenEasing":0,"duration":90},{"transform":{"x":-30},"tweenEasing":0,"duration":5},{"transform":{"scX":0.5,"scY":0.5},"tweenEasing":null,"duration":0}],"name":"thrmb"},{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"root"},{"frame":[{"transform":{},"tweenEasing":null,"duration":100}],"name":"loading"}],"slot":[{"frame":[{"tweenEasing":null,"duration":100}],"name":"track"},{"frame":[{"tweenEasing":null,"duration":100}],"name":"bar"},{"frame":[{"color":{"aM":0},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":90},{"tweenEasing":0,"duration":5},{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"thrmb"},{"frame":[{"duration":100,"actions":[{"gotoAndPlay":"idle"}],"tweenEasing":0},{"duration":0,"actions":[{"gotoAndPlay":"hide"}],"tweenEasing":null}],"name":"loading"}],"ffd":[],"name":"idle"}],"frameRate":24,"name":"progressBar"},{"aabb":{"width":108,"y":-51.950005000000004,"height":104,"x":-54},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"idle"}],"skin":[{"name":"","slot":[{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"1"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"3"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"4"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"6"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"5"},{"display":[{"path":"_texture/_diamond","type":"image","name":"_texture/_diamond","transform":{"y":0.15}}],"name":"2"}]}],"bone":[{"name":"root","transform":{}},{"inheritScale":0,"transform":{"y":-11,"scX":0.3329,"scY":0.3333,"x":-19},"name":"6","parent":"root"},{"inheritScale":0,"transform":{"y":11,"scX":0.3329,"scY":0.3333,"x":-19},"name":"5","parent":"root"},{"inheritScale":0,"transform":{"y":22,"scX":0.3329,"scY":0.3333},"name":"4","parent":"root"},{"inheritScale":0,"transform":{"y":11,"scX":0.3329,"scY":0.3333,"x":19},"name":"3","parent":"root"},{"inheritScale":0,"transform":{"y":-11,"scX":0.3329,"scY":0.3333,"x":19},"name":"2","parent":"root"},{"inheritScale":0,"transform":{"y":-22,"scX":0.3329,"scY":0.3333},"name":"1","parent":"root"}],"slot":[{"name":"6","parent":"6","color":{}},{"z":1,"name":"5","parent":"5","color":{}},{"z":2,"name":"4","parent":"4","color":{}},{"z":3,"name":"3","parent":"3","color":{}},{"z":4,"name":"2","parent":"2","color":{}},{"z":5,"name":"1","parent":"1","color":{}}],"animation":[{"playTimes":0,"frame":[],"duration":30,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":30}],"name":"root"},{"frame":[{"transform":{"y":-2,"x":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-2,"x":-4},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":3,"x":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"transform":{},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":2,"x":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-2,"x":4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-4},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":20},{"transform":{},"tweenEasing":null,"duration":0}],"name":"1"}],"slot":[{"frame":[{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":0,"duration":20},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":20},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":15},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":5}],"name":"4"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":10},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":10}],"name":"3"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":15}],"name":"2"},{"frame":[{"color":{"aM":50},"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"color":{"aM":50},"tweenEasing":null,"duration":20}],"name":"1"}],"ffd":[],"name":"idle","fadeInTime":0.2},{"playTimes":0,"frame":[],"duration":0,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":0}],"name":"root"},{"frame":[{"transform":{"y":11,"x":19},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"transform":{"y":-11,"x":19},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"transform":{"y":-22},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"transform":{"y":-11,"x":-19},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"transform":{"y":11,"x":-19},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"transform":{"y":22},"tweenEasing":null,"duration":0}],"name":"1"}],"slot":[{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"6"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"5"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"4"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"3"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"2"},{"frame":[{"color":{"aM":0},"tweenEasing":null,"duration":0}],"name":"1"}],"ffd":[],"name":"hide","fadeInTime":0.2}],"frameRate":24,"name":"loading"}],"name":"AnimationBaseTest","version":"5.0"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/animation_base_test_tex.json b/reference/Pixi/Demos/resource/assets/animation_base_test_tex.json new file mode 100644 index 0000000..e53778e --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/animation_base_test_tex.json @@ -0,0 +1 @@ +{"imagePath":"animation_base_test_tex.png","width":1024,"SubTexture":[{"width":600,"y":1,"height":4,"name":"_texture/track","x":73},{"width":600,"y":7,"height":4,"name":"_texture/bar","x":73},{"width":88,"y":1,"height":30,"name":"_texture/thrmb","x":675},{"width":70,"y":1,"height":60,"name":"_texture/_diamond","x":1}],"height":64,"name":"AnimationBaseTest"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/animation_base_test_tex.png b/reference/Pixi/Demos/resource/assets/animation_base_test_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..f24f5ee4109e073df7c9df61cd6f4bf57551c879 GIT binary patch literal 6700 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 bGdVBi``3gCs968_Gsxo9S(D0>@aX>oe`W`p literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_ske.json b/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_ske.json new file mode 100644 index 0000000..8d98c7e --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_ske.json @@ -0,0 +1,7232 @@ +{ + "frameRate": 24, + "isGlobal": 0, + "armature": [ + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "bullet_01_f/bullet_01", + "transform": { + "x": -27 + } + } + ], + "name": "b" + } + ] + } + ], + "bone": [ + { + "inheritScale": 0, + "length": 20, + "name": "b", + "transform": {} + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 74, + "y": -10, + "height": 20, + "x": -64 + }, + "slot": [ + { + "name": "b", + "parent": "b", + "color": { + "aM": 50 + } + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "bullet_01", + "ik": [], + "animation": [ + { + "duration": 4, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 4, + "transform": { + "scX": 0.1, + "scY": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "scX": 1.8 + }, + "tweenEasing": null + } + ], + "name": "b" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 4, + "tweenEasing": 0, + "color": { + "aM": 50 + } + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "b" + } + ], + "name": "idle" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "fire_effect_01_f/fireEffect", + "transform": { + "scX": 1.5, + "x": 21 + } + } + ], + "name": "root" + } + ] + } + ], + "bone": [ + { + "inheritScale": 0, + "length": 30, + "name": "root", + "transform": {} + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 48, + "y": -19, + "height": 38, + "x": -3 + }, + "slot": [ + { + "name": "root", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "fire_effect_01", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "name": "idle" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "flame_01_f/bbb", + "transform": { + "skX": -90, + "skY": -90, + "x": 95 + } + } + ], + "blendMode": "add", + "name": "b2" + }, + { + "display": [ + { + "type": "image", + "name": "flame_01_f/ba_bu_flame1", + "transform": { + "y": 85, + "skX": -90, + "skY": -90 + } + } + ], + "name": "b1" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "length": 30, + "transform": { + "skX": 90, + "skY": 90 + }, + "parent": "root", + "inheritScale": 0, + "name": "b2" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 180, + "y": -22, + "height": 234, + "x": -90 + }, + "slot": [ + { + "name": "b1", + "parent": "root", + "color": {} + }, + { + "blendMode": "add", + "z": 1, + "parent": "b2", + "name": "b2", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "flame_01", + "ik": [], + "animation": [ + { + "duration": 2, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "b2" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": 0 + }, + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 30 + } + } + ], + "name": "b2" + } + ], + "name": "idle", + "playTimes": 0 + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/calf_r", + "transform": { + "y": 2.05, + "skX": 0.1784, + "skY": 0.1784, + "x": 16.95 + } + } + ], + "name": "calf_r" + }, + { + "display": [ + { + "transform": { + "skX": -90, + "skY": -90, + "scX": 0.8, + "scY": 0.8 + }, + "type": "armature", + "name": "flame_01", + "filterType": null + } + ], + "name": "effects_f" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/foot_l_0", + "transform": { + "y": 6.4707, + "skX": 89.9982, + "skY": 89.9982, + "scX": 0.9955, + "scY": 1.0045, + "x": 0.0002 + } + } + ], + "name": "foot_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/shouder_r_1", + "transform": { + "y": -3.0591, + "skX": -50.3304, + "skY": -50.3127, + "scX": 0.9998, + "scY": 1.0002, + "x": 1.8548 + } + } + ], + "name": "shouder_r" + }, + { + "display": [ + { + "transform": { + "skX": -90, + "skY": -90 + }, + "type": "armature", + "name": "flame_01", + "filterType": null + } + ], + "name": "effects_b" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/calf_l", + "transform": { + "y": 0.95, + "skX": -0.1967, + "skY": -0.1976, + "x": 15 + } + } + ], + "name": "calf_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_1_r_1", + "transform": { + "y": -1.9, + "skX": 0.438, + "skY": 0.438, + "x": 21.55 + } + } + ], + "name": "thigh_1_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/pelvis", + "transform": { + "y": 7.5, + "x": 3.5 + } + } + ], + "name": "pelvis" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/shouder_l_0", + "transform": { + "y": -3.2345, + "skX": 129.6702, + "skY": 129.6875, + "scX": 0.9998, + "scY": 1.0002, + "x": 0.7822 + } + } + ], + "name": "shouder_l" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_r", + "transform": { + "y": -11.55, + "skX": -0.1635, + "skY": -0.1626, + "x": 12.45 + } + } + ], + "name": "thigh_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/chest", + "transform": { + "y": 29.4658, + "skX": 89.9994, + "skY": 90.0004, + "x": -17.0277 + } + } + ], + "name": "chest" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_1_l_0", + "transform": { + "y": -2.95, + "skX": 0.1119, + "skY": 0.1128, + "x": 23 + } + } + ], + "name": "thigh_1_l" + }, + { + "display": [ + { + "transform": {}, + "type": "armature", + "name": "weapon_1502b_r", + "filterType": null + } + ], + "name": "weapon_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/foot_r", + "transform": { + "y": 7.4165, + "skX": 89.9982, + "skY": 89.9982, + "scX": 0.9955, + "scY": 1.0045, + "x": -0.502 + } + } + ], + "name": "foot_r" + }, + { + "display": [ + { + "type": "image", + "name": "mecha_1502b_folder/thigh_l", + "transform": { + "y": -5.55, + "skX": 0.0463, + "skY": 0.0455, + "x": 13.45 + } + } + ], + "name": "thigh_l" + }, + { + "display": [ + { + "transform": {}, + "type": "armature", + "name": "weapon_1502b_l", + "filterType": null + } + ], + "name": "weapon_l" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "length": 20, + "transform": { + "y": -25, + "scX": 0.9955, + "x": 62.85 + }, + "parent": "root", + "inheritScale": 0, + "name": "foot_l" + }, + { + "length": 40, + "transform": { + "y": -133.55, + "skX": 21.9887, + "skY": 21.9887, + "scX": 0.9995, + "scY": 0.9977, + "x": 8.3 + }, + "parent": "root", + "inheritScale": 0, + "name": "thigh_l" + }, + { + "length": 42, + "transform": { + "y": -112.45, + "skX": 69.8809, + "skY": 69.8854, + "scX": 0.9876, + "scY": 0.9979, + "x": -8.55 + }, + "parent": "root", + "inheritScale": 0, + "name": "thigh_r" + }, + { + "length": 20, + "transform": { + "y": -123.15, + "skX": -89.9991, + "skY": -89.9991 + }, + "parent": "root", + "inheritScale": 0, + "name": "pelvis" + }, + { + "length": 20, + "transform": { + "y": -4, + "scX": 0.9955, + "x": -43.8 + }, + "parent": "root", + "inheritScale": 0, + "name": "foot_r" + }, + { + "length": 50, + "transform": { + "y": -0.04, + "skX": 97.9614, + "skY": 97.9621, + "scX": 0.9894, + "scY": 0.9971, + "x": 40.11 + }, + "parent": "thigh_l", + "inheritScale": 0, + "name": "thigh_1_l" + }, + { + "length": 20, + "transform": { + "skX": -90, + "skY": -90, + "x": 13.75 + }, + "parent": "pelvis", + "inheritScale": 0, + "name": "chest" + }, + { + "length": 53, + "transform": { + "y": -0.01, + "skX": 105.4235, + "skY": 105.423, + "scX": 0.9984, + "scY": 0.9995, + "x": 41.52 + }, + "parent": "thigh_r", + "inheritScale": 0, + "name": "thigh_1_r" + }, + { + "length": 20, + "transform": { + "y": 31.28, + "scX": 0.9965, + "scY": 0.9969, + "x": 13.74 + }, + "parent": "chest", + "inheritScale": 0, + "name": "shouder_r" + }, + { + "length": 20, + "transform": { + "y": 46.59, + "scX": 0.9965, + "scY": 0.9969, + "x": -2.41 + }, + "parent": "chest", + "inheritScale": 0, + "name": "shouder_l" + }, + { + "inheritRotation": 0, + "length": 100, + "transform": { + "y": 3.13, + "skX": 130, + "skY": 130, + "x": 11.65 + }, + "parent": "chest", + "inheritScale": 0, + "name": "effects_b" + }, + { + "length": 64, + "transform": { + "y": 0.01, + "skX": -70.8583, + "skY": -70.864, + "scX": 1.0149, + "scY": 0.9967, + "x": 50.91 + }, + "parent": "thigh_1_l", + "inheritScale": 0, + "name": "calf_l" + }, + { + "inheritRotation": 0, + "length": 100, + "transform": { + "y": -13.37, + "skX": 90, + "skY": 90, + "x": -20.82 + }, + "parent": "chest", + "inheritScale": 0, + "name": "effects_f" + }, + { + "length": 66, + "transform": { + "y": -0.02, + "skX": -88.4874, + "skY": -88.4933, + "scX": 0.9852, + "scY": 0.9996, + "x": 53.26 + }, + "parent": "thigh_1_r", + "inheritScale": 0, + "name": "calf_r" + }, + { + "length": 100, + "transform": { + "skX": 180, + "skY": 180, + "scX": 0.9982, + "scY": 0.9994, + "x": 5.98 + }, + "parent": "shouder_r", + "inheritScale": 0, + "name": "weapon_r" + }, + { + "length": 100, + "transform": { + "y": 0.04, + "skX": 180, + "skY": 180, + "scX": 0.998, + "scY": 0.9993, + "x": 5.6 + }, + "parent": "shouder_l", + "inheritScale": 0, + "name": "weapon_l" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 202.6571337556091, + "y": -262.3655325241823, + "height": 320.2820325241823, + "x": -111.39678584090109 + }, + "slot": [ + { + "name": "weapon_l", + "parent": "weapon_l", + "color": {} + }, + { + "z": 1, + "name": "shouder_l", + "parent": "shouder_l", + "color": {} + }, + { + "z": 2, + "name": "foot_l", + "parent": "foot_l", + "color": {} + }, + { + "z": 3, + "name": "thigh_1_l", + "parent": "thigh_1_l", + "color": {} + }, + { + "z": 4, + "name": "calf_l", + "parent": "calf_l", + "color": {} + }, + { + "z": 5, + "name": "thigh_l", + "parent": "thigh_l", + "color": {} + }, + { + "z": 6, + "name": "pelvis", + "parent": "pelvis", + "color": {} + }, + { + "z": 7, + "name": "effects_f", + "parent": "effects_f", + "color": { + "aM": 0 + } + }, + { + "z": 8, + "name": "chest", + "parent": "chest", + "color": {} + }, + { + "z": 9, + "name": "effects_b", + "parent": "effects_b", + "color": { + "aM": 0 + } + }, + { + "z": 10, + "name": "foot_r", + "parent": "foot_r", + "color": {} + }, + { + "z": 11, + "name": "thigh_1_r", + "parent": "thigh_1_r", + "color": {} + }, + { + "z": 12, + "name": "calf_r", + "parent": "calf_r", + "color": {} + }, + { + "z": 13, + "name": "thigh_r", + "parent": "thigh_r", + "color": {} + }, + { + "z": 14, + "name": "shouder_r", + "parent": "shouder_r", + "color": {} + }, + { + "z": 15, + "name": "weapon_r", + "parent": "weapon_r", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "mecha_1502b", + "ik": [ + { + "bone": "calf_l", + "chain": 1, + "bendPositive": "false", + "name": "calf_l", + "target": "foot_l" + }, + { + "bone": "calf_r", + "chain": 1, + "bendPositive": "false", + "name": "calf_r", + "target": "foot_r" + } + ], + "animation": [ + { + "duration": 60, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -0.04, + "skY": 0.0009, + "scX": 1.0004, + "x": -0.01 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -0.61, + "skX": 3.5176, + "skY": 3.5176, + "x": -0.46 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -3.95, + "skX": 3.2612, + "skY": 3.2619, + "scX": 1.0008, + "scY": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -4 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "skX": -3.4867, + "skY": -3.5176, + "scX": 0.9996, + "scY": 1.0027 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": -4.05, + "skX": 2.2559, + "skY": 2.2558, + "scX": 0.9985, + "scY": 1.0002 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": 0.55, + "skX": 3.5176, + "skY": 3.5176, + "x": 0.49 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 30, + "transform": { + "y": 0.06, + "skY": -0.0009, + "scX": 1.0002, + "x": 0.01 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 60, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.2, + "name": "idle", + "playTimes": 0 + }, + { + "duration": 30, + "frame": [ + { + "duration": 14, + "tweenEasing": null + }, + { + "duration": 16, + "tweenEasing": null, + "events": [ + { + "name": "step", + "bone": "foot_r" + } + ] + }, + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "step" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.21, + "skX": -13.2798, + "skY": -13.279, + "x": 0.32 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.2, + "skX": -12.4984, + "skY": -12.4984, + "scX": 0.9998, + "x": 0.25 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.28, + "skX": -12.29, + "skY": -12.2892, + "scX": 0.9997, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.21, + "skX": -16.0776, + "skY": -16.0767, + "scX": 0.9996, + "scY": 0.9998, + "x": 0.33 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.14, + "skX": -15.1996, + "skY": -15.1996, + "scX": 0.9997, + "x": 0.52 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.15, + "skX": -13.4429, + "skY": -13.442, + "x": 0.87 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.21, + "skX": -13.2798, + "skY": -13.279, + "x": 0.32 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -0.49, + "skX": 11.6982, + "skY": 10.0384, + "scX": 1.1315, + "scY": 1.0017, + "x": -1.93 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -1.58, + "skX": 9.3988, + "skY": 9.2902, + "scX": 1.0079, + "x": -0.43 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -2.37, + "skX": 8.1528, + "skY": 9.1018, + "scX": 0.9313, + "scY": 0.9988, + "x": 0.46 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.99, + "skX": 13.6189, + "skY": 13.1293, + "scX": 1.037, + "scY": 1.0004, + "x": -1.3 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.1, + "skX": 14.9031, + "skY": 12.4457, + "scX": 1.2006, + "scY": 1.0028, + "x": -3.33 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 1.08, + "skX": 13.1082, + "skY": 10.6515, + "scX": 1.2005, + "scY": 1.0028, + "x": -3.69 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.49, + "skX": 11.6982, + "skY": 10.0384, + "scX": 1.1315, + "scY": 1.0017, + "x": -1.93 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.3, + "scX": 0.999, + "x": 16.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.3, + "scX": 0.9981, + "x": 12.15 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -1.15, + "scX": 0.9994, + "x": -7.15 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -2.5, + "scX": 1.0021, + "x": -39.35 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -5.1, + "skX": 1.0018, + "skY": 1.0018, + "scX": 1.0028, + "x": -81.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -10.25, + "skX": 8.0065, + "skY": 8.0073, + "scX": 0.9898, + "scY": 0.9991, + "x": -102.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -13.45, + "skX": 14.0174, + "skY": 14.0174, + "scX": 1.0146, + "scY": 0.9985, + "x": -108.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -20.4, + "skX": 28.3082, + "skY": 28.3075, + "scX": 0.9856, + "scY": 0.9973, + "x": -111.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -29.65, + "skX": 37.8443, + "skY": 37.847, + "scX": 0.9987, + "scY": 0.9968, + "x": -86.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -33.25, + "skX": 38.3489, + "skY": 38.3494, + "scX": 1.0058, + "scY": 0.9968, + "x": -71.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -35.1, + "skX": 26.0511, + "skY": 26.0511, + "scX": 1.004, + "scY": 0.9974, + "x": -49.45 + }, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -33.55, + "skX": 18.2766, + "skY": 18.2774, + "scX": 1.0066, + "scY": 0.998, + "x": -39.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -12.45, + "skX": -15.7668, + "skY": -15.7676, + "scX": 1.0049, + "scY": 0.9982, + "x": 14.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.3, + "scX": 0.999, + "x": 16.75 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -10.85, + "skX": 1.7556, + "skY": 1.7583, + "scX": 1.0008, + "x": -4.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.8, + "skX": 8.7821, + "skY": 8.7805, + "scX": 0.9991, + "scY": 0.9994, + "x": -5.75 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -8.05, + "skX": 15.0552, + "skY": 15.0559, + "scX": 0.9974, + "scY": 0.9992, + "x": -7.55 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -17.85, + "skX": 28.8664, + "skY": 28.8666, + "scX": 0.9897, + "scY": 0.9991, + "x": -10.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -24.1, + "skX": 47.6881, + "skY": 47.6814, + "scX": 0.9656, + "scY": 1.0002, + "x": -15.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -14.5, + "skX": 56.4569, + "skY": 56.4521, + "scX": 0.9566, + "scY": 1.001, + "x": -15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -10.05, + "skX": 54.9538, + "skY": 54.9501, + "scX": 0.9602, + "scY": 1.0009, + "x": -15.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 1.6, + "skX": 48.189, + "skY": 48.1838, + "scX": 0.9672, + "scY": 1.0002, + "x": -14.9 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.85, + "skX": 39.9103, + "skY": 39.9075, + "scX": 0.9635, + "scY": 0.9996, + "x": -14.4 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.75, + "skX": 32.1298, + "skY": 32.1271, + "scX": 0.971, + "scY": 0.9992, + "x": -13.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -6.1, + "skX": 12.5454, + "skY": 12.5447, + "scX": 0.993, + "scY": 0.9993, + "x": -11.95 + }, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -9.45, + "skX": 5.0166, + "skY": 5.0169, + "scX": 0.9989, + "scY": 0.9996, + "x": -10.85 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -15.3, + "skX": -4.2618, + "skY": -4.2608, + "scX": 1.0018, + "scY": 1.0004, + "x": -4.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -10.85, + "skX": 1.7556, + "skY": 1.7583, + "scX": 1.0008, + "x": -4.15 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -11.35, + "skX": 8.7547, + "skY": 8.7549, + "scX": 0.9864, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -6.75, + "skX": 8.5031, + "skY": 8.5048, + "scX": 0.9816, + "scY": 0.999, + "x": -9.3 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -16.4, + "skX": 8.7549, + "skY": 8.7555, + "scX": 0.984, + "scY": 0.999, + "x": -8.75 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -11.35, + "skX": 9.0056, + "skY": 9.0057, + "scX": 1.0044, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -2.3, + "skX": 9.2556, + "skY": 9.2542, + "scX": 1.0118, + "scY": 0.999, + "x": -12.45 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -9.95, + "skX": 9.5045, + "skY": 9.5052, + "scX": 1.0123, + "scY": 0.9989, + "x": -12.45 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -11.35, + "skX": 8.7547, + "skY": 8.7549, + "scX": 0.9864, + "scY": 0.999, + "x": -10.5 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": -0.18, + "skX": -5.5, + "skY": -5.5135, + "scX": 0.9997, + "scY": 1.001, + "x": -0.09 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.05, + "skX": -5.2163, + "skY": -5.2966, + "scX": 0.9997, + "scY": 1.0072, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.03, + "skX": -5.4472, + "skY": -5.5673, + "scX": 0.9998, + "scY": 1.0109, + "x": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.01, + "skX": -5.9558, + "skY": -6.0573, + "scX": 0.9997, + "scY": 1.0092, + "x": 0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.12, + "skX": -6.5087, + "skY": -6.5003, + "scX": 0.9997, + "scY": 0.9991, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -0.25, + "skX": -6.7986, + "skY": -6.7138, + "scX": 0.9996, + "scY": 0.992, + "x": -0.27 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.18, + "skX": -5.5, + "skY": -5.5135, + "scX": 0.9997, + "scY": 1.001, + "x": -0.09 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.4, + "skX": 7.0054, + "skY": 7.0071, + "scX": 0.9748, + "scY": 0.9992, + "x": -16.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -17.5, + "skX": 28.5597, + "skY": 28.5583, + "scX": 1.0043, + "scY": 0.9972, + "x": -20.95 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -24.25, + "skX": 21.5371, + "skY": 21.5363, + "scX": 1.0169, + "scY": 0.9977, + "x": 2.05 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -26.2, + "skX": 16.5221, + "skY": 16.5229, + "scX": 1.0189, + "scY": 0.9982, + "x": 15.95 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -30.85, + "skX": 11.2628, + "skY": 11.2628, + "scX": 1.0148, + "scY": 0.9987, + "x": 43.9 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -30.5, + "skX": 8.2592, + "skY": 8.2575, + "scX": 1.0131, + "scY": 0.9991, + "x": 56 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -6.25, + "skX": -15.0159, + "skY": -15.0143, + "scX": 1.017, + "scY": 0.9984, + "x": 101.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 7.85, + "skX": -1.25, + "skY": -1.2509, + "scX": 1.0029, + "scY": 0.9998, + "x": 102.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 7.8, + "skX": -0.625, + "skY": -0.6254, + "scX": 1.0016, + "x": 101.125 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 7.75, + "scX": 1.0003, + "x": 99.65 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 7.05, + "skX": 0.0035, + "skY": 0.0035, + "scX": 0.9988, + "x": 76.2 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 6.35, + "scX": 0.9979, + "x": 50.75 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 4.35, + "skX": 0.7527, + "skY": 0.7518, + "scX": 0.9933, + "x": 7.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.4, + "skX": 7.0054, + "skY": 7.0071, + "scX": 0.9748, + "scY": 0.9992, + "x": -16.75 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -11.8, + "skX": 23.2823, + "skY": 23.2807, + "scX": 1.0012, + "scY": 1.0018, + "x": -17.1 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.75, + "skX": 12.2765, + "skY": 12.2735, + "scX": 1.0078, + "scY": 1.0012, + "x": -14.2 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -5.4, + "skX": 5.5145, + "skY": 5.5127, + "scX": 1.0083, + "scY": 1.0005, + "x": -11.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -8.25, + "skX": -1.0013, + "skY": -1.0056, + "scX": 1.0099, + "scY": 0.9998, + "x": -9.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -14.85, + "skX": -15.3018, + "skY": -15.3079, + "scX": 1.0115, + "scY": 0.999, + "x": -6.85 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -18.05, + "skX": -21.8297, + "skY": -21.8354, + "scX": 1.0114, + "scY": 0.9988, + "x": -5.75 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -21.25, + "skX": -32.626, + "skY": -32.632, + "scX": 1.0082, + "scY": 0.999, + "x": -3.6 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -17, + "skX": -20.5755, + "skY": -20.5791, + "scX": 1.0115, + "scY": 0.9988, + "x": -4.5 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -12.7, + "skX": -15.0502, + "skY": -15.0562, + "scX": 1.0109, + "scY": 0.999, + "x": -5.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -6.3, + "skX": -20.0717, + "skY": -20.0779, + "scX": 1.0114, + "scY": 0.9989, + "x": -6.7 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -5.55, + "skX": -19.0685, + "skY": -19.0725, + "scX": 1.0093, + "scY": 0.9989, + "x": -10.45 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -13.95, + "skX": -5.767, + "skY": -5.77, + "scX": 1.0024, + "scY": 0.9995, + "x": -13 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -22.55, + "skX": 15.5262, + "skY": 15.5271, + "scX": 0.9958, + "scY": 1.0016, + "x": -16.3 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -11.8, + "skX": 23.2823, + "skY": 23.2807, + "scX": 1.0012, + "scY": 1.0018, + "x": -17.1 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.66, + "skX": 9.4644, + "skY": 9.6617, + "scX": 0.9857, + "scY": 0.9996, + "x": 1.86 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 1.24, + "skX": 6.8557, + "skY": 8.4041, + "scX": 0.8951, + "scY": 0.9983, + "x": 0.3 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 1.82, + "skX": 5.8718, + "skY": 7.4208, + "scX": 0.8951, + "scY": 0.9983, + "x": -0.57 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 1.85, + "skX": 11.6349, + "skY": 13.1834, + "scX": 0.8952, + "scY": 0.9984, + "x": 1.19 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.6, + "skX": 13.0119, + "skY": 12.1388, + "scX": 1.0644, + "scY": 1.0008, + "x": 3.01 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": -0.16, + "skX": 11.7217, + "skY": 9.922, + "scX": 1.1373, + "scY": 1.0019, + "x": 3.6 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.66, + "skX": 9.4644, + "skY": 9.6617, + "scX": 0.9857, + "scY": 0.9996, + "x": 1.86 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 4, + "transform": { + "y": 0.27, + "skX": -12.9031, + "skY": -12.9031, + "scX": 0.9997, + "x": 0.2 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.3, + "skX": -11.6123, + "skY": -11.6123, + "scX": 0.9996, + "scY": 0.9998, + "x": -0.16 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.42, + "skX": -10.609, + "skY": -10.6081, + "scX": 0.9995, + "scY": 0.9998, + "x": -0.9 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.35, + "skX": -16.1317, + "skY": -16.1317, + "scX": 0.9993, + "scY": 0.9998, + "x": 0.14 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.17, + "skX": -14.8927, + "skY": -14.8927, + "scX": 0.9995, + "scY": 0.9998, + "x": 0.41 + }, + "tweenEasing": 0 + }, + { + "duration": 8, + "transform": { + "y": 0.19, + "skX": -12.7133, + "skY": -12.7133, + "scX": 0.9996, + "x": 0.41 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.27, + "skX": -12.9031, + "skY": -12.9031, + "scX": 0.9997, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 30, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.2, + "name": "walk", + "playTimes": 0 + }, + { + "duration": 3, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.08, + "skX": -0.0054, + "skY": -0.0046, + "scX": 1.002, + "scY": 1.0006, + "x": 0.19 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.1, + "skX": -0.0054, + "skY": -0.0046, + "scX": 1.002, + "scY": 1.0006, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.48, + "skX": 4.4951, + "skY": 4.5075, + "scX": 1.0004, + "scY": 1.0015, + "x": -0.78 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.86, + "skX": 7.4976, + "skY": 7.5101, + "scX": 1.0004, + "scY": 1.0015, + "x": -1.1 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 13.534, + "skX": -7.269, + "skY": -7.269, + "scX": 0.9988, + "scY": 1.0015, + "x": -17.524 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 15.434, + "skX": -7.269, + "skY": -7.269, + "scX": 0.9988, + "scY": 1.0015, + "x": -17.524 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 13.834, + "skX": -1.7543, + "skY": -1.7543, + "scX": 0.9998, + "x": -17.574 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 15.734, + "skX": -1.7543, + "skY": -1.7543, + "scX": 0.9998, + "x": -17.574 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.1, + "skX": -4.5063, + "skY": -4.5021, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.05 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.33, + "skX": -5.7548, + "skY": -5.7494, + "scX": 0.9996, + "scY": 0.9992, + "x": -0.03 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 14.134, + "skX": 8.2707, + "skY": 8.2663, + "scX": 1.0112, + "scY": 1.0015, + "x": -17.674 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 16.034, + "skX": 8.2707, + "skY": 8.2663, + "scX": 1.0112, + "scY": 1.0015, + "x": -17.674 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.37, + "skX": 4.4953, + "skY": 4.5082, + "scX": 1.0005, + "scY": 1.0015, + "x": 0.66 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.89, + "skX": 7.4979, + "skY": 7.5107, + "scX": 1.0005, + "scY": 1.0015, + "x": 1.13 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.05, + "skX": -0.0061, + "skY": -0.0061, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.15 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.06, + "skX": -0.0061, + "skY": -0.0061, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.2, + "name": "attack_01", + "playTimes": 5 + }, + { + "duration": 9, + "frame": [ + { + "duration": 4, + "tweenEasing": null + }, + { + "duration": 5, + "tweenEasing": null, + "events": [ + { + "name": "step", + "bone": "foot_l" + } + ] + }, + { + "duration": 0, + "action": "attack_02_1", + "tweenEasing": null + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.19, + "skY": 0.0009, + "scX": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.19, + "skY": 0.0009, + "scX": 1.0011, + "scY": 1.0003, + "x": 0.37 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.34 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.27, + "skX": 6.0331, + "skY": 6.0331, + "x": -0.86 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.89, + "skX": 4.524, + "skY": 4.524, + "x": -1.17 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.16, + "skX": 0.0044, + "skY": 0.0044, + "x": -0.45 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -15.75, + "x": -60.15 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -28.65, + "skX": 47.9363, + "skY": 47.934, + "scX": 0.9793, + "scY": 1.0002, + "x": -19.85 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -17.3, + "skX": 92.2581, + "skY": 92.2557, + "scX": 0.9465, + "x": -39.65 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 18.95, + "skX": 48.1876, + "skY": 48.1844, + "scX": 0.9767, + "scY": 1.0002, + "x": -55.2 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 19.15, + "x": -56 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -1.55, + "skX": -5.9764, + "skY": -6.0331, + "scX": 0.9994, + "scY": 1.0047, + "x": 35.55 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": -0.1, + "skX": -4.4827, + "skY": -4.524, + "scX": 0.9995, + "scY": 1.0035, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.1, + "skX": -0.0026, + "skY": -0.0044, + "scY": 1.0002, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -29.5, + "skX": 9.5199, + "skY": 9.5204, + "scX": 0.9925, + "scY": 1.0009, + "x": -20.5 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 19.4, + "skX": -35.3872, + "skY": -35.392, + "scX": 1.0113, + "scY": 0.999, + "x": -56.8 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 1.38, + "skX": 6.0331, + "skY": 6.0331, + "x": 1.16 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.32, + "skX": 4.524, + "skY": 4.524, + "x": 1.44 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.43, + "skX": 0.0044, + "skY": 0.0044, + "x": 0.93 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": 0.23, + "skY": -0.0009, + "scX": 0.9996, + "scY": 0.9998 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 0.22, + "scX": 1.0008, + "scY": 1.0003, + "x": 0.38 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.24, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.37 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 9, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 9, + "actions": [ + { + "gotoAndPlay": "prepare_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 9, + "actions": [ + { + "gotoAndPlay": "prepare_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.2, + "name": "attack_02" + }, + { + "duration": 3, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.34 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "action": "fire_01", + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.33 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.16, + "skX": 0.0044, + "skY": 0.0044, + "x": -0.45 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.72, + "skX": 3.5184, + "skY": 3.5184, + "x": -0.9 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": { + "y": -4.85, + "x": -110.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 18.95, + "skX": 48.1876, + "skY": 48.1844, + "scX": 0.9767, + "scY": 1.0002, + "x": -55.2 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22, + "skX": 46.6831, + "skY": 46.6806, + "scX": 0.9778, + "x": -56.4 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 19.15, + "x": -56 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22.25, + "x": -57.2 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.1, + "skX": -0.0026, + "skY": -0.0044, + "scY": 1.0002, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.1, + "skX": -3.4856, + "skY": -3.5184, + "scX": 0.9996, + "scY": 1.0029, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 19.4, + "skX": -35.3872, + "skY": -35.392, + "scX": 1.0113, + "scY": 0.999, + "x": -56.8 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 22.55, + "skX": -39.4031, + "skY": -39.4078, + "scX": 1.0107, + "scY": 0.9992, + "x": -58 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.43, + "skX": 0.0044, + "skY": 0.0044, + "x": 0.93 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 0.12, + "skX": 3.5184, + "skY": 3.5184, + "x": 1.51 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.24, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.37 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "action": "fire_01", + "transform": { + "y": 0.18, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.39 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + }, + { + "duration": 0, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 3, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 3, + "actions": [ + { + "gotoAndPlay": "fire_01" + } + ], + "tweenEasing": null + } + ], + "name": "weapon_r" + } + ], + "fadeInTime": 0.1, + "name": "attack_02_1", + "playTimes": 10 + }, + { + "duration": 10, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.04, + "scX": 1.0015, + "scY": 1.0005, + "x": -0.02 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.36, + "skX": -20.7464, + "skY": -20.7456, + "scX": 0.9988, + "scY": 0.9996, + "x": 0.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.14, + "skX": 8.9426, + "skY": 8.9434, + "scX": 0.9982, + "scY": 0.9994, + "x": 0.44 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.19, + "skX": 5.5746, + "skY": 5.5754, + "scX": 0.9974, + "scY": 0.9991, + "x": 0.49 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.13, + "skX": 47.427, + "skY": 47.4278, + "scX": 0.9977, + "scY": 0.9992, + "x": 0.56 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.09, + "skX": 52.6335, + "skY": 52.6343, + "scX": 0.9973, + "scY": 0.9991, + "x": 0.51 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -2.07, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.5, + "skX": -1.9074, + "skY": -1.9139, + "x": -1.87 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 2.88, + "skX": -8.0387, + "skY": -8.0452, + "x": 3.68 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 1.72, + "skX": -1.6311, + "skY": -1.6376, + "x": 1.42 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 3.09, + "skX": -28.3747, + "skY": -28.3747, + "x": 4.47 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 3.2, + "skX": -16.7919, + "skY": -16.7984, + "x": 5.39 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 6, + "transform": { + "y": -5, + "x": -114.2 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -5, + "x": -114.2 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.05, + "skX": 10.0352, + "skY": 10.0352, + "scX": 1.0014, + "scY": 0.9993, + "x": 15.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -24.4, + "skX": 54.7039, + "skY": 54.6998, + "scX": 0.9738, + "scY": 1.0008, + "x": -51.9 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45, + "skX": 31.1254, + "skY": 31.1262, + "scX": 0.9895, + "scY": 0.9991, + "x": -81.7 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 35.8, + "skX": 28.1119, + "skY": 28.1111, + "scX": 0.993, + "scY": 0.9991, + "x": -81.75 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 44.8, + "skX": 17.8174, + "skY": 17.8178, + "scX": 0.9986, + "scY": 0.9991, + "x": -87.3 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45.8, + "skX": 16.3115, + "skY": 16.3114, + "scX": 0.9993, + "scY": 0.9991, + "x": -87.9 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 44.8, + "skX": 16.8133, + "skY": 16.8129, + "scX": 0.9992, + "scY": 0.9991, + "x": -87.3 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.25, + "skX": -1.7519, + "skY": -1.7533, + "scX": 1.0015, + "scY": 0.9997, + "x": 15.55 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -24.75, + "skX": 12.2581, + "skY": 12.2593, + "scX": 0.9907, + "scY": 0.9986, + "x": -52.7 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 45.6, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -82.85 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 36.25, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -82.9 + }, + "tweenEasing": 0 + }, + { + "duration": 3, + "transform": { + "y": 45.35, + "skX": -6.5047, + "skY": -6.5058, + "scX": 1.0051, + "scY": 0.9993, + "x": -88.5 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -0.08, + "skX": -10.2014, + "skY": -10.3185, + "scX": 0.9988, + "scY": 1.0096 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.12, + "skX": -24.2129, + "skY": -24.3318, + "scX": 0.9988, + "scY": 1.0097, + "x": 0.06 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.13, + "skX": 30.9807, + "skY": 31.1144, + "scX": 0.9974, + "scY": 0.985, + "x": -0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.17, + "skX": 19.224, + "skY": 19.3108, + "scX": 0.9985, + "scY": 0.9906, + "x": -0.12 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": 25.9728, + "skY": 26.0924, + "scX": 0.9978, + "scY": 0.9869, + "x": -0.09 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.84, + "skX": 34.7399, + "skY": 34.8805, + "scX": 0.9972, + "scY": 0.9841, + "x": -1.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.07, + "skX": 38.5028, + "skY": 38.6462, + "scX": 0.9969, + "scY": 0.9836, + "x": -0.09 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.2, + "x": -26.7 + }, + "tweenEasing": 0 + }, + { + "duration": 4, + "transform": { + "y": -2, + "x": -43.6 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2, + "x": -43.6 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": { + "y": -0.21, + "skX": -23.7864, + "skY": -23.7989, + "scX": 0.9872, + "scY": 0.9984, + "x": 0.12 + }, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": { + "y": -0.04, + "skX": 28.5439, + "skY": 28.5391, + "scX": 0.9903, + "scY": 0.9993, + "x": 0.32 + }, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": -14.4, + "skX": 7.7667, + "skY": 7.7665, + "scX": 0.9946, + "scY": 1.0007, + "x": 15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -25.15, + "skX": -4.7653, + "skY": -4.7658, + "scX": 1.0019, + "scY": 0.9996, + "x": -53.5 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 46.15, + "skX": 8.5209, + "skY": 8.5185, + "scX": 0.9989, + "scY": 1.0008, + "x": -84 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 36.7, + "skX": -12.0389, + "skY": -12.0428, + "scX": 1.008, + "scY": 0.9992, + "x": -84.1 + }, + "tweenEasing": 0 + }, + { + "duration": 1, + "transform": { + "y": 45.95, + "skX": -5.2656, + "skY": -5.2681, + "scX": 1.0059, + "scY": 0.9996, + "x": -89.75 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 46.95, + "skX": 0.7538, + "skY": 0.7506, + "scX": 1.0032, + "x": -90.35 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 45.95, + "skX": 0.5035, + "skY": 0.5004, + "scX": 1.0031, + "x": -89.75 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 1.98, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.21 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 2.32, + "skX": -26.7681, + "skY": -26.7747, + "scX": 0.7204, + "scY": 0.9983, + "x": 2.18 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.33, + "skX": 1.9651, + "skY": 1.9585, + "scX": 0.8952, + "scY": 0.9985, + "x": -2.87 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -2.65, + "skX": -10.8838, + "skY": -10.8904, + "scX": 0.9907, + "scY": 1.0009, + "x": -0.64 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -4.74, + "skX": -32.6458, + "skY": -32.6387, + "scX": 0.9997, + "scY": 1.0002, + "x": -3.51 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -5.12, + "skX": -24.7198, + "skY": -24.7264, + "scX": 1.0003, + "x": -4.15 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 2, + "transform": { + "y": 0.02, + "skY": -0.0009, + "scX": 1.0013, + "scY": 1.0004, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.22, + "skX": 11.8408, + "skY": 11.8408, + "scX": 0.9986, + "scY": 0.9996, + "x": 9.24 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.14, + "skX": 7.9952, + "skY": 7.9952, + "scX": 0.9993, + "scY": 0.9998, + "x": 0.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.56, + "skX": 19.4318, + "skY": 19.4318, + "scX": 0.9968, + "scY": 0.999, + "x": 11.53 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.54, + "skX": 48.2468, + "skY": 48.2468, + "scX": 0.9976, + "scY": 0.9992, + "x": 11.64 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -1.55, + "skX": 57.4615, + "skY": 57.4615, + "scX": 0.9969, + "scY": 0.999, + "x": 11.65 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 10, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "death" + }, + { + "duration": 8, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.04, + "scX": 0.9989, + "scY": 0.9996, + "x": -0.02 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.17, + "skY": 0.0009, + "scX": 1.0013, + "scY": 1.0004, + "x": 0.26 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.23, + "skY": 0.0017, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.28 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.15, + "skY": 0.0009, + "scX": 1.0019, + "scY": 1.0006, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.07, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.35 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.18, + "skX": -3.0111, + "skY": -3.0111, + "x": 0.04 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -0.36, + "skX": -9.4689, + "skY": -9.4689, + "x": 9.94 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 1.45, + "skX": -12.052, + "skY": -12.052, + "x": 1.5 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -8.45, + "x": -53 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -1.25, + "x": -78.8 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.05, + "skX": 10.0352, + "skY": 10.0352, + "scX": 1.0014, + "scY": 0.9993, + "x": 15.35 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -1.35, + "skX": -8.0191, + "skY": -8.0191, + "scX": 0.9964, + "scY": 1.0008, + "x": -51.85 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 2, + "skX": 1.003, + "skY": 1.0023, + "scX": 1.0002, + "x": -61.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.1, + "skX": 6.0193, + "skY": 6.02, + "scX": 1.0013, + "scY": 0.9996, + "x": -54.65 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.25, + "skX": -1.7519, + "skY": -1.7533, + "scX": 1.0015, + "scY": 0.9997, + "x": 15.55 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.4, + "skX": 12.2581, + "skY": 12.2593, + "scX": 0.9907, + "scY": 0.9986, + "x": -52.6 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.15, + "skX": 10.5078, + "skY": 10.507, + "scX": 0.9919, + "scY": 0.9989, + "x": -55.45 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.08, + "skX": -10.2014, + "skY": -10.3185, + "scX": 0.9988, + "scY": 1.0096 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -0.09, + "skX": -9.2713, + "skY": -9.2481, + "scX": 0.9996, + "scY": 0.9976, + "x": -0.05 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -0.09, + "skX": 1.4611, + "skY": 1.5451, + "scX": 0.9986, + "scY": 0.991, + "x": -0.05 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.2, + "x": -26.7 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -14.4, + "skX": 7.7667, + "skY": 7.7665, + "scX": 0.9946, + "scY": 1.0007, + "x": 15.75 + }, + "tweenEasing": 0 + }, + { + "duration": 7, + "transform": { + "y": -1.45, + "skX": -7.5225, + "skY": -7.525, + "scX": 1.0041, + "scY": 0.9994, + "x": -53.35 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 7.25, + "skX": -1.0033, + "skY": -1.0035, + "scX": 1.0007, + "scY": 0.9998, + "x": -56.25 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.98, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.21 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": -0.54, + "skX": -3.0111, + "skY": -3.0111, + "x": 0.42 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": -3.08, + "skX": -9.4689, + "skY": -9.4689, + "x": 8.58 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": -1.98, + "skX": -12.052, + "skY": -12.052, + "x": -0.92 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.02, + "skY": -0.0009, + "scX": 0.9986, + "scY": 0.9995, + "x": -0.1 + }, + "tweenEasing": 0 + }, + { + "duration": 5, + "transform": { + "y": 0.24, + "scX": 1.001, + "scY": 1.0004, + "x": 0.17 + }, + "tweenEasing": 0 + }, + { + "duration": 2, + "transform": { + "y": 0.29, + "scX": 1.0014, + "scY": 1.0005, + "x": 0.27 + }, + "tweenEasing": 0 + }, + { + "duration": 0, + "transform": { + "y": 0.18, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.26 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 8, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "hit" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.24, + "skY": 0.0009, + "scX": 0.9983, + "scY": 0.9994, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.18, + "skX": -17.0743, + "skY": -17.0743, + "x": 3.04 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.25, + "x": -51.4 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 32.95, + "skX": 28.6151, + "skY": 28.6146, + "scX": 0.9929, + "scY": 0.9991, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 33.35, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": 16.9669, + "skY": 17.0743, + "scX": 0.9981, + "scY": 0.9882, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -23.137, + "skY": -23.137, + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.95, + "x": 20.4 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 33.85, + "skX": -1.0021, + "skY": -1.0039, + "scX": 1.002, + "scY": 0.9998, + "x": -6 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.82, + "skX": -17.0743, + "skY": -17.0743, + "x": -2.45 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.18, + "skY": 0.0009, + "scX": 0.9985, + "scY": 0.9995, + "x": 0.18 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_1" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.01, + "skY": 0.0009, + "scX": 1.0016, + "scY": 1.0005, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.03, + "skX": 12.0717, + "skY": 12.0717, + "x": -1.6 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 10.8, + "skX": 57.6806, + "skY": 57.68, + "scX": 0.9907, + "scY": 0.997, + "x": -83.05 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.2, + "skX": 46.6827, + "skY": 46.6812, + "scX": 0.9819, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 25.2948, + "skY": 25.2935, + "scX": 0.9847, + "scY": 0.9974, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.71, + "skX": -37.2482, + "skY": -37.3652, + "scX": 0.9988, + "scY": 1.0096, + "x": -0.2 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": 1.2365, + "skY": 1.2365 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -8.75, + "skX": 57.68, + "skY": 57.6793, + "scX": 0.9908, + "scY": 0.997, + "x": -44.3 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 31.0364, + "skY": 31.0434, + "scX": 0.9759, + "scY": 1.0009, + "x": -6.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.82, + "skX": 12.0717, + "skY": 12.0717, + "x": 1.49 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.08, + "scX": 0.9997, + "x": 0.11 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_2" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 3.11, + "skX": -29.9982, + "skY": -29.9974, + "scX": 1.002, + "scY": 1.0007, + "x": -2.66 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.01, + "skX": 12.0701, + "skY": 12.0703, + "x": -1.62 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 29.9, + "skX": -16.3344, + "skY": -16.3344, + "scX": 0.9907, + "scY": 0.997, + "x": -20.7 + }, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.2, + "skX": 27.2191, + "skY": 27.2173, + "scX": 0.9818, + "x": -5.9 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": 25.2948, + "skY": 25.2935, + "scX": 0.9847, + "scY": 0.9974, + "x": -5.95 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -16.22, + "skY": -16.22 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.71, + "skX": -7.25, + "skY": -7.3656, + "scX": 0.9988, + "scY": 1.0096, + "x": -0.2 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -11.7614, + "skY": -11.7614 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 34.35, + "skX": -17.8725, + "skY": -17.8709, + "scX": 0.9908, + "scY": 0.997, + "x": 29.95 + }, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.25, + "skX": -6.4479, + "skY": -6.4395, + "scX": 0.9759, + "scY": 1.0009, + "x": -6.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 1.84, + "skX": 12.0708, + "skY": 12.071, + "x": 1.48 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.28, + "skX": -29.9989, + "skY": -29.9989, + "scX": 1.0018, + "scY": 1.0006, + "x": 2.58 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_3" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.26, + "skX": -24.1896, + "skY": -24.1887, + "scX": 1.002, + "scY": 1.0007, + "x": -2.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.91, + "skX": -5.0202, + "skY": -5.0216, + "x": 0.77 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 37.6, + "skX": 7.7638, + "skY": 7.7638, + "scX": 0.9429, + "scY": 0.9992, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.1, + "x": 0.1 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.05, + "skX": 29.1728, + "skY": 29.2112, + "scX": 0.9994, + "scY": 0.9959, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "skX": -22.362, + "skY": -22.362, + "scX": 0.5, + "scY": 0.5 + }, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.65, + "skX": 11.7477, + "skY": 11.7432, + "scX": 0.9828, + "scY": 1.0009, + "x": 0.15 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -1.46, + "skX": -5.0204, + "skY": -5.0211, + "x": -0.78 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.18, + "skX": -24.1901, + "skY": -24.1901, + "scX": 1.0018, + "scY": 1.0006, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_f" + }, + { + "frame": [ + { + "duration": 1, + "tweenEasing": null, + "color": { + "aM": 0 + } + }, + { + "duration": 0, + "displayIndex": -1, + "tweenEasing": null, + "color": { + "aM": 0 + } + } + ], + "name": "effects_b" + } + ], + "fadeInTime": 0.1, + "name": "jump_4" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.16, + "skY": 0.0009, + "scX": 1.0015, + "scY": 1.0004, + "x": 0.19 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.9, + "skX": -5.0198, + "skY": -5.0198, + "x": 0.83 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 37.6, + "skX": -6.3646, + "skY": -6.3646, + "scX": 0.9429, + "scY": 0.9992, + "x": 0.05 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 38.1, + "x": 0.1 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.05, + "skX": 5.0015, + "skY": 5.0013, + "scX": 0.9994, + "scY": 0.9959, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 22.4, + "skX": 19.7978, + "skY": 19.7933, + "scX": 1.0112, + "scY": 1.0015, + "x": -6.7 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -1.38, + "skX": -5.0198, + "skY": -5.0198, + "x": -0.75 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.22, + "scX": 1.001, + "scY": 1.0002, + "x": 0.21 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "squat" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.09, + "skX": -20.5765, + "skY": -20.5756, + "scX": 1.002, + "scY": 1.0007, + "x": 0.13 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.41, + "skX": -16.7092, + "skY": -16.695, + "scX": 1.0004, + "scY": 1.0015, + "x": -0.79 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 20.85, + "skX": -5.0134, + "skY": -5.0141, + "scX": 0.9986, + "scY": 1.0014, + "x": -6.55 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.15, + "skX": -23.2231, + "skY": -23.2231, + "x": -6.6 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.11, + "skX": -29.5028, + "skY": -29.5002, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.06 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.45, + "skX": 7.2697, + "skY": 7.2648, + "scX": 1.011, + "scY": 1.0014, + "x": -6.7 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 0.44, + "skX": -16.7003, + "skY": -16.6872, + "scX": 1.0004, + "scY": 1.0015, + "x": 0.69 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": -20.5843, + "skY": -20.5843, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.2 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "aim_up" + }, + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 7.3, + "skX": 13.8338, + "skY": 13.8346, + "scX": 1.002, + "scY": 1.0007, + "x": -14.03 + }, + "tweenEasing": null + } + ], + "name": "weapon_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 2.72, + "skX": 19.4945, + "skY": 19.5066, + "scX": 1.0004, + "scY": 1.0015, + "x": 9.53 + }, + "tweenEasing": null + } + ], + "name": "shouder_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 29.0164, + "skX": -5.0138, + "skY": -5.0138, + "scX": 0.9986, + "scY": 1.0014, + "x": -3.8279 + }, + "tweenEasing": null + } + ], + "name": "thigh_l" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 21.15, + "skX": 35.6959, + "skY": 35.6959, + "x": -6.6 + }, + "tweenEasing": null + } + ], + "name": "pelvis" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.12, + "skX": 20.9537, + "skY": 20.9586, + "scX": 0.9997, + "scY": 0.9995, + "x": -0.1 + }, + "tweenEasing": null + } + ], + "name": "chest" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "foot_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "thigh_1_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "calf_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": 11.9358, + "skX": 0.0022, + "skY": -0.0022, + "x": -9.3081 + }, + "tweenEasing": null + } + ], + "name": "thigh_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -2.7, + "skX": 19.494, + "skY": 19.5068, + "scX": 1.0004, + "scY": 1.0015, + "x": -9.69 + }, + "tweenEasing": null + } + ], + "name": "shouder_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": { + "y": -0.07, + "skX": 13.8335, + "skY": 13.8335, + "scX": 1.0017, + "scY": 1.0005, + "x": 0.14 + }, + "tweenEasing": null + } + ], + "name": "weapon_r" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_b" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "effects_f" + } + ], + "slot": [], + "fadeInTime": 0.1, + "name": "aim_down" + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/back_l", + "transform": { + "y": 0.9655, + "skX": -1.9759, + "skY": -1.9759, + "x": -10.0006 + } + } + ], + "name": "back" + }, + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0001", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0002", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0003", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + } + ], + "name": "front" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "inheritScale": 0, + "transform": { + "y": -8, + "x": 81 + }, + "name": "fire", + "parent": "root" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 151.9727, + "y": -21.0345, + "height": 44, + "x": -68.0006 + }, + "slot": [ + { + "name": "back", + "parent": "root", + "color": {} + }, + { + "z": 1, + "name": "front", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "weapon_1502b_l", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [], + "name": "idle" + }, + { + "duration": 2, + "frame": [ + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "fire", + "bone": "fire" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 1, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": 2, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "fire_01" + }, + { + "duration": 6, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 2, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 2, + "tweenEasing": null + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "prepare_01", + "playTimes": 0 + } + ] + }, + { + "skin": [ + { + "name": "", + "slot": [ + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/back_r", + "transform": { + "y": 1.5324, + "skX": -1.9759, + "skY": -1.9759, + "x": -10.4813 + } + } + ], + "name": "back" + }, + { + "display": [ + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0001", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0002", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + }, + { + "type": "image", + "name": "weapon_1502b_folder/image/paoguan_0003", + "transform": { + "y": -2.6705, + "skX": -1.9759, + "skY": -1.9759, + "x": 36.9721 + } + } + ], + "name": "front" + } + ] + } + ], + "bone": [ + { + "transform": {}, + "name": "root" + }, + { + "inheritScale": 0, + "transform": { + "y": -7, + "x": 81 + }, + "name": "fire", + "parent": "root" + } + ], + "type": "Armature", + "frameRate": 24, + "aabb": { + "width": 154.9534, + "y": -20.9676, + "height": 45, + "x": -70.9813 + }, + "slot": [ + { + "name": "back", + "parent": "root", + "color": {} + }, + { + "z": 1, + "name": "front", + "parent": "root", + "color": {} + } + ], + "defaultActions": [ + { + "gotoAndPlay": "idle" + } + ], + "name": "weapon_1502b_r", + "ik": [], + "animation": [ + { + "duration": 1, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 1, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [], + "name": "idle" + }, + { + "duration": 2, + "frame": [ + { + "duration": 0, + "tweenEasing": null, + "events": [ + { + "name": "fire", + "bone": "fire" + } + ] + } + ], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 2, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 1, + "tweenEasing": null + }, + { + "duration": 1, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 0, + "displayIndex": 2, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "fire_01" + }, + { + "duration": 6, + "frame": [], + "ffd": [], + "bone": [ + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "fire" + }, + { + "frame": [ + { + "duration": 6, + "transform": {}, + "tweenEasing": null + } + ], + "name": "root" + } + ], + "slot": [ + { + "frame": [ + { + "duration": 2, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 1, + "tweenEasing": null + }, + { + "duration": 2, + "displayIndex": 2, + "tweenEasing": null + }, + { + "duration": 0, + "tweenEasing": null + } + ], + "name": "front" + } + ], + "name": "prepare_01", + "playTimes": 0 + } + ] + } + ], + "name": "mecha_1502b", + "version": "5.0" +} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.json b/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.json new file mode 100644 index 0000000..9452b23 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.json @@ -0,0 +1 @@ +{"width":512,"SubTexture":[{"width":74,"y":93,"height":20,"name":"bullet_01_f/bullet_01","x":307},{"width":48,"y":1,"height":38,"name":"fire_effect_01_f/fireEffect","x":212},{"width":180,"y":430,"height":52,"name":"flame_01_f/ba_bu_flame1","x":1},{"frameY":0,"y":1,"frameWidth":86,"frameX":-2,"frameHeight":234,"width":81,"height":233,"name":"flame_01_f/bbb","x":1},{"width":44,"y":1,"height":39,"name":"mecha_1502b_folder/shouder_l_0","x":319},{"width":29,"y":77,"height":106,"name":"mecha_1502b_folder/foot_l_0","x":434},{"width":50,"y":185,"height":32,"name":"mecha_1502b_folder/thigh_1_l_0","x":434},{"width":122,"y":177,"height":46,"name":"mecha_1502b_folder/calf_l","x":84},{"width":101,"y":118,"height":57,"name":"mecha_1502b_folder/thigh_l","x":84},{"width":41,"y":77,"height":65,"name":"mecha_1502b_folder/pelvis","x":465},{"width":89,"y":236,"height":192,"name":"mecha_1502b_folder/chest","x":1},{"width":29,"y":77,"height":109,"name":"mecha_1502b_folder/foot_r","x":403},{"width":55,"y":1,"height":32,"name":"mecha_1502b_folder/thigh_1_r_1","x":262},{"width":126,"y":1,"height":52,"name":"mecha_1502b_folder/calf_r","x":84},{"width":103,"y":55,"height":61,"name":"mecha_1502b_folder/thigh_r","x":84},{"width":43,"y":144,"height":39,"name":"mecha_1502b_folder/shouder_r_1","x":465},{"width":116,"y":55,"height":44,"name":"weapon_1502b_folder/back_l","x":189},{"frameY":0,"y":39,"frameWidth":94,"frameX":0,"frameHeight":36,"width":93,"height":36,"name":"weapon_1502b_folder/image/paoguan_0002","x":403},{"width":94,"y":1,"height":36,"name":"weapon_1502b_folder/image/paoguan_0003","x":403},{"width":94,"y":55,"height":36,"name":"weapon_1502b_folder/image/paoguan_0001","x":307},{"width":121,"y":118,"height":45,"name":"weapon_1502b_folder/back_r","x":187}],"height":512,"name":"mecha_1502b","imagePath":"mecha_1502b_tex.png"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.png b/reference/Pixi/Demos/resource/assets/core_element/mecha_1502b_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..368d0f3a0301bb58241614e964bdaf2dd803dce9 GIT binary patch literal 190205 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

Ru*jgBKwJ0yN%H^zU|SF4e{6~Wr*9pL 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

Wxxh!tx# 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 literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_ske.json b/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_ske.json new file mode 100644 index 0000000..532c09f --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003_folder/calf_r_0","transform":{"y":1.8721,"x":27.7907}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1003d_folder/thigh_l_0","transform":{"y":2.8796,"x":19.1837}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1002_folder/upperarm_r_2","transform":{"y":2.5661,"skX":-99.6918,"skY":-99.6918}}],"name":"shouder_r"},{"display":[{"type":"image","name":"mecha_1004_folder/chest_1","transform":{"y":46.4064,"skX":89.5694,"skY":89.5694,"x":-8.7784}}],"name":"chest"},{"display":[{"type":"image","name":"mecha_1004d_folder/foot_l_0","transform":{"y":7.7385,"skX":90,"skY":90,"x":2.3128}}],"name":"foot_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1003_folder/calf_l_0","transform":{"y":4.1499,"x":26.8604}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1003d_folder/thigh_r_0","transform":{"y":-7.6009,"x":15.0357}}],"name":"thigh_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1002_folder/upperarm_l_2","transform":{"y":-3.8492,"skX":-105.7978,"skY":-105.7978,"x":-0.8558}}],"name":"shouder_l"},{"display":[{"type":"image","name":"mecha_1004d_folder/foot_r_1","transform":{"y":9.2478,"skX":90,"skY":90,"x":2.5697}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":176.64362862645802,"y":-233.80623389915854,"height":281.5540549156089,"x":-95.10679917154837},"slot":[{"name":"shouder_l","parent":"shouder_l","color":{}},{"z":1,"name":"foot_l","parent":"foot_l","color":{}},{"z":2,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":3,"name":"calf_l","parent":"calf_l","color":{}},{"z":4,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":5,"name":"pelvis","parent":"pelvis","color":{}},{"z":6,"name":"chest","parent":"chest","color":{}},{"z":7,"name":"foot_r","parent":"foot_r","color":{}},{"z":8,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":9,"name":"calf_r","parent":"calf_r","color":{}},{"z":10,"name":"thigh_r","parent":"thigh_r","color":{}},{"z":11,"name":"shouder_r","parent":"shouder_r","color":{}}],"defaultActions":[{"gotoAndPlay":"empty"}],"name":"skin_a","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"empty","playTimes":0}]},{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003_folder/calf_r_0","transform":{"y":2.1179,"x":27.5723}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1008d_folder/thigh_r_0","transform":{"y":0.8121,"x":21.8806}}],"name":"thigh_r"},{"display":[{"type":"image","name":"mecha_1003_folder/foot_r_0","transform":{"y":10.5628,"skX":90,"skY":90}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1008d_folder/thigh_l_0","transform":{"y":-0.794,"x":21.2746}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1003_folder/calf_l_0","transform":{"y":3.7974,"x":25.8031}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1003_folder/foot_l_0","transform":{"y":10.132,"skX":90,"skY":90,"x":-0.2792}}],"name":"foot_l"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":181.67820326799887,"y":-159.1498821898437,"height":216.2126923697017,"x":-95.3644576640574},"slot":[{"name":"foot_l","parent":"foot_l","color":{}},{"z":1,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":2,"name":"calf_l","parent":"calf_l","color":{}},{"z":3,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":4,"name":"pelvis","parent":"pelvis","color":{}},{"z":5,"name":"foot_r","parent":"foot_r","color":{}},{"z":6,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":7,"name":"calf_r","parent":"calf_r","color":{}},{"z":8,"name":"thigh_r","parent":"thigh_r","color":{}}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"name":"skin_b","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"newAnimation","playTimes":0}]},{"skin":[{"name":"","slot":[{"display":[{"type":"image","name":"mecha_1003d_folder/calf_l_0","transform":{"y":1.8851,"x":27.6888}}],"name":"calf_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_r_1","transform":{"y":-1.9,"skX":0.438,"skY":0.438,"x":21.55}}],"name":"thigh_1_r"},{"display":[{"type":"image","name":"mecha_1007d_folder/foot_l_1","transform":{"y":9.6443,"skX":90,"skY":90,"x":6.2003}}],"name":"foot_l"},{"display":[{"type":"image","name":"mecha_1004d_folder/chest_1","transform":{"y":52.0796,"skX":90,"skY":90,"x":-10.0293}}],"name":"chest"},{"display":[{"type":"image","name":"mecha_1004d_folder/shouder_r_2","transform":{"y":-3.0957,"skX":-90,"skY":-90,"x":-5.4198}}],"name":"shouder_r"},{"display":[{"type":"image","name":"mecha_1007d_folder/thigh_l_0","transform":{"y":-0.447,"x":26.8758}}],"name":"thigh_l"},{"display":[{"type":"image","name":"mecha_1003d_folder/calf_r_0","transform":{"y":1.2965,"x":29.7327}}],"name":"calf_r"},{"display":[{"type":"image","name":"mecha_1502b_folder/thigh_1_l_0","transform":{"y":-2.95,"skX":0.1119,"skY":0.1128,"x":23}}],"name":"thigh_1_l"},{"display":[{"type":"image","name":"mecha_1007d_folder/foot_r_0","transform":{"y":11.1489,"skX":90,"skY":90,"x":7.3628}}],"name":"foot_r"},{"display":[{"type":"image","name":"mecha_1004d_folder/shouder_l_2","transform":{"y":-1.1608,"skX":-90,"skY":-90,"x":-7.7426}}],"name":"shouder_l"},{"display":[{"type":"image","name":"mecha_1502b_folder/pelvis","transform":{"y":7.5,"x":3.5}}],"name":"pelvis"},{"display":[{"type":"image","name":"mecha_1007d_folder/thigh_r_0","transform":{"y":1.6378,"x":22.6896}}],"name":"thigh_r"}]}],"bone":[{"transform":{},"name":"root"},{"length":20,"transform":{"y":-25,"scX":0.9955,"x":62.85},"parent":"root","inheritScale":0,"name":"foot_l"},{"length":40,"transform":{"y":-133.55,"skX":21.9887,"skY":21.9887,"scX":0.9995,"scY":0.9977,"x":8.3},"parent":"root","inheritScale":0,"name":"thigh_l"},{"length":42,"transform":{"y":-112.45,"skX":69.8809,"skY":69.8854,"scX":0.9876,"scY":0.9979,"x":-8.55},"parent":"root","inheritScale":0,"name":"thigh_r"},{"length":20,"transform":{"y":-123.15,"skX":-89.9991,"skY":-89.9991},"parent":"root","inheritScale":0,"name":"pelvis"},{"length":20,"transform":{"y":-4,"scX":0.9955,"x":-43.8},"parent":"root","inheritScale":0,"name":"foot_r"},{"length":50,"transform":{"y":-0.04,"skX":97.9614,"skY":97.9621,"scX":0.9894,"scY":0.9971,"x":40.11},"parent":"thigh_l","inheritScale":0,"name":"thigh_1_l"},{"length":20,"transform":{"skX":-90,"skY":-90,"x":13.75},"parent":"pelvis","inheritScale":0,"name":"chest"},{"length":53,"transform":{"y":-0.01,"skX":105.4235,"skY":105.423,"scX":0.9984,"scY":0.9995,"x":41.52},"parent":"thigh_r","inheritScale":0,"name":"thigh_1_r"},{"length":20,"transform":{"y":31.28,"scX":0.9965,"scY":0.9969,"x":13.74},"parent":"chest","inheritScale":0,"name":"shouder_r"},{"length":20,"transform":{"y":46.59,"scX":0.9965,"scY":0.9969,"x":-2.41},"parent":"chest","inheritScale":0,"name":"shouder_l"},{"inheritRotation":0,"length":100,"transform":{"y":3.13,"skX":130,"skY":130,"x":11.65},"parent":"chest","inheritScale":0,"name":"effects_b"},{"length":64,"transform":{"y":0.01,"skX":-70.8583,"skY":-70.864,"scX":1.0149,"scY":0.9967,"x":50.91},"parent":"thigh_1_l","inheritScale":0,"name":"calf_l"},{"inheritRotation":0,"length":100,"transform":{"y":-13.37,"skX":90,"skY":90,"x":-20.82},"parent":"chest","inheritScale":0,"name":"effects_f"},{"length":66,"transform":{"y":-0.02,"skX":-88.4874,"skY":-88.4933,"scX":0.9852,"scY":0.9996,"x":53.26},"parent":"thigh_1_r","inheritScale":0,"name":"calf_r"},{"length":100,"transform":{"skX":180,"skY":180,"scX":0.9982,"scY":0.9994,"x":5.98},"parent":"shouder_r","inheritScale":0,"name":"weapon_r"},{"length":100,"transform":{"y":0.04,"skX":180,"skY":180,"scX":0.998,"scY":0.9993,"x":5.6},"parent":"shouder_l","inheritScale":0,"name":"weapon_l"}],"type":"Armature","frameRate":24,"aabb":{"width":187.45307710983226,"y":-280.97944052980597,"height":328.6282985398831,"x":-95.92274665260345},"slot":[{"name":"shouder_l","parent":"shouder_l","color":{}},{"z":1,"name":"foot_l","parent":"foot_l","color":{}},{"z":2,"name":"thigh_1_l","parent":"thigh_1_l","color":{}},{"z":3,"name":"calf_l","parent":"calf_l","color":{}},{"z":4,"name":"thigh_l","parent":"thigh_l","color":{}},{"z":5,"name":"pelvis","parent":"pelvis","color":{}},{"z":6,"name":"chest","parent":"chest","color":{}},{"z":7,"name":"foot_r","parent":"foot_r","color":{}},{"z":8,"name":"thigh_1_r","parent":"thigh_1_r","color":{}},{"z":9,"name":"calf_r","parent":"calf_r","color":{}},{"z":10,"name":"thigh_r","parent":"thigh_r","color":{}},{"z":11,"name":"shouder_r","parent":"shouder_r","color":{}}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"name":"skin_c","ik":[{"bone":"calf_l","chain":1,"bendPositive":"false","name":"calf_l","target":"foot_l"},{"bone":"calf_r","chain":1,"bendPositive":"false","name":"calf_r","target":"foot_r"}],"animation":[{"duration":0,"frame":[],"ffd":[],"bone":[{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"root"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"pelvis"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"foot_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"chest"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"thigh_1_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"shouder_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_b"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_l"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"effects_f"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"calf_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_r"},{"frame":[{"duration":0,"transform":{},"tweenEasing":null}],"name":"weapon_l"}],"slot":[],"name":"newAnimation","playTimes":0}]}],"name":"skin_1502b","version":"5.0"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.json b/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.json new file mode 100644 index 0000000..2e82d63 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.json @@ -0,0 +1 @@ +{"width":512,"SubTexture":[{"width":63,"y":240,"height":42,"name":"mecha_1002_folder/upperarm_l_2","x":121},{"width":29,"y":88,"height":83,"name":"mecha_1004d_folder/foot_l_0","x":360},{"width":50,"y":348,"height":32,"name":"mecha_1502b_folder/thigh_1_l_0","x":101},{"width":92,"y":187,"height":51,"name":"mecha_1003_folder/calf_l_0","x":121},{"frameY":0,"y":449,"frameWidth":103,"frameX":-1,"frameHeight":57,"width":102,"height":56,"name":"mecha_1003d_folder/thigh_l_0","x":308},{"width":41,"y":245,"height":65,"name":"mecha_1502b_folder/pelvis","x":341},{"width":118,"y":187,"height":101,"name":"mecha_1004_folder/chest_1","x":1},{"width":30,"y":1,"height":85,"name":"mecha_1004d_folder/foot_r_1","x":360},{"width":55,"y":478,"height":32,"name":"mecha_1502b_folder/thigh_1_r_1","x":1},{"frameY":-1,"y":346,"frameWidth":95,"frameX":0,"frameHeight":52,"width":95,"height":51,"name":"mecha_1003_folder/calf_r_0","x":208},{"width":105,"y":449,"height":58,"name":"mecha_1003d_folder/thigh_r_0","x":98},{"width":67,"y":399,"height":38,"name":"mecha_1002_folder/upperarm_r_2","x":208},{"width":32,"y":348,"height":98,"name":"mecha_1003_folder/foot_l_0","x":390},{"frameY":0,"y":384,"frameWidth":116,"frameX":-3,"frameHeight":63,"width":108,"height":63,"name":"mecha_1008d_folder/thigh_l_0","x":98},{"width":34,"y":245,"height":101,"name":"mecha_1003_folder/foot_r_0","x":305},{"frameY":0,"y":290,"frameWidth":96,"frameX":-3,"frameHeight":54,"width":92,"height":54,"name":"mecha_1008d_folder/thigh_r_0","x":203},{"width":69,"y":187,"height":56,"name":"mecha_1004d_folder/shouder_l_2","x":289},{"width":40,"y":348,"height":80,"name":"mecha_1007d_folder/foot_l_1","x":348},{"frameY":0,"y":384,"frameWidth":96,"frameX":0,"frameHeight":92,"width":95,"height":92,"name":"mecha_1003d_folder/calf_l_0","x":1},{"width":100,"y":290,"height":56,"name":"mecha_1007d_folder/thigh_l_0","x":101},{"width":163,"y":1,"height":184,"name":"mecha_1004d_folder/chest_1","x":1},{"width":41,"y":348,"height":81,"name":"mecha_1007d_folder/foot_r_0","x":305},{"width":98,"y":290,"height":92,"name":"mecha_1003d_folder/calf_r_0","x":1},{"width":101,"y":449,"height":58,"name":"mecha_1007d_folder/thigh_r_0","x":205},{"width":72,"y":187,"height":59,"name":"mecha_1004d_folder/shouder_r_2","x":215}],"height":512,"name":"skin_1502b","imagePath":"skin_1502b_tex.png"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.png b/reference/Pixi/Demos/resource/assets/core_element/skin_1502b_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..eb1afbbedf94d065aef05f3f8457a9474555c318 GIT binary patch literal 257183 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

6A7-O$mFh1bgF{N|6z1co)^ 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�DU^{WI-@ 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 WO_juzLf6#0e14bD|3COF#Qy*#if9l3 literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/resource/assets/dragon_boy_ske.json b/reference/Pixi/Demos/resource/assets/dragon_boy_ske.json new file mode 100644 index 0000000..5d2ce0d --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/dragon_boy_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"armature":[{"aabb":{"width":693.2805749826739,"y":-702.3605101048755,"height":769.5863484320666,"x":-240.9677870990554},"type":"Armature","ik":[],"defaultActions":[{"gotoAndPlay":"stand"}],"skin":[{"name":"","slot":[{"display":[{"path":"parts/tail","type":"image","name":"parts/tail","transform":{"skX":45.2229,"y":-0.0768,"skY":45.2229,"x":30.247025}}],"name":"tail"},{"display":[{"path":"parts/armUpperR","type":"image","name":"parts/armUpperR","transform":{"skX":13.9232,"y":1.1848,"skY":13.9232,"x":14.130075}}],"name":"armUpperR"},{"display":[{"path":"parts/beardL","type":"image","name":"parts/beardL","transform":{"skX":-174.0434,"y":-1.088575,"skY":-174.0434,"x":12.496175}}],"name":"beardL"},{"display":[{"path":"parts/eyeL","type":"image","name":"parts/eyeL","transform":{"y":0.1,"x":0.075}}],"name":"eyeL"},{"display":[{"path":"parts/armL","type":"image","name":"parts/armL","transform":{"skX":98.2989,"y":-0.719275,"skY":98.2989,"x":6.6737}}],"name":"armL"},{"display":[{"path":"parts/body","type":"image","name":"parts/body","transform":{"skX":94.9653,"y":0.154875,"skY":94.9653,"x":-0.2393}}],"name":"body"},{"display":[{"path":"parts/armR","type":"image","name":"parts/armR","transform":{"skX":-85.2356,"y":0.697625,"skY":-85.2356,"x":3.554325}}],"name":"armR"},{"display":[{"path":"parts/clothes1","type":"image","name":"parts/clothes1","transform":{"skX":132.4995,"y":4.012475,"skY":132.4995,"x":8.099525}}],"name":"clothes"},{"display":[{"path":"parts/legR","type":"image","name":"parts/legR","transform":{"skX":-94.0239,"y":-1.50245,"skY":-94.0239,"x":20.645475}}],"name":"legR"},{"display":[{"path":"parts/handL","type":"image","name":"parts/handL","transform":{"skX":146.6156,"y":-0.362775,"skY":146.6156,"x":8.683125}}],"name":"handL"},{"display":[{"path":"parts/tailTip","type":"image","name":"parts/tailTip","transform":{"skX":82.7421,"y":-0.205475,"skY":82.7421,"x":20.4126}}],"name":"tailTip"},{"display":[{"path":"parts/hair","type":"image","name":"parts/hair","transform":{"skX":-4.9086,"y":0.099375,"skY":-4.9086,"x":0.01125}}],"name":"hair"},{"display":[{"path":"parts/eyeR","type":"image","name":"parts/eyeR","transform":{"y":-0.125,"x":0.375}}],"name":"eyeR"},{"display":[{"path":"parts/legL","type":"image","name":"parts/legL","transform":{"skX":-146.9135,"y":-1.6115,"skY":-146.9135,"x":25.27875}}],"name":"legL"},{"display":[{"path":"parts/handR","type":"image","name":"parts/handR","transform":{"skX":-88.1106,"y":1.26565,"skY":-88.1106,"x":5.7614}}],"name":"handR"},{"display":[{"path":"parts/head","type":"image","name":"parts/head","transform":{"skX":80.4531,"y":-2.634675,"skY":80.4531,"x":30.73875}}],"name":"head"},{"display":[{"path":"parts/armUpperL","type":"image","name":"parts/armUpperL","transform":{"skX":-148.2623,"y":1.080425,"skY":-148.2623,"x":6.9746}}],"name":"armUpperL"},{"display":[{"path":"parts/beardR","type":"image","name":"parts/beardR","transform":{"y":0.05,"x":15.4}}],"name":"beardR"}]}],"bone":[{"name":"root","transform":{"y":-67.63665,"x":-1.639675}},{"length":37.5,"transform":{"skX":-94.9653,"y":12.635475,"skY":-94.9653,"x":6.523525},"parent":"root","name":"body"},{"length":30,"transform":{"skX":-156.0107,"y":11.725,"skY":-156.0107,"x":-23.90455},"parent":"body","name":"legR"},{"length":37.5,"transform":{"skX":159.9921,"y":7.848175,"skY":159.9921,"x":20.146325},"parent":"body","name":"armUpperR"},{"length":37.5,"transform":{"skX":-154.3312,"y":-15.06895,"skY":-154.3312,"x":-17.7624},"parent":"body","name":"legL"},{"length":37.5,"transform":{"skX":11.4957,"y":-1.450925,"skY":11.4957,"x":40.778625},"parent":"body","name":"head"},{"length":17.5,"transform":{"skX":-171.7742,"y":-23.401175,"skY":-171.7742,"x":18.620325},"parent":"body","name":"armUpperL"},{"length":62.5,"transform":{"skX":79.7425,"y":17.53175,"skY":79.7425,"x":-29.2773},"parent":"body","name":"tail"},{"length":20,"transform":{"skX":-37.5342,"y":-7.9354,"skY":-37.5342,"x":0.35575},"parent":"body","name":"clothes"},{"length":15,"transform":{"skX":30.7088,"y":0.5564,"skY":30.7088,"x":16.6908},"parent":"armUpperL","name":"armL"},{"transform":{"skX":80.4531,"y":-5.998925,"skY":80.4531,"x":35.0657},"name":"eyeR","parent":"head"},{"length":37.5,"transform":{"skX":-37.5192,"y":-0.7752,"skY":-37.5192,"x":64.465525},"parent":"tail","name":"tailTip"},{"transform":{"skX":80.4531,"y":-25.297,"skY":80.4531,"x":33.442525},"name":"eyeL","parent":"head"},{"length":20,"transform":{"skX":-105.5036,"y":-33.4062,"skY":-105.5036,"x":1.8647},"parent":"head","name":"beardL"},{"length":12.5,"transform":{"skX":35.2088,"y":0.132125,"skY":35.2088,"x":34.6873},"parent":"armUpperR","name":"armR"},{"length":20,"transform":{"skX":80.4531,"y":-8.96425,"skY":80.4531,"x":5.818825},"parent":"head","name":"beardR"},{"length":12.5,"transform":{"skX":86.9099,"y":20.157725,"skY":86.9099,"x":26.206225},"parent":"head","name":"hair"},{"length":10,"transform":{"skX":17.875,"y":0.276975,"skY":17.875,"x":10.84685},"parent":"armR","name":"handR"},{"length":20,"transform":{"skX":4.4133,"y":-0.106825,"skY":4.4133,"x":16.657725},"parent":"armL","name":"handL"}],"slot":[{"name":"tailTip","parent":"tailTip","color":{}},{"z":1,"name":"armUpperL","parent":"armUpperL","color":{}},{"z":2,"name":"armL","parent":"armL","color":{}},{"z":3,"name":"handL","parent":"handL","color":{}},{"z":4,"name":"legL","parent":"legL","color":{}},{"z":5,"name":"body","parent":"body","color":{}},{"z":6,"name":"tail","parent":"tail","color":{}},{"z":7,"name":"clothes","parent":"clothes","color":{}},{"z":8,"name":"hair","parent":"hair","color":{}},{"z":9,"name":"head","parent":"head","color":{}},{"z":10,"name":"eyeL","parent":"eyeL","color":{}},{"z":11,"name":"eyeR","parent":"eyeR","color":{}},{"z":12,"name":"legR","parent":"legR","color":{}},{"z":13,"name":"armUpperR","parent":"armUpperR","color":{}},{"z":14,"name":"armR","parent":"armR","color":{}},{"z":15,"name":"handR","parent":"handR","color":{}},{"z":16,"name":"beardL","parent":"beardL","color":{}},{"z":17,"name":"beardR","parent":"beardR","color":{}}],"animation":[{"playTimes":0,"frame":[],"duration":30,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":30}],"name":"root"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"skX":4.95,"skY":4.95,"x":-1},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{},"tweenEasing":0,"duration":12},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":18},{"transform":{},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"y":-0.5},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"skX":-12.64,"y":-2.01435,"skY":-12.64,"x":1.2837},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{},"tweenEasing":0,"duration":8},{"transform":{"y":-0.5},"tweenEasing":0,"duration":22},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":9.6205,"skY":9.6205},"tweenEasing":0,"duration":15},{"transform":{"skX":-1.4848,"skY":-1.4848},"tweenEasing":0,"duration":15},{"transform":{"skX":9.6205,"skY":9.6205},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":15},{"transform":{"skX":5.44,"skY":5.44},"tweenEasing":0,"duration":15},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":12},{"transform":{"y":-1,"x":0.5},"tweenEasing":0,"duration":18},{"transform":{},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":30},{"transform":{},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":17},{"tweenEasing":null,"duration":1},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"stand"},{"playTimes":0,"frame":[],"duration":20,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":20},{"transform":{},"tweenEasing":null,"duration":0}],"name":"root"},{"frame":[{"transform":{"y":-1},"tweenEasing":0,"duration":10},{"transform":{"y":-0.5},"tweenEasing":0,"duration":10},{"transform":{"y":-1},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":-30,"y":-3.5,"skY":-30,"x":-1.5},"tweenEasing":0,"duration":10},{"transform":{"skX":30,"y":-0.5,"skY":30,"x":-0.975},"tweenEasing":0,"duration":10},{"transform":{"skX":-30,"y":-3.5,"skY":-30,"x":-1.5},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":45.5,"y":3.5,"skY":45.5,"x":-1.5},"tweenEasing":0,"duration":10},{"transform":{"skX":-22.15,"y":0.5,"skY":-22.15},"tweenEasing":0,"duration":10},{"transform":{"skX":45.5,"y":3.5,"skY":45.5,"x":-1.5},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":49.67,"y":7.100275,"skY":49.67,"x":-10.08605},"tweenEasing":0,"duration":10},{"transform":{"skX":-19.23,"y":-2.23195,"skY":-19.23,"x":-5.63015},"tweenEasing":0,"duration":10},{"transform":{"skX":49.67,"y":7.100275,"skY":49.67,"x":-10.08605},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"y":1},"tweenEasing":0,"duration":10},{"transform":{"skX":2.95,"y":0.5,"skY":2.95},"tweenEasing":0,"duration":10},{"transform":{"y":1},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":-21.2,"y":1,"skY":-21.2},"tweenEasing":0,"duration":10},{"transform":{"skX":30,"y":0.5,"skY":30},"tweenEasing":0,"duration":10},{"transform":{"skX":-21.2,"y":1,"skY":-21.2},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"x":-2},"tweenEasing":0,"duration":10},{"transform":{"skX":-8.7,"y":-1.5,"skY":-8.7,"x":-3},"tweenEasing":0,"duration":10},{"transform":{"x":-2},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":0,"duration":5},{"transform":{"y":-0.5,"x":-0.5},"tweenEasing":0,"duration":5},{"transform":{},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":-38.8,"y":-0.5503,"skY":-38.8,"x":-3.259675},"tweenEasing":0,"duration":10},{"transform":{"skX":38.55,"y":-1.461275,"skY":38.55,"x":0.976075},"tweenEasing":0,"duration":10},{"transform":{"skX":-38.8,"y":-0.5503,"skY":-38.8,"x":-3.259675},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"y":0.125,"x":0.425},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":-0.069325,"skY":-2.95,"x":-1.0284},"tweenEasing":0,"duration":10},{"transform":{"y":0.125,"x":0.425},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"y":-0.133975,"x":2.23205},"tweenEasing":0,"duration":10},{"transform":{"skX":17.93,"y":2.519025,"skY":17.93,"x":-0.749225},"tweenEasing":0,"duration":10},{"transform":{"y":-0.133975,"x":2.23205},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":1.047675,"skY":-2.95,"x":-1.887475},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":6.04,"y":-1.37935,"skY":6.04,"x":-0.879675},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":21.72,"y":2.488875,"skY":21.72,"x":-0.64355},"tweenEasing":0,"duration":5},{"transform":{"skX":31.7897,"y":1.249725,"skY":31.7897,"x":-0.683125},"tweenEasing":0,"duration":5},{"transform":{"skX":-15.63,"y":0.0106,"skY":-15.63,"x":-0.722675},"tweenEasing":0,"duration":5},{"transform":{"skX":-19.6672,"y":-1.40275,"skY":-19.6672,"x":-0.056175},"tweenEasing":0,"duration":5},{"transform":{"skX":21.72,"y":2.488875,"skY":21.72,"x":-0.64355},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-10.45,"y":0.41485,"skY":-10.45,"x":-0.3614},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{},"tweenEasing":0,"duration":10},{"transform":{"skX":-2.95,"y":-1.79345,"skY":-2.95,"x":0.282225},"tweenEasing":0,"duration":10},{"transform":{},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":-45.48,"y":0.506125,"skY":-45.48,"x":-4.066475},"tweenEasing":0,"duration":10},{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":0,"duration":10},{"transform":{"skX":-45.48,"y":0.506125,"skY":-45.48,"x":-4.066475},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":15,"y":0.225675,"skY":15,"x":-0.416425},"tweenEasing":0,"duration":10},{"transform":{"skX":6.45,"y":0.8498,"skY":6.45,"x":-0.69405},"tweenEasing":0,"duration":10},{"transform":{"skX":15,"y":0.225675,"skY":15,"x":-0.416425},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"walk"},{"playTimes":0,"frame":[],"duration":5,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":5}],"name":"root"},{"frame":[{"transform":{"y":-16.5},"tweenEasing":0,"duration":5},{"transform":{"y":-16.5},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":-27.69,"y":0.2582,"skY":-27.69,"x":0.293925},"tweenEasing":0,"duration":2},{"transform":{"skX":-27.69,"y":0.16485,"skY":-27.69,"x":-0.7805},"tweenEasing":0,"duration":3},{"transform":{"skX":-27.69,"y":0.2582,"skY":-27.69,"x":0.293925},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":-24.65,"y":2.5,"skY":-24.65},"tweenEasing":0,"duration":2},{"transform":{"skX":-23.1904,"y":2.437775,"skY":-23.1904,"x":-0.716275},"tweenEasing":0,"duration":3},{"transform":{"skX":-24.65,"y":2.5,"skY":-24.65},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":-15.2954,"y":9.571825,"skY":-15.2954,"x":-5.1551},"tweenEasing":0,"duration":2},{"transform":{"skX":-15.2954,"y":9.44735,"skY":-15.2954,"x":-6.587675},"tweenEasing":0,"duration":3},{"transform":{"skX":-15.2954,"y":9.571825,"skY":-15.2954,"x":-5.1551},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"skX":10,"y":0.475,"skY":10,"x":0.9},"tweenEasing":0,"duration":5},{"transform":{"skX":10,"y":0.475,"skY":10,"x":0.9},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":15,"y":1,"skY":15},"tweenEasing":0,"duration":2},{"transform":{"skX":15,"y":0.90665,"skY":15,"x":-1.074425},"tweenEasing":0,"duration":3},{"transform":{"skX":15,"y":1,"skY":15},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"skX":9.3457,"y":-2.5,"skY":9.3457,"x":-6},"tweenEasing":0,"duration":2},{"transform":{"skX":13.7283,"y":-2.5,"skY":13.7283,"x":-6},"tweenEasing":0,"duration":3},{"transform":{"skX":9.3457,"y":-2.5,"skY":9.3457,"x":-6},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{"y":-1.1277,"x":-1.19205},"tweenEasing":0,"duration":2},{"transform":{"y":-1.22105,"x":-2.266475},"tweenEasing":0,"duration":3},{"transform":{"y":-1.1277,"x":-1.19205},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":8.55,"y":0.6382,"skY":8.55,"x":-0.149475},"tweenEasing":0,"duration":5},{"transform":{"skX":8.55,"y":0.6382,"skY":8.55,"x":-0.149475},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"skX":-10,"y":-2.1757,"skY":-10,"x":2.220375},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-2.264625,"skY":-10,"x":2.0302},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.931525,"skY":-10,"x":2.25325},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"skX":2.89,"y":1.575025,"skY":2.89,"x":0.54245},"tweenEasing":0,"duration":2},{"transform":{"skX":8.91,"y":-0.224,"skY":8.91,"x":0.159375},"tweenEasing":0,"duration":3},{"transform":{"skX":2.89,"y":1.575025,"skY":2.89,"x":0.54245},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{"skX":-10,"y":-1.57535,"skY":-10,"x":2.234775},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-2.264625,"skY":-10,"x":2.0302},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.57535,"skY":-10,"x":2.234775},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":-50.29,"y":4.806675,"skY":-50.29,"x":-4.944425},"tweenEasing":0,"duration":2},{"transform":{"skX":-58.5649,"y":4.806675,"skY":-58.5649,"x":-4.944425},"tweenEasing":0,"duration":3},{"transform":{"skX":-50.29,"y":4.806675,"skY":-50.29,"x":-4.944425},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":-13.13,"y":0.289775,"skY":-13.13,"x":-2.020225},"tweenEasing":0,"duration":5},{"transform":{"skX":-13.13,"y":0.289775,"skY":-13.13,"x":-2.020225},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{"skX":42.5,"y":1.6871,"skY":42.5,"x":-2.037225},"tweenEasing":0,"duration":2},{"transform":{"skX":50.23,"y":1.707375,"skY":50.23,"x":-2.008275},"tweenEasing":0,"duration":3},{"transform":{"skX":42.5,"y":1.6871,"skY":42.5,"x":-2.037225},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{"skX":-10,"y":-1.5109,"skY":-10,"x":-0.204525},"tweenEasing":0,"duration":2},{"transform":{"skX":-10,"y":-0.699725,"skY":-10,"x":0.953925},"tweenEasing":0,"duration":3},{"transform":{"skX":-10,"y":-1.5109,"skY":-10,"x":-0.204525},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":0,"duration":5},{"transform":{"skX":-0.48,"y":0.541625,"skY":-0.48,"x":0.374075},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":-8.55,"y":-0.962825,"skY":-8.55,"x":-3.527325},"tweenEasing":0,"duration":5},{"transform":{"skX":-8.55,"y":-0.962825,"skY":-8.55,"x":-3.527325},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"jump"},{"playTimes":0,"frame":[],"duration":5,"bone":[{"frame":[{"transform":{},"tweenEasing":null,"duration":5}],"name":"root"},{"frame":[{"transform":{"y":-16.5},"tweenEasing":0,"duration":5},{"transform":{"y":-16.5},"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"transform":{"skX":27.76,"y":2.2411,"skY":27.76,"x":1.544925},"tweenEasing":0,"duration":2},{"transform":{"skX":27.76,"y":2.144,"skY":27.76,"x":0.427375},"tweenEasing":0,"duration":3},{"transform":{"skX":27.76,"y":2.2411,"skY":27.76,"x":1.544925},"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"transform":{"skX":-69.64,"y":2.5,"skY":-69.64},"tweenEasing":0,"duration":2},{"transform":{"skX":-66.683,"y":2.467625,"skY":-66.683,"x":-0.3725},"tweenEasing":0,"duration":3},{"transform":{"skX":-69.64,"y":2.5,"skY":-69.64},"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"transform":{"skX":50.73,"y":1.975,"skY":50.73,"x":5.65},"tweenEasing":0,"duration":2},{"transform":{"skX":50.73,"y":1.910275,"skY":50.73,"x":4.904975},"tweenEasing":0,"duration":3},{"transform":{"skX":50.73,"y":1.975,"skY":50.73,"x":5.65},"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"transform":{"skX":-8.73,"y":-0.85,"skY":-8.73,"x":2.75},"tweenEasing":0,"duration":5},{"transform":{"skX":-8.73,"y":-0.85,"skY":-8.73,"x":2.75},"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"transform":{"skX":92.45,"y":1,"skY":92.45},"tweenEasing":0,"duration":2},{"transform":{"skX":89.9735,"y":1.064725,"skY":89.9735,"x":0.745025},"tweenEasing":0,"duration":3},{"transform":{"skX":92.45,"y":1,"skY":92.45},"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"transform":{"skX":-18.47,"y":-1.525,"skY":-18.47,"x":-0.975},"tweenEasing":0,"duration":2},{"transform":{"skX":-22.44,"y":-1.525,"skY":-22.44,"x":-0.975},"tweenEasing":0,"duration":3},{"transform":{"skX":-18.47,"y":-1.525,"skY":-18.47,"x":-0.975},"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"transform":{"y":-1.215525,"x":-1.50165},"tweenEasing":0,"duration":2},{"transform":{"y":-1.118425,"x":-0.384125},"tweenEasing":0,"duration":3},{"transform":{"y":-1.215525,"x":-1.50165},"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"transform":{"skX":-53.9,"y":1.45345,"skY":-53.9,"x":1.087275},"tweenEasing":0,"duration":5},{"transform":{"skX":-53.9,"y":1.45345,"skY":-53.9,"x":1.087275},"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"transform":{"skX":8.73,"y":-1.153625,"skY":8.73,"x":-4.44015},"tweenEasing":0,"duration":2},{"transform":{"skX":8.73,"y":-0.7513,"skY":8.73,"x":-3.707225},"tweenEasing":0,"duration":3},{"transform":{"skX":8.73,"y":-1.153625,"skY":8.73,"x":-4.44015},"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"transform":{"skX":0.14,"y":-0.289,"skY":0.14,"x":0.699575},"tweenEasing":0,"duration":2},{"transform":{"skX":-0.83,"y":0.44715,"skY":-0.83,"x":0.45425},"tweenEasing":0,"duration":3},{"transform":{"skX":0.14,"y":-0.289,"skY":0.14,"x":0.699575},"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"transform":{"skX":8.73,"y":-2.0383,"skY":8.73,"x":-3.25035},"tweenEasing":0,"duration":2},{"transform":{"skX":8.73,"y":-1.484225,"skY":8.73,"x":-3.304875},"tweenEasing":0,"duration":3},{"transform":{"skX":8.73,"y":-2.0383,"skY":8.73,"x":-3.25035},"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"transform":{"skX":-2.54,"y":1.945425,"skY":-2.54,"x":0.081175},"tweenEasing":0,"duration":2},{"transform":{"skX":25.1339,"y":1.945425,"skY":25.1339,"x":0.081175},"tweenEasing":0,"duration":3},{"transform":{"skX":-2.54,"y":1.945425,"skY":-2.54,"x":0.081175},"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"transform":{"skX":-13.14,"y":-0.799125,"skY":-13.14,"x":-2.801725},"tweenEasing":0,"duration":5},{"transform":{"skX":-13.14,"y":-0.799125,"skY":-13.14,"x":-2.801725},"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"transform":{"skX":8.96,"y":1.31275,"skY":8.96,"x":-1.966675},"tweenEasing":0,"duration":2},{"transform":{"skX":-6.04,"y":1.31275,"skY":-6.04,"x":-1.966675},"tweenEasing":0,"duration":3},{"transform":{"skX":8.96,"y":1.31275,"skY":8.96,"x":-1.966675},"tweenEasing":null,"duration":0}],"name":"beardR"},{"frame":[{"transform":{"skX":-6.27,"y":1.80955,"skY":-6.27,"x":0.147725},"tweenEasing":0,"duration":2},{"transform":{"skX":-7.09,"y":0.051875,"skY":-7.09,"x":-1.580525},"tweenEasing":0,"duration":3},{"transform":{"skX":-6.27,"y":1.80955,"skY":-6.27,"x":0.147725},"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"transform":{"skX":29.52,"y":-0.3423,"skY":29.52,"x":-0.984675},"tweenEasing":0,"duration":5},{"transform":{"skX":29.52,"y":-0.3423,"skY":29.52,"x":-0.984675},"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"transform":{"skX":21.45,"y":0.367025,"skY":21.45,"x":-0.899625},"tweenEasing":0,"duration":5},{"transform":{"skX":21.45,"y":0.367025,"skY":21.45,"x":-0.899625},"tweenEasing":null,"duration":0}],"name":"handL"}],"slot":[{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}],"name":"beardR"}],"ffd":[],"name":"fall"}],"frameRate":24,"name":"DragonBoy"}],"name":"Dragon_1","version":"5.0"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/dragon_boy_tex.json b/reference/Pixi/Demos/resource/assets/dragon_boy_tex.json new file mode 100644 index 0000000..9021b7b --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/dragon_boy_tex.json @@ -0,0 +1 @@ +{"imagePath":"dragon_boy_tex.png","width":256,"SubTexture":[{"frameX":0,"y":174,"frameY":0,"frameWidth":28,"width":28,"frameHeight":53,"height":52,"name":"parts/tailTip","x":196},{"width":28,"y":174,"height":22,"name":"parts/armUpperL","x":226},{"width":12,"y":234,"height":20,"name":"parts/armL","x":90},{"width":24,"y":198,"height":20,"name":"parts/handL","x":226},{"frameX":0,"y":191,"frameY":0,"frameWidth":51,"width":51,"frameHeight":45,"height":45,"name":"parts/legL","x":1},{"frameX":0,"y":102,"frameY":0,"frameWidth":59,"width":59,"frameHeight":87,"height":87,"name":"parts/body","x":1},{"width":54,"y":102,"height":70,"name":"parts/tail","x":62},{"width":52,"y":174,"height":44,"name":"parts/clothes1","x":109},{"width":31,"y":174,"height":71,"name":"parts/hair","x":163},{"frameX":0,"y":1,"frameY":0,"frameWidth":85,"width":84,"frameHeight":99,"height":99,"name":"parts/head","x":1},{"width":7,"y":241,"height":12,"name":"parts/eyeL","x":238},{"frameX":0,"y":220,"frameY":0,"frameWidth":10,"width":9,"frameHeight":15,"height":15,"name":"parts/eyeR","x":136},{"frameX":0,"y":174,"frameY":0,"frameWidth":45,"width":45,"frameHeight":58,"height":58,"name":"parts/legR","x":62},{"width":40,"y":228,"height":24,"name":"parts/armUpperR","x":196},{"frameX":0,"y":220,"frameY":0,"frameWidth":12,"width":11,"frameHeight":20,"height":19,"name":"parts/armR","x":238},{"width":25,"y":220,"height":15,"name":"parts/handR","x":109},{"frameX":0,"y":245,"frameY":0,"frameWidth":30,"width":30,"frameHeight":9,"height":9,"name":"parts/beardL","x":54},{"width":34,"y":234,"height":9,"name":"parts/beardR","x":54}],"height":256,"name":"Dragon_1"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/dragon_boy_tex.png b/reference/Pixi/Demos/resource/assets/dragon_boy_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..02c8677ff1090a3dbb8fb09eabdef30c0353aaff GIT binary patch literal 31667 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

Uan5rsr0@){GlFf|1Lm#Pl^af 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 literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/main_ske.json b/reference/Pixi/Demos/resource/assets/replace_slot_display/main_ske.json new file mode 100644 index 0000000..30eb04e --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/replace_slot_display/main_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"name":"main","version":"5.0","armature":[{"animation":[{"slot":[],"playTimes":0,"duration":30,"frame":[],"name":"idle","bone":[{"frame":[{"duration":30,"tweenEasing":null,"transform":{}}],"name":"root"},{"frame":[{"duration":10,"tweenEasing":0,"transform":{}},{"duration":10,"tweenEasing":0,"transform":{"skX":120,"skY":120}},{"duration":10,"tweenEasing":0,"transform":{"skX":-120,"skY":-120}},{"duration":0,"tweenEasing":null,"transform":{}}],"name":"ball"},{"frame":[{"duration":10,"tweenEasing":0,"transform":{}},{"duration":10,"tweenEasing":0,"transform":{"skX":120,"skY":120}},{"duration":10,"tweenEasing":0,"transform":{"skX":-120,"skY":-120}},{"duration":0,"tweenEasing":null,"transform":{}}],"name":"point"}],"ffd":[{"frame":[{"duration":10,"tweenEasing":0,"offset":0,"vertices":[]},{"duration":10,"tweenEasing":0,"offset":0,"vertices":[115.61,54.15,0,0,120.7,-60.04,0,0,0,0,0,0,0,0,0,0,113.3,49.94,119.03,-55.73,1,-5.66,-1.29,7.67,0,0,0,0,0,0,0,0]},{"duration":10,"tweenEasing":0,"offset":0,"vertices":[-36.97,-85.96,0,0,-21.37,108.42,0,0,0,0,0,0,0,0,0,0,-39.88,-82.14,-19.5,95.39,2.53,5.56,0.38,-2.85,0,0,0,0,0,0,0,0]},{"duration":0,"tweenEasing":null,"offset":0,"vertices":[]}],"scale":1,"skin":"","offset":0,"name":"display0005","slot":"mesh"}]}],"defaultActions":[{"gotoAndPlay":"idle"}],"type":"Armature","name":"MyArmature","slot":[{"color":{},"name":"point","parent":"point"},{"z":1,"color":{},"name":"mesh","parent":"point"},{"z":2,"color":{},"name":"ball","parent":"ball"},{"z":3,"color":{},"name":"weapon","parent":"ball"}],"ik":[],"aabb":{"width":674.9445000000001,"y":-80.1317,"height":160.1317,"x":-335},"bone":[{"name":"root","transform":{}},{"length":100,"transform":{},"parent":"root","name":"point"},{"length":100,"transform":{"x":100},"parent":"point","name":"ball"}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"width":270,"userEdges":[6,7,7,13,13,4,6,15,15,5,9,10,10,6,7,11,11,8,8,9],"type":"mesh","vertices":[-135,-80,135,-80,-135,80,135,80,134.95,-31.85,134.95,31.45,73.3,31.25,73.2,-31.65,-121.4,-67.5,-122.1,66.7,88.45,66.3,89.25,-65.95,107.1,-80,106.3,-31.76,106.5,80,106.3,31.36],"transform":{"x":-200},"height":160,"edges":[2,0,1,4,4,5,5,3,0,12,12,1,3,14,14,2],"path":"display0005","uvs":[0,0,1,0,0,1,1,1,0.99981,0.30094,0.99981,0.69656,0.77148,0.69531,0.77111,0.30219,0.05037,0.07813,0.04778,0.91687,0.82759,0.91438,0.83056,0.08781,0.89667,0,0.89369,0.30152,0.89444,1,0.89369,0.69598],"name":"display0005","triangles":[9,2,10,0,8,11,0,11,12,10,2,14,15,10,14,12,11,13,12,13,4,12,4,1,14,3,5,15,14,5,4,13,5,13,15,5,6,10,15,11,7,13,6,15,13,7,6,13,6,9,10,8,7,11,8,9,6,8,6,7,8,0,9,0,2,9]}],"name":"mesh"},{"display":[{"path":"weapon_1004_1","type":"image","name":"weapon_1004_1","transform":{"y":5,"x":65}}],"name":"weapon"},{"display":[{"path":"display0001","type":"image","name":"display0001","transform":{}}],"name":"point"},{"display":[{"path":"display0009","type":"image","name":"display0009","transform":{"y":-0.1317,"x":104.9445}}],"name":"ball"}]}]}]} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.json b/reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.json new file mode 100644 index 0000000..e114583 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.json @@ -0,0 +1 @@ +{"imagePath":"main_tex.png","width":512,"SubTexture":[{"width":60,"y":325,"height":60,"name":"display0001","x":206},{"width":270,"y":1,"height":160,"name":"display0005","x":1},{"width":270,"y":163,"height":160,"name":"display0009","x":1},{"width":203,"y":325,"height":29,"name":"weapon_1004_1","x":1}],"height":512,"name":"main"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.png b/reference/Pixi/Demos/resource/assets/replace_slot_display/main_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6d6b2811c0b37caf26debfa81944e5af0fa255 GIT binary patch literal 26260 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 X>vn$vI|KhVqjvJxnWOk4K{x*gzMv<3 literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_ske.json b/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_ske.json new file mode 100644 index 0000000..092f090 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"isGlobal":0,"name":"replace","version":"5.0","armature":[{"animation":[{"slot":[],"playTimes":0,"duration":0,"frame":[],"name":"newAnimation","bone":[{"frame":[{"duration":0,"tweenEasing":null,"transform":{}}],"name":"root"}],"ffd":[]}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"type":"Armature","name":"MyMesh","slot":[{"color":{},"name":"meshA","parent":"root"},{"z":1,"color":{},"name":"meshB","parent":"root"},{"z":2,"color":{},"name":"mesh","parent":"root"}],"ik":[],"aabb":{"width":203,"y":-9.5,"height":29,"x":-36.5},"bone":[{"length":100,"name":"root","transform":{}}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"path":"weapon_1004_1","type":"image","name":"weapon_1004_1","transform":{"y":5,"x":65}}],"name":"mesh"},{"display":[{"width":203,"userEdges":[7,4,4,5,5,6,6,7,12,11,10,11,10,13,14,6,7,15,14,15],"type":"mesh","vertices":[-101.35,-12.8,143.75,-70.95,-101.45,6.15,123.05,20,103.85,7,126.85,-44,13.75,-17.9,11.9,7.05,-46.25,-21.7,-44.75,20.2,-47.75,-9.4,-48.35,2.95,-101.5,5.9,-101.5,-12.15,-46.3,-10.75,-45.8,12.95,13.9,-25.51,26.61,16.69],"transform":{"y":5,"x":65},"height":29,"edges":[1,3,0,8,9,2,2,12,12,13,13,0,8,16,16,1,3,17,17,9],"path":"weapon_1004_1","uvs":[0,0,1,0,0,1,1,1,0.84852,0.6931,0.91256,0.26207,0.66034,0.2,0.59384,0.71379,0.27438,0.00172,0.26453,1,0.26478,0.17586,0.26182,0.60172,0,0.70345,0,0.08103,0.27685,0.2569,0.27906,0.67586,0.5734,0.00101,0.58153,1],"name":"weapon_1004_1","triangles":[6,5,1,16,6,1,4,17,3,1,5,3,5,4,3,6,4,5,6,7,4,7,17,4,15,9,17,8,14,16,11,9,15,11,15,14,10,11,14,0,10,8,10,14,8,12,2,9,0,13,10,12,9,11,10,13,11,13,12,11,14,7,6,15,17,7,14,15,7,16,14,6]}],"name":"meshB"},{"display":[{"width":203,"userEdges":[],"type":"mesh","vertices":[-101.5,-14.5,297.95,-14.5,-101.5,14.5,296.75,14.5,29.55,-14.5,29.1,14.5,262.95,-14.5,261.75,14.5],"transform":{"y":5,"x":65},"height":29,"edges":[1,3,2,0,0,4,5,2,4,6,6,1,3,7,7,5],"path":"weapon_1004_1","uvs":[0,0,1,0,0,1,1,1,0.64557,0,0.64335,1,0.83793,0,0.84384,1],"name":"weapon_1004_1","triangles":[6,7,1,1,7,3,4,5,6,6,5,7,0,2,5,0,5,4]}],"name":"meshA"}]}]},{"animation":[{"slot":[{"frame":[{"duration":1,"tweenEasing":null},{"duration":1,"tweenEasing":null,"displayIndex":6},{"duration":1,"tweenEasing":null,"displayIndex":1},{"duration":2,"tweenEasing":null,"displayIndex":5},{"duration":1,"tweenEasing":null,"displayIndex":7},{"duration":1,"tweenEasing":null,"displayIndex":8},{"duration":1,"tweenEasing":null,"displayIndex":2},{"duration":9,"tweenEasing":null,"displayIndex":4},{"duration":0,"tweenEasing":null,"displayIndex":3}],"name":"ball"}],"playTimes":0,"duration":17,"frame":[],"name":"newAnimation","bone":[{"frame":[{"duration":17,"tweenEasing":null,"transform":{}}],"name":"root"},{"frame":[{"duration":1,"tweenEasing":null,"transform":{"y":-70.4221,"x":-83.5006}},{"duration":1,"tweenEasing":null,"transform":{"y":-64.552,"x":0.4446}},{"duration":1,"tweenEasing":null,"transform":{"y":-65.0185,"x":105.0759}},{"duration":2,"tweenEasing":null,"transform":{"y":0.8148,"x":105.4037}},{"duration":1,"tweenEasing":null,"transform":{"y":65.3926,"x":0.2229}},{"duration":1,"tweenEasing":null,"transform":{"y":65.4336,"x":-105.0409}},{"duration":1,"tweenEasing":null,"transform":{"y":0.5252,"x":-104.8163}},{"duration":9,"tweenEasing":null,"transform":{}},{"duration":0,"tweenEasing":null,"transform":{"y":65.668,"x":105.3589}}],"name":"ball"}],"ffd":[]}],"defaultActions":[{"gotoAndPlay":"newAnimation"}],"type":"MovieClip","name":"MyDisplay","slot":[{"color":{},"name":"ball","parent":"ball","displayIndex":-1}],"ik":[],"aabb":{"width":270,"y":-151.2369,"height":160,"x":-323.90430000000003},"bone":[{"name":"root","transform":{}},{"transform":{},"name":"ball","parent":"root"}],"frameRate":24,"skin":[{"name":"","slot":[{"display":[{"path":"display0002","type":"image","name":"display0002","transform":{"y":64.6363,"x":104.7465}},{"path":"display0004","type":"image","name":"display0004","transform":{"y":65.0185,"x":-105.0759}},{"path":"display0009","type":"image","name":"display0009","transform":{"y":-0.5252,"x":104.8163}},{"path":"display0006","type":"image","name":"display0006","transform":{"y":-65.668,"x":-105.3589}},{"path":"display0010","type":"image","name":"display0010","transform":{}},{"path":"display0005","type":"image","name":"display0005","transform":{"y":-0.8148,"x":-105.4037}},{"path":"display0003","type":"image","name":"display0003","transform":{"y":64.552,"x":-0.4446}},{"path":"display0007","type":"image","name":"display0007","transform":{"y":-65.3926,"x":-0.2229}},{"path":"display0008","type":"image","name":"display0008","transform":{"y":-65.4336,"x":105.0409}},{"filterType":null,"path":"MyArmature","type":"armature","name":"MyArmature","transform":{}}],"name":"ball"}]}]}]} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.json b/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.json new file mode 100644 index 0000000..fdc44d1 --- /dev/null +++ b/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.json @@ -0,0 +1 @@ +{"imagePath":"replace_tex.png","width":1024,"SubTexture":[{"width":203,"y":1,"height":29,"name":"weapon_1004_1","x":817},{"width":270,"y":1,"height":190,"name":"display0004","x":1},{"width":240,"y":193,"height":160,"name":"display0010","x":757},{"width":240,"y":193,"height":190,"name":"display0003","x":515},{"width":270,"y":1,"height":190,"name":"display0002","x":545},{"width":1,"y":1,"height":1,"name":"MyArmature","x":1022},{"width":270,"y":193,"height":190,"name":"display0008","x":1},{"width":270,"y":385,"height":160,"name":"display0009","x":1},{"width":240,"y":193,"height":190,"name":"display0007","x":273},{"width":270,"y":1,"height":190,"name":"display0006","x":273},{"width":270,"y":385,"height":160,"name":"display0005","x":273}],"height":1024,"name":"replace"} \ No newline at end of file diff --git a/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.png b/reference/Pixi/Demos/resource/assets/replace_slot_display/replace_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..0c85ad08b6a1f6235009d721edd1fbcbcd77aa43 GIT binary patch literal 60291 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 Zgxd~0Xi=9`{RLh0`n!yG=4#u9{1*#rE297a literal 0 HcmV?d00001 diff --git a/reference/Pixi/Demos/src/AnimationBaseTest.ts b/reference/Pixi/Demos/src/AnimationBaseTest.ts new file mode 100644 index 0000000..c599c6b --- /dev/null +++ b/reference/Pixi/Demos/src/AnimationBaseTest.ts @@ -0,0 +1,111 @@ +class AnimationBaseTest extends BaseTest { + + private _armatureDisplay: dragonBones.PixiArmatureDisplay; + + protected _onStart(): void { + PIXI.loader + .add("dragonBonesData", "./resource/assets/animation_base_test_ske.json") + .add("textureData", "./resource/assets/animation_base_test_tex.json") + .add("texture", "./resource/assets/animation_base_test_tex.png"); + + PIXI.loader.once("complete", (loader: PIXI.loaders.Loader, resources: dragonBones.Map) => { + const factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dragonBonesData"].data); + factory.parseTextureAtlasData(resources["textureData"].data, resources["texture"].texture); + + this._armatureDisplay = factory.buildArmatureDisplay("progressBar"); + this._armatureDisplay.x = this.stage.width * 0.5; + this._armatureDisplay.y = this.stage.height * 0.5; + this.stage.addChild(this._armatureDisplay); + + // Test animation event + this._armatureDisplay.addListener(dragonBones.EventObject.START, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.LOOP_COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.FADE_IN, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.FADE_IN_COMPLETE, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.FADE_OUT, this._animationEventHandler, this); + this._armatureDisplay.addListener(dragonBones.EventObject.FADE_OUT_COMPLETE, this._animationEventHandler, this); + + // Test frame event + this._armatureDisplay.addListener(dragonBones.EventObject.FRAME_EVENT, this._animationEventHandler, this); + + // Test animation config. + // const animaitonConfig = this._armatureDisplay.animation.animationConfig; + // animaitonConfig.name = "test"; // Animation state name. + // animaitonConfig.animation = "idle"; // Animation name. + + // animaitonConfig.playTimes = 1; // Play one time. + // animaitonConfig.playTimes = 3; // Play several times. + // animaitonConfig.playTimes = 0; // Loop play. + + // animaitonConfig.timeScale = 1.0; // Play speed. + // animaitonConfig.timeScale = -1.0; // Reverse play. + + // animaitonConfig.position = 1.0; // Goto and play. + // animaitonConfig.duration = 3.0; // Interval play. + // this._armatureDisplay.animation.playConfig(animaitonConfig); + + this._armatureDisplay.animation.play("idle", 1); + + // + this.stage.interactive = true; + this.stage.addListener("touchstart", this._touchHandler, this); + this.stage.addListener("touchend", this._touchHandler, this); + this.stage.addListener("touchmove", this._touchHandler, this); + this.stage.addListener("mousedown", this._touchHandler, this); + this.stage.addListener("mouseup", this._touchHandler, this); + this.stage.addListener("mousemove", this._touchHandler, this); + + const text = new PIXI.Text("", { align: "center" }); + text.text = "Click to control animation play progress."; + text.scale.x = 0.7; + text.scale.y = 0.7; + text.x = (this.renderer.width - text.width) * 0.5; + text.y = this.renderer.height - 60; + this._stage.addChild(text); + + // + this._startRenderTick(); + }); + + PIXI.loader.load(); + } + + private _isTouched: boolean = false; + private _touchHandler(event: PIXI.interaction.InteractionEvent): void { + const progress = Math.min(Math.max((event.data.global.x - this._armatureDisplay.x + 300) / 600, 0.0), 1.0); + switch (event.type) { + case "touchstart": + case "mousedown": + this._isTouched = true; + // this._armatureDisplay.animation.gotoAndPlayByTime("idle", 0.5, 1); + // this._armatureDisplay.animation.gotoAndStopByTime("idle", 1); + + // this._armatureDisplay.animation.gotoAndPlayByFrame("idle", 25, 2); + // this._armatureDisplay.animation.gotoAndStopByFrame("idle", 50); + + // this._armatureDisplay.animation.gotoAndPlayByProgress("idle", progress, 3); + this._armatureDisplay.animation.gotoAndStopByProgress("idle", progress); + break; + + case "touchend": + case "mouseup": + this._isTouched = false; + this._armatureDisplay.animation.play(); + break; + + case "touchmove": + case "mousemove": + if (this._isTouched) { + const animationState = this._armatureDisplay.animation.getState("idle"); + animationState.currentTime = animationState.totalTime * progress; + } + break; + } + } + + private _animationEventHandler(event: dragonBones.EventObject): void { + console.log(event.animationState.name, event.type, event.name ? event.name : ""); + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/src/BaseTest.ts b/reference/Pixi/Demos/src/BaseTest.ts new file mode 100644 index 0000000..0c5980d --- /dev/null +++ b/reference/Pixi/Demos/src/BaseTest.ts @@ -0,0 +1,35 @@ +abstract class BaseTest { + protected readonly _renderer = new PIXI.WebGLRenderer(1136, 640); + protected readonly _stage = new PIXI.Container(); + protected readonly _backgroud: PIXI.Sprite = new PIXI.Sprite(PIXI.Texture.EMPTY); + + public constructor() { + this._renderer.backgroundColor = 0x666666; + this._backgroud.width = this._renderer.width; + this._backgroud.height = this._renderer.height; + this._stage.addChild(this._backgroud); + + document.body.appendChild(this._renderer.view); + + this._onStart(); + } + + private _renderHandler(deltaTime: number): void { + this._renderer.render(this._stage); + } + + protected _startRenderTick(): void { + // Make sure render after dragonBones update. + PIXI.ticker.shared.add(this._renderHandler, this); + } + + protected abstract _onStart(): void; + + public get renderer(): PIXI.WebGLRenderer { + return this._renderer; + } + + public get stage(): PIXI.Container { + return this._stage; + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/src/CoreElement.ts b/reference/Pixi/Demos/src/CoreElement.ts new file mode 100644 index 0000000..70cc4cf --- /dev/null +++ b/reference/Pixi/Demos/src/CoreElement.ts @@ -0,0 +1,570 @@ +namespace coreElement { + type PointType = PIXI.Point; + type ArmatureDisplayType = dragonBones.PixiArmatureDisplay; + type EventType = dragonBones.EventObject; + + export class Game extends BaseTest { + public static STAGE_WIDTH: number; + public static STAGE_HEIGHT: number; + public static GROUND: number; + public static G: number = 0.6; + public static instance: Game; + + private _left: boolean = false; + private _right: boolean = false; + private _player: Mecha; + private readonly _bullets: Array = []; + + protected _onStart(): void { + PIXI.loader + .add("dataA", "./resource/assets/core_element/mecha_1502b_ske.json") + .add("textureDataA", "./resource/assets/core_element/mecha_1502b_tex.json") + .add("textureA", "./resource/assets/core_element/mecha_1502b_tex.png") + .add("dataB", "./resource/assets/core_element/skin_1502b_ske.json") + .add("textureDataB", "./resource/assets/core_element/skin_1502b_tex.json") + .add("textureB", "./resource/assets/core_element/skin_1502b_tex.png") + .add("dataC", "./resource/assets/core_element/weapon_1000_ske.json") + .add("textureDataC", "./resource/assets/core_element/weapon_1000_tex.json") + .add("textureC", "./resource/assets/core_element/weapon_1000_tex.png"); + + PIXI.loader.once("complete", (loader: PIXI.loaders.Loader, resources: dragonBones.Map) => { + Game.STAGE_WIDTH = this._stage.width; + Game.STAGE_HEIGHT = this._stage.height; + Game.GROUND = Game.STAGE_HEIGHT - 150; + Game.instance = this; + PIXI.ticker.shared.add(this._enterFrameHandler, this); + + const factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dataA"].data); + factory.parseTextureAtlasData(resources["textureDataA"].data, resources["textureA"].texture); + factory.parseDragonBonesData(resources["dataB"].data); + factory.parseTextureAtlasData(resources["textureDataB"].data, resources["textureB"].texture); + factory.parseDragonBonesData(resources["dataC"].data); + factory.parseTextureAtlasData(resources["textureDataC"].data, resources["textureC"].texture); + + this._player = new Mecha(); + + // Listener. + this._stage.interactive = true; + this._stage.addListener('touchstart', this._touchHandler, this); + this._stage.addListener('touchend', this._touchHandler, this); + this._stage.addListener('touchmove', this._touchHandler, this); + this._stage.addListener('mousedown', this._touchHandler, this); + this._stage.addListener('mouseup', this._touchHandler, this); + this._stage.addListener('mousemove', this._touchHandler, this); + this._stage.addChild(this._backgroud); + document.addEventListener("keydown", this._keyHandler); + document.addEventListener("keyup", this._keyHandler); + + // Info. + const text = new PIXI.Text("", { align: "center" }); + text.text = "Press W/A/S/D to move. Press Q/E to switch weapons. Press SPACE to switch skin.\nMouse Move to aim. Click to fire."; + text.scale.x = 0.7; + text.scale.y = 0.7; + text.x = (Game.STAGE_WIDTH - text.width) * 0.5; + text.y = Game.STAGE_HEIGHT - 60; + this._stage.addChild(text); + + // + this._startRenderTick(); + }); + + PIXI.loader.load(); + } + + private _touchHandler(event: PIXI.interaction.InteractionEvent): void { + this._player.aim(event.data.global.x, event.data.global.y); + + if (event.type === 'touchstart' || event.type === 'mousedown') { + this._player.attack(true); + } + else if (event.type === 'touchend' || event.type === 'mouseup') { + this._player.attack(false); + } + } + + private _keyHandler(event: KeyboardEvent): void { + const isDown = event.type === "keydown"; + switch (event.keyCode) { + case 37: + case 65: + Game.instance._left = isDown; + Game.instance._updateMove(-1); + break; + + case 39: + case 68: + Game.instance._right = isDown; + Game.instance._updateMove(1); + break; + + case 38: + case 87: + if (isDown) { + Game.instance._player.jump(); + } + break; + + case 83: + case 40: + Game.instance._player.squat(isDown); + break; + + case 81: + if (isDown) { + Game.instance._player.switchWeaponR(); + } + break; + + case 69: + if (isDown) { + Game.instance._player.switchWeaponL(); + } + break; + + case 32: + if (isDown) { + Game.instance._player.switchSkin(); + } + break; + } + } + + private _enterFrameHandler(deltaTime: number): void { // Make sure game update before dragonBones update. + if (this._player) { + this._player.update(); + } + + let i = this._bullets.length; + while (i--) { + const bullet = this._bullets[i]; + if (bullet.update()) { + this._bullets.splice(i, 1); + } + } + } + + private _updateMove(dir: number): void { + if (this._left && this._right) { + this._player.move(dir); + } + else if (this._left) { + this._player.move(-1); + } + else if (this._right) { + this._player.move(1); + } + else { + this._player.move(0); + } + } + + public addBullet(bullet: Bullet): void { + this._bullets.push(bullet); + } + } + + class Mecha { + private static readonly JUMP_SPEED: number = 20; + private static readonly NORMALIZE_MOVE_SPEED: number = 3.6; + private static readonly MAX_MOVE_SPEED_FRONT: number = Mecha.NORMALIZE_MOVE_SPEED * 1.4; + private static readonly MAX_MOVE_SPEED_BACK: number = Mecha.NORMALIZE_MOVE_SPEED * 1.0; + private static readonly NORMAL_ANIMATION_GROUP: string = "normal"; + private static readonly AIM_ANIMATION_GROUP: string = "aim"; + private static readonly ATTACK_ANIMATION_GROUP: string = "attack"; + private static readonly WEAPON_L_LIST: Array = ["weapon_1502b_l", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d", "weapon_1005e"]; + private static readonly WEAPON_R_LIST: Array = ["weapon_1502b_r", "weapon_1005", "weapon_1005b", "weapon_1005c", "weapon_1005d"]; + private static readonly SKINS: Array = ["mecha_1502b", "skin_a", "skin_b", "skin_c"]; + + private _isJumpingA: boolean = false; + private _isJumpingB: boolean = false; + private _isSquating: boolean = false; + private _isAttackingA: boolean = false; + private _isAttackingB: boolean = false; + private _weaponRIndex: number = 0; + private _weaponLIndex: number = 0; + private _skinIndex: number = 0; + private _faceDir: number = 1; + private _aimDir: number = 0; + private _moveDir: number = 0; + private _aimRadian: number = 0.0; + private _speedX: number = 0.0; + private _speedY: number = 0.0; + private _armature: dragonBones.Armature; + private _armatureDisplay: ArmatureDisplayType; + private _weaponL: dragonBones.Armature; + private _weaponR: dragonBones.Armature; + private _aimState: dragonBones.AnimationState | null = null; + private _walkState: dragonBones.AnimationState | null = null; + private _attackState: dragonBones.AnimationState | null = null; + private readonly _target: PointType = new PIXI.Point(); + private readonly _helpPoint: PointType = new PIXI.Point(); + + public constructor() { + this._armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay("mecha_1502b"); + this._armatureDisplay.x = Game.STAGE_WIDTH * 0.5; + this._armatureDisplay.y = Game.GROUND; + this._armature = this._armatureDisplay.armature; + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_IN_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.FADE_OUT_COMPLETE, this._animationEventHandler, this); + this._armature.eventDispatcher.addEvent(dragonBones.EventObject.COMPLETE, this._animationEventHandler, this); + + // Get weapon childArmature. + this._weaponL = this._armature.getSlot("weapon_l").childArmature; + this._weaponR = this._armature.getSlot("weapon_r").childArmature; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + Game.instance.stage.addChild(this._armatureDisplay); + this._updateAnimation(); + } + + public move(dir: number): void { + if (this._moveDir === dir) { + return; + } + + this._moveDir = dir; + this._updateAnimation(); + } + + public jump(): void { + if (this._isJumpingA) { + return; + } + + this._isJumpingA = true; + this._armature.animation.fadeIn( + "jump_1", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + } + + public squat(isSquating: boolean): void { + if (this._isSquating === isSquating) { + return; + } + + this._isSquating = isSquating; + this._updateAnimation(); + } + + public attack(isAttacking: boolean): void { + if (this._isAttackingA === isAttacking) { + return; + } + + this._isAttackingA = isAttacking; + } + + public switchWeaponL(): void { + this._weaponL.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + this._weaponLIndex++; + this._weaponLIndex %= Mecha.WEAPON_L_LIST.length; + const weaponName = Mecha.WEAPON_L_LIST[this._weaponLIndex]; + this._weaponL = dragonBones.PixiFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_l").childArmature = this._weaponL; + this._weaponL.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + } + + public switchWeaponR(): void { + this._weaponR.eventDispatcher.removeEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + + this._weaponRIndex++; + this._weaponRIndex %= Mecha.WEAPON_R_LIST.length; + const weaponName = Mecha.WEAPON_R_LIST[this._weaponRIndex]; + this._weaponR = dragonBones.PixiFactory.factory.buildArmature(weaponName); + this._armature.getSlot("weapon_r").childArmature = this._weaponR; + this._weaponR.eventDispatcher.addEvent(dragonBones.EventObject.FRAME_EVENT, this._frameEventHandler, this); + } + + public switchSkin(): void { + this._skinIndex++; + this._skinIndex %= Mecha.SKINS.length; + const skinName = Mecha.SKINS[this._skinIndex]; + const skinData = dragonBones.PixiFactory.factory.getArmatureData(skinName).defaultSkin; + dragonBones.PixiFactory.factory.changeSkin(this._armature, skinData, ["weapon_l", "weapon_r"]); + } + + public aim(x: number, y: number): void { + this._target.x = x; + this._target.y = y; + } + + public update(): void { + this._updatePosition(); + this._updateAim(); + this._updateAttack(); + } + + private _animationEventHandler(event: EventType): void { + switch (event.type) { + case dragonBones.EventObject.FADE_IN_COMPLETE: + if (event.animationState.name === "jump_1") { + this._isJumpingB = true; + this._speedY = -Mecha.JUMP_SPEED; + + if (this._moveDir !== 0) { + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + + this._armature.animation.fadeIn( + "jump_2", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + break; + + case dragonBones.EventObject.FADE_OUT_COMPLETE: + if (event.animationState.name === "attack_01") { + this._isAttackingB = false; + this._attackState = null; + } + break; + + case dragonBones.EventObject.COMPLETE: + if (event.animationState.name === "jump_4") { + this._isJumpingA = false; + this._isJumpingB = false; + this._updateAnimation(); + } + break; + } + } + + private _frameEventHandler(event: EventType): void { + if (event.name === "fire") { + this._helpPoint.x = event.bone.global.x; + this._helpPoint.y = event.bone.global.y; + this._helpPoint.copy((event.armature.display).toGlobal(this._helpPoint)); + + this._fire(this._helpPoint); + } + } + + private _fire(firePoint: PointType): void { + const radian = this._faceDir < 0 ? Math.PI - this._aimRadian : this._aimRadian; + const bullet = new Bullet("bullet_01", "fire_effect_01", radian + Math.random() * 0.02 - 0.01, 40, firePoint); + Game.instance.addBullet(bullet); + } + + private _updateAnimation(): void { + if (this._isJumpingA) { + return; + } + + if (this._isSquating) { + this._speedX = 0; + this._armature.animation.fadeIn( + "squat", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + return; + } + + if (this._moveDir === 0) { + this._speedX = 0; + this._armature.animation.fadeIn( + "idle", -1.0, -1, 0, + Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + + this._walkState = null; + } + else { + if (this._walkState === null) { + this._walkState = this._armature.animation.fadeIn( + "walk", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ); + + this._walkState.resetToPose = false; + } + + if (this._moveDir * this._faceDir > 0) { + this._walkState.timeScale = Mecha.MAX_MOVE_SPEED_FRONT / Mecha.NORMALIZE_MOVE_SPEED; + } + else { + this._walkState.timeScale = -Mecha.MAX_MOVE_SPEED_BACK / Mecha.NORMALIZE_MOVE_SPEED; + } + + if (this._moveDir * this._faceDir > 0) { + this._speedX = Mecha.MAX_MOVE_SPEED_FRONT * this._faceDir; + } + else { + this._speedX = -Mecha.MAX_MOVE_SPEED_BACK * this._faceDir; + } + } + } + + private _updatePosition(): void { + if (this._speedX !== 0.0) { + this._armatureDisplay.x += this._speedX; + if (this._armatureDisplay.x < 0) { + this._armatureDisplay.x = 0; + } + else if (this._armatureDisplay.x > Game.STAGE_WIDTH) { + this._armatureDisplay.x = Game.STAGE_WIDTH; + } + } + + if (this._speedY !== 0.0) { + if (this._speedY < 5.0 && this._speedY + Game.G >= 5.0) { + this._armature.animation.fadeIn( + "jump_3", -1.0, -1, 0 + , Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + + this._speedY += Game.G; + this._armatureDisplay.y += this._speedY; + + if (this._armatureDisplay.y > Game.GROUND) { + this._armatureDisplay.y = Game.GROUND; + this._speedY = 0.0; + this._armature.animation.fadeIn( + "jump_4", -1.0, -1, + 0, Mecha.NORMAL_ANIMATION_GROUP + ).resetToPose = false; + } + } + } + + private _updateAim(): void { + this._faceDir = this._target.x > this._armatureDisplay.x ? 1 : -1; + if (this._armatureDisplay.armature.flipX !== this._faceDir < 0) { + this._armatureDisplay.armature.flipX = !this._armatureDisplay.armature.flipX; + if (this._moveDir !== 0) { + this._updateAnimation(); + } + } + + const aimOffsetY = this._armature.getBone("chest").global.y * this._armatureDisplay.scale.y; + if (this._faceDir > 0) { + this._aimRadian = Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + } + else { + this._aimRadian = Math.PI - Math.atan2(this._target.y - this._armatureDisplay.y - aimOffsetY, this._target.x - this._armatureDisplay.x); + if (this._aimRadian > Math.PI) { + this._aimRadian -= Math.PI * 2.0; + } + } + + let aimDir = 0; + if (this._aimRadian > 0.0) { + aimDir = -1; + } + else { + aimDir = 1; + } + + if (this._aimState === null || this._aimDir !== aimDir) { + this._aimDir = aimDir; + + // Animation mixing. + if (this._aimDir >= 0) { + this._aimState = this._armature.animation.fadeIn( + "aim_up", -1.0, -1, + 0, Mecha.AIM_ANIMATION_GROUP + ); + } + else { + this._aimState = this._armature.animation.fadeIn( + "aim_down", -1.0, -1, + 0, Mecha.AIM_ANIMATION_GROUP + ); + } + + this._aimState.resetToPose = false; + } + + this._aimState.weight = Math.abs(this._aimRadian / Math.PI * 2); + this._armature.invalidUpdate(); + } + + private _updateAttack(): void { + if (!this._isAttackingA || this._isAttackingB) { + return; + } + + this._isAttackingB = true; + this._attackState = this._armature.animation.fadeIn( + "attack_01", -1.0, -1, + 0, Mecha.ATTACK_ANIMATION_GROUP + ); + + this._attackState.resetToPose = false; + this._attackState.autoFadeOutTime = this._attackState.fadeTotalTime; + } + } + + class Bullet { + private _speedX: number = 0.0; + private _speedY: number = 0.0; + + private _armatureDisplay: ArmatureDisplayType; + private _effecDisplay: ArmatureDisplayType | null = null; + + public constructor(armatureName: string, effectArmatureName: string | null, radian: number, speed: number, position: PointType) { + this._speedX = Math.cos(radian) * speed; + this._speedY = Math.sin(radian) * speed; + + this._armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay(armatureName); + this._armatureDisplay.x = position.x + Math.random() * 2 - 1; + this._armatureDisplay.y = position.y + Math.random() * 2 - 1; + this._armatureDisplay.rotation = radian; + + if (effectArmatureName !== null) { + this._effecDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay(effectArmatureName); + this._effecDisplay.rotation = radian; + this._effecDisplay.x = this._armatureDisplay.x; + this._effecDisplay.y = this._armatureDisplay.y; + this._effecDisplay.scale.set( + 1 + Math.random() * 1, + 1 + Math.random() * 0.5 + ); + if (Math.random() < 0.5) { + this._effecDisplay.scale.y *= -1; + } + + Game.instance.stage.addChild(this._effecDisplay); + this._effecDisplay.animation.play("idle"); + } + + Game.instance.stage.addChild(this._armatureDisplay); + this._armatureDisplay.animation.play("idle"); + } + + public update(): boolean { + this._armatureDisplay.x += this._speedX; + this._armatureDisplay.y += this._speedY; + + if ( + this._armatureDisplay.x < -100.0 || this._armatureDisplay.x >= Game.STAGE_WIDTH + 100.0 || + this._armatureDisplay.y < -100.0 || this._armatureDisplay.y >= Game.STAGE_HEIGHT + 100.0 + ) { + Game.instance.stage.removeChild(this._armatureDisplay); + this._armatureDisplay.dispose(); + + if (this._effecDisplay !== null) { + Game.instance.stage.removeChild(this._effecDisplay); + this._effecDisplay.dispose(); + } + + return true; + } + + return false; + } + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/src/HelloDragonBones.ts b/reference/Pixi/Demos/src/HelloDragonBones.ts new file mode 100644 index 0000000..42f53da --- /dev/null +++ b/reference/Pixi/Demos/src/HelloDragonBones.ts @@ -0,0 +1,44 @@ +/** + * How to use + * 1. Load data. + * + * 2. Parse data. + * factory.parseDragonBonesData(); + * factory.parseTextureAtlasData(); + * + * 3. Build armature. + * armatureDisplay = factory.buildArmatureDisplay("armatureName"); + * + * 4. Play animation. + * armatureDisplay.animation.play("animationName"); + * + * 5. Add armature to stage. + * addChild(armatureDisplay); + */ +class HelloDragonBones extends BaseTest { + protected _onStart(): void { + PIXI.loader + // .add("dragonBonesData", "./resource/assets/dragon_boy_ske.json") + .add("dragonBonesData", "./resource/assets/dragon_boy_ske.dbbin", { loadType: PIXI.loaders.Resource.LOAD_TYPE.XHR, xhrType: PIXI.loaders.Resource.XHR_RESPONSE_TYPE.BUFFER } as any) + .add("textureData", "./resource/assets/dragon_boy_tex.json") + .add("texture", "./resource/assets/dragon_boy_tex.png"); + + PIXI.loader.once("complete", (loader: PIXI.loaders.Loader, resources: dragonBones.Map) => { + const factory = dragonBones.PixiFactory.factory; + factory.parseDragonBonesData(resources["dragonBonesData"].data); + factory.parseTextureAtlasData(resources["textureData"].data, resources["texture"].texture); + + const armatureDisplay = factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.animation.play("walk"); + this.stage.addChild(armatureDisplay); + + armatureDisplay.x = this._renderer.width * 0.5; + armatureDisplay.y = this._renderer.height * 0.5 + 100; + + // + this._startRenderTick(); + }); + + PIXI.loader.load(); + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/src/PerformanceTest.ts b/reference/Pixi/Demos/src/PerformanceTest.ts new file mode 100644 index 0000000..b83491b --- /dev/null +++ b/reference/Pixi/Demos/src/PerformanceTest.ts @@ -0,0 +1,141 @@ +class PerformanceTest extends BaseTest { + private _addingArmature: boolean = false; + private _removingArmature: boolean = false; + private readonly _text: PIXI.Text = new PIXI.Text("", { align: "center" }); + private readonly _armatures: Array = []; + private _resources: dragonBones.Map; + + protected _onStart(): void { + PIXI.loader + .add("dragonBonesData", "./resource/assets/dragon_boy_ske.json") + .add("textureData", "./resource/assets/dragon_boy_tex.json") + .add("texture", "./resource/assets/dragon_boy_tex.png"); + + PIXI.loader.once("complete", (loader: PIXI.loaders.Loader, resources: dragonBones.Map) => { + this._resources = resources; + // + this._text.scale.x = 0.7; + this._text.scale.y = 0.7; + this.stage.addChild(this._text); + + // + this._stage.interactive = true; + this._stage.addListener("touchstart", this._touchHandler, this); + this._stage.addListener("touchend", this._touchHandler, this); + this._stage.addListener("mousedown", this._touchHandler, this); + this._stage.addListener("mouseup", this._touchHandler, this); + PIXI.ticker.shared.add(this._enterFrameHandler, this); + + for (let i = 0; i < 100; ++i) { + this._addArmature(); + } + + this._resetPosition(); + this._updateText(); + + // + this._startRenderTick(); + }); + + PIXI.loader.load(); + } + + private _enterFrameHandler(deltaTime: number): void { + if (this._addingArmature) { + for (let i = 0; i < 10; ++i) { + this._addArmature(); + } + + this._resetPosition(); + this._updateText(); + } + + if (this._removingArmature) { + for (let i = 0; i < 10; ++i) { + this._removeArmature(); + } + + this._resetPosition(); + this._updateText(); + } + } + + private _touchHandler(event: PIXI.interaction.InteractionEvent): void { + switch (event.type) { + case "touchstart": + case "mousedown": + const touchRight = event.data.global.x > this._renderer.width * 0.5; + this._addingArmature = touchRight; + this._removingArmature = !touchRight; + break; + + case "touchend": + case "mouseup": + this._addingArmature = false; + this._removingArmature = false; + break; + } + } + + private _addArmature(): void { + if (this._armatures.length === 0) { + dragonBones.PixiFactory.factory.parseDragonBonesData(this._resources["dragonBonesData"].data); + dragonBones.PixiFactory.factory.parseTextureAtlasData(this._resources["textureData"].data, this._resources["texture"].texture); + } + + const armatureDisplay = dragonBones.PixiFactory.factory.buildArmatureDisplay("DragonBoy"); + armatureDisplay.armature.cacheFrameRate = 24; + armatureDisplay.animation.play("walk", 0); + armatureDisplay.scale.set(0.7, 0.7); + this.stage.addChild(armatureDisplay); + + this._armatures.push(armatureDisplay); + } + + private _removeArmature(): void { + if (this._armatures.length === 0) { + return; + } + + const armatureDisplay = this._armatures.pop(); + this.stage.removeChild(armatureDisplay); + armatureDisplay.dispose(); + + if (this._armatures.length === 0) { + dragonBones.PixiFactory.factory.clear(true); + dragonBones.BaseObject.clearPool(); + } + } + + private _resetPosition(): void { + const armatureCount = this._armatures.length; + if (armatureCount === 0) { + return; + } + + const paddingH = 50; + const paddingV = 150; + const gapping = 100; + + const stageWidth = this.renderer.width - paddingH * 2; + const columnCount = Math.floor(stageWidth / gapping); + const paddingHModify = (this.renderer.width - columnCount * gapping) * 0.5; + const dX = stageWidth / columnCount; + const dY = (this.renderer.height - paddingV * 2) / Math.ceil(armatureCount / columnCount); + + for (let i = 0, l = armatureCount; i < l; ++i) { + const armatureDisplay = this._armatures[i]; + const lineY = Math.floor(i / columnCount); + + armatureDisplay.x = (i % columnCount) * dX + paddingHModify; + armatureDisplay.y = lineY * dY + paddingV; + } + } + + private _updateText(): void { + this._text.text = "Count: " + this._armatures.length + " \nTouch screen left to decrease count / right to increase count."; + this._text.x = (this.renderer.width - this._text.width) * 0.5; + this._text.y = this.renderer.height - 60; + this.stage.addChild(this._text); + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/src/ReplaceSlotDisplay.ts b/reference/Pixi/Demos/src/ReplaceSlotDisplay.ts new file mode 100644 index 0000000..7f0af5a --- /dev/null +++ b/reference/Pixi/Demos/src/ReplaceSlotDisplay.ts @@ -0,0 +1,129 @@ +class ReplaceSlotDisplay extends BaseTest { + + private _displayIndex: number = 0; + private readonly _replaceDisplays: string[] = [ + // Replace normal display. + "display0002", "display0003", "display0004", "display0005", "display0006", "display0007", "display0008", "display0009", "display0010", + // Replace mesh display. + "meshA", "meshB", "meshC", + ]; + + private readonly _factory: dragonBones.PixiFactory = dragonBones.PixiFactory.factory; + private _armatureDisplay: dragonBones.PixiArmatureDisplay; + + protected _onStart(): void { + PIXI.loader + .add("dragonBonesDataA", "./resource/assets/replace_slot_display/main_ske.json") + .add("textureDataA", "./resource/assets/replace_slot_display/main_tex.json") + .add("textureA", "./resource/assets/replace_slot_display/main_tex.png") + .add("dragonBonesDataB", "./resource/assets/replace_slot_display/replace_ske.json") + .add("textureDataB", "./resource/assets/replace_slot_display/replace_tex.json") + .add("textureB", "./resource/assets/replace_slot_display/replace_tex.png"); + + PIXI.loader.once("complete", (loader: PIXI.loaders.Loader, resources: dragonBones.Map) => { + this._factory.parseDragonBonesData(resources["dragonBonesDataA"].data); + this._factory.parseTextureAtlasData(resources["textureDataA"].data, resources["textureA"].texture); + this._factory.parseDragonBonesData(resources["dragonBonesDataB"].data); + this._factory.parseTextureAtlasData(resources["textureDataB"].data, resources["textureB"].texture); + + this._armatureDisplay = this._factory.buildArmatureDisplay("MyArmature"); + this._armatureDisplay.animation.timeScale = 0.1; + this._armatureDisplay.animation.play(); + + this._armatureDisplay.x = this.stage.width * 0.5; + this._armatureDisplay.y = this.stage.height * 0.5; + this.stage.addChild(this._armatureDisplay); + + const touchHandler = (event: PIXI.interaction.InteractionEvent): void => { + this._replaceDisplay(); + }; + this.stage.interactive = true; + this.stage.addListener("touchstart", touchHandler, this); + this.stage.addListener("mousedown", touchHandler, this); + + // + this._startRenderTick(); + }); + + PIXI.loader.load(); + } + + private _replaceDisplay(): void { + this._displayIndex = (this._displayIndex + 1) % this._replaceDisplays.length; + + const replaceDisplayName = this._replaceDisplays[this._displayIndex]; + + if (replaceDisplayName.indexOf("mesh") >= 0) { // Replace mesh display. + switch (replaceDisplayName) { + case "meshA": + // Normal to mesh. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "meshA", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0002", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + + case "meshB": + // Normal to mesh. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "meshB", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0003", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + + case "meshC": + // Back to normal. + this._factory.replaceSlotDisplay( + "replace", + "MyMesh", + "mesh", + "weapon_1004_1", + this._armatureDisplay.armature.getSlot("weapon") + ); + + // Replace mesh texture. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + "display0005", + this._armatureDisplay.armature.getSlot("mesh") + ); + break; + } + } + else { // Replace normal display. + this._factory.replaceSlotDisplay( + "replace", + "MyDisplay", + "ball", + replaceDisplayName, + this._armatureDisplay.armature.getSlot("ball") + ); + } + } +} \ No newline at end of file diff --git a/reference/Pixi/Demos/tsconfig.json b/reference/Pixi/Demos/tsconfig.json new file mode 100644 index 0000000..c2fc9e2 --- /dev/null +++ b/reference/Pixi/Demos/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "watch": false, + "sourceMap": false, + "declaration": false, + "alwaysStrict": true, + "noImplicitAny": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": false, + "strictNullChecks": false, + "experimentalDecorators": true, + "allowSyntheticDefaultImports": true, + "target": "es5", + "module": "commonjs", + "outDir": "./out" + }, + "exclude": [ + "node_modules", + "out" + ] +} \ No newline at end of file diff --git a/reference/Pixi/Demos/tslint.json b/reference/Pixi/Demos/tslint.json new file mode 100644 index 0000000..eeb58d1 --- /dev/null +++ b/reference/Pixi/Demos/tslint.json @@ -0,0 +1,15 @@ +{ + "rules": { + "no-unused-expression": true, + "no-unreachable": true, + "no-duplicate-variable": true, + "no-duplicate-key": true, + "no-unused-variable": true, + "curly": false, + "class-name": true, + "triple-equals": true, + "semicolon": [ + true + ] + } +} \ No newline at end of file diff --git a/reference/Pixi/README.md b/reference/Pixi/README.md new file mode 100644 index 0000000..7d77599 --- /dev/null +++ b/reference/Pixi/README.md @@ -0,0 +1,5 @@ +# DragonBones Pixi library + +## [Demos](./Demos/) + +## [Pixi](http://www.pixijs.com/) \ No newline at end of file diff --git a/reference/README.md b/reference/README.md new file mode 100644 index 0000000..71b7179 --- /dev/null +++ b/reference/README.md @@ -0,0 +1,21 @@ +# DragonBones JavaScript / TypeScript Runtime +* [DragonBones common library](./DragonBones/) +* Highly suggest use [DragonBones Pro](http://www.dragonbones.com/) to create aniamtion. + +## Supported engines +* [Egret](http://www.egret.com/) - [How to use DragonBones in Egret](./Egret/) +* [Pixi](http://www.pixijs.com/) - [How to use DragonBones in Pixi](./Pixi/) + +## To learn more about +* [DragonBones WebSite](http://www.dragonbones.com/) +* [DragonBones Pro WebSite](http://www.egret.com/products/dragonbones.html) +* [Demos](http://www.dragonbones.com/demo/index.html) + +## Release Notes +* [DragonBones 4.7 release notes](https://github.com/DragonBones/DragonBonesJS/blob/master/docs/DragonBones_4.7_release_notes_zh.md) + +## DragonBones data format +* [DragonBones 5.0 data format](https://github.com/DragonBones/DragonBonesJS/blob/master/docs/DragonBones_5.0_data_format_zh.md) +* [DragonBones 4.5 data format](https://github.com/DragonBones/DragonBonesJS/blob/master/docs/DragonBones_4.5_data_format_zh.md) + +Copyright 2012-2017 The DragonBones Team. \ No newline at end of file diff --git a/reference/docs/DragonBones_4.5_data_format_zh.md b/reference/docs/DragonBones_4.5_data_format_zh.md new file mode 100644 index 0000000..c557908 --- /dev/null +++ b/reference/docs/DragonBones_4.5_data_format_zh.md @@ -0,0 +1,421 @@ +# DragonBones 4.5 数据格式标准说明 +```javascript +{ + // DragonBones 数据名称 + "name": "dragonBonesName", + + // 数据版本 + "version": "4.5", + + // 动画帧频 + "frameRate": 24, + + // 是否使用绝对数据 [0: 使用相对数据, 1: 使用绝对数据] (可选属性 默认: 1) + "isGlobal": 1, + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 骨架列表 + "armature": [{ + + // 骨架名称 (一个 DragonBones 数据可包含多个骨架) + "name": "armatureName", + + // 动画帧频 (可选属性 默认: 使用全局帧频) + "frameRate": 24, + + // 动画类型 (可选属性 默认: "Armature") + // ["Armature": 骨骼动画, "MovieClip": 基本动画, "Stage": 场景动画] + "type": "Armature", + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 添加到舞台后的默认行为列表 (可选属性 默认: null) + "defaultActions": [ + + // 此骨架播放指定动画 + ["gotoAndPlay", "animationName"], + + // 此骨架播放指定动画并停止 + ["gotoAndStop", "animationName"], + ], + + // 此骨架包含的骨骼列表 + "bone": [{ + + // 骨骼名称 + "name": "boneName", + + // 父级骨骼的名称 + "parent": "parentBoneName", + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 骨骼注册到骨架的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + } + }], + + // 此骨架包含的插槽列表 + "slot": [{ + + // 插槽名称 + "name": "slotName", + + // 插槽所属的骨骼名称 + "parent": "parentBoneName", + + // 默认显示对象的索引 (可选属性 默认: 0) + "displayIndex": 0, + + // 混合模式 (可选属性 默认: null) + "blendMode": null, + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 显示对象的颜色叠加 (可选属性 默认: null) + "color": { + "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100) + "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100) + "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100) + "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100) + "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0) + "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0) + "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0) + "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0) + }, + + // 添加到舞台后的行为列表 (可选属性 默认: null) + "actions": [ + + // 子骨架播放指定动画 (仅对显示对象为骨架时有效) + ["gotoAndPlay", "animationName"], + + // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效) + ["gotoAndStop", "animationName"], + ] + }], + + // 此骨架包含的皮肤列表 + "skin": [{ + + // 皮肤名称 + "name": "skinName", + + // 此皮肤包含的插槽列表 + "slot": [{ + + // 插槽名称 + "name": "slotName", + + // 此插槽包含的显示对象列表 + "display": [{ + + // 显示对象名称 + "name": "displayName", + + // 显示对象类型 (可选属性 默认: "image") + // ["image": 贴图, "armature": 骨架, "mesh": 网格, ... 其他扩展的类型] + "type": "image", + + // 显示对象相对于骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // y 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + }, + + // 显示对象的轴点 (可选属性 默认: null, 仅对贴图或网格有效) + "pivot": { + "x": 0.50, // 水平轴点 [0.00~1.00] (可选属性 默认: 0.50) + "y": 0.50, // 垂直轴点 [0.00~1.00] (可选属性 默认: 0.50) + }, + + // 顶点的 UV 坐标列表 (可选属性 默认: null, 仅对网格有效) + // [u0, v0, u1, v1, ...] + "uvs": [0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 1.0000, 0.0000, 1.0000], + + // 三角形顶点索引列表 (可选属性 默认: null, 仅对网格有效) + "triangles": [0, 1, 2, 2, 3, 0], + + // 顶点相对显示对象轴点的坐标列表 (可选属性 默认: null, 仅对网格有效) + // [x0, y0, x1, y1, ...] + "vertices": [-64.00, -64.00, 64.00, -64.00, 64.00, 64.00, -64.00, 64.00], + + // 顶点权重列表 (可选属性 默认: null, 仅对网格有效) + // [骨骼数量, 骨骼索引, 权重, ..., ...] + "weights": [1, 0, 1.00, 2, 0, 0.50, 1, 0.50], + + // 蒙皮插槽注册的矩阵变换 (可选属性 默认: null, 仅对网格有效) + // [a, b, c, d, tx, ty] + "slotPose": [1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00], + + // 蒙皮骨骼注册的矩阵变换 (可选属性 默认: null, 仅对网格有效) + // [骨骼索引, a, b, c, d, tx, ty, ...] + "bonePose": [0, 1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00] + }] + }] + }], + + // 此骨架包含的 ik 约束列表 + "ik": [{ + + // ik 约束名称 + "name": "ikName", + + // 绑定骨骼的名称 + "bone": "boneName", + + // 目标骨骼的名称 + "target": "ikBoneName", + + // 弯曲方向 (可选属性 默认: true) + // [true: 正方向/ 顺时针, false: 反方向/ 逆时针] + "bendPositive": true, + + // 骨骼链的长度 (可选属性 默认: 0) + // [0: 只约束 bone, n: 约束 bone 及 bone 向上 n 级的父骨骼] + "chain": 0, + + // 权重 [0.00: 不约束 ~ 1.00: 完全约束] (可选属性 默认: 1.00) + "weight": 1.00 + }], + + // 此骨架包含的动画列表 + "animation": [{ + + // 动画名称 + "name": "animationName", + + // 循环播放次数 [0: 循环播放无限次, n: 循环播放 n 次] (可选属性 默认: 1) + "playTimes": 1, + + // 动画帧长度 (可选属性 默认: 1) + "duration": 1, + + // 此动画包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 帧事件 (可选属性 默认: null) + "event": "eventName", + + // 帧声音 (可选属性 默认: null) + "sound": "soundName", + + // 帧行为列表 (可选属性 默认: null) + "actions": [ + + // 此骨架播放指定动画 + ["gotoAndPlay", "animationName"], + + // 此骨架播放指定动画并停止 + ["gotoAndStop", "animationName"], + ] + }], + + // 深度排序移动时间轴 + "zOrder": { + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 插槽偏移 [slotIndexA, offsetA, slotIndexB, offsetB, ...] (可选属性 默认: null) + "zOrder": [0, 2, 4, 1, 6, -1] + }] + }, + + // 此动画包含的骨骼时间轴列表 (可选属性 默认: null) + "bone": [{ + + // 时间轴名称 (与骨骼名称对应) + "name": "boneName", + + // 时间轴缩放 (可选属性 默认: 1.00) + "scale": 1.00, + + // 时间轴偏移 (可选属性 默认: 0.00) + "offset": 0.00, + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 帧事件 (可选属性 默认: null) + "event": "eventName", + + // 帧声音 (可选属性 默认: null) + "sound": "soundName", + + // 骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000 // 垂直缩放 (可选属性 默认: 1.0000) + }, + }] + }], + + // 此动画包含的插槽时间轴列表 + "slot": [{ + + // 时间轴名称 (与插槽名称对应) + "name": "slotName", + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 此帧的显示对象索引 (皮肤中对应的插槽显示对象列表) (可选属性 默认: 0) + "displayIndex": 0, + + // 显示对象的颜色叠加 (可选属性 默认: null) + "color": { + "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100) + "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100) + "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100) + "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100) + "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0) + "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0) + "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0) + "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0) + }, + + // 播放到当前帧时,执行的动作行为列表 (可选属性 默认: null) + "actions": [ + + // 子骨架播放指定动画 (仅对显示对象为骨架时有效) + ["gotoAndPlay", "animationName"], + + // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效) + ["gotoAndStop", "animationName"], + ] + }], + }], + + // 此动画包含的自由变形时间轴列表 (可选属性 默认: null) + "ffd": [{ + + // 时间轴名称 (与皮肤名称对应) + "skin": "skinName", + + // 时间轴名称 (与插槽名称对应) + "name": "slotName", + + // 时间轴名称 (显示对象索引) + "displayIndex": 0, + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 顶点坐标列表索引偏移 (可选属性 默认: 0) + "offset": 0, + + // 顶点坐标相对位移列表 [x0, y0, x1, y1, ...] (可选属性 默认: null) + "vertices": [0.01, 0.01] + }] + }] + }] + }] +} +``` + +------------------------------ + +# 4.5 相对 4.0 格式变化 + +* Armature + 1. 增加 "frameRate" 属性: 可为每个骨架设置独立帧率 + 2. 增加 "type" 属性: 骨骼动画/基本动画/场景动画 + 3. 增加 "defaultActions" 列表: 可为骨架分配默认行为 (删除 "gotoAndPlay" 属性, 其功能与 "actions" 合并) + 4. 增加 "ik" 列表 + +* Slot + 1. 增加 "actions" 列表: 插槽可为子骨架分配默认行为 (删除 "gotoAndPlay" 属性, 其功能与 "actions" 合并) + +* Display + 1. "type" 属性增加 "mesh" 类型以及与其匹配的其他属性 + +* Animation + 1. 增加 "ffd" 时间轴 + +* Frame + 1. 增加 "actions" 列表: 控制子骨架行为 (删除 "action" "gotoAndPlay" 属性, 其功能与 "actions" 合并) + +* actions + 1. 暂时只支持 "gotoAndPlay" 行为, 后续会扩展更多对动画的控制行为和交互行为 + +------------------------------ + +# 4.0 相对 3.0 格式变化 + +* Armature 中包含Slot列表 + +* Skin 中增加默认Skin, 默认skin有如下特性: + 1. 在skin列表中排第一 + 2. 名字为空字符串“” + 3. 包含的slot会同时存在于其他的skin,相当于保存所有其他skin中共有的slot(相当于其他skin的基类) + +* Skin中包含的Slot的Display的transform属性中不在有pX,pY属性 + 1. Display不再有初始轴点属性,所有display的轴点均为中心点。 + 2. 因为display在运动时的轴点是骨骼的原点,所以这里的轴点信息可以在初始化时换算成display的位置信息,从而可以完美还原动画。 + +* Animation中有下面的改动 + 1. 去掉"tweenEasing": 动画不会覆盖关键帧的缓动值 + 2. 去掉"autoTween": 动画不会覆盖关键帧的补件值 + 3. "loop"改名为"playtime" + 4. "colorTransform"改名为"color" + +* 区分Bone时间轴和Slot时间轴 + 1. Bone时间轴包含平移旋转缩放,自定义事件和声音事件 + 2. Slot时间轴包含颜色变换,dispalyIndex变换和zorder变换 + +* Armature, Bone 和Slot中均添加了userData字段用于记录用户自定义信息,同时方便第三方扩展 + +* Frame中有如下改动 + 1. 中去掉了hide 属性,动画中如果想隐藏某个插槽,改为设置dispalyIndex为-1. visible属性完全留给开发者使用,用于动态设置slot是否隐藏。 + 2. 增加curve属性,使用贝塞尔曲线描述动画补间的缓动效果 diff --git a/reference/docs/DragonBones_4.7_release_notes_zh.md b/reference/docs/DragonBones_4.7_release_notes_zh.md new file mode 100644 index 0000000..9fff3da --- /dev/null +++ b/reference/docs/DragonBones_4.7_release_notes_zh.md @@ -0,0 +1,44 @@ +DragonBones 4.7 的运行库,相对之前的版本有较大的功能增加和改进,同时保证完美的向下兼容。 +全新的 TypeScript / JavaScript、ActionScript、C++ 的运行库支持,支持 DragonBones Pro 的全部功能。 +* [DragonBones Github](https://github.com/DragonBones) + +#### 合并 Armature 与 FastArmature,不再区分极速模式与普通模式,简化开启缓存的调用方式。 +* 不用再纠结是否需要使用极速模式了,因为 Armatue 已经合并了极速模式(FastArmature)的全部功能,包括支持开启缓存。 +* 通过 Armatrue.enableAnimationCache() 接口开启缓存。 +* FastArmatrue 以及 AnimationCacheManger 不再建议使用,但是功能依然保留用于实现向下兼容。 +* 【特别注意】TS版本,以下代码需要作调整才能编译通过: + * instanceof dragonBones.FastArmatre 改为 instanceof dragonBones.Armatre + * instanceof dragonBones.FastBone 改为 instanceof dragonBones.Bone + * 依次类推... + +#### 内置内存池,方便DragonBones对象的内存管理,大幅提升频繁创建对象的效率,减少发生内存泄漏的可能性。 +* 提供BaseObject基类,封装构建对象的方法,自动放入内存池,所有DragonBones体系中需要频繁动态创建的对象都是基于BaseObject的 +* 内存池提供setMaxCount接口,控制最大尺寸。 +* 内存池提供clear接口,清空内存池。 + +#### 增强了局部换装功能,解决轴点错位问题,支持一键整体换装,支持纹理延迟加载。 +* 增加 Factory.replaceSlotDisplay()、Factory.replaceSlotDisplayList() 接口用于解决局部换种轴点错位的问题。 +* 增加 Armature.replaceTexture() 接口,用于实现替换整个骨架的贴图。 +* 增加骨架脱离贴图运行机制,可以实现贴图延时加载,动画边运行,贴图边加载。 +* 具体的使用文档可以参见 [APISpec](http://edn.egret.com/cn/apidoc/) 和新功能教程。 + +#### 规范骨架显示对象的类型,构造简单的骨骼动画更方便 +* 增加 IArmatureDisplay 接口,规范 Armatrue 的 display 显示对象的类型。 +* 增加 Factory.buildArmatureDisplay() 接口,用于直接构建骨架的显示对象。使用该方法构建的骨骼动画能够自动运行,不需要再手动添加到 WorkClock 中。往场景中添加不需要独立控制的骨骼动画,使用该接口会非常方便,只需一行就能实现。 +stage.addChild(Factory.buildArmatureDisplay())。 + +#### 重构 Animation 的 gotoAndPlay() 接口,拆分动画的播放和混合功能,增加动画播放的接口,支持更多控制播放的参数。 +* 以前的 gotoAndPlay() 承载了动画的播放和融合两类功能,参数列表庞大,使用起来不方便容易出错。这个版本将这两类功能拆分为: + * play() 负责动画的播放。 + * fadeIn() 负责动画的融合。 +* 增加动画播放的接口,支持通过时间、帧和进度三个维度,控制动画播放开始和播放停止的位置: + * Armature.animation.gotoAndPlayByTime() + * Armature.animation.gotoAndPlayByFrame() + * Armature.animation.gotoAndPlayByProgress() + * Armature.animation.gotoAndStopByTime() + * Armature.animation.gotoAndStopByFrame() + * Armature.animation.gotoAndStopByProgress() +* 接口维持向下兼容,gotoAndPlay() 和 gotoAndStop() 功能仍然不变,但是改为不建议使用的状态。 +* 增加 fadeIn() 接口,用与实现多个动画同时播放的动画混合效果。 + + diff --git a/reference/docs/DragonBones_5.0_data_format_zh.md b/reference/docs/DragonBones_5.0_data_format_zh.md new file mode 100644 index 0000000..b14528b --- /dev/null +++ b/reference/docs/DragonBones_5.0_data_format_zh.md @@ -0,0 +1,450 @@ +# DragonBones 5.0 数据格式标准说明 +```javascript +{ + // DragonBones 数据名称 + "name": "dragonBonesName", + + // 数据版本 + "version": "5.0", + + // 最低兼容版本 + "compatibleVersion": "4.5", + + // 动画帧频 + "frameRate": 24, + + // 自定义数据 (可选属性 默认: null) + "userData": null, + + // 骨架列表 + "armature": [{ + + // 骨架名称 (一个 DragonBones 数据可包含多个骨架) + "name": "armatureName", + + // 动画帧频 (可选属性 默认: 使用全局帧频) + "frameRate": 24, + + // 动画类型 (可选属性 默认: "Armature") + // ["Armature": 骨骼动画, "MovieClip": 基本动画, "Stage": 场景动画] + "type": "Armature", + + // 自定义数据 (可选属性 默认: null) + "userData": null, + + // 添加到舞台后的默认行为列表 (可选属性 默认: null) + "defaultActions": [ + + // 此骨架播放指定动画 + ["gotoAndPlay", "animationName"], + + // 此骨架播放指定动画并停止 + ["gotoAndStop", "animationName"], + ], + + // 此骨架包含的骨骼列表 + "bone": [{ + + // 骨骼名称 + "name": "boneName", + + // 父级骨骼的名称 + "parent": "parentBoneName", + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 骨骼注册到骨架的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + } + }], + + // 此骨架包含的插槽列表 + "slot": [{ + + // 插槽名称 + "name": "slotName", + + // 插槽所属的骨骼名称 + "parent": "parentBoneName", + + // 默认显示对象的索引 (可选属性 默认: 0) + "displayIndex": 0, + + // 混合模式 (可选属性 默认: null) + "blendMode": null, + + // 自定义数据 [任何类型] (可选属性 默认: null) + "userData": null, + + // 显示对象的颜色叠加 (可选属性 默认: null) + "color": { + "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100) + "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100) + "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100) + "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100) + "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0) + "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0) + "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0) + "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0) + }, + + // 添加到舞台后的行为列表 (可选属性 默认: null) + "actions": [ + + // 子骨架播放指定动画 (仅对显示对象为骨架时有效) + ["gotoAndPlay", "animationName"], + + // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效) + ["gotoAndStop", "animationName"], + ] + }], + + // 此骨架包含的皮肤列表 + "skin": [{ + + // 皮肤名称 + "name": "skinName", + + // 此皮肤包含的插槽列表 + "slot": [{ + + // 插槽名称 + "name": "slotName", + + // 此插槽包含的显示对象列表 + "display": [{ + + // 显示对象名称 + "name": "displayName", + + // 显示对象类型 (可选属性 默认: "image") + // ["image": 贴图, "armature": 骨架, "mesh": 网格, "boundingBox": 边界框, ... 其他扩展的类型] + "type": "image", + + // 子骨架指向的骨架名、网格包含的贴图名 (可选属性 默认: null, 仅对子骨架、网格有效) + "path": "path", + + // 共享网格的索引 (可选属性 默认: null, 仅对网格有效) + "share": "meshName", + + // 是否继承动画 (可选属性 默认: true, 仅对共享网格有效) + "inheritFFD": true, + + // 边界框类型 (可选属性 默认: "rectangle", 仅对边界框有效) + // ["rectangle": 矩形, "ellipse": 椭圆, "polygon": 自定义多边形] + "subType": "rectangle", + + // 显示对象颜色 (可选属性 默认: 0, 仅对边界框有效) + "color": 0, + + // 显示对象相对于骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // y 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + }, + + // 显示对象的轴点 (可选属性 默认: null, 对骨架无效) + "pivot": { + "x": 0.50, // 水平轴点 [0.00~1.00] (可选属性 默认: 0.50) + "y": 0.50, // 垂直轴点 [0.00~1.00] (可选属性 默认: 0.50) + }, + + // 矩形或椭圆的宽高 (可选属性 默认: 0, 仅对边界框有效), + "width": 100, "height": 100, + + // 顶点相对显示对象轴点的坐标列表 (可选属性 默认: null, 仅对网格或自定义多边形边界框有效) + // [x0, y0, x1, y1, ...] + "vertices": [-64.00, -64.00, 64.00, -64.00, 64.00, 64.00, -64.00, 64.00], + + // 顶点的 UV 坐标列表 (可选属性 默认: null, 仅对网格有效) + // [u0, v0, u1, v1, ...] + "uvs": [0.0000, 0.0000, 1.0000, 0.0000, 1.0000, 1.0000, 0.0000, 1.0000], + + // 三角形顶点索引列表 (可选属性 默认: null, 仅对网格有效) + "triangles": [0, 1, 2, 2, 3, 0], + + // 顶点权重列表 (可选属性 默认: null, 仅对网格有效) + // [骨骼数量, 骨骼索引, 权重, ..., ...] + "weights": [1, 0, 1.00, 2, 0, 0.50, 1, 0.50], + + // 蒙皮插槽注册的矩阵变换 (可选属性 默认: null, 仅对网格有效) + // [a, b, c, d, tx, ty] + "slotPose": [1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00], + + // 蒙皮骨骼注册的矩阵变换 (可选属性 默认: null, 仅对网格有效) + // [骨骼索引, a, b, c, d, tx, ty, ...] + "bonePose": [0, 1.0000, 0.0000, 0.0000, 1.0000, 0.00, 0.00] + }] + }] + }], + + // 此骨架包含的 ik 约束列表 + "ik": [{ + + // ik 约束名称 + "name": "ikName", + + // 绑定骨骼的名称 + "bone": "boneName", + + // 目标骨骼的名称 + "target": "ikBoneName", + + // 弯曲方向 (可选属性 默认: true) + // [true: 正方向/ 顺时针, false: 反方向/ 逆时针] + "bendPositive": true, + + // 骨骼链的长度 (可选属性 默认: 0) + // [0: 只约束 bone, n: 约束 bone 及 bone 向上 n 级的父骨骼] + "chain": 0, + + // 权重 [0.00: 不约束 ~ 1.00: 完全约束] (可选属性 默认: 1.00) + "weight": 1.00 + }], + + // 此骨架包含的动画列表 + "animation": [{ + + // 动画名称 + "name": "animationName", + + // 循环播放次数 [0: 循环播放无限次, n: 循环播放 n 次] (可选属性 默认: 1) + "playTimes": 1, + + // 动画帧长度 (可选属性 默认: 1) + "duration": 1, + + // 此动画包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 帧声音 (可选属性 默认: null) + "sound": "soundName", + + // 帧事件列表 (可选属性 默认: null) + "events": [{ + + // 事件名称 + "name": "eventName", + + // 骨骼名称 (可选属性 默认: null) + "bone": "boneName", + + // 插槽名称 (可选属性 默认: null) + "slot": "slotName", + + // 事件参数列表 (可选属性 默认: null) + "ints":[0, 1, 2], + "floats":[0.01, 1.01, 2.01], + "strings":["a", "b", "c"] + }], + + // 帧行为列表 (可选属性 默认: null) + "actions": [ + + // 此骨架播放指定动画 + ["gotoAndPlay", "animationName"], + + // 此骨架播放指定动画并停止 + ["gotoAndStop", "animationName"], + ] + }], + + // 深度排序时间轴 + "zOrder": { + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 插槽偏移 [slotIndexA, offsetA, slotIndexB, offsetB, ...] (可选属性 默认: null) + "zOrder": [0, 2, 4, 1, 6, -1] + }] + }, + + // 此动画包含的骨骼时间轴列表 (可选属性 默认: null) + "bone": [{ + + // 时间轴名称 (与骨骼名称对应) + "name": "boneName", + + // 时间轴缩放 (可选属性 默认: 1.00) + "scale": 1.00, + + // 时间轴偏移 (可选属性 默认: 0.00) + "offset": 0.00, + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 缓动类型 [0: 由 tweenEasing 或 curve 描述缓动类型,1~N: 其他扩展缓动类型枚举(具体如何枚举未来再定义)] (可选属性 默认: 0) + "tweenType": 0, + + // 缓动值 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 贝塞尔曲线缓动参数列表 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 骨骼的位移/ 斜切/ 缩放 (可选属性 默认: null) + "transform": { + "x": 0.00, // 水平位移 (可选属性 默认: 0.00) + "y": 0.00, // 垂直位移 (可选属性 默认: 0.00) + "skX": 0.0000, // 水平斜切 (可选属性 默认: 0.0000) + "skY": 0.0000, // 垂直斜切 (可选属性 默认: 0.0000) + "scX": 1.0000, // 垂直缩放 (可选属性 默认: 1.0000) + "scY": 1.0000 // 垂直缩放 (可选属性 默认: 1.0000) + }, + }] + }], + + // 此动画包含的插槽时间轴列表 + "slot": [{ + + // 时间轴名称 (与插槽名称对应) + "name": "slotName", + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 缓动类型 [0: 由 tweenEasing 描述缓动类型,N: 其他扩展缓动属性] (可选属性 默认: 0) + "tweenType": 0, + + // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 此帧的显示对象索引 (皮肤中对应的插槽显示对象列表) (可选属性 默认: 0) + "displayIndex": 0, + + // 显示对象的颜色叠加 (可选属性 默认: null) + "color": { + "aM": 100, // 透明叠加 [0~100] (可选属性 默认: 100) + "rM": 100, // 红色叠加 [0~100] (可选属性 默认: 100) + "gM": 100, // 绿色叠加 [0~100] (可选属性 默认: 100) + "bM": 100, // 蓝色叠加 [0~100] (可选属性 默认: 100) + "aO": 0.00, // 透明偏移 [-255~255] (可选属性 默认: 0) + "rO": 0.00, // 红色偏移 [-255~255] (可选属性 默认: 0) + "gO": 0.00, // 绿色偏移 [-255~255] (可选属性 默认: 0) + "bO": 0.00, // 蓝色偏移 [-255~255] (可选属性 默认: 0) + }, + + // 播放到当前帧时,执行的动作行为列表 (可选属性 默认: null) + "actions": [ + + // 子骨架播放指定动画 (仅对显示对象为骨架时有效) + ["gotoAndPlay", "animationName"], + + // 子骨架播放指定动画并停止 (仅对显示对象为骨架时有效) + ["gotoAndStop", "animationName"], + ] + }], + }], + + // 此动画包含的自由变形时间轴列表 (可选属性 默认: null) + "ffd": [{ + + // 时间轴名称 (与网格名称对应) + "name": "timelineName", + + // 皮肤名称 + "skin": "skinName", + + // 插槽名称 + "slot": "slotName", + + // 此时间轴包含的关键帧列表 (可选属性 默认: null) + "frame": [{ + + // 帧长度 (可选属性 默认: 1) + "duration": 1, + + // 缓动类型 [0: 由 tweenEasing 描述缓动类型,N: 其他扩展缓动属性] (可选属性 默认: 0) + "tweenType": 0, + + // 补间缓动 [0.00: 线性, null: 无缓动] (可选属性 默认: null) + "tweenEasing": 0.00, + + // 补间缓动贝塞尔曲线 [x1, y1, x2, y2, ...] (可选属性 默认: null) + "curve": [0.00, 0.00, 1.00, 1.00], + + // 顶点坐标列表索引偏移 (可选属性 默认: 0) + "offset": 0, + + // 顶点坐标相对位移列表 [x0, y0, x1, y1, ...] (可选属性 默认: null) + "vertices": [0.01, 0.01] + }] + }] + }] + }] +} +``` + +------------------------------ +# 5.0 相对 [4.5](DragonBones_4.5_data_format_zh.md) 格式变化 + +## Root +* 增加 "compatibleVersion" 属性,代表兼容的最低版本。 +* 删除 "isGlobal" 属性。 + * 不再支持绝对坐标,只支持相对坐标,相当于isGlobal设置为0。 + * isGlobal为1的情况(绝对坐标)只存在于使用2.3及以前的数据格式。 + * 从3.0开始支持相对坐标,于是引入isGlobal属性用于向下兼容,同时支持相对坐标和绝对坐标。 + * 从5.0开始不再支持绝对坐标。 + +## Display +* 增加 "path" 属性,与 name 区分,用于标识图片指向的贴图路径、Mesh包含的贴图路径或子骨架指向的骨架名。 +* name属性的意义变为display的唯一标示符,不再代表路径。 + +## 支持边界框 +* "display"的"type" 属性的值增加 "boundingBox" ,用于标记边界框。 +* 边界框类型的 display 会包含如下属性 + * "subType" : 标记边界框的类型,可能的值为"rectangle": 矩形, "ellipse": 椭圆, "polygon": 自定义多边形 + * "width", "height": 宽高(仅对矩形或椭圆类型的边界框生效) + * "vertices": 顶点列表(仅对自定义多边形类型的边界框生效) + +## 支持共享网格(Linked Mesh) +* 网格类型的Display增加 "share" 属性,可以通过设置share属性将之变为共享网格。 +* 共享网格可以通过 "inheritFFD" 属性控制共享网格是否继承主网格的FFD动画。 + +## 支持动画中改变插槽的显示顺序(ZOrder) +* "animation" 中增加 "zOrder" 属性,代表深度排序时间轴 +* "zOrder" 包含frames属性,代表时间轴上的关键帧列表。包含的每个关键帧对象会包含如下属性: + * "duration": 关键帧持续的长度。 + * "zOrder": 该关键帧上zOrder需要变化的插槽以及变化的幅度组成的数组。 + +## 事件统一由主时间轴抛出,支持多事件和事件参数列表 +* 去掉骨骼时间轴包含的关键帧的event属性。(版本升级的时候会把数据移动到主时间轴相同位置的关键帧上) +* "animation" 的 "frame"(主时间轴包含的关键帧列表)包含的关键帧数据的 event 属性改为 "events", 表示需要在该帧上抛出的事件列表。 +* 事件对象包含如下属性 + * "name": 事件名 + * "bone": 抛出事件的骨骼,默认为null(原骨骼时间轴包含的事件,将把骨骼名记录在这里) + * "slot": 抛出事件的插槽,默认为null(该属性和上面的bone属性不可能同时存在,都不存在代表事件由骨架抛出) + * "ints": 整形参数列表 + * "floats": 浮点形参数列表 + * "strings": 字符串形参数列表 + +## 增加更多缓动类型的定义 +* "frame"包含的关键帧数据增加 "tweenType" 属性。 +* "tweenType" 默认为0 代表由 tweenEasing 或 curve 描述缓动类型(和4.5一致) +* "tweenType" 不为0 代表使用其他扩展缓动类型的枚举,具体每个枚举代表的意义未来再定义。 From 3a7a60d945ddbccbe0bf3f97f76db963a252d6b3 Mon Sep 17 00:00:00 2001 From: Carlos Ballesteros Velasco Date: Fri, 1 Sep 2017 22:09:01 +0200 Subject: [PATCH 2/2] More work --- .gitignore | 12 + .travis.yml | 1 + README.md | 4 +- build.gradle | 20 + dragonbones-core/.gitignore | 4 + dragonbones-core/build.gradle | 2 + .../animation/ActionTimelineState.java | 260 +++ .../com/dragonbones/animation/Animation.java | 851 +++++++++ .../dragonbones/animation/AnimationState.java | 985 ++++++++++ .../animation/BoneAllTimelineState.java | 84 + .../com/dragonbones/animation/BonePose.java | 20 + .../animation/BoneTimelineState.java | 19 + .../dragonbones/animation/IAnimatable.java | 31 + .../animation/SlotColorTimelineState.java | 149 ++ .../SlotDislayIndexTimelineState.java | 16 + .../animation/SlotFFDTimelineState.java | 176 ++ .../animation/SlotTimelineState.java | 17 + .../dragonbones/animation/TimelineState.java | 208 +++ .../com/dragonbones/animation/TweenState.java | 7 + .../animation/TweenTimelineState.java | 106 ++ .../com/dragonbones/animation/WorldClock.java | 206 ++ .../animation/ZOrderTimelineState.java | 21 + .../com/dragonbones/armature/Armature.java | 950 ++++++++++ .../java/com/dragonbones/armature/Bone.java | 514 +++++ .../com/dragonbones/armature/Constraint.java | 30 + .../dragonbones/armature/IArmatureProxy.java | 49 + .../dragonbones/armature/IKConstraint.java | 124 ++ .../java/com/dragonbones/armature/Slot.java | 1056 +++++++++++ .../dragonbones/armature/TransformObject.java | 150 ++ .../java/com/dragonbones/core/ActionType.java | 18 + .../core/AnimationFadeOutMode.java | 57 + .../com/dragonbones/core/ArmatureType.java | 18 + .../java/com/dragonbones/core/BaseObject.java | 150 ++ .../com/dragonbones/core/BinaryOffset.java | 40 + .../java/com/dragonbones/core/BlendMode.java | 29 + .../com/dragonbones/core/BoundingBoxType.java | 20 + .../com/dragonbones/core/DisplayType.java | 19 + .../com/dragonbones/core/DragonBones.java | 74 + .../java/com/dragonbones/core/OffsetMode.java | 10 + .../com/dragonbones/core/TimelineType.java | 35 + .../java/com/dragonbones/core/TweenType.java | 21 + .../com/dragonbones/event/EventObject.java | 152 ++ .../dragonbones/event/EventStringType.java | 8 + .../dragonbones/event/IEventDispatcher.java | 45 + .../com/dragonbones/factory/BaseFactory.java | 957 ++++++++++ .../factory/BuildArmaturePackage.java | 18 + .../com/dragonbones/geom/ColorTransform.java | 51 + .../java/com/dragonbones/geom/Matrix.java | 204 ++ .../main/java/com/dragonbones/geom/Point.java | 23 + .../java/com/dragonbones/geom/Rectangle.java | 28 + .../java/com/dragonbones/geom/Transform.java | 232 +++ .../com/dragonbones/model/ActionData.java | 31 + .../dragonbones/model/AnimationConfig.java | 321 ++++ .../com/dragonbones/model/AnimationData.java | 249 +++ .../com/dragonbones/model/ArmatureData.java | 417 +++++ .../model/ArmatureDisplayData.java | 28 + .../java/com/dragonbones/model/BoneData.java | 87 + .../dragonbones/model/BoundingBoxData.java | 74 + .../model/BoundingBoxDisplayData.java | 23 + .../com/dragonbones/model/CanvasData.java | 27 + .../com/dragonbones/model/ConstraintData.java | 22 + .../com/dragonbones/model/DisplayData.java | 24 + .../dragonbones/model/DragonBonesData.java | 166 ++ .../model/EllipseBoundingBoxData.java | 176 ++ .../dragonbones/model/IKConstraintData.java | 18 + .../dragonbones/model/ImageDisplayData.java | 22 + .../dragonbones/model/MeshDisplayData.java | 27 + .../java/com/dragonbones/model/OutCode.java | 25 + .../model/PolygonBoundingBoxData.java | 266 +++ .../model/RectangleBoundingBoxData.java | 231 +++ .../java/com/dragonbones/model/SkinData.java | 89 + .../java/com/dragonbones/model/SlotData.java | 83 + .../dragonbones/model/TextureAtlasData.java | 127 ++ .../com/dragonbones/model/TextureData.java | 46 + .../com/dragonbones/model/TimelineData.java | 19 + .../java/com/dragonbones/model/UserData.java | 105 ++ .../com/dragonbones/model/WeightData.java | 19 + .../com/dragonbones/parser/ActionFrame.java | 8 + .../dragonbones/parser/BinaryDataParser.java | 359 ++++ .../com/dragonbones/parser/DataParser.java | 349 ++++ .../dragonbones/parser/ObjectDataParser.java | 1653 +++++++++++++++++ .../main/java/com/dragonbones/util/Array.java | 87 + .../java/com/dragonbones/util/ArrayBase.java | 140 ++ .../java/com/dragonbones/util/BoolArray.java | 16 + .../java/com/dragonbones/util/CharArray.java | 27 + .../java/com/dragonbones/util/Console.java | 13 + .../java/com/dragonbones/util/Dynamic.java | 151 ++ .../java/com/dragonbones/util/FloatArray.java | 92 + .../java/com/dragonbones/util/Function.java | 5 + .../java/com/dragonbones/util/IntArray.java | 95 + .../com/dragonbones/util/NumberArray.java | 6 + .../java/com/dragonbones/util/ShortArray.java | 27 + .../java/com/dragonbones/util/StrReader.java | 138 ++ .../java/com/dragonbones/util/StreamUtil.java | 45 + .../java/com/dragonbones/util/StringUtil.java | 11 + .../dragonbones/util/buffer/ArrayBuffer.java | 56 + .../util/buffer/ArrayBufferView.java | 4 + .../dragonbones/util/buffer/Float32Array.java | 27 + .../dragonbones/util/buffer/Int16Array.java | 28 + .../dragonbones/util/buffer/Uint16Array.java | 37 + .../dragonbones/util/buffer/Uint32Array.java | 23 + .../dragonbones/util/buffer/Uint8Array.java | 24 + .../java/com/dragonbones/util/json/JSON.java | 198 ++ .../dragonbones/parser/DataParserTest.java | 17 + .../com/dragonbones/util/IntArrayTest.java | 22 + .../com/dragonbones/util/json/JSONTest.java | 31 + .../src/test/resources/Dragon/Dragon.dbproj | Bin 0 -> 31625 bytes .../test/resources/Dragon/Dragon_ske.dbbin | Bin 0 -> 18292 bytes .../src/test/resources/Dragon/Dragon_ske.json | 1 + .../src/test/resources/Dragon/Dragon_tex.json | 1 + .../src/test/resources/Dragon/Dragon_tex.png | Bin 0 -> 159196 bytes .../resources/Dragon/library/texture.json | 1 + .../test/resources/Dragon/library/texture.png | Bin 0 -> 159205 bytes .../test/resources/NewDragon/NewDragon.atlas | 209 +++ .../test/resources/NewDragon/NewDragon.json | 1 + .../test/resources/NewDragon/NewDragon.png | Bin 0 -> 824720 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 172 ++ gradlew.bat | 84 + settings.gradle | 5 + 120 files changed, 15171 insertions(+), 1 deletion(-) create mode 100644 .travis.yml create mode 100644 build.gradle create mode 100644 dragonbones-core/.gitignore create mode 100644 dragonbones-core/build.gradle create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/ActionTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/Animation.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/AnimationState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/BoneAllTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/BonePose.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/BoneTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/IAnimatable.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/SlotColorTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/SlotDislayIndexTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/SlotFFDTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/SlotTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/TimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/TweenState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/TweenTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/WorldClock.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/animation/ZOrderTimelineState.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/Armature.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/Bone.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/Constraint.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/IArmatureProxy.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/IKConstraint.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/Slot.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/armature/TransformObject.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/ActionType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/AnimationFadeOutMode.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/ArmatureType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/BaseObject.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/BinaryOffset.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/BlendMode.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/BoundingBoxType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/DisplayType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/DragonBones.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/OffsetMode.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/TimelineType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/core/TweenType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/event/EventObject.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/event/EventStringType.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/event/IEventDispatcher.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/factory/BaseFactory.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/factory/BuildArmaturePackage.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/geom/ColorTransform.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/geom/Matrix.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/geom/Point.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/geom/Rectangle.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/geom/Transform.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/ActionData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/AnimationConfig.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/AnimationData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/ArmatureData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/ArmatureDisplayData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/BoneData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxDisplayData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/CanvasData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/ConstraintData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/DisplayData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/DragonBonesData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/EllipseBoundingBoxData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/IKConstraintData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/ImageDisplayData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/MeshDisplayData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/OutCode.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/PolygonBoundingBoxData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/RectangleBoundingBoxData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/SkinData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/SlotData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/TextureAtlasData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/TextureData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/TimelineData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/UserData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/model/WeightData.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/parser/ActionFrame.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/parser/BinaryDataParser.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/parser/DataParser.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/parser/ObjectDataParser.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/ArrayBase.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/BoolArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/CharArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/Console.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/Dynamic.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/FloatArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/Function.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/IntArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/NumberArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/ShortArray.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/StrReader.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/StreamUtil.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/StringUtil.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBuffer.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBufferView.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/Float32Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/Int16Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint16Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint32Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint8Array.java create mode 100644 dragonbones-core/src/main/java/com/dragonbones/util/json/JSON.java create mode 100644 dragonbones-core/src/test/java/com/dragonbones/parser/DataParserTest.java create mode 100644 dragonbones-core/src/test/java/com/dragonbones/util/IntArrayTest.java create mode 100644 dragonbones-core/src/test/java/com/dragonbones/util/json/JSONTest.java create mode 100644 dragonbones-core/src/test/resources/Dragon/Dragon.dbproj create mode 100644 dragonbones-core/src/test/resources/Dragon/Dragon_ske.dbbin create mode 100644 dragonbones-core/src/test/resources/Dragon/Dragon_ske.json create mode 100644 dragonbones-core/src/test/resources/Dragon/Dragon_tex.json create mode 100644 dragonbones-core/src/test/resources/Dragon/Dragon_tex.png create mode 100644 dragonbones-core/src/test/resources/Dragon/library/texture.json create mode 100644 dragonbones-core/src/test/resources/Dragon/library/texture.png create mode 100644 dragonbones-core/src/test/resources/NewDragon/NewDragon.atlas create mode 100644 dragonbones-core/src/test/resources/NewDragon/NewDragon.json create mode 100644 dragonbones-core/src/test/resources/NewDragon/NewDragon.png create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle diff --git a/.gitignore b/.gitignore index 32858aa..8c6f20f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,17 @@ *.war *.ear +*.iml +*.ipr +*.iws + +.gradle +.idea + +/build +/out +/classes +/target + # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..dff5f3a --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: java diff --git a/README.md b/README.md index 33eb802..627cd1b 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # DragonBonesJAVA -coming soon... \ No newline at end of file +``` +./gradlew check +``` \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f23acfa --- /dev/null +++ b/build.gradle @@ -0,0 +1,20 @@ +allprojects { + group 'com.dragonbones' + version '0.1' + + apply plugin: 'java' + + sourceCompatibility = 1.8 + targetCompatibility = 1.8 + + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + compile "org.jetbrains:annotations:13.0" + testCompile group: 'junit', name: 'junit', version: '4.12' + } +} \ No newline at end of file diff --git a/dragonbones-core/.gitignore b/dragonbones-core/.gitignore new file mode 100644 index 0000000..e0b93f7 --- /dev/null +++ b/dragonbones-core/.gitignore @@ -0,0 +1,4 @@ +/build +/out +/classes +/target diff --git a/dragonbones-core/build.gradle b/dragonbones-core/build.gradle new file mode 100644 index 0000000..7d82dc7 --- /dev/null +++ b/dragonbones-core/build.gradle @@ -0,0 +1,2 @@ +dependencies { +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/ActionTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/ActionTimelineState.java new file mode 100644 index 0000000..9407c5c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/ActionTimelineState.java @@ -0,0 +1,260 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Slot; +import com.dragonbones.core.ActionType; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.event.EventObject; +import com.dragonbones.event.EventStringType; +import com.dragonbones.event.IEventDispatcher; +import com.dragonbones.model.ActionData; +import com.dragonbones.model.TimelineData; +import com.dragonbones.util.Array; + +/** + * @internal + * @private + */ +public class ActionTimelineState extends TimelineState { + private void _onCrossFrame(int frameIndex) { + IEventDispatcher eventDispatcher = this._armature.getEventDispatcher(); + if (this._animationState.actionEnabled) { + int frameOffset = this._animationData.frameOffset + this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameOffset.v + frameIndex); + int actionCount = this._frameArray.get(frameOffset + 1); + Array actions = this._armature.armatureData.actions; + for (int i = 0; i < actionCount; ++i) { + int actionIndex = this._frameArray.get(frameOffset + 2 + i); + ActionData action = actions.get(actionIndex); + if (action.type == ActionType.Play) { + if (action.slot != null) { + Slot slot = this._armature.getSlot(action.slot.name); + if (slot != null) { + Armature childArmature = slot.getChildArmature(); + if (childArmature != null) { + childArmature._bufferAction(action, true); + } + } + } else if (action.bone != null) { + for (Slot slot : this._armature.getSlots()) { + Armature childArmature = slot.getChildArmature(); + if (childArmature != null && slot.getParent().boneData == action.bone) { + childArmature._bufferAction(action, true); + } + } + } else { + this._armature._bufferAction(action, true); + } + } else { + EventStringType eventType = action.type == ActionType.Frame ? EventObject.FRAME_EVENT : EventObject.SOUND_EVENT; + if (action.type == ActionType.Sound || eventDispatcher.hasEvent(eventType)) { + EventObject eventObject = BaseObject.borrowObject(EventObject.class); + // eventObject.time = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + eventObject.time = this._frameArray.get(frameOffset) / this._frameRate; + eventObject.type = eventType; + eventObject.name = action.name; + eventObject.data = action.data; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + + if (action.bone != null) { + eventObject.bone = this._armature.getBone(action.bone.name); + } + + if (action.slot != null) { + eventObject.slot = this._armature.getSlot(action.slot.name); + } + + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + } + } + + protected void _onArriveAtFrame() { + } + + protected void _onUpdateFrame() { + } + + public void update(float passedTime) { + int prevState = this.playState; + float prevPlayTimes = this.currentPlayTimes; + float prevTime = this.currentTime; + + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + IEventDispatcher eventDispatcher = this._armature.getEventDispatcher(); + if (prevState < 0) { + if (this.playState != prevState) { + if (this._animationState.displayControl && this._animationState.resetToPose) { // Reset zorder to pose. + this._armature._sortZOrder(null, 0); + } + + prevPlayTimes = this.currentPlayTimes; + + if (eventDispatcher.hasEvent(EventObject.START)) { + EventObject eventObject = BaseObject.borrowObject(EventObject.class); + eventObject.type = EventObject.START; + eventObject.armature = this._armature; + eventObject.animationState = this._animationState; + this._armature._dragonBones.bufferEvent(eventObject); + } + } else { + return; + } + } + + boolean isReverse = this._animationState.timeScale < 0f; + EventObject loopCompleteEvent = null; + EventObject completeEvent = null; + if (this.currentPlayTimes != prevPlayTimes) { + if (eventDispatcher.hasEvent(EventObject.LOOP_COMPLETE)) { + loopCompleteEvent = BaseObject.borrowObject(EventObject.class); + loopCompleteEvent.type = EventObject.LOOP_COMPLETE; + loopCompleteEvent.armature = this._armature; + loopCompleteEvent.animationState = this._animationState; + } + + if (this.playState > 0) { + if (eventDispatcher.hasEvent(EventObject.COMPLETE)) { + completeEvent = BaseObject.borrowObject(EventObject.class); + completeEvent.type = EventObject.COMPLETE; + completeEvent.armature = this._armature; + completeEvent.animationState = this._animationState; + } + + } + } + + if (this._frameCount > 1) { + TimelineData timelineData = this._timelineData; + int timelineFrameIndex = (int) Math.floor(this.currentTime * this._frameRate); // uint + int frameIndex = this._frameIndices.get(timelineData.frameIndicesOffset + timelineFrameIndex); + if (this._frameIndex != frameIndex) { // Arrive at frame. + int crossedFrameIndex = this._frameIndex; + this._frameIndex = frameIndex; + if (this._timelineArray != null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray.get(timelineData.offset + BinaryOffset.TimelineFrameOffset.v + this._frameIndex); + if (isReverse) { + if (crossedFrameIndex < 0) { + int prevFrameIndex = (int) Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices.get(timelineData.frameIndicesOffset + prevFrameIndex); + if (this.currentPlayTimes == prevPlayTimes) { // Start. + if (crossedFrameIndex == frameIndex) { // Uncrossed. + crossedFrameIndex = -1; + } + } + } + + while (crossedFrameIndex >= 0) { + int frameOffset = this._animationData.frameOffset + this._timelineArray.get(timelineData.offset + BinaryOffset.TimelineFrameOffset.v + crossedFrameIndex); + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + float framePosition = this._frameArray.get(frameOffset) / this._frameRate; + if ( + this._position <= framePosition && + framePosition <= this._position + this._duration + ) { // Support interval play. + this._onCrossFrame(crossedFrameIndex); + } + + if (loopCompleteEvent != null && crossedFrameIndex == 0) { // Add loop complete event after first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } else { + crossedFrameIndex = this._frameCount - 1; + } + + if (crossedFrameIndex == frameIndex) { + break; + } + } + } else { + if (crossedFrameIndex < 0) { + int prevFrameIndex = (int) Math.floor(prevTime * this._frameRate); + crossedFrameIndex = this._frameIndices.get(timelineData.frameIndicesOffset + prevFrameIndex); + int frameOffset = this._animationData.frameOffset + this._timelineArray.get(timelineData.offset + BinaryOffset.TimelineFrameOffset.v + crossedFrameIndex); + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + float framePosition = this._frameArray.get(frameOffset) / this._frameRate; + if (this.currentPlayTimes == prevPlayTimes) { // Start. + if (prevTime <= framePosition) { // Crossed. + if (crossedFrameIndex > 0) { + crossedFrameIndex--; + } else { + crossedFrameIndex = this._frameCount - 1; + } + } else if (crossedFrameIndex == frameIndex) { // Uncrossed. + crossedFrameIndex = -1; + } + } + } + + while (crossedFrameIndex >= 0) { + if (crossedFrameIndex < this._frameCount - 1) { + crossedFrameIndex++; + } else { + crossedFrameIndex = 0; + } + + int frameOffset = this._animationData.frameOffset + this._timelineArray.get(timelineData.offset + BinaryOffset.TimelineFrameOffset.v + crossedFrameIndex); + // const framePosition = this._frameArray[frameOffset] * this._frameRateR; // Precision problem + float framePosition = this._frameArray.get(frameOffset) / this._frameRate; + if ( + this._position <= framePosition && + framePosition <= this._position + this._duration + ) { // Support interval play. + this._onCrossFrame(crossedFrameIndex); + } + + if (loopCompleteEvent != null && crossedFrameIndex == 0) { // Add loop complete event before first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + if (crossedFrameIndex == frameIndex) { + break; + } + } + } + } + } + } else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData != null) { + this._frameOffset = this._animationData.frameOffset + this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameOffset.v); + // Arrive at frame. + float framePosition = this._frameArray.get(this._frameOffset) / this._frameRate; + if (this.currentPlayTimes == prevPlayTimes) { // Start. + if (prevTime <= framePosition) { + this._onCrossFrame(this._frameIndex); + } + } else if (this._position <= framePosition) { // Loop complete. + if (!isReverse && loopCompleteEvent != null) { // Add loop complete event before first frame. + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + loopCompleteEvent = null; + } + + this._onCrossFrame(this._frameIndex); + } + } + } + + if (loopCompleteEvent != null) { + this._armature._dragonBones.bufferEvent(loopCompleteEvent); + } + + if (completeEvent != null) { + this._armature._dragonBones.bufferEvent(completeEvent); + } + } + } + + public void setCurrentTime(float value) { + this._setCurrentTime(value); + this._frameIndex = -1; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/Animation.java b/dragonbones-core/src/main/java/com/dragonbones/animation/Animation.java new file mode 100644 index 0000000..c41daac --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/Animation.java @@ -0,0 +1,851 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Bone; +import com.dragonbones.armature.Slot; +import com.dragonbones.core.AnimationFadeOutMode; +import com.dragonbones.core.BaseObject; +import com.dragonbones.model.AnimationConfig; +import com.dragonbones.model.AnimationData; +import com.dragonbones.util.Array; +import com.dragonbones.util.Console; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 动画控制器,用来播放动画数据,管理动画状态。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationData + * @see AnimationState + */ +public class Animation extends BaseObject { + /** + * 播放速度。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * + * @default 1f + * @version DragonBones 3.0 + * @language zh_CN + */ + public float timeScale; + + private boolean _animationDirty; // Update bones and slots cachedFrameIndices. + /** + * @internal + * @private + */ + public boolean _timelineDirty; // Updata animationStates timelineStates. + private final Array _animationNames = new Array<>(); + private final Array _animationStates = new Array<>(); + private final Map _animations = new HashMap<>(); + private Armature _armature; + @Nullable + private AnimationConfig _animationConfig = null; // Initial value. + @Nullable + private AnimationState _lastAnimationState; + + /** + * @private + */ + protected void _onClear() { + for (AnimationState animationState : this._animationStates) { + animationState.returnToPool(); + } + + for (String k : this._animations.keySet()) { + this._animations.remove(k); + } + + if (this._animationConfig != null) { + this._animationConfig.returnToPool(); + } + + this.timeScale = 1f; + + this._animationDirty = false; + this._timelineDirty = false; + this._animationNames.clear(); + this._animationStates.clear(); + //this._animations.clear(); + this._armature = null; // + this._animationConfig = null; // + this._lastAnimationState = null; + } + + private void _fadeOut(AnimationConfig animationConfig) { + switch (animationConfig.fadeOutMode) { + case SameLayer: + for (AnimationState animationState : this._animationStates) { + if (animationState.layer == animationConfig.layer) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case SameGroup: + for (AnimationState animationState : this._animationStates) { + if (Objects.equals(animationState.group, animationConfig.group)) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case SameLayerAndGroup: + for (AnimationState animationState : this._animationStates) { + if ( + animationState.layer == animationConfig.layer && + Objects.equals(animationState.group, animationConfig.group) + ) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + } + break; + + case All: + for (AnimationState animationState : this._animationStates) { + animationState.fadeOut(animationConfig.fadeOutTime, animationConfig.pauseFadeOut); + } + break; + + case None: + case Single: + default: + break; + } + } + + /** + * @internal + * @private + */ + public void init(Armature armature) { + if (this._armature != null) { + return; + } + + this._armature = armature; + this._animationConfig = BaseObject.borrowObject(AnimationConfig.class); + } + + /** + * @internal + * @private + */ + public void advanceTime(float passedTime) { + if (passedTime < 0f) { // Only animationState can reverse play. + passedTime = -passedTime; + } + + if (this._armature.inheritAnimation && this._armature._parent != null) { // Inherit parent animation timeScale. + passedTime *= this._armature._parent._armature.getAnimation().timeScale; + } + + if (this.timeScale != 1f) { + passedTime *= this.timeScale; + } + + int animationStateCount = this._animationStates.size(); + if (animationStateCount == 1) { + AnimationState animationState = this._animationStates.get(0); + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + this._armature._dragonBones.bufferObject(animationState); + this._animationStates.clear(); + this._lastAnimationState = null; + } else { + AnimationData animationData = animationState.animationData; + float cacheFrameRate = animationData.cacheFrameRate; + if (this._animationDirty && cacheFrameRate > 0f) { // Update cachedFrameIndices. + this._animationDirty = false; + for (Bone bone : this._armature.getBones()) { + bone._cachedFrameIndices = animationData.getBoneCachedFrameIndices(bone.name); + } + + for (Slot slot : this._armature.getSlots()) { + slot._cachedFrameIndices = animationData.getSlotCachedFrameIndices(slot.name); + } + } + + if (this._timelineDirty) { + animationState.updateTimelines(); + } + + animationState.advanceTime(passedTime, cacheFrameRate); + } + } else if (animationStateCount > 1) { + for (int i = 0, r = 0; i < animationStateCount; ++i) { + AnimationState animationState = this._animationStates.get(i); + if (animationState._fadeState > 0 && animationState._subFadeState > 0) { + r++; + this._armature._dragonBones.bufferObject(animationState); + this._animationDirty = true; + if (this._lastAnimationState == animationState) { // Update last animation state. + this._lastAnimationState = null; + } + } else { + if (r > 0) { + this._animationStates.set(i - r, animationState); + } + + if (this._timelineDirty) { + animationState.updateTimelines(); + } + + animationState.advanceTime(passedTime, 0f); + } + + if (i == animationStateCount - 1 && r > 0) { // Modify animation states size. + this._animationStates.setLength(this._animationStates.size() - r); + if (this._lastAnimationState == null && this._animationStates.size() > 0) { + this._lastAnimationState = this._animationStates.get(this._animationStates.size() - 1); + } + } + } + + this._armature._cacheFrameIndex = -1; + } else { + this._armature._cacheFrameIndex = -1; + } + + this._timelineDirty = false; + } + + /** + * 清除所有动画状态。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + public void reset() { + for (AnimationState animationState : this._animationStates) { + animationState.returnToPool(); + } + + this._animationDirty = false; + this._timelineDirty = false; + this._animationConfig.clear(); + this._animationStates.clear(); + this._lastAnimationState = null; + } + + public void stop() { + stop(null); + } + + /** + * 暂停播放动画。 + * + * @param animationName 动画状态的名称,如果未设置,则暂停所有动画状态。 + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationState + */ + public void stop(String animationName) { + if (animationName != null) { + AnimationState animationState = this.getState(animationName); + if (animationState != null) { + animationState.stop(); + } + } else { + for (AnimationState animationState : this._animationStates) { + animationState.stop(); + } + } + } + + /** + * 通过动画配置来播放动画。 + * + * @param animationConfig 动画配置。 + * @returns 对应的动画状态。 + * @version DragonBones 5.0 + * @beta + * @language zh_CN + * @see AnimationConfig + * @see AnimationState + */ + public AnimationState playConfig(AnimationConfig animationConfig) { + String animationName = animationConfig.animation; + if (!(this._animations.containsKey(animationName))) { + Console.warn( + "Non-existent animation.\n" + + "DragonBones name: " + this._armature.armatureData.parent.name + + "Armature name: " + this._armature.getName() + + "Animation name: " + animationName + ); + + return null; + } + + AnimationData animationData = this._animations.get(animationName); + + if (animationConfig.fadeOutMode == AnimationFadeOutMode.Single) { + for (AnimationState animationState : this._animationStates) { + if (animationState.animationData == animationData) { + return animationState; + } + } + } + + if (this._animationStates.size() == 0) { + animationConfig.fadeInTime = 0f; + } else if (animationConfig.fadeInTime < 0f) { + animationConfig.fadeInTime = animationData.fadeInTime; + } + + if (animationConfig.fadeOutTime < 0f) { + animationConfig.fadeOutTime = animationConfig.fadeInTime; + } + + if (animationConfig.timeScale <= -100.0) { + animationConfig.timeScale = 1f / animationData.scale; + } + + if (animationData.frameCount > 1) { + if (animationConfig.position < 0f) { + animationConfig.position %= animationData.duration; + animationConfig.position = animationData.duration - animationConfig.position; + } else if (animationConfig.position == animationData.duration) { + animationConfig.position -= 0.000001; // Play a little time before end. + } else if (animationConfig.position > animationData.duration) { + animationConfig.position %= animationData.duration; + } + + if (animationConfig.duration > 0f && animationConfig.position + animationConfig.duration > animationData.duration) { + animationConfig.duration = animationData.duration - animationConfig.position; + } + + if (animationConfig.playTimes < 0) { + animationConfig.playTimes = animationData.playTimes; + } + } else { + animationConfig.playTimes = 1; + animationConfig.position = 0f; + if (animationConfig.duration > 0f) { + animationConfig.duration = 0f; + } + } + + if (animationConfig.duration == 0f) { + animationConfig.duration = -1f; + } + + this._fadeOut(animationConfig); + + AnimationState animationState = BaseObject.borrowObject(AnimationState.class); + animationState.init(this._armature, animationData, animationConfig); + this._animationDirty = true; + this._armature._cacheFrameIndex = -1; + + if (this._animationStates.size() > 0) { + boolean added = false; + for (int i = 0, l = this._animationStates.size(); i < l; ++i) { + if (animationState.layer >= this._animationStates.get(i).layer) { + } else { + added = true; + this._animationStates.splice(i + 1, 0, animationState); + break; + } + } + + if (!added) { + this._animationStates.add(animationState); + } + } else { + this._animationStates.add(animationState); + } + + // Child armature play same name animation. + for (Slot slot : this._armature.getSlots()) { + Armature childArmature = slot.getChildArmature(); + if ( + childArmature != null && childArmature.inheritAnimation && + childArmature.getAnimation().hasAnimation(animationName) && + childArmature.getAnimation().getState(animationName) == null + ) { + childArmature.getAnimation().fadeIn(animationName); // + } + } + + if (animationConfig.fadeInTime <= 0f) { // Blend animation state, update armature. + this._armature.advanceTime(0f); + } + + this._lastAnimationState = animationState; + + return animationState; + } + + public AnimationState play() { + return play(null, -1); + } + + public AnimationState play(String animationName) { + return play(animationName, -1); + } + + /** + * 播放动画。 + * + * @param animationName 动画数据名称,如果未设置,则播放默认动画,或将暂停状态切换为播放状态,或重新播放上一个正在播放的动画。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationState + */ + public AnimationState play(String animationName, int playTimes) { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0f; + this._animationConfig.animation = animationName != null ? animationName : ""; + + if (animationName != null && animationName.length() > 0) { + this.playConfig(this._animationConfig); + } else if (this._lastAnimationState == null) { + AnimationData defaultAnimation = this._armature.armatureData.defaultAnimation; + if (defaultAnimation != null) { + this._animationConfig.animation = defaultAnimation.name; + this.playConfig(this._animationConfig); + } + } else if (!this._lastAnimationState.isPlaying() && !this._lastAnimationState.isCompleted()) { + this._lastAnimationState.play(); + } else { + this._animationConfig.animation = this._lastAnimationState.name; + this.playConfig(this._animationConfig); + } + + return this._lastAnimationState; + } + + @Nullable + public AnimationState fadeIn(String animationName) { + return fadeIn(animationName, -1f, -1, 0, null, AnimationFadeOutMode.SameLayerAndGroup); + } + + /** + * 淡入播放动画。 + * + * @param animationName 动画数据名称。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @param fadeInTime 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * @param layer 混合图层,图层高会优先获取混合权重。 + * @param group 混合组,用于动画状态编组,方便控制淡出。 + * @param fadeOutMode 淡出模式。 + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationFadeOutMode + * @see AnimationState + */ + @Nullable + public AnimationState fadeIn( + String animationName, float fadeInTime, int playTimes, + int layer, @Nullable String group, AnimationFadeOutMode fadeOutMode + ) { + this._animationConfig.clear(); + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group != null ? group : ""; + + return this.playConfig(this._animationConfig); + } + + @Nullable + public AnimationState gotoAndPlayByTime(String animationName) { + return gotoAndPlayByTime(animationName, 0f, -1); + } + + /** + * 从指定时间开始播放动画。 + * + * @param animationName 动画数据的名称。 + * @param time 开始时间。 (以秒为单位) + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + @Nullable + public AnimationState gotoAndPlayByTime(String animationName, float time, int playTimes) { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.position = time; + this._animationConfig.fadeInTime = 0f; + this._animationConfig.animation = animationName; + + return this.playConfig(this._animationConfig); + } + + @Nullable + public AnimationState gotoAndPlayByFrame(String animationName) { + return gotoAndPlayByFrame(animationName, 0, -1); + } + + /** + * 从指定帧开始播放动画。 + * + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + @Nullable + public AnimationState gotoAndPlayByFrame(String animationName, int frame, int playTimes) { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0f; + this._animationConfig.animation = animationName; + + AnimationData animationData = this._animations.get(animationName); + if (animationData != null) { + this._animationConfig.position = animationData.duration * frame / animationData.frameCount; + } + + return this.playConfig(this._animationConfig); + } + + @Nullable + public AnimationState gotoAndPlayByProgress(String animationName) { + return gotoAndPlayByProgress(animationName, 0f, -1); + } + + /** + * 从指定进度开始播放动画。 + * + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0~1] + * @param playTimes 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + @Nullable + public AnimationState gotoAndPlayByProgress(String animationName, float progress, int playTimes) { + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.playTimes = playTimes; + this._animationConfig.fadeInTime = 0f; + this._animationConfig.animation = animationName; + + AnimationData animationData = this._animations.get(animationName); + if (animationData != null) { + this._animationConfig.position = animationData.duration * (progress > 0f ? progress : 0f); + } + + return this.playConfig(this._animationConfig); + } + + public AnimationState gotoAndStopByTime(String animationName) { + return gotoAndStopByTime(animationName, 0f); + } + + /** + * 将动画停止到指定的时间。 + * + * @param animationName 动画数据的名称。 + * @param time 时间。 (以秒为单位) + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + @Nullable + public AnimationState gotoAndStopByTime(String animationName, float time) { + AnimationState animationState = this.gotoAndPlayByTime(animationName, time, 1); + if (animationState != null) { + animationState.stop(); + } + + return animationState; + } + + public @Nullable + AnimationState gotoAndStopByFrame(String animationName) { + return gotoAndStopByFrame(animationName, 0); + } + + /** + * 将动画停止到指定的帧。 + * + * @param animationName 动画数据的名称。 + * @param frame 帧。 + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + public @Nullable + AnimationState gotoAndStopByFrame(String animationName, int frame) { + AnimationState animationState = this.gotoAndPlayByFrame(animationName, frame, 1); + if (animationState != null) { + animationState.stop(); + } + + return animationState; + } + + @Nullable + public AnimationState gotoAndStopByProgress(String animationName) { + return gotoAndStopByProgress(animationName, 0f); + } + + /** + * 将动画停止到指定的进度。 + * + * @param animationName 动画数据的名称。 + * @param progress 进度。 [0 ~ 1] + * @returns 对应的动画状态。 + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState + */ + @Nullable + public AnimationState gotoAndStopByProgress(String animationName, float progress) { + AnimationState animationState = this.gotoAndPlayByProgress(animationName, progress, 1); + if (animationState != null) { + animationState.stop(); + } + + return animationState; + } + + /** + * 获取动画状态。 + * + * @param animationName 动画状态的名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationState + */ + public @Nullable + AnimationState getState(String animationName) { + int i = this._animationStates.size(); + while (i-- != 0) { + AnimationState animationState = this._animationStates.get(i); + if (Objects.equals(animationState.name, animationName)) { + return animationState; + } + } + + return null; + } + + /** + * 是否包含动画数据。 + * + * @param animationName 动画数据的名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationData + */ + public boolean hasAnimation(String animationName) { + return this._animations.containsKey(animationName); + } + + /** + * 获取所有的动画状态。 + * + * @version DragonBones 5.1 + * @language zh_CN + * @see AnimationState + */ + public Array getStates() { + return this._animationStates; + } + + /** + * 动画是否处于播放状态。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean isPlaying() { + for (AnimationState animationState : this._animationStates) { + if (animationState.isPlaying()) { + return true; + } + } + + return false; + } + + /** + * 所有动画状态是否均已播放完毕。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationState + */ + public boolean isCompleted() { + for (AnimationState animationState : this._animationStates) { + if (!animationState.isCompleted()) { + return false; + } + } + + return this._animationStates.size() > 0; + } + + /** + * 上一个正在播放的动画状态名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see #getLastAnimationState() + */ + public String getLastAnimationName() { + return this._lastAnimationState != null ? this._lastAnimationState.name : ""; + } + + /** + * 所有动画数据名称。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see #getAnimations() + */ + public Array getAnimationNames() { + return this._animationNames; + } + + /** + * 所有动画数据。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationData + */ + public Map getAnimations() { + return this._animations; + } + + public void setAnimations(Map value) { + if (this._animations == value) { + return; + } + + this._animationNames.clear(); + this._animations.clear(); + + for (String k : value.keySet()) { + this._animations.put(k, value.get(k)); + this._animationNames.add(k); + } + } + + /** + * 一个可以快速使用的动画配置实例。 + * + * @version DragonBones 5.0 + * @language zh_CN + * @see AnimationConfig + */ + public AnimationConfig getAnimationConfig() { + this._animationConfig.clear(); + return this._animationConfig; + } + + /** + * 上一个正在播放的动画状态。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationState + */ + public @Nullable + AnimationState getLastAnimationState() { + return this._lastAnimationState; + } + + public AnimationState gotoAndPlay(String animationName) { + return gotoAndPlay(animationName, -1, -1, -1, 0, null, AnimationFadeOutMode.SameLayerAndGroup, true, true); + } + + /** + * @see #play() + * @see #fadeIn(String) + * @see #gotoAndPlayByTime(String, float, int) + * @see #gotoAndPlayByFrame(String, int, int) + * @see #gotoAndPlayByProgress(String, float, int) + * @deprecated 已废弃,请参考 @see + */ + @Nullable + public AnimationState gotoAndPlay( + String animationName, float fadeInTime, float duration, int playTimes, + int layer, @Nullable String group, AnimationFadeOutMode fadeOutMode, + boolean pauseFadeOut, boolean pauseFadeIn + ) { + //pauseFadeOut; + //pauseFadeIn; + this._animationConfig.clear(); + this._animationConfig.resetToPose = true; + this._animationConfig.fadeOutMode = fadeOutMode; + this._animationConfig.playTimes = playTimes; + this._animationConfig.layer = layer; + this._animationConfig.fadeInTime = fadeInTime; + this._animationConfig.animation = animationName; + this._animationConfig.group = group != null ? group : ""; + + AnimationData animationData = this._animations.get(animationName); + if (animationData != null && duration > 0f) { + this._animationConfig.timeScale = animationData.duration / duration; + } + + return this.playConfig(this._animationConfig); + } + + public @Nullable + AnimationState gotoAndStop(String animationName) { + return gotoAndStop(animationName, 0f); + } + + /** + * @see #gotoAndStopByTime(String, float) + * @see #gotoAndStopByFrame(String) + * @see #gotoAndStopByProgress(String, float) + * @deprecated 已废弃,请参考 @see + */ + public @Nullable + AnimationState gotoAndStop(String animationName, float time) { + return this.gotoAndStopByTime(animationName, time); + } + + /** + * @see #getAnimationNames() + * @see #getAnimations() + * @deprecated 已废弃,请参考 @see + */ + public Array getAnimationList() { + return this._animationNames; + } + + /** + * @see #getAnimationNames() + * @see #getAnimations() + * @deprecated 已废弃,请参考 @see + */ + public Array getAnimationDataList() { + Array list = new Array<>(); + for (int i = 0, l = this._animationNames.size(); i < l; ++i) { + list.push(this._animations.get(this._animationNames.get(i))); + } + + return list; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/AnimationState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/AnimationState.java new file mode 100644 index 0000000..808bc7f --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/AnimationState.java @@ -0,0 +1,985 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Bone; +import com.dragonbones.armature.Slot; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.DisplayType; +import com.dragonbones.event.EventObject; +import com.dragonbones.event.EventStringType; +import com.dragonbones.geom.Transform; +import com.dragonbones.model.*; +import com.dragonbones.util.Array; +import com.dragonbones.util.IntArray; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 动画状态,播放动画时产生,可以对每个播放的动画进行更细致的控制和调节。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Animation + * @see AnimationData + */ +public class AnimationState extends BaseObject { + /** + * 是否将骨架的骨骼和插槽重置为绑定姿势(如果骨骼和插槽在这个动画状态中没有动画)。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + public boolean resetToPose; + /** + * 是否以增加的方式混合。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean additiveBlending; + /** + * 是否对插槽的显示对象有控制权。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot#displayController + */ + public boolean displayControl; + /** + * 是否能触发行为。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean actionEnabled; + /** + * 混合图层。 + * + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public float layer; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public int playTimes; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float timeScale; + /** + * 混合权重。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float weight; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * 当设置一个大于等于 0 的值,动画状态将会在播放完成后自动淡出。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float autoFadeOutTime; + /** + * @private + */ + public float fadeTotalTime; + /** + * 动画名称。 + * + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public String name; + /** + * 混合组。 + * + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + */ + public String group; + /** + * 动画数据。 + * + * @version DragonBones 3.0 + * @readonly + * @language zh_CN + * @see AnimationData + */ + public AnimationData animationData; + + private boolean _timelineDirty; + /** + * @internal + * @private xx: Play Enabled, Fade Play Enabled + */ + public int _playheadState; + /** + * @internal + * @private -1: Fade in, 0: Fade complete, 1: Fade out; + */ + public float _fadeState; + /** + * @internal + * @private -1: Fade start, 0: Fading, 1: Fade complete; + */ + public float _subFadeState; + /** + * @internal + * @private + */ + public float _position; + /** + * @internal + * @private + */ + public float _duration; + private float _fadeTime; + private float _time; + /** + * @internal + * @private + */ + public float _fadeProgress; + private float _weightResult; + private Array _boneMask = new Array<>(); + private Array _boneTimelines = new Array<>(); + private Array _slotTimelines = new Array<>(); + private Map _bonePoses = new HashMap<>(); + private Armature _armature; + /** + * @internal + * @private + */ + public ActionTimelineState _actionTimeline = null; // Initial value. + @Nullable + private ZOrderTimelineState _zOrderTimeline = null; // Initial value. + + /** + * @private + */ + protected void _onClear() { + for (BoneTimelineState timeline : this._boneTimelines) { + timeline.returnToPool(); + } + + for (SlotTimelineState timeline : this._slotTimelines) { + timeline.returnToPool(); + } + + for (String k : this._bonePoses.keySet()) { + this._bonePoses.get(k).returnToPool(); + this._bonePoses.remove(k); + } + + if (this._actionTimeline != null) { + this._actionTimeline.returnToPool(); + } + + if (this._zOrderTimeline != null) { + this._zOrderTimeline.returnToPool(); + } + + this.resetToPose = false; + this.additiveBlending = false; + this.displayControl = false; + this.actionEnabled = false; + this.layer = 0; + this.playTimes = 1; + this.timeScale = 1f; + this.weight = 1f; + this.autoFadeOutTime = 0f; + this.fadeTotalTime = 0f; + this.name = ""; + this.group = ""; + this.animationData = null; // + + this._timelineDirty = true; + this._playheadState = 0; + this._fadeState = -1; + this._subFadeState = -1; + this._position = 0f; + this._duration = 0f; + this._fadeTime = 0f; + this._time = 0f; + this._fadeProgress = 0f; + this._weightResult = 0f; + this._boneMask.clear(); + this._boneTimelines.clear(); + this._slotTimelines.clear(); + // this._bonePoses.clear(); + this._armature = null; // + this._actionTimeline = null; // + this._zOrderTimeline = null; + } + + private boolean _isDisabled(Slot slot) { + if (this.displayControl) { + String displayController = slot.displayController; + if ( + displayController == null || + Objects.equals(displayController, this.name) || + Objects.equals(displayController, this.group) + ) { + return false; + } + } + + return true; + } + + private void _advanceFadeTime(float passedTime) { + boolean isFadeOut = this._fadeState > 0; + + if (this._subFadeState < 0) { // Fade start event. + this._subFadeState = 0; + + EventStringType eventType = isFadeOut ? EventObject.FADE_OUT : EventObject.FADE_IN; + if (this._armature.getEventDispatcher().hasEvent(eventType)) { + EventObject eventObject = BaseObject.borrowObject(EventObject.class); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + + if (passedTime < 0f) { + passedTime = -passedTime; + } + + this._fadeTime += passedTime; + + if (this._fadeTime >= this.fadeTotalTime) { // Fade complete. + this._subFadeState = 1; + this._fadeProgress = isFadeOut ? 0f : 1f; + } else if (this._fadeTime > 0f) { // Fading. + this._fadeProgress = isFadeOut ? (1f - this._fadeTime / this.fadeTotalTime) : (this._fadeTime / this.fadeTotalTime); + } else { // Before fade. + this._fadeProgress = isFadeOut ? 1f : 0f; + } + + if (this._subFadeState > 0) { // Fade complete event. + if (!isFadeOut) { + this._playheadState |= 1; // x1 + this._fadeState = 0; + } + + EventStringType eventType = isFadeOut ? EventObject.FADE_OUT_COMPLETE : EventObject.FADE_IN_COMPLETE; + if (this._armature.getEventDispatcher().hasEvent(eventType)) { + EventObject eventObject = BaseObject.borrowObject(EventObject.class); + eventObject.type = eventType; + eventObject.armature = this._armature; + eventObject.animationState = this; + this._armature._dragonBones.bufferEvent(eventObject); + } + } + } + + private void _blendBoneTimline(BoneTimelineState timeline) { + final Bone bone = timeline.bone; + final Transform bonePose = timeline.bonePose.result; + Transform animationPose = bone.animationPose; + float boneWeight = this._weightResult > 0f ? this._weightResult : -this._weightResult; + + if (!bone._blendDirty) { + bone._blendDirty = true; + bone._blendLayer = this.layer; + bone._blendLayerWeight = boneWeight; + bone._blendLeftWeight = 1f; + + animationPose.x = bonePose.x * boneWeight; + animationPose.y = bonePose.y * boneWeight; + animationPose.rotation = bonePose.rotation * boneWeight; + animationPose.skew = bonePose.skew * boneWeight; + animationPose.scaleX = (bonePose.scaleX - 1f) * boneWeight + 1f; + animationPose.scaleY = (bonePose.scaleY - 1f) * boneWeight + 1f; + } else { + boneWeight *= bone._blendLeftWeight; + bone._blendLayerWeight += boneWeight; + + animationPose.x += bonePose.x * boneWeight; + animationPose.y += bonePose.y * boneWeight; + animationPose.rotation += bonePose.rotation * boneWeight; + animationPose.skew += bonePose.skew * boneWeight; + animationPose.scaleX += (bonePose.scaleX - 1f) * boneWeight; + animationPose.scaleY += (bonePose.scaleY - 1f) * boneWeight; + } + + if (this._fadeState != 0 || this._subFadeState != 0) { + bone._transformDirty = true; + } + } + + /** + * @private + * @internal + */ + public void init(Armature armature, AnimationData animationData, AnimationConfig animationConfig) { + if (this._armature != null) { + return; + } + + this._armature = armature; + + this.animationData = animationData; + this.resetToPose = animationConfig.resetToPose; + this.additiveBlending = animationConfig.additiveBlending; + this.displayControl = animationConfig.displayControl; + this.actionEnabled = animationConfig.actionEnabled; + this.layer = animationConfig.layer; + this.playTimes = animationConfig.playTimes; + this.timeScale = animationConfig.timeScale; + this.fadeTotalTime = animationConfig.fadeInTime; + this.autoFadeOutTime = animationConfig.autoFadeOutTime; + this.weight = animationConfig.weight; + this.name = animationConfig.name.length() > 0 ? animationConfig.name : animationConfig.animation; + this.group = animationConfig.group; + + if (animationConfig.pauseFadeIn) { + this._playheadState = 2; // 10 + } else { + this._playheadState = 3; // 11 + } + + if (animationConfig.duration < 0f) { + this._position = 0f; + this._duration = this.animationData.duration; + if (animationConfig.position != 0f) { + if (this.timeScale >= 0f) { + this._time = animationConfig.position; + } else { + this._time = animationConfig.position - this._duration; + } + } else { + this._time = 0f; + } + } else { + this._position = animationConfig.position; + this._duration = animationConfig.duration; + this._time = 0f; + } + + if (this.timeScale < 0f && this._time == 0f) { + this._time = -0.000001f; // Turn to end. + } + + if (this.fadeTotalTime <= 0f) { + this._fadeProgress = 0.999999f; // Make different. + } + + if (animationConfig.boneMask.size() > 0) { + this._boneMask.setLength(animationConfig.boneMask.size()); + for (int i = 0, l = this._boneMask.size(); i < l; ++i) { + this._boneMask.set(i, animationConfig.boneMask.get(i)); + } + } + + this._actionTimeline = BaseObject.borrowObject(ActionTimelineState.class); + this._actionTimeline.init(this._armature, this, this.animationData.actionTimeline); + this._actionTimeline.currentTime = this._time; + if (this._actionTimeline.currentTime < 0f) { + this._actionTimeline.currentTime = this._duration - this._actionTimeline.currentTime; + } + + if (this.animationData.zOrderTimeline != null) { + this._zOrderTimeline = BaseObject.borrowObject(ZOrderTimelineState.class); + this._zOrderTimeline.init(this._armature, this, this.animationData.zOrderTimeline); + } + } + + /** + * @private + * @internal + */ + public void updateTimelines() { + Map> boneTimelines = new HashMap<>(); + for (BoneTimelineState timeline : this._boneTimelines) { // Create bone timelines map. + String timelineName = timeline.bone.name; + if (!(boneTimelines.containsKey(timelineName))) { + boneTimelines.put(timelineName, new Array<>()); + } + + boneTimelines.get(timelineName).add(timeline); + } + + for (Bone bone : this._armature.getBones()) { + String timelineName = bone.name; + if (!this.containsBoneMask(timelineName)) { + continue; + } + + Array timelineDatas = this.animationData.getBoneTimelines(timelineName); + if (boneTimelines.containsKey(timelineName)) { // Remove bone timeline from map. + boneTimelines.remove(timelineName); + } else { // Create new bone timeline. + if (!this._bonePoses.containsKey(timelineName)) { + this._bonePoses.put(timelineName, BaseObject.borrowObject(BonePose.class)); + } + BonePose bonePose = this._bonePoses.get(timelineName); + if (timelineDatas != null) { + for (TimelineData timelineData : timelineDatas) { + switch (timelineData.type) { + case BoneAll: + BoneAllTimelineState timeline = BaseObject.borrowObject(BoneAllTimelineState.class); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, timelineData); + this._boneTimelines.push(timeline); + break; + + case BoneT: + case BoneR: + case BoneS: + // TODO + break; + + case BoneX: + case BoneY: + case BoneRotate: + case BoneSkew: + case BoneScaleX: + case BoneScaleY: + // TODO + break; + } + } + } else if (this.resetToPose) { // Pose timeline. + BoneAllTimelineState timeline = BaseObject.borrowObject(BoneAllTimelineState.class); + timeline.bone = bone; + timeline.bonePose = bonePose; + timeline.init(this._armature, this, null); + this._boneTimelines.push(timeline); + } + } + } + + for (String k : boneTimelines.keySet()) { // Remove bone timelines. + for (BoneTimelineState timeline : boneTimelines.get(k)) { + this._boneTimelines.splice(this._boneTimelines.indexOfObject(timeline), 1); + timeline.returnToPool(); + } + } + + Map> slotTimelines = new HashMap<>(); + IntArray ffdFlags = new IntArray(); + for (SlotTimelineState timeline : this._slotTimelines) { // Create slot timelines map. + String timelineName = timeline.slot.name; + if (!(slotTimelines.containsKey(timelineName))) { + slotTimelines.put(timelineName, new Array<>()); + } + + slotTimelines.get(timelineName).add(timeline); + } + + for (Slot slot : this._armature.getSlots()) { + String boneName = slot.getParent().name; + if (!this.containsBoneMask(boneName)) { + continue; + } + + String timelineName = slot.name; + Array timelineDatas = this.animationData.getSlotTimeline(timelineName); + if (slotTimelines.containsKey(timelineName)) { + slotTimelines.remove(timelineName); + } else { // Create new slot timeline. + boolean displayIndexFlag = false; + boolean colorFlag = false; + ffdFlags.clear(); + + if (timelineDatas != null) { + for (TimelineData timelineData : timelineDatas) { + switch (timelineData.type) { + case SlotDisplay: { + SlotDislayIndexTimelineState timeline = BaseObject.borrowObject(SlotDislayIndexTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + displayIndexFlag = true; + break; + } + + case SlotColor: { + SlotColorTimelineState timeline = BaseObject.borrowObject(SlotColorTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + colorFlag = true; + break; + } + + case SlotFFD: { + SlotFFDTimelineState timeline = BaseObject.borrowObject(SlotFFDTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, timelineData); + this._slotTimelines.push(timeline); + ffdFlags.push(timeline.meshOffset); + break; + } + } + } + } + + if (this.resetToPose) { // Pose timeline. + if (!displayIndexFlag) { + SlotDislayIndexTimelineState timeline = BaseObject.borrowObject(SlotDislayIndexTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + + if (!colorFlag) { + SlotColorTimelineState timeline = BaseObject.borrowObject(SlotColorTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + + for (DisplayData displayData : slot._rawDisplayDatas) { + if (displayData != null && displayData.type == DisplayType.Mesh && ffdFlags.indexOfObject(((MeshDisplayData) displayData).offset) < 0) { + SlotFFDTimelineState timeline = BaseObject.borrowObject(SlotFFDTimelineState.class); + timeline.slot = slot; + timeline.init(this._armature, this, null); + this._slotTimelines.push(timeline); + } + } + } + } + } + + for (String k : slotTimelines.keySet()) { // Remove slot timelines. + for (SlotTimelineState timeline : slotTimelines.get(k)) { + this._slotTimelines.splice(this._slotTimelines.indexOfObject(timeline), 1); + timeline.returnToPool(); + } + } + } + + /** + * @private + * @internal + */ + public void advanceTime(float passedTime, float cacheFrameRate) { + // Update fade time. + if (this._fadeState != 0 || this._subFadeState != 0) { + this._advanceFadeTime(passedTime); + } + + // Update time. + if (this._playheadState == 3) { // 11 + if (this.timeScale != 1f) { + passedTime *= this.timeScale; + } + + this._time += passedTime; + } + + if (this._timelineDirty) { + this._timelineDirty = false; + this.updateTimelines(); + } + + if (this.weight == 0f) { + return; + } + + boolean isCacheEnabled = this._fadeState == 0 && cacheFrameRate > 0f; + boolean isUpdateTimeline = true; + boolean isUpdateBoneTimeline = true; + float time = this._time; + this._weightResult = this.weight * this._fadeProgress; + + this._actionTimeline.update(time); // Update main timeline. + + if (isCacheEnabled) { // Cache time internval. + float internval = cacheFrameRate * 2.0f; + this._actionTimeline.currentTime = (float) (Math.floor(this._actionTimeline.currentTime * internval) / internval); + } + + if (this._zOrderTimeline != null) { // Update zOrder timeline. + this._zOrderTimeline.update(time); + } + + if (isCacheEnabled) { // Update cache. + int cacheFrameIndex = (int) Math.floor(this._actionTimeline.currentTime * cacheFrameRate); // uint + if (this._armature._cacheFrameIndex == cacheFrameIndex) { // Same cache. + isUpdateTimeline = false; + isUpdateBoneTimeline = false; + } else { + this._armature._cacheFrameIndex = cacheFrameIndex; + if (this.animationData.cachedFrames.getBool(cacheFrameIndex)) { // Cached. + isUpdateBoneTimeline = false; + } else { // Cache. + this.animationData.cachedFrames.setBool(cacheFrameIndex, true); + } + } + } + + if (isUpdateTimeline) { + if (isUpdateBoneTimeline) { // Update bone timelines. + Bone bone = null; + BoneTimelineState prevTimeline = null; // + for (int i = 0, l = this._boneTimelines.size(); i < l; ++i) { + BoneTimelineState timeline = this._boneTimelines.get(i); + if (bone != timeline.bone) { // Blend bone pose. + if (bone != null) { + this._blendBoneTimline(prevTimeline); + + if (bone._blendDirty) { + if (bone._blendLeftWeight > 0f) { + if (bone._blendLayer != this.layer) { + if (bone._blendLayerWeight >= bone._blendLeftWeight) { + bone._blendLeftWeight = 0f; + bone = null; + } else { + bone._blendLayer = this.layer; + bone._blendLeftWeight -= bone._blendLayerWeight; + bone._blendLayerWeight = 0f; + } + } + } else { + bone = null; + } + } + } + + bone = timeline.bone; + } + + if (bone != null) { + timeline.update(time); + if (i == l - 1) { + this._blendBoneTimline(timeline); + } else { + prevTimeline = timeline; + } + } + } + } + + for (int i = 0, l = this._slotTimelines.size(); i < l; ++i) { + SlotTimelineState timeline = this._slotTimelines.get(i); + if (this._isDisabled(timeline.slot)) { + continue; + } + + timeline.update(time); + } + } + + if (this._fadeState == 0) { + if (this._subFadeState > 0) { + this._subFadeState = 0; + } + + if (this._actionTimeline.playState > 0) { + if (this.autoFadeOutTime >= 0f) { // Auto fade out. + this.fadeOut(this.autoFadeOutTime); + } + } + } + } + + /** + * 继续播放。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void play() { + this._playheadState = 3; // 11 + } + + /** + * 暂停播放。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void stop() { + this._playheadState &= 1; // 0x + } + + public void fadeOut(float fadeOutTime) { + fadeOut(fadeOutTime, true); + } + + /** + * 淡出动画。 + * + * @param fadeOutTime 淡出时间。 (以秒为单位) + * @param pausePlayhead 淡出时是否暂停动画。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void fadeOut(float fadeOutTime, boolean pausePlayhead) { + if (fadeOutTime < 0f) { + fadeOutTime = 0f; + } + + if (pausePlayhead) { + this._playheadState &= 2; // x0 + } + + if (this._fadeState > 0) { + if (fadeOutTime > this.fadeTotalTime - this._fadeTime) { // If the animation is already in fade out, the new fade out will be ignored. + return; + } + } else { + this._fadeState = 1; + this._subFadeState = -1; + + if (fadeOutTime <= 0f || this._fadeProgress <= 0f) { + this._fadeProgress = 0.000001f; // Modify fade progress to different value. + } + + for (BoneTimelineState timeline : this._boneTimelines) { + timeline.fadeOut(); + } + + for (SlotTimelineState timeline : this._slotTimelines) { + timeline.fadeOut(); + } + } + + this.displayControl = false; // + this.fadeTotalTime = this._fadeProgress > 0.000001 ? fadeOutTime / this._fadeProgress : 0f; + this._fadeTime = this.fadeTotalTime * (1f - this._fadeProgress); + } + + /** + * 是否包含骨骼遮罩。 + * + * @param name 指定的骨骼名称。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean containsBoneMask(String name) { + return this._boneMask.size() == 0 || this._boneMask.indexOf(name) >= 0; + } + + public void addBoneMask(String name) { + addBoneMask(name, true); + } + + /** + * 添加骨骼遮罩。 + * + * @param name 指定的骨骼名称。 + * @param recursive 是否为该骨骼的子骨骼添加遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void addBoneMask(String name, boolean recursive) { + Bone currentBone = this._armature.getBone(name); + if (currentBone == null) { + return; + } + + if (this._boneMask.indexOf(name) < 0) { // Add mixing + this._boneMask.add(name); + } + + if (recursive) { // Add recursive mixing. + for (Bone bone : this._armature.getBones()) { + if (this._boneMask.indexOf(bone.name) < 0 && currentBone.contains(bone)) { + this._boneMask.add(bone.name); + } + } + } + + this._timelineDirty = true; + } + + public void removeBoneMask(String name) { + removeBoneMask(name, true); + } + + /** + * 删除骨骼遮罩。 + * + * @param name 指定的骨骼名称。 + * @param recursive 是否删除该骨骼的子骨骼遮罩。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void removeBoneMask(String name, boolean recursive) { + int index = this._boneMask.indexOf(name); + if (index >= 0) { // Remove mixing. + this._boneMask.splice(index, 1); + } + + if (recursive) { + Bone currentBone = this._armature.getBone(name); + if (currentBone != null) { + Array bones = this._armature.getBones(); + if (this._boneMask.size() > 0) { // Remove recursive mixing. + for (Bone bone : bones) { + int index2 = this._boneMask.indexOf(bone.name); + if (index2 >= 0 && currentBone.contains(bone)) { + this._boneMask.splice(index2, 1); + } + } + } else { // Add unrecursive mixing. + for (Bone bone : bones) { + if (bone == currentBone) { + continue; + } + + if (!currentBone.contains(bone)) { + this._boneMask.add(bone.name); + } + } + } + } + } + + this._timelineDirty = true; + } + + /** + * 删除所有骨骼遮罩。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void removeAllBoneMask() { + this._boneMask.clear(); + this._timelineDirty = true; + } + + /** + * 是否正在淡入。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + public boolean isFadeIn() { + return this._fadeState < 0; + } + + /** + * 是否正在淡出。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + public boolean isFadeOut() { + return this._fadeState > 0; + } + + /** + * 是否淡入完毕。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + public boolean isFadeComplete() { + return this._fadeState == 0; + } + + /** + * 是否正在播放。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean isPlaying() { + return (this._playheadState & 2) != 0 && this._actionTimeline.playState <= 0; + } + + /** + * 是否播放完毕。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean isCompleted() { + return this._actionTimeline.playState > 0; + } + + /** + * 当前播放次数。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public int getCurrentPlayTimes() { + return this._actionTimeline.currentPlayTimes; + } + + /** + * 总时间。 (以秒为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float getTotalTime() { + return this._duration; + } + + /** + * 当前播放的时间。 (以秒为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float getCurrentTime() { + return this._actionTimeline.currentTime; + } + + public void setCurrentTime(float value) { + int currentPlayTimes = this._actionTimeline.currentPlayTimes - (this._actionTimeline.playState > 0 ? 1 : 0); + if (value < 0 || this._duration < value) { + value = (value % this._duration) + currentPlayTimes * this._duration; + if (value < 0) { + value += this._duration; + } + } + + if (this.playTimes > 0 && currentPlayTimes == this.playTimes - 1 && value == this._duration) { + value = this._duration - 0.000001f; + } + + if (this._time == value) { + return; + } + + this._time = value; + this._actionTimeline.setCurrentTime(this._time); + + if (this._zOrderTimeline != null) { + this._zOrderTimeline.playState = -1; + } + + for (BoneTimelineState timeline : this._boneTimelines) { + timeline.playState = -1; + } + + for (SlotTimelineState timeline : this._slotTimelines) { + timeline.playState = -1; + } + } + + /** + * @see #animationData + * @deprecated 已废弃,请参考 @see + */ + public AnimationData getClip() { + return this.animationData; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/BoneAllTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/BoneAllTimelineState.java new file mode 100644 index 0000000..88a7957 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/BoneAllTimelineState.java @@ -0,0 +1,84 @@ +package com.dragonbones.animation; + +import com.dragonbones.geom.Transform; +import com.dragonbones.util.FloatArray; + +/** + * @internal + * @private + */ +public class BoneAllTimelineState extends BoneTimelineState { + protected void _onArriveAtFrame() { + super._onArriveAtFrame(); + + if (this._timelineData != null) { + FloatArray frameFloatArray = this._dragonBonesData.frameFloatArray; + Transform current = this.bonePose.current; + Transform delta = this.bonePose.delta; + int valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * 6; // ...(timeline value offset)|xxxxxx|xxxxxx|(Value offset)xxxxx|(Next offset)xxxxx|xxxxxx|xxxxxx|... + + current.x = frameFloatArray.get(valueOffset++); + current.y = frameFloatArray.get(valueOffset++); + current.rotation = frameFloatArray.get(valueOffset++); + current.skew = frameFloatArray.get(valueOffset++); + current.scaleX = frameFloatArray.get(valueOffset++); + current.scaleY = frameFloatArray.get(valueOffset++); + + if (this._tweenState == TweenState.Always) { + if (this._frameIndex == this._frameCount - 1) { + valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + + delta.x = frameFloatArray.get(valueOffset++) - current.x; + delta.y = frameFloatArray.get(valueOffset++) - current.y; + delta.rotation = frameFloatArray.get(valueOffset++) - current.rotation; + delta.skew = frameFloatArray.get(valueOffset++) - current.skew; + delta.scaleX = frameFloatArray.get(valueOffset++) - current.scaleX; + delta.scaleY = frameFloatArray.get(valueOffset++) - current.scaleY; + } + // else { + // delta.x = 0f; + // delta.y = 0f; + // delta.rotation = 0f; + // delta.skew = 0f; + // delta.scaleX = 0f; + // delta.scaleY = 0f; + // } + } else { // Pose. + Transform current = this.bonePose.current; + current.x = 0f; + current.y = 0f; + current.rotation = 0f; + current.skew = 0f; + current.scaleX = 1f; + current.scaleY = 1f; + } + } + + protected void _onUpdateFrame() { + super._onUpdateFrame(); + + Transform current = this.bonePose.current; + Transform delta = this.bonePose.delta; + Transform result = this.bonePose.result; + + this.bone._transformDirty = true; + if (this._tweenState != TweenState.Always) { + this._tweenState = TweenState.None; + } + + float scale = this._armature.armatureData.scale; + result.x = (current.x + delta.x * this._tweenProgress) * scale; + result.y = (current.y + delta.y * this._tweenProgress) * scale; + result.rotation = current.rotation + delta.rotation * this._tweenProgress; + result.skew = current.skew + delta.skew * this._tweenProgress; + result.scaleX = current.scaleX + delta.scaleX * this._tweenProgress; + result.scaleY = current.scaleY + delta.scaleY * this._tweenProgress; + } + + public void fadeOut() { + Transform result = this.bonePose.result; + result.rotation = Transform.normalizeRadian(result.rotation); + result.skew = Transform.normalizeRadian(result.skew); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/BonePose.java b/dragonbones-core/src/main/java/com/dragonbones/animation/BonePose.java new file mode 100644 index 0000000..4341858 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/BonePose.java @@ -0,0 +1,20 @@ +package com.dragonbones.animation; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Transform; + +/** + * @internal + * @private + */ +public class BonePose extends BaseObject { + public final Transform current = new Transform(); + public final Transform delta = new Transform(); + public final Transform result = new Transform(); + + protected void _onClear() { + this.current.identity(); + this.delta.identity(); + this.result.identity(); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/BoneTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/BoneTimelineState.java new file mode 100644 index 0000000..bbef789 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/BoneTimelineState.java @@ -0,0 +1,19 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Bone; + +/** + * @internal + * @private + */ +public abstract class BoneTimelineState extends TweenTimelineState { + public Bone bone; + public BonePose bonePose; + + protected void _onClear() { + super._onClear(); + + this.bone = null; // + this.bonePose = null; // + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/IAnimatable.java b/dragonbones-core/src/main/java/com/dragonbones/animation/IAnimatable.java new file mode 100644 index 0000000..032ad58 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/IAnimatable.java @@ -0,0 +1,31 @@ +package com.dragonbones.animation; + +/** + * 播放动画接口。 (Armature 和 WordClock 都实现了该接口) + * 任何实现了此接口的实例都可以加到 WorldClock 实例中,由 WorldClock 统一更新时间。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see WorldClock + * @see com.dragonbones.armature.Armature + */ +public interface IAnimatable { + /** + * 更新时间。 + * + * @param passedTime 前进的时间。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + */ + void advanceTime(float passedTime); + + /** + * 当前所属的 WordClock 实例。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + WorldClock getClock(); + + void setClock(WorldClock value); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/SlotColorTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotColorTimelineState.java new file mode 100644 index 0000000..8ac0f0a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotColorTimelineState.java @@ -0,0 +1,149 @@ +package com.dragonbones.animation; + +import com.dragonbones.geom.ColorTransform; +import com.dragonbones.util.FloatArray; +import com.dragonbones.util.ShortArray; + +/** + * @internal + * @private + */ +public class SlotColorTimelineState extends SlotTimelineState { + private boolean _dirty; + private final FloatArray _current = new FloatArray(new float[]{0, 0, 0, 0, 0, 0, 0, 0}); + private final FloatArray _delta = new FloatArray(new float[]{0, 0, 0, 0, 0, 0, 0, 0}); + private final FloatArray _result = new FloatArray(new float[]{0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f}); + + protected void _onClear() { + super._onClear(); + + this._dirty = false; + } + + protected void _onArriveAtFrame() { + super._onArriveAtFrame(); + + if (this._timelineData != null) { + ShortArray intArray = this._dragonBonesData.intArray; + ShortArray frameIntArray = this._dragonBonesData.frameIntArray; + int valueOffset = this._animationData.frameIntOffset + this._frameValueOffset + this._frameIndex * 1; // ...(timeline value offset)|x|x|(Value offset)|(Next offset)|x|x|... + int colorOffset = frameIntArray.get(valueOffset); + this._current.set(0, intArray.get(colorOffset++)); + this._current.set(1, intArray.get(colorOffset++)); + this._current.set(2, intArray.get(colorOffset++)); + this._current.set(3, intArray.get(colorOffset++)); + this._current.set(4, intArray.get(colorOffset++)); + this._current.set(5, intArray.get(colorOffset++)); + this._current.set(6, intArray.get(colorOffset++)); + this._current.set(7, intArray.get(colorOffset++)); + + if (this._tweenState == TweenState.Always) { + if (this._frameIndex == this._frameCount - 1) { + colorOffset = frameIntArray.get(this._animationData.frameIntOffset + this._frameValueOffset); + } else { + colorOffset = frameIntArray.get(valueOffset + 1 * 1); + } + + this._delta.set(0, intArray.get(colorOffset++) - this._current.get(0)); + this._delta.set(1, intArray.get(colorOffset++) - this._current.get(1)); + this._delta.set(2, intArray.get(colorOffset++) - this._current.get(2)); + this._delta.set(3, intArray.get(colorOffset++) - this._current.get(3)); + this._delta.set(4, intArray.get(colorOffset++) - this._current.get(4)); + this._delta.set(5, intArray.get(colorOffset++) - this._current.get(5)); + this._delta.set(6, intArray.get(colorOffset++) - this._current.get(6)); + this._delta.set(7, intArray.get(colorOffset++) - this._current.get(7)); + } + } else { // Pose. + ColorTransform color = this.slot.slotData.color; + this._current.set(0, color.alphaMultiplier * 100f); + this._current.set(1, color.redMultiplier * 100f); + this._current.set(2, color.greenMultiplier * 100f); + this._current.set(3, color.blueMultiplier * 100f); + this._current.set(4, color.alphaOffset); + this._current.set(5, color.redOffset); + this._current.set(6, color.greenOffset); + this._current.set(7, color.blueOffset); + } + } + + protected void _onUpdateFrame() { + super._onUpdateFrame(); + + this._dirty = true; + if (this._tweenState != TweenState.Always) { + this._tweenState = TweenState.None; + } + + this._result.set(0, (this._current.get(0) + this._delta.get(0) * this._tweenProgress) * 0.01f); + this._result.set(1, (this._current.get(1) + this._delta.get(1) * this._tweenProgress) * 0.01f); + this._result.set(2, (this._current.get(2) + this._delta.get(2) * this._tweenProgress) * 0.01f); + this._result.set(3, (this._current.get(3) + this._delta.get(3) * this._tweenProgress) * 0.01f); + this._result.set(4, (this._current.get(4) + this._delta.get(4) * this._tweenProgress)); + this._result.set(5, (this._current.get(5) + this._delta.get(5) * this._tweenProgress)); + this._result.set(6, (this._current.get(6) + this._delta.get(6) * this._tweenProgress)); + this._result.set(7, (this._current.get(7) + this._delta.get(7) * this._tweenProgress)); + } + + public void fadeOut() { + this._tweenState = TweenState.None; + this._dirty = false; + } + + public void update(float passedTime) { + super.update(passedTime); + + // Fade animation. + if (this._tweenState != TweenState.None || this._dirty) { + ColorTransform result = this.slot._colorTransform; + + if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0) { + if ( + result.alphaMultiplier != this._result.get(0) || + result.redMultiplier != this._result.get(1) || + result.greenMultiplier != this._result.get(2) || + result.blueMultiplier != this._result.get(3) || + result.alphaOffset != this._result.get(4) || + result.redOffset != this._result.get(5) || + result.greenOffset != this._result.get(6) || + result.blueOffset != this._result.get(7) + ) { + float fadeProgress = (float) Math.pow(this._animationState._fadeProgress, 4); + + result.alphaMultiplier += (this._result.get(0) - result.alphaMultiplier) * fadeProgress; + result.redMultiplier += (this._result.get(1) - result.redMultiplier) * fadeProgress; + result.greenMultiplier += (this._result.get(2) - result.greenMultiplier) * fadeProgress; + result.blueMultiplier += (this._result.get(3) - result.blueMultiplier) * fadeProgress; + result.alphaOffset += (this._result.get(4) - result.alphaOffset) * fadeProgress; + result.redOffset += (this._result.get(5) - result.redOffset) * fadeProgress; + result.greenOffset += (this._result.get(6) - result.greenOffset) * fadeProgress; + result.blueOffset += (this._result.get(7) - result.blueOffset) * fadeProgress; + + this.slot._colorDirty = true; + } + } else if (this._dirty) { + this._dirty = false; + if ( + result.alphaMultiplier != this._result.get(1) || + result.redMultiplier != this._result.get(1) || + result.greenMultiplier != this._result.get(1) || + result.blueMultiplier != this._result.get(1) || + result.alphaOffset != this._result.get(1) || + result.redOffset != this._result.get(1) || + result.greenOffset != this._result.get(1) || + result.blueOffset != this._result.get(1) + ) { + result.alphaMultiplier = this._result.get(1); + result.redMultiplier = this._result.get(1); + result.greenMultiplier = this._result.get(1); + result.blueMultiplier = this._result.get(1); + result.alphaOffset = (int) this._result.get(1); + result.redOffset = (int) this._result.get(1); + result.greenOffset = (int) this._result.get(1); + result.blueOffset = (int) this._result.get(1); + + this.slot._colorDirty = true; + } + } + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/SlotDislayIndexTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotDislayIndexTimelineState.java new file mode 100644 index 0000000..9afac3a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotDislayIndexTimelineState.java @@ -0,0 +1,16 @@ +package com.dragonbones.animation; + +/** + * @internal + * @private + */ +public class SlotDislayIndexTimelineState extends SlotTimelineState { + protected void _onArriveAtFrame() { + if (this.playState >= 0) { + int displayIndex = this._timelineData != null ? this._frameArray.get(this._frameOffset + 1) : this.slot.slotData.displayIndex; + if (this.slot.getDisplayIndex() != displayIndex) { + this.slot._setDisplayIndex(displayIndex, true); + } + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/SlotFFDTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotFFDTimelineState.java new file mode 100644 index 0000000..4556fca --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotFFDTimelineState.java @@ -0,0 +1,176 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.model.TimelineData; +import com.dragonbones.util.FloatArray; +import com.dragonbones.util.ShortArray; +import org.jetbrains.annotations.Nullable; + +/** + * @internal + * @private + */ +public class SlotFFDTimelineState extends SlotTimelineState { + public int meshOffset; + + private boolean _dirty; + private int _frameFloatOffset; + private int _valueCount; + private float _ffdCount; + private int _valueOffset; + private final FloatArray _current = new FloatArray(); + private final FloatArray _delta = new FloatArray(); + private final FloatArray _result = new FloatArray(); + + protected void _onClear() { + super._onClear(); + + this.meshOffset = 0; + + this._dirty = false; + this._frameFloatOffset = 0; + this._valueCount = 0; + this._ffdCount = 0; + this._valueOffset = 0; + this._current.clear(); + this._delta.clear(); + this._result.clear(); + } + + protected void _onArriveAtFrame() { + super._onArriveAtFrame(); + + if (this._timelineData != null) { + boolean isTween = this._tweenState == TweenState.Always; + FloatArray frameFloatArray = this._dragonBonesData.frameFloatArray; + int valueOffset = this._animationData.frameFloatOffset + this._frameValueOffset + this._frameIndex * this._valueCount; + + if (isTween) { + int nextValueOffset = valueOffset + this._valueCount; + if (this._frameIndex == this._frameCount - 1) { + nextValueOffset = this._animationData.frameFloatOffset + this._frameValueOffset; + } + + for (int i = 0; i < this._valueCount; ++i) { + float v = frameFloatArray.get(valueOffset + i); + this._current.set(i, v); + this._delta.set(i, frameFloatArray.get(nextValueOffset + i) - v); + } + } else { + for (int i = 0; i < this._valueCount; ++i) { + this._current.set(i, frameFloatArray.get(valueOffset + i)); + } + } + } else { + for (int i = 0; i < this._valueCount; ++i) { + this._current.set(i, 0f); + } + } + } + + protected void _onUpdateFrame() { + super._onUpdateFrame(); + + this._dirty = true; + if (this._tweenState != TweenState.Always) { + this._tweenState = TweenState.None; + } + + for (int i = 0; i < this._valueCount; ++i) { + this._result.set(i, this._current.get(i) + this._delta.get(i) * this._tweenProgress); + } + } + + public void init(Armature armature, AnimationState animationState, @Nullable TimelineData timelineData) { + super.init(armature, animationState, timelineData); + + if (this._timelineData != null) { + ShortArray frameIntArray = this._dragonBonesData.frameIntArray; + int frameIntOffset = this._animationData.frameIntOffset + this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameValueCount.v); + this.meshOffset = frameIntArray.get(frameIntOffset + BinaryOffset.FFDTimelineMeshOffset.v); + this._ffdCount = frameIntArray.get(frameIntOffset + BinaryOffset.FFDTimelineFFDCount.v); + this._valueCount = frameIntArray.get(frameIntOffset + BinaryOffset.FFDTimelineValueCount.v); + this._valueOffset = frameIntArray.get(frameIntOffset + BinaryOffset.FFDTimelineValueOffset.v); + this._frameFloatOffset = frameIntArray.get(frameIntOffset + BinaryOffset.FFDTimelineFloatOffset.v) + this._animationData.frameFloatOffset; + } else { + this._valueCount = 0; + } + + this._current.setLength(this._valueCount); + this._delta.setLength(this._valueCount); + this._result.setLength(this._valueCount); + + for (int i = 0; i < this._valueCount; ++i) { + this._delta.set(i, 0f); + } + } + + public void fadeOut() { + this._tweenState = TweenState.None; + this._dirty = false; + } + + public void update(float passedTime) { + if (this.slot._meshData == null || (this._timelineData != null && this.slot._meshData.offset != this.meshOffset)) { + return; + } + + super.update(passedTime); + + // Fade animation. + if (this._tweenState != TweenState.None || this._dirty) { + FloatArray result = this.slot._ffdVertices; + if (this._timelineData != null) { + FloatArray frameFloatArray = this._dragonBonesData.frameFloatArray; + if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0) { + float fadeProgress = (float) Math.pow(this._animationState._fadeProgress, 2); + + for (int i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result.set(i, result.get(i) + (frameFloatArray.get(this._frameFloatOffset + i) - result.get(i)) * fadeProgress); + } else if (i < this._valueOffset + this._valueCount) { + result.set(i, result.get(i) + (this._result.get(i - this._valueOffset) - result.get(i)) * fadeProgress); + } else { + result.set(i, result.get(i) + (frameFloatArray.get(this._frameFloatOffset + i - this._valueCount) - result.get(i)) * fadeProgress); + } + } + + this.slot._meshDirty = true; + } else if (this._dirty) { + this._dirty = false; + + for (int i = 0; i < this._ffdCount; ++i) { + if (i < this._valueOffset) { + result.set(i, frameFloatArray.get(this._frameFloatOffset + i)); + } else if (i < this._valueOffset + this._valueCount) { + result.set(i, this._result.get(i - this._valueOffset)); + } else { + result.set(i, frameFloatArray.get(this._frameFloatOffset + i - this._valueCount)); + } + } + + this.slot._meshDirty = true; + } + } else { + this._ffdCount = result.size(); // + if (this._animationState._fadeState != 0 || this._animationState._subFadeState != 0) { + float fadeProgress = (float) Math.pow(this._animationState._fadeProgress, 2); + for (int i = 0; i < this._ffdCount; ++i) { + result.set(i, result.get(i) + (0f - result.get(i)) * fadeProgress); + } + + this.slot._meshDirty = true; + } else if (this._dirty) { + this._dirty = false; + + for (int i = 0; i < this._ffdCount; ++i) { + result.set(i, 0f); + } + + this.slot._meshDirty = true; + } + } + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/SlotTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotTimelineState.java new file mode 100644 index 0000000..cb063d6 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/SlotTimelineState.java @@ -0,0 +1,17 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Slot; + +/** + * @internal + * @private + */ +public abstract class SlotTimelineState extends TweenTimelineState { + public Slot slot; + + protected void _onClear() { + super._onClear(); + + this.slot = null; // + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/TimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/TimelineState.java new file mode 100644 index 0000000..11ebd32 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/TimelineState.java @@ -0,0 +1,208 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.model.AnimationData; +import com.dragonbones.model.DragonBonesData; +import com.dragonbones.model.TimelineData; +import com.dragonbones.util.CharArray; +import com.dragonbones.util.FloatArray; +import com.dragonbones.util.IntArray; +import com.dragonbones.util.ShortArray; +import org.jetbrains.annotations.Nullable; + +/** + * @internal + * @private + */ +public abstract class TimelineState extends BaseObject { + public int playState; // -1: start, 0: play, 1: complete; + public int currentPlayTimes; + public float currentTime; + + protected TweenState _tweenState; + protected float _frameRate; + protected int _frameValueOffset; + protected int _frameCount; + protected int _frameOffset; + protected int _frameIndex; + protected float _frameRateR; + protected float _position; + protected float _duration; + protected float _timeScale; + protected float _timeOffset; + protected DragonBonesData _dragonBonesData; + protected AnimationData _animationData; + @Nullable + protected TimelineData _timelineData; + protected Armature _armature; + protected AnimationState _animationState; + protected TimelineState _actionTimeline; + protected ShortArray _frameArray; + protected ShortArray _frameIntArray; + protected FloatArray _frameFloatArray; + protected CharArray _timelineArray; + protected IntArray _frameIndices; + + protected void _onClear() { + this.playState = -1; + this.currentPlayTimes = -1; + this.currentTime = -1f; + + this._tweenState = TweenState.None; + this._frameRate = 0; + this._frameValueOffset = 0; + this._frameCount = 0; + this._frameOffset = 0; + this._frameIndex = -1; + this._frameRateR = 0f; + this._position = 0f; + this._duration = 0f; + this._timeScale = 1f; + this._timeOffset = 0f; + this._dragonBonesData = null; // + this._animationData = null; // + this._timelineData = null; // + this._armature = null; // + this._animationState = null; // + this._actionTimeline = null; // + this._frameArray = null; // + this._frameIntArray = null; // + this._frameFloatArray = null; // + this._timelineArray = null; // + this._frameIndices = null; // + } + + protected abstract void _onArriveAtFrame(); + + protected abstract void _onUpdateFrame(); + + protected boolean _setCurrentTime(float passedTime) { + float prevState = this.playState; + float prevPlayTimes = this.currentPlayTimes; + float prevTime = this.currentTime; + + if (this._actionTimeline != null && this._frameCount <= 1) { // No frame or only one frame. + this.playState = this._actionTimeline.playState >= 0 ? 1 : -1; + this.currentPlayTimes = 1; + this.currentTime = this._actionTimeline.currentTime; + } else if (this._actionTimeline == null || this._timeScale != 1f || this._timeOffset != 0f) { // Action timeline or has scale and offset. + int playTimes = this._animationState.playTimes; + float totalTime = playTimes * this._duration; + + passedTime *= this._timeScale; + if (this._timeOffset != 0f) { + passedTime += this._timeOffset * this._animationData.duration; + } + + if (playTimes > 0 && (passedTime >= totalTime || passedTime <= -totalTime)) { + if (this.playState <= 0 && this._animationState._playheadState == 3) { + this.playState = 1; + } + + this.currentPlayTimes = playTimes; + if (passedTime < 0f) { + this.currentTime = 0f; + } else { + this.currentTime = this._duration; + } + } else { + if (this.playState != 0 && this._animationState._playheadState == 3) { + this.playState = 0; + } + + if (passedTime < 0f) { + passedTime = -passedTime; + this.currentPlayTimes = (int) Math.floor(passedTime / this._duration); + this.currentTime = this._duration - (passedTime % this._duration); + } else { + this.currentPlayTimes = (int) Math.floor(passedTime / this._duration); + this.currentTime = passedTime % this._duration; + } + } + + this.currentTime += this._position; + } else { // Multi frames. + this.playState = this._actionTimeline.playState; + this.currentPlayTimes = this._actionTimeline.currentPlayTimes; + this.currentTime = this._actionTimeline.currentTime; + } + + if (this.currentPlayTimes == prevPlayTimes && this.currentTime == prevTime) { + return false; + } + + // Clear frame flag when timeline start or loopComplete. + if ( + (prevState < 0 && this.playState != prevState) || + (this.playState <= 0 && this.currentPlayTimes != prevPlayTimes) + ) { + this._frameIndex = -1; + } + + return true; + } + + public void init(Armature armature, AnimationState animationState, @Nullable TimelineData timelineData) { + this._armature = armature; + this._animationState = animationState; + this._timelineData = timelineData; + this._actionTimeline = this._animationState._actionTimeline; + + if (this == this._actionTimeline) { + this._actionTimeline = null; // + } + + this._frameRate = this._armature.armatureData.frameRate; + this._frameRateR = 1f / this._frameRate; + this._position = this._animationState._position; + this._duration = this._animationState._duration; + this._dragonBonesData = this._armature.armatureData.parent; + this._animationData = this._animationState.animationData; + + if (this._timelineData != null) { + this._frameIntArray = this._dragonBonesData.frameIntArray; + this._frameFloatArray = this._dragonBonesData.frameFloatArray; + this._frameArray = this._dragonBonesData.frameArray; + this._timelineArray = this._dragonBonesData.timelineArray; + this._frameIndices = this._dragonBonesData.frameIndices; + + this._frameCount = this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineKeyFrameCount.v); + this._frameValueOffset = this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameValueOffset.v); + this._timeScale = 100f / this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineScale.v); + this._timeOffset = this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineOffset.v) * 0.01f; + } + } + + public void fadeOut() { + } + + public void update(float passedTime) { + if (this.playState <= 0 && this._setCurrentTime(passedTime)) { + if (this._frameCount > 1) { + int timelineFrameIndex = (int) Math.floor(this.currentTime * this._frameRate); // uint + int frameIndex = this._frameIndices.get(this._timelineData.frameIndicesOffset + timelineFrameIndex); + if (this._frameIndex != frameIndex) { + this._frameIndex = frameIndex; + this._frameOffset = this._animationData.frameOffset + this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameOffset.v + this._frameIndex); + + this._onArriveAtFrame(); + } + } else if (this._frameIndex < 0) { + this._frameIndex = 0; + if (this._timelineData != null) { // May be pose timeline. + this._frameOffset = this._animationData.frameOffset + this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameOffset.v); + } + + this._onArriveAtFrame(); + } + + if (this._tweenState != TweenState.None) { + this._onUpdateFrame(); + } + } + } +} + + diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/TweenState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/TweenState.java new file mode 100644 index 0000000..d96c4d6 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/TweenState.java @@ -0,0 +1,7 @@ +package com.dragonbones.animation; + +public enum TweenState { + None, + Once, + Always +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/TweenTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/TweenTimelineState.java new file mode 100644 index 0000000..8ca1db4 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/TweenTimelineState.java @@ -0,0 +1,106 @@ +package com.dragonbones.animation; + +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.core.TweenType; +import com.dragonbones.util.ShortArray; + +/** + * @internal + * @private + */ +public abstract class TweenTimelineState extends TimelineState { + private static float _getEasingValue(TweenType tweenType, float progress, float easing) { + float value = progress; + + switch (tweenType) { + case QuadIn: + value = (float) Math.pow(progress, 2f); + break; + + case QuadOut: + value = (float) (1f - Math.pow(1f - progress, 2f)); + break; + + case QuadInOut: + value = (float) (0.5 * (1f - Math.cos(progress * Math.PI))); + break; + } + + return (value - progress) * easing + progress; + } + + private static float _getEasingCurveValue(float progress, ShortArray samples, float count, int offset) { + if (progress <= 0f) { + return 0f; + } else if (progress >= 1f) { + return 1f; + } + + float segmentCount = count + 1; // + 2 - 1 + int valueIndex = (int) Math.floor(progress * segmentCount); + float fromValue = valueIndex == 0 ? 0f : samples.get(offset + valueIndex - 1); + float toValue = (valueIndex == segmentCount - 1) ? 10000f : samples.get(offset + valueIndex); + + return (fromValue + (toValue - fromValue) * (progress * segmentCount - valueIndex)) * 0.0001f; + } + + protected TweenType _tweenType; + protected float _curveCount; + protected float _framePosition; + protected float _frameDurationR; + protected float _tweenProgress; + protected float _tweenEasing; + + protected void _onClear() { + super._onClear(); + + this._tweenType = TweenType.None; + this._curveCount = 0; + this._framePosition = 0f; + this._frameDurationR = 0f; + this._tweenProgress = 0f; + this._tweenEasing = 0f; + } + + protected void _onArriveAtFrame() { + if ( + this._frameCount > 1 && + ( + this._frameIndex != this._frameCount - 1 || + this._animationState.playTimes == 0 || + this._animationState.getCurrentPlayTimes() < this._animationState.playTimes - 1 + ) + ) { + this._tweenType = TweenType.values[this._frameArray.get(this._frameOffset + BinaryOffset.FrameTweenType.v)]; // TODO recode ture tween type. + this._tweenState = this._tweenType == TweenType.None ? TweenState.Once : TweenState.Always; + if (this._tweenType == TweenType.Curve) { + this._curveCount = this._frameArray.get(this._frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v); + } else if (this._tweenType != TweenType.None && this._tweenType != TweenType.Line) { + this._tweenEasing = this._frameArray.get(this._frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v) * 0.01f; + } + + this._framePosition = this._frameArray.get(this._frameOffset) * this._frameRateR; + if (this._frameIndex == this._frameCount - 1) { + this._frameDurationR = 1f / (this._animationData.duration - this._framePosition); + } else { + int nextFrameOffset = this._animationData.frameOffset + (int) this._timelineArray.get(this._timelineData.offset + BinaryOffset.TimelineFrameOffset.v + this._frameIndex + 1); + this._frameDurationR = 1f / (this._frameArray.get(nextFrameOffset) * this._frameRateR - this._framePosition); + } + } else { + this._tweenState = TweenState.Once; + } + } + + protected void _onUpdateFrame() { + if (this._tweenState == TweenState.Always) { + this._tweenProgress = (this.currentTime - this._framePosition) * this._frameDurationR; + if (this._tweenType == TweenType.Curve) { + this._tweenProgress = TweenTimelineState._getEasingCurveValue(this._tweenProgress, this._frameArray, this._curveCount, this._frameOffset + BinaryOffset.FrameCurveSamples.v); + } else if (this._tweenType != TweenType.Line) { + this._tweenProgress = TweenTimelineState._getEasingValue(this._tweenType, this._tweenProgress, this._tweenEasing); + } + } else { + this._tweenProgress = 0f; + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/WorldClock.java b/dragonbones-core/src/main/java/com/dragonbones/animation/WorldClock.java new file mode 100644 index 0000000..cf1ca6f --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/WorldClock.java @@ -0,0 +1,206 @@ +package com.dragonbones.animation; + +import com.dragonbones.armature.Armature; +import com.dragonbones.util.Array; +import org.jetbrains.annotations.Nullable; + +/** + * WorldClock 提供时钟支持,为每个加入到时钟的 IAnimatable 对象更新时间。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see IAnimatable + * @see Armature + */ +public class WorldClock implements IAnimatable { + /** + * 一个可以直接使用的全局 WorldClock 实例. + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public static final WorldClock clock = new WorldClock(); + /** + * 当前时间。 (以秒为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float time = 0f; + /** + * 时间流逝速度,用于控制动画变速播放。 [0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * + * @default 1f + * @version DragonBones 3.0 + * @language zh_CN + */ + public float timeScale = 1f; + private final Array _animatebles = new Array<>(); + @Nullable + private WorldClock _clock = null; + + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public WorldClock() { + this(-1f); + } + + /** + * 创建一个新的 WorldClock 实例。 + * 通常并不需要单独创建 WorldClock 实例,可以直接使用 WorldClock.clock 静态实例。 + * (创建更多独立的 WorldClock 实例可以更灵活的为需要更新的 IAnimateble 实例分组,用于控制不同组不同的播放速度) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public WorldClock(float time) { + if (time < 0f) { + this.time = System.currentTimeMillis() * 0.001f; + } else { + this.time = time; + } + } + + /** + * 为所有的 IAnimatable 实例更新时间。 + * + * @param passedTime 前进的时间。 (以秒为单位,当设置为 -1 时将自动计算当前帧与上一帧的时间差) + * @version DragonBones 3.0 + * @language zh_CN + */ + public void advanceTime(float passedTime) { + if (passedTime != passedTime) { // isNaN + passedTime = 0f; + } + + if (passedTime < 0f) { + passedTime = System.currentTimeMillis() * 0.001f - this.time; + } + + if (this.timeScale != 1f) { + passedTime *= this.timeScale; + } + + if (passedTime < 0f) { + this.time -= passedTime; + } else { + this.time += passedTime; + } + + if (passedTime == 0f) { + return; + } + + int i = 0, r = 0, l = this._animatebles.size(); + for (; i < l; ++i) { + IAnimatable animatable = this._animatebles.get(i); + if (animatable != null) { + if (r > 0) { + this._animatebles.set(i - r, animatable); + this._animatebles.set(i, null); + } + + animatable.advanceTime(passedTime); + } else { + r++; + } + } + + if (r > 0) { + l = this._animatebles.size(); + for (; i < l; ++i) { + IAnimatable animateble = this._animatebles.get(i); + if (animateble != null) { + this._animatebles.set(i - r, animateble); + } else { + r++; + } + } + + this._animatebles.setLength(this._animatebles.size() - r); + } + } + + /** + * 是否包含 IAnimatable 实例 + * + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public boolean contains(IAnimatable value) { + return this._animatebles.indexOf(value) >= 0; + } + + /** + * 添加 IAnimatable 实例。 + * + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void add(IAnimatable value) { + if (this._animatebles.indexOf(value) < 0) { + this._animatebles.add(value); + value.setClock(this); + } + } + + /** + * 移除 IAnimatable 实例。 + * + * @param value IAnimatable 实例。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void remove(IAnimatable value) { + int index = this._animatebles.indexOf(value); + if (index >= 0) { + this._animatebles.set(index, null); + value.setClock(null); + } + } + + /** + * 清除所有的 IAnimatable 实例。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void clear() { + for (IAnimatable animatable : this._animatebles) { + if (animatable != null) { + animatable.setClock(null); + } + } + } + + /** + * @inheritDoc + */ + public WorldClock getClock() { + return this._clock; + } + + public void setClock(WorldClock value) { + if (this._clock == value) { + return; + } + + if (this._clock != null) { + this._clock.remove(this); + } + + this._clock = value; + + if (this._clock != null) { + this._clock.add(this); + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/animation/ZOrderTimelineState.java b/dragonbones-core/src/main/java/com/dragonbones/animation/ZOrderTimelineState.java new file mode 100644 index 0000000..db2dd0e --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/animation/ZOrderTimelineState.java @@ -0,0 +1,21 @@ +package com.dragonbones.animation; + +/** + * @internal + * @private + */ +public class ZOrderTimelineState extends TimelineState { + protected void _onArriveAtFrame() { + if (this.playState >= 0) { + int count = this._frameArray.get(this._frameOffset + 1); + if (count > 0) { + this._armature._sortZOrder(this._frameArray, this._frameOffset + 2); + } else { + this._armature._sortZOrder(null, 0); + } + } + } + + protected void _onUpdateFrame() { + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/Armature.java b/dragonbones-core/src/main/java/com/dragonbones/armature/Armature.java new file mode 100644 index 0000000..28fd8dc --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/Armature.java @@ -0,0 +1,950 @@ +package com.dragonbones.armature; + +import com.dragonbones.animation.Animation; +import com.dragonbones.animation.IAnimatable; +import com.dragonbones.animation.WorldClock; +import com.dragonbones.core.ActionType; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.DragonBones; +import com.dragonbones.event.EventStringType; +import com.dragonbones.event.IEventDispatcher; +import com.dragonbones.geom.Point; +import com.dragonbones.model.*; +import com.dragonbones.util.Array; +import com.dragonbones.util.Console; +import com.dragonbones.util.Function; +import com.dragonbones.util.ShortArray; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +/** + * 骨架,是骨骼动画系统的核心,由显示容器、骨骼、插槽、动画、事件系统构成。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData + * @see Bone + * @see Slot + * @see Animation + */ +public class Armature extends BaseObject implements IAnimatable { + private static int _onSortSlots(Slot a, Slot b) { + return a._zOrder > b._zOrder ? 1 : -1; + } + + /** + * 是否继承父骨架的动画状态。 + * + * @default true + * @version DragonBones 4.5 + * @language zh_CN + */ + public boolean inheritAnimation; + /** + * @private + */ + public boolean debugDraw; + /** + * 获取骨架数据。 + * + * @version DragonBones 4.5 + * @readonly + * @language zh_CN + * @see ArmatureData + */ + public ArmatureData armatureData; + /** + * 用于存储临时数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Object userData; + + private boolean _debugDraw; + private boolean _lockUpdate; + private boolean _bonesDirty; + private boolean _slotsDirty; + private boolean _zOrderDirty; + private boolean _flipX; + private boolean _flipY; + /** + * @internal + * @private + */ + public int _cacheFrameIndex; + private final Array _bones = new Array<>(); + private final Array _slots = new Array<>(); + private final Array _actions = new Array<>(); + @Nullable + private Animation _animation = null; // Initial value. + @Nullable + private IArmatureProxy _proxy = null; // Initial value. + private Object _display; + /** + * @private + */ + @Nullable + public TextureAtlasData _replaceTextureAtlasData = null; // Initial value. + private Object _replacedTexture; + /** + * @internal + * @private + */ + public DragonBones _dragonBones; + @Nullable + private WorldClock _clock = null; // Initial value. + /** + * @internal + * @private + */ + @Nullable + public Slot _parent; + + @Override + public void setClock(WorldClock value) { + this._clock = value; + } + + /** + * @private + */ + protected void _onClear() { + if (this._clock != null) { // Remove clock first. + this._clock.remove(this); + } + + for (Bone bone : this._bones) { + bone.returnToPool(); + } + + for (Slot slot : this._slots) { + slot.returnToPool(); + } + + for (ActionData action : this._actions) { + action.returnToPool(); + } + + if (this._animation != null) { + this._animation.returnToPool(); + } + + if (this._proxy != null) { + this._proxy.clear(); + } + + if (this._replaceTextureAtlasData != null) { + this._replaceTextureAtlasData.returnToPool(); + } + + this.inheritAnimation = true; + this.debugDraw = false; + this.armatureData = null; // + this.userData = null; + + this._debugDraw = false; + this._lockUpdate = false; + this._bonesDirty = false; + this._slotsDirty = false; + this._zOrderDirty = false; + this._flipX = false; + this._flipY = false; + this._cacheFrameIndex = -1; + this._bones.clear(); + this._slots.clear(); + this._actions.clear(); + this._animation = null; // + this._proxy = null; // + this._display = null; + this._replaceTextureAtlasData = null; + this._replacedTexture = null; + this._dragonBones = null; // + this._clock = null; + this._parent = null; + } + + private void _sortBones() { + int total = this._bones.size(); + if (total <= 0) { + return; + } + + Array sortHelper = this._bones.copy(); + int index = 0; + int count = 0; + + this._bones.clear(); + while (count < total) { + Bone bone = sortHelper.get(index++); + if (index >= total) { + index = 0; + } + + if (this._bones.indexOf(bone) >= 0) { + continue; + } + + if (bone.constraints.size() > 0) { // Wait constraint. + boolean flag = false; + for (Constraint constraint : bone.constraints) { + if (this._bones.indexOf(constraint.target) < 0) { + flag = true; + break; + } + } + + if (flag) { + continue; + } + } + + if (bone.getParent() != null && this._bones.indexOf(bone.getParent()) < 0) { // Wait parent. + continue; + } + + this._bones.add(bone); + count++; + } + } + + private void _sortSlots() { + this._slots.sort(Armature::_onSortSlots); + } + + /** + * @internal + * @private + */ + public void _sortZOrder(@Nullable ShortArray slotIndices, int offset) { + Array slotDatas = this.armatureData.sortedSlots; + boolean isOriginal = slotIndices == null; + + if (this._zOrderDirty || !isOriginal) { + for (int i = 0, l = slotDatas.size(); i < l; ++i) { + int slotIndex = isOriginal ? i : slotIndices.get(offset + i); + if (slotIndex < 0 || slotIndex >= l) { + continue; + } + + SlotData slotData = slotDatas.get(slotIndex); + Slot slot = this.getSlot(slotData.name); + if (slot != null) { + slot._setZorder(i); + } + } + + this._slotsDirty = true; + this._zOrderDirty = !isOriginal; + } + } + + /** + * @internal + * @private + */ + public void _addBoneToBoneList(Bone value) { + if (this._bones.indexOf(value) < 0) { + this._bonesDirty = true; + this._bones.add(value); + this._animation._timelineDirty = true; + } + } + + /** + * @internal + * @private + */ + public void _removeBoneFromBoneList(Bone value) { + int index = this._bones.indexOf(value); + if (index >= 0) { + this._bones.splice(index, 1); + this._animation._timelineDirty = true; + } + } + + /** + * @internal + * @private + */ + public void _addSlotToSlotList(Slot value) { + if (this._slots.indexOf(value) < 0) { + this._slotsDirty = true; + this._slots.add(value); + this._animation._timelineDirty = true; + } + } + + /** + * @internal + * @private + */ + public void _removeSlotFromSlotList(Slot value) { + int index = this._slots.indexOf(value); + if (index >= 0) { + this._slots.splice(index, 1); + this._animation._timelineDirty = true; + } + } + + /** + * @internal + * @private + */ + public void _bufferAction(ActionData action, boolean append) { + if (this._actions.indexOf(action) < 0) { + if (append) { + this._actions.add(action); + } else { + this._actions.unshiftObject(action); + } + } + } + + /** + * 释放骨架。 (回收到对象池) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void dispose() { + if (this.armatureData != null) { + this._lockUpdate = true; + this._dragonBones.bufferObject(this); + } + } + + /** + * @private + */ + public void init( + ArmatureData armatureData, + IArmatureProxy proxy, Object display, DragonBones dragonBones + ) { + if (this.armatureData != null) { + return; + } + + this.armatureData = armatureData; + this._animation = BaseObject.borrowObject(Animation.class); + this._proxy = proxy; + this._display = display; + this._dragonBones = dragonBones; + + this._proxy.init(this); + this._animation.init(this); + this._animation.setAnimations(this.armatureData.animations); + } + + /** + * 更新骨架和动画。 + * + * @param passedTime 两帧之间的时间间隔。 (以秒为单位) + * @version DragonBones 3.0 + * @language zh_CN + * @see IAnimatable + * @see WorldClock + */ + public void advanceTime(float passedTime) { + if (this._lockUpdate) { + return; + } + + if (this.armatureData == null) { + Console._assert(false, "The armature has been disposed."); + return; + } else if (this.armatureData.parent == null) { + Console._assert(false, "The armature data has been disposed."); + return; + } + + int prevCacheFrameIndex = this._cacheFrameIndex; + + // Update nimation. + this._animation.advanceTime(passedTime); + + // Sort bones and slots. + if (this._bonesDirty) { + this._bonesDirty = false; + this._sortBones(); + } + + if (this._slotsDirty) { + this._slotsDirty = false; + this._sortSlots(); + } + + // Update bones and slots. + if (this._cacheFrameIndex < 0 || this._cacheFrameIndex != prevCacheFrameIndex) { + int i = 0, l = 0; + for (i = 0, l = this._bones.size(); i < l; ++i) { + this._bones.get(i).update(this._cacheFrameIndex); + } + + for (i = 0, l = this._slots.size(); i < l; ++i) { + this._slots.get(i).update(this._cacheFrameIndex); + } + } + + if (this._actions.size() > 0) { + this._lockUpdate = true; + for (ActionData action : this._actions) { + if (action.type == ActionType.Play) { + this._animation.fadeIn(action.name); + } + } + + this._actions.clear(); + this._lockUpdate = false; + } + + // + boolean drawed = this.debugDraw || DragonBones.debugDraw; + if (drawed || this._debugDraw) { + this._debugDraw = drawed; + this._proxy.debugUpdate(this._debugDraw); + } + } + + public void invalidUpdate() { + invalidUpdate(null, false); + } + + public void invalidUpdate(@Nullable String boneName) { + invalidUpdate(boneName, false); + } + + /** + * 更新骨骼和插槽。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * + * @param boneName 指定的骨骼名称,如果未设置,将更新所有骨骼。 + * @param updateSlotDisplay 是否更新插槽的显示对象。 + * @version DragonBones 3.0 + * @language zh_CN + * @see Bone + * @see Slot + */ + public void invalidUpdate(@Nullable String boneName, boolean updateSlotDisplay) { + if (boneName != null && boneName.length() > 0) { + Bone bone = this.getBone(boneName); + if (bone != null) { + bone.invalidUpdate(); + + if (updateSlotDisplay) { + for (Slot slot : this._slots) { + if (slot.getParent() == bone) { + slot.invalidUpdate(); + } + } + } + } + } else { + for (Bone bone : this._bones) { + bone.invalidUpdate(); + } + + if (updateSlotDisplay) { + for (Slot slot : this._slots) { + slot.invalidUpdate(); + } + } + } + } + + /** + * 判断点是否在所有插槽的自定义包围盒内。 + * + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + @Nullable + public Slot containsPoint(float x, float y) { + for (Slot slot : this._slots) { + if (slot.containsPoint(x, y)) { + return slot; + } + } + + return null; + } + + @Nullable + public Slot intersectsSegment( + float xA, float yA, float xB, float yB + ) { + return intersectsSegment(xA, yA, xB, yB, null, null, null); + } + + /** + * 判断线段是否与骨架的所有插槽的自定义包围盒相交。 + * + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 线段从起点到终点相交的第一个自定义包围盒的插槽。 + * @version DragonBones 5.0 + * @language zh_CN + */ + @Nullable + public Slot intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) + + { + boolean isV = xA == xB; + float dMin = 0f; + float dMax = 0f; + float intXA = 0f; + float intYA = 0f; + float intXB = 0f; + float intYB = 0f; + float intAN = 0f; + float intBN = 0f; + Slot intSlotA = null; + Slot intSlotB = null; + + for (Slot slot : this._slots) { + int intersectionCount = slot.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionPointA != null || intersectionPointB != null) { + if (intersectionPointA != null) { + float d = isV ? intersectionPointA.y - yA : intersectionPointA.x - xA; + if (d < 0f) { + d = -d; + } + + if (intSlotA == null || d < dMin) { + dMin = d; + intXA = intersectionPointA.x; + intYA = intersectionPointA.y; + intSlotA = slot; + + if (normalRadians != null) { + intAN = normalRadians.x; + } + } + } + + if (intersectionPointB != null) { + float d = intersectionPointB.x - xA; + if (d < 0f) { + d = -d; + } + + if (intSlotB == null || d > dMax) { + dMax = d; + intXB = intersectionPointB.x; + intYB = intersectionPointB.y; + intSlotB = slot; + + if (normalRadians != null) { + intBN = normalRadians.y; + } + } + } + } else { + intSlotA = slot; + break; + } + } + } + + if (intSlotA != null && intersectionPointA != null) { + intersectionPointA.x = intXA; + intersectionPointA.y = intYA; + + if (normalRadians != null) { + normalRadians.x = intAN; + } + } + + if (intSlotB != null && intersectionPointB != null) { + intersectionPointB.x = intXB; + intersectionPointB.y = intYB; + + if (normalRadians != null) { + normalRadians.y = intBN; + } + } + + return intSlotA; + } + + /** + * 获取指定名称的骨骼。 + * + * @param name 骨骼的名称。 + * @returns 骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + * @see Bone + */ + @Nullable + public Bone getBone(String name) { + for (Bone bone : this._bones) { + if (Objects.equals(bone.name, name)) { + return bone; + } + } + + return null; + } + + /** + * 通过显示对象获取骨骼。 + * + * @param display 显示对象。 + * @returns 包含这个显示对象的骨骼。 + * @version DragonBones 3.0 + * @language zh_CN + * @see Bone + */ + @Nullable + public Bone getBoneByDisplay(Object display) { + Slot slot = this.getSlotByDisplay(display); + return slot != null ? slot.getParent() : null; + } + + /** + * 获取插槽。 + * + * @param name 插槽的名称。 + * @returns 插槽。 + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ + @Nullable + public Slot getSlot(String name) { + for (Slot slot : this._slots) { + if (Objects.equals(slot.name, name)) { + return slot; + } + } + + return null; + } + + /** + * 通过显示对象获取插槽。 + * + * @param display 显示对象。 + * @returns 包含这个显示对象的插槽。 + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ + @Nullable + public Slot getSlotByDisplay(Object display) { + if (display != null) { + for (Slot slot : this._slots) { + if (slot.getDisplay() == display) { + return slot; + } + } + } + + return null; + } + + public void addBone(Bone value) { + addBone(value, null); + } + + /** + * @deprecated + */ + public void addBone(Bone value, @Nullable String parentName) { + Console._assert(value != null); + + value._setArmature(this); + value._setParent(parentName != null ? this.getBone(parentName) : null); + } + + /** + * @deprecated + */ + public void removeBone(Bone value) { + Console._assert(value != null && value.getArmature() == this); + + value._setParent(null); + value._setArmature(null); + } + + /** + * @deprecated + */ + public void addSlot(Slot value, String parentName) { + Bone bone = this.getBone(parentName); + + Console._assert(value != null && bone != null); + + value._setArmature(this); + value._setParent(bone); + } + + /** + * @deprecated + */ + public void removeSlot(Slot value) { + Console._assert(value != null && value.getArmature() == this); + + value._setParent(null); + value._setArmature(null); + } + + /** + * 获取所有骨骼。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Bone + */ + public Array getBones() { + return this._bones; + } + + /** + * 获取所有插槽。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ + public Array getSlots() { + return this._slots; + } + + public boolean getFlipX() { + return this._flipX; + } + + public void setFlipX(boolean value) { + if (this._flipX == value) { + return; + } + + this._flipX = value; + this.invalidUpdate(); + } + + public boolean getFlipY() { + return this._flipY; + } + + public void setFlipY(boolean value) { + if (this._flipY == value) { + return; + } + + this._flipY = value; + this.invalidUpdate(); + } + + /** + * 动画缓存帧率,当设置的值大于 0 的时,将会开启动画缓存。 + * 通过将动画数据缓存在内存中来提高运行性能,会有一定的内存开销。 + * 帧率不宜设置的过高,通常跟动画的帧率相当且低于程序运行的帧率。 + * 开启动画缓存后,某些功能将会失效,比如 Bone 和 Slot 的 offset 属性等。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see DragonBonesData#frameRate + * @see ArmatureData#frameRate + */ + public float getCacheFrameRate() { + return this.armatureData.cacheFrameRate; + } + + public void setCacheFrameRate(float value) { + if (this.armatureData.cacheFrameRate != value) { + this.armatureData.cacheFrames(value); + + // Set child armature frameRate. + for (Slot slot : this._slots) { + Armature childArmature = slot.getChildArmature(); + if (childArmature != null) { + childArmature.setCacheFrameRate(value); + } + } + } + } + + /** + * 骨架名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData#name + */ + public String getName() { + return this.armatureData.name; + } + + /** + * 获得动画控制器。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Animation + */ + public Animation getAnimation() { + return this._animation; + } + + /** + * @pivate + */ + public IArmatureProxy getProxy() { + return this._proxy; + } + + /** + * @pivate + */ + public IEventDispatcher getEventDispatcher() { + return this._proxy; + } + + /** + * @language zh_CN + * 替换骨架的主贴图,根据渲染引擎的不同,提供不同的贴图数据。 + * @version DragonBones 4.5 + */ + public Object getReplacedTexture() { + return this._replacedTexture; + } + + public void setReplacedTexture(Object value) { + if (this._replacedTexture == value) { + return; + } + + if (this._replaceTextureAtlasData != null) { + this._replaceTextureAtlasData.returnToPool(); + this._replaceTextureAtlasData = null; + } + + this._replacedTexture = value; + + for (Slot slot : this._slots) { + slot.invalidUpdate(); + slot.update(-1); + } + } + + /** + * @inheritDoc + */ + @Nullable + public WorldClock getClock() { + return this._clock; + } + + public void clock(@Nullable WorldClock value) { + if (this._clock == value) { + return; + } + + if (this._clock != null) { + this._clock.remove(this); + } + + this._clock = value; + + if (this._clock != null) { + this._clock.add(this); + } + + // Update childArmature clock. + for (Slot slot : this._slots) { + Armature childArmature = slot.getChildArmature(); + if (childArmature != null) { + childArmature.setClock(this._clock); + } + } + } + + /** + * 获取父插槽。 (当此骨架是某个骨架的子骨架时,可以通过此属性向上查找从属关系) + * + * @version DragonBones 4.5 + * @language zh_CN + * @see Slot + */ + @Nullable + public Slot getParent() { + return this._parent; + } + + /** + * @see Armature#setReplacedTexture(Object) + * @deprecated 已废弃,请参考 @see + */ + public void replaceTexture(Object texture) { + this.setReplacedTexture(texture); + } + + /** + * @see Armature#getEventDispatcher() + * @deprecated 已废弃,请参考 @see + */ + public boolean hasEventListener(EventStringType type) { + return this._proxy.hasEvent(type); + } + + /** + * @see Armature#getEventDispatcher() + * @deprecated 已废弃,请参考 @see + */ + public void addEventListener(EventStringType type, Function listener, Object target) { + this._proxy.addEvent(type, listener, target); + } + + /** + * @see Armature#getEventDispatcher() + * @deprecated 已废弃,请参考 @see + */ + public void removeEventListener(EventStringType type, Function listener, Object target) { + this._proxy.removeEvent(type, listener, target); + } + + /** + * @see #setCacheFrameRate(float) + * @deprecated 已废弃,请参考 @see + */ + public void enableAnimationCache(float frameRate) { + this.setCacheFrameRate(frameRate); + } + + ///** + // * @deprecated + // * 已废弃,请参考 @see + // * @see #_display + // */ + //@Override + //public Object getDisplay() { + // return this._display; + //} + + /** + * 获取显示容器,插槽的显示对象都会以此显示容器为父级,根据渲染平台的不同,类型会不同,通常是 DisplayObjectContainer 类型。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Object getDisplay() { + return this._display; + } + +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/Bone.java b/dragonbones-core/src/main/java/com/dragonbones/armature/Bone.java new file mode 100644 index 0000000..46b6f76 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/Bone.java @@ -0,0 +1,514 @@ +package com.dragonbones.armature; + +import com.dragonbones.core.DragonBones; +import com.dragonbones.core.OffsetMode; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Transform; +import com.dragonbones.model.BoneData; +import com.dragonbones.util.Array; +import com.dragonbones.util.IntArray; +import org.jetbrains.annotations.Nullable; + +/** + * 骨骼,一个骨架中可以包含多个骨骼,骨骼以树状结构组成骨架。 + * 骨骼在骨骼动画体系中是最重要的逻辑单元之一,负责动画中的平移旋转缩放的实现。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see BoneData + * @see Armature + * @see Slot + */ +public class Bone extends TransformObject { + /** + * @private + */ + public OffsetMode offsetMode; + /** + * @internal + * @private + */ + public final Transform animationPose = new Transform(); + /** + * @internal + * @private + */ + public final Array constraints = new Array<>(); + /** + * @readonly + */ + public BoneData boneData; + /** + * @internal + * @private + */ + public boolean _transformDirty; + /** + * @internal + * @private + */ + public boolean _childrenTransformDirty; + /** + * @internal + * @private + */ + public boolean _blendDirty; + private boolean _localDirty; + private boolean _visible; + private int _cachedFrameIndex; + /** + * @internal + * @private + */ + public float _blendLayer; + /** + * @internal + * @private + */ + public float _blendLeftWeight; + /** + * @internal + * @private + */ + public float _blendLayerWeight; + private final Array _bones = new Array<>(); + private final Array _slots = new Array<>(); + /** + * @internal + * @private + */ + @Nullable + public IntArray _cachedFrameIndices = new IntArray(); + + /** + * @private + */ + protected void _onClear() { + super._onClear(); + + for (Constraint constraint : this.constraints) { + constraint.returnToPool(); + } + + this.offsetMode = OffsetMode.Additive; + this.animationPose.identity(); + this.constraints.clear(); + this.boneData = null; // + + this._transformDirty = false; + this._childrenTransformDirty = false; + this._blendDirty = false; + this._localDirty = true; + this._visible = true; + this._cachedFrameIndex = -1; + this._blendLayer = 0; + this._blendLeftWeight = 1f; + this._blendLayerWeight = 0f; + this._bones.clear(); + this._slots.clear(); + this._cachedFrameIndices = null; + } + + /** + * @private + */ + private void _updateGlobalTransformMatrix(boolean isCache) { + boolean flipX = this._armature.getFlipX(); + boolean flipY = this._armature.getFlipY() == DragonBones.yDown; + Transform global = this.global; + Matrix globalTransformMatrix = this.globalTransformMatrix; + boolean inherit = this._parent != null; + float dR = 0f; + + if (this.offsetMode == OffsetMode.Additive) { + // global.copyFrom(this.origin).add(this.offset).add(this.animationPose); + global.x = this.origin.x + this.offset.x + this.animationPose.x; + global.y = this.origin.y + this.offset.y + this.animationPose.y; + global.skew = this.origin.skew + this.offset.skew + this.animationPose.skew; + global.rotation = this.origin.rotation + this.offset.rotation + this.animationPose.rotation; + global.scaleX = this.origin.scaleX * this.offset.scaleX * this.animationPose.scaleX; + global.scaleY = this.origin.scaleY * this.offset.scaleY * this.animationPose.scaleY; + } else if (this.offsetMode == OffsetMode.None) { + global.copyFrom(this.origin).add(this.animationPose); + } else { + inherit = false; + global.copyFrom(this.offset); + } + + if (inherit) { + Matrix parentMatrix = this._parent.globalTransformMatrix; + + if (this.boneData.inheritScale) { + if (!this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + + dR = this._parent.global.rotation; // + global.rotation -= dR; + } + + global.toMatrix(globalTransformMatrix); + globalTransformMatrix.concat(parentMatrix); + + if (this.boneData.inheritTranslation) { + global.x = globalTransformMatrix.tx; + global.y = globalTransformMatrix.ty; + } else { + globalTransformMatrix.tx = global.x; + globalTransformMatrix.ty = global.y; + } + + if (isCache) { + global.fromMatrix(globalTransformMatrix); + } else { + this._globalDirty = true; + } + } else { + if (this.boneData.inheritTranslation) { + float x = global.x; + float y = global.y; + global.x = parentMatrix.a * x + parentMatrix.c * y + parentMatrix.tx; + global.y = parentMatrix.d * y + parentMatrix.b * x + parentMatrix.ty; + } else { + if (flipX) { + global.x = -global.x; + } + + if (flipY) { + global.y = -global.y; + } + } + + if (this.boneData.inheritRotation) { + this._parent.updateGlobalTransform(); + dR = this._parent.global.rotation; + + if (this._parent.global.scaleX < 0f) { + dR += Math.PI; + } + + if (parentMatrix.a * parentMatrix.d - parentMatrix.b * parentMatrix.c < 0f) { + dR -= global.rotation * 2.0; + + if (flipX != flipY || this.boneData.inheritReflection) { + global.skew += Math.PI; + } + } + + global.rotation += dR; + } else if (flipX || flipY) { + if (flipX && flipY) { + dR = (float)Math.PI; + } else { + dR = -global.rotation * 2.0f; + if (flipX) { + dR += Math.PI; + } + + global.skew += Math.PI; + } + + global.rotation += dR; + } + + global.toMatrix(globalTransformMatrix); + } + } else { + if (flipX || flipY) { + if (flipX) { + global.x = -global.x; + } + + if (flipY) { + global.y = -global.y; + } + + if (flipX && flipY) { + dR = (float)Math.PI; + } else { + dR = -global.rotation * 2.0f; + if (flipX) { + dR += Math.PI; + } + + global.skew += Math.PI; + } + + global.rotation += dR; + } + + global.toMatrix(globalTransformMatrix); + } + } + + /** + * @internal + * @private + */ + public void _setArmature(@Nullable Armature value) { + if (this._armature == value) { + return; + } + + Array oldSlots = null; + Array oldBones = null; + + if (this._armature != null) { + oldSlots = this.getSlots(); + oldBones = this.getBones(); + this._armature._removeBoneFromBoneList(this); + } + + this._armature = value; // + + if (this._armature != null) { + this._armature._addBoneToBoneList(this); + } + + if (oldSlots != null) { + for (Slot slot : oldSlots) { + if (slot.getParent() == this) { + slot._setArmature(this._armature); + } + } + } + + if (oldBones != null) { + for (Bone bone : oldBones) { + if (bone.getParent() == this) { + bone._setArmature(this._armature); + } + } + } + } + + /** + * @internal + * @private + */ + public void init(BoneData boneData) { + if (this.boneData != null) { + return; + } + + this.boneData = boneData; + this.name = this.boneData.name; + this.origin = this.boneData.transform; + } + + /** + * @internal + * @private + */ + public void update(int cacheFrameIndex) { + this._blendDirty = false; + + if (cacheFrameIndex >= 0 && this._cachedFrameIndices != null) { + int cachedFrameIndex = this._cachedFrameIndices.get(cacheFrameIndex); + if (cachedFrameIndex >= 0 && this._cachedFrameIndex == cachedFrameIndex) { // Same cache. + this._transformDirty = false; + } else if (cachedFrameIndex >= 0) { // Has been Cached. + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } else { + if (this.constraints.size() > 0) { // Update constraints. + for (Constraint constraint : this.constraints) { + constraint.update(); + } + } + + if ( + this._transformDirty || + (this._parent != null && this._parent._childrenTransformDirty) + ) { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } else if (this._cachedFrameIndex >= 0) { // Same cache, but not set index yet. + this._transformDirty = false; + this._cachedFrameIndices.set(cacheFrameIndex, this._cachedFrameIndex); + } else { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + } else { + if (this.constraints.size() > 0) { // Update constraints. + for (Constraint constraint : this.constraints) { + constraint.update(); + } + } + + if (this._transformDirty || (this._parent != null && this._parent._childrenTransformDirty)) { // Dirty. + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } + + if (this._transformDirty) { + this._transformDirty = false; + this._childrenTransformDirty = true; + + if (this._cachedFrameIndex < 0) { + boolean isCache = cacheFrameIndex >= 0; + if (this._localDirty) { + this._updateGlobalTransformMatrix(isCache); + } + + if (isCache && this._cachedFrameIndices != null) { + int vv = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + this._cachedFrameIndices.set(cacheFrameIndex, vv); + this._cachedFrameIndex = vv; + } + } else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + } else if (this._childrenTransformDirty) { + this._childrenTransformDirty = false; + } + + this._localDirty = true; + } + + /** + * @internal + * @private + */ + public void updateByConstraint() { + if (this._localDirty) { + this._localDirty = false; + if (this._transformDirty || (this._parent != null && this._parent._childrenTransformDirty)) { + this._updateGlobalTransformMatrix(true); + } + + this._transformDirty = true; + } + } + + /** + * @internal + * @private + */ + public void addConstraint(Constraint constraint) { + if (this.constraints.indexOf(constraint) < 0) { + this.constraints.add(constraint); + } + } + + /** + * 下一帧更新变换。 (当骨骼没有动画状态或动画状态播放完成时,骨骼将不在更新) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public void invalidUpdate() { + this._transformDirty = true; + } + + /** + * 是否包含骨骼或插槽。 + * + * @returns + * @version DragonBones 3.0 + * @language zh_CN + * @see TransformObject + */ + public boolean contains(TransformObject child) { + if (child == this) { + return false; + } + + TransformObject ancestor = child; + while (ancestor != this && ancestor != null) { + ancestor = ancestor.getParent(); + } + + return ancestor == this; + } + + /** + * 所有的子骨骼。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Array getBones() { + this._bones.clear(); + + for (Bone bone : this._armature.getBones()) { + if (bone.getParent() == this) { + this._bones.add(bone); + } + } + + return this._bones; + } + + /** + * 所有的插槽。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ + public Array getSlots() { + this._slots.clear(); + + for (Slot slot : this._armature.getSlots()) { + if (slot.getParent() == this) { + this._slots.add(slot); + } + } + + return this._slots; + } + + /** + * 控制此骨骼所有插槽的可见。 + * + * @default true + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ + public boolean getVisible() { + return this._visible; + } + + public void setVisible(boolean value) { + if (this._visible == value) { + return; + } + + this._visible = value; + + for (Slot slot : this._armature.getSlots()) { + if (slot._parent == this) { + slot._updateVisible(); + } + } + } + + /** + * @see #boneData + * @see BoneData#length + * @deprecated 已废弃,请参考 @see + */ + public float getLength() { + return this.boneData.length; + } + + /** + * @see Armature#getSlot(String) + * @deprecated 已废弃,请参考 @see + */ + @Nullable + public Slot getSlot() { + for (Slot slot : this._armature.getSlots()) { + if (slot.getParent() == this) { + return slot; + } + } + + return null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/Constraint.java b/dragonbones-core/src/main/java/com/dragonbones/armature/Constraint.java new file mode 100644 index 0000000..e84b00b --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/Constraint.java @@ -0,0 +1,30 @@ +package com.dragonbones.armature; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Point; +import com.dragonbones.geom.Transform; +import org.jetbrains.annotations.Nullable; + +/** + * @private + * @internal + */ +public abstract class Constraint extends BaseObject { + protected static final Matrix _helpMatrix = new Matrix(); + protected static final Transform _helpTransform = new Transform(); + protected static final Point _helpPoint = new Point(); + + public Bone target; + public Bone bone; + @Nullable + public Bone root; + + protected void _onClear() { + this.target = null; // + this.bone = null; // + this.root = null; // + } + + public abstract void update(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/IArmatureProxy.java b/dragonbones-core/src/main/java/com/dragonbones/armature/IArmatureProxy.java new file mode 100644 index 0000000..043f6dd --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/IArmatureProxy.java @@ -0,0 +1,49 @@ +package com.dragonbones.armature; + +import com.dragonbones.animation.Animation; +import com.dragonbones.event.IEventDispatcher; + +/** + * @version DragonBones 5.0 + * @language zh_CN + * 骨架代理接口。 + */ +public interface IArmatureProxy extends IEventDispatcher { + /** + * @private + */ + void init(Armature armature); + + /** + * @private + */ + void clear(); + + /** + * @language zh_CN + * 释放代理和骨架。 (骨架会回收到对象池) + * @version DragonBones 4.5 + */ + void dispose(boolean disposeProxy); + + /** + * @private + */ + void debugUpdate(boolean isEnabled); + + /** + * @language zh_CN + * 获取骨架。 + * @version DragonBones 4.5 + * @see Armature + */ + Armature armature(); + + /** + * @language zh_CN + * 获取动画控制器。 + * @version DragonBones 4.5 + * @see Animation + */ + Animation animation(); +} \ No newline at end of file diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/IKConstraint.java b/dragonbones-core/src/main/java/com/dragonbones/armature/IKConstraint.java new file mode 100644 index 0000000..f46d0d0 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/IKConstraint.java @@ -0,0 +1,124 @@ +package com.dragonbones.armature; + +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Transform; + +/** + * @private + * @internal + */ +public class IKConstraint extends Constraint { + public boolean bendPositive; + public boolean scaleEnabled; // TODO + public float weight; + + protected void _onClear() { + super._onClear(); + + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1f; + } + + private void _computeA() { + Transform ikGlobal = this.target.global; + Transform global = this.bone.global; + Matrix globalTransformMatrix = this.bone.globalTransformMatrix; + // const boneLength = this.bone.boneData.length; + // const x = globalTransformMatrix.a * boneLength; + + float ikRadian = (float) Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0f) { + ikRadian += Math.PI; + } + + global.rotation += (ikRadian - global.rotation) * this.weight; + global.toMatrix(globalTransformMatrix); + } + + private void _computeB() { + float boneLength = this.bone.boneData.length; + Bone parent = this.root; + Transform ikGlobal = this.target.global; + Transform parentGlobal = parent.global; + Transform global = this.bone.global; + Matrix globalTransformMatrix = this.bone.globalTransformMatrix; + + float x = globalTransformMatrix.a * boneLength; + float y = globalTransformMatrix.b * boneLength; + + float lLL = x * x + y * y; + float lL = (float) Math.sqrt(lLL); + + float dX = global.x - parentGlobal.x; + float dY = global.y - parentGlobal.y; + float lPP = dX * dX + dY * dY; + float lP = (float) Math.sqrt(lPP); + float rawRadianA = (float) Math.atan2(dY, dX); + + dX = ikGlobal.x - parentGlobal.x; + dY = ikGlobal.y - parentGlobal.y; + float lTT = dX * dX + dY * dY; + float lT = (float) Math.sqrt(lTT); + + float ikRadianA = 0f; + if (lL + lP <= lT || lT + lL <= lP || lT + lP <= lL) { + ikRadianA = (float) Math.atan2(ikGlobal.y - parentGlobal.y, ikGlobal.x - parentGlobal.x); + if (lL + lP <= lT) { + } else if (lP < lL) { + ikRadianA += Math.PI; + } + } else { + float h = (float) ((lPP - lLL + lTT) / (2.0 * lTT)); + float r = (float) (Math.sqrt(lPP - h * h * lTT) / lT); + float hX = parentGlobal.x + (dX * h); + float hY = parentGlobal.y + (dY * h); + float rX = -dY * r; + float rY = dX * r; + + boolean isPPR = false; + if (parent._parent != null) { + Matrix parentParentMatrix = parent._parent.globalTransformMatrix; + isPPR = parentParentMatrix.a * parentParentMatrix.d - parentParentMatrix.b * parentParentMatrix.c < 0f; + } + + if (isPPR != this.bendPositive) { + global.x = hX - rX; + global.y = hY - rY; + } else { + global.x = hX + rX; + global.y = hY + rY; + } + + ikRadianA = (float) Math.atan2(global.y - parentGlobal.y, global.x - parentGlobal.x); + } + + float dR = (ikRadianA - rawRadianA) * this.weight; + parentGlobal.rotation += dR; + parentGlobal.toMatrix(parent.globalTransformMatrix); + + float parentRadian = rawRadianA + dR; + global.x = (float) (parentGlobal.x + Math.cos(parentRadian) * lP); + global.y = (float) (parentGlobal.y + Math.sin(parentRadian) * lP); + + float ikRadianB = (float) Math.atan2(ikGlobal.y - global.y, ikGlobal.x - global.x); + if (global.scaleX < 0f) { + ikRadianB += Math.PI; + } + + dR = (ikRadianB - global.rotation) * this.weight; + global.rotation += dR; + global.toMatrix(globalTransformMatrix); + } + + public void update() { + if (this.root == null) { + this.bone.updateByConstraint(); + this._computeA(); + } else { + this.root.updateByConstraint(); + this.bone.updateByConstraint(); + this._computeB(); + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/Slot.java b/dragonbones-core/src/main/java/com/dragonbones/armature/Slot.java new file mode 100644 index 0000000..9ef761d --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/Slot.java @@ -0,0 +1,1056 @@ +package com.dragonbones.armature; + +import com.dragonbones.animation.AnimationState; +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.core.BlendMode; +import com.dragonbones.core.DisplayType; +import com.dragonbones.geom.ColorTransform; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Point; +import com.dragonbones.geom.Rectangle; +import com.dragonbones.model.*; +import com.dragonbones.util.Array; +import com.dragonbones.util.FloatArray; +import com.dragonbones.util.IntArray; +import org.jetbrains.annotations.Nullable; + +/** + * 插槽,附着在骨骼上,控制显示对象的显示状态和属性。 + * 一个骨骼上可以包含多个插槽。 + * 一个插槽中可以包含多个显示对象,同一时间只能显示其中的一个显示对象,但可以在动画播放的过程中切换显示对象实现帧动画。 + * 显示对象可以是普通的图片纹理,也可以是子骨架的显示容器,网格显示对象,还可以是自定义的其他显示对象。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Armature + * @see Bone + * @see SlotData + */ +public abstract class Slot extends TransformObject { + /** + * 显示对象受到控制的动画状态或混合组名称,设置为 null 则表示受所有的动画状态控制。 + * + * @default null + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationState#displayControl + * @see AnimationState#name + * @see AnimationState#group + */ + @Nullable + public String displayController; + /** + * @readonly + */ + public SlotData slotData; + /** + * @private + */ + protected boolean _displayDirty; + /** + * @private + */ + protected boolean _zOrderDirty; + /** + * @private + */ + protected boolean _visibleDirty; + /** + * @private + */ + protected boolean _blendModeDirty; + /** + * @private + */ + public boolean _colorDirty; + /** + * @private + */ + public boolean _meshDirty; + /** + * @private + */ + protected boolean _transformDirty; + /** + * @private + */ + protected boolean _visible; + /** + * @private + */ + protected BlendMode _blendMode; + /** + * @private + */ + protected int _displayIndex; + /** + * @private + */ + protected float _animationDisplayIndex; + /** + * @private + */ + public float _zOrder; + /** + * @private + */ + protected int _cachedFrameIndex; + /** + * @private + */ + public float _pivotX; + /** + * @private + */ + public float _pivotY; + /** + * @private + */ + protected final Matrix _localMatrix = new Matrix(); + /** + * @private + */ + public final ColorTransform _colorTransform = new ColorTransform(); + /** + * @private + */ + public final FloatArray _ffdVertices = new FloatArray(); + /** + * @private + */ + public final Array _displayDatas = new Array<>(); + /** + * @private + */ + // ArrayList + protected final Array _displayList = new Array<>(); + /** + * @private + */ + protected final Array _meshBones = new Array<>(); + /** + * @internal + * @private + */ + public Array _rawDisplayDatas = new Array<>(); + /** + * @private + */ + @Nullable + protected DisplayData _displayData; + /** + * @private + */ + @Nullable + protected TextureData _textureData; + /** + * @private + */ + @Nullable + public MeshDisplayData _meshData; + /** + * @private + */ + @Nullable + protected BoundingBoxData _boundingBoxData; + /** + * @private + */ + protected Object _rawDisplay = null; // Initial value. + /** + * @private + */ + protected Object _meshDisplay = null; // Initial value. + /** + * @private + */ + protected Object _display; + /** + * @private + */ + @Nullable + protected Armature _childArmature; + /** + * @internal + * @private + */ + @Nullable + public IntArray _cachedFrameIndices; + + /** + * @private + */ + protected void _onClear() { + super._onClear(); + + Array disposeDisplayList = new Array<>(); + for (Object eachDisplay : this._displayList) { + if ( + eachDisplay != null && eachDisplay != this._rawDisplay && eachDisplay != this._meshDisplay && + disposeDisplayList.indexOf(eachDisplay) < 0 + ) { + disposeDisplayList.add(eachDisplay); + } + } + + for (Object eachDisplay : disposeDisplayList) { + if (eachDisplay instanceof Armature) { + ((Armature) eachDisplay).dispose(); + } else { + this._disposeDisplay(eachDisplay); + } + } + + if (this._meshDisplay != null && this._meshDisplay != this._rawDisplay) { // May be _meshDisplay and _rawDisplay is the same one. + this._disposeDisplay(this._meshDisplay); + } + + if (this._rawDisplay != null) { + this._disposeDisplay(this._rawDisplay); + } + + this.displayController = null; + this.slotData = null; // + + this._displayDirty = false; + this._zOrderDirty = false; + this._blendModeDirty = false; + this._colorDirty = false; + this._meshDirty = false; + this._transformDirty = false; + this._visible = true; + this._blendMode = BlendMode.Normal; + this._displayIndex = -1; + this._animationDisplayIndex = -1; + this._zOrder = 0; + this._cachedFrameIndex = -1; + this._pivotX = 0f; + this._pivotY = 0f; + this._localMatrix.identity(); + this._colorTransform.identity(); + this._ffdVertices.clear(); + this._displayList.clear(); + this._displayDatas.clear(); + this._meshBones.clear(); + this._rawDisplayDatas = null; // + this._displayData = null; + this._textureData = null; + this._meshData = null; + this._boundingBoxData = null; + this._rawDisplay = null; + this._meshDisplay = null; + this._display = null; + this._childArmature = null; + this._cachedFrameIndices = null; + } + + /** + * @private + */ + protected abstract void _initDisplay(Object value); + + /** + * @private + */ + protected abstract void _disposeDisplay(Object value); + + /** + * @private + */ + protected abstract void _onUpdateDisplay(); + + /** + * @private + */ + protected abstract void _addDisplay(); + + /** + * @private + */ + protected abstract void _replaceDisplay(Object value); + + /** + * @private + */ + protected abstract void _removeDisplay(); + + /** + * @private + */ + protected abstract void _updateZOrder(); + + /** + * @private + */ + public abstract void _updateVisible(); + + /** + * @private + */ + protected abstract void _updateBlendMode(); + + /** + * @private + */ + protected abstract void _updateColor(); + + /** + * @private + */ + protected abstract void _updateFrame(); + + /** + * @private + */ + protected abstract void _updateMesh(); + + /** + * @private + */ + protected abstract void _updateTransform(boolean isSkinnedMesh); + + /** + * @private + */ + protected void _updateDisplayData() { + final DisplayData prevDisplayData = this._displayData; + final TextureData prevTextureData = this._textureData; + final MeshDisplayData prevMeshData = this._meshData; + final DisplayData rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.size() ? this._rawDisplayDatas.get(this._displayIndex) : null; + + if (this._displayIndex >= 0 && this._displayIndex < this._displayDatas.size()) { + this._displayData = this._displayDatas.get(this._displayIndex); + } else { + this._displayData = null; + } + + // Update texture and mesh data. + if (this._displayData != null) { + if (this._displayData.type == DisplayType.Image || this._displayData.type == DisplayType.Mesh) { + this._textureData = ((ImageDisplayData) this._displayData).texture; + if (this._displayData.type == DisplayType.Mesh) { + this._meshData = (MeshDisplayData) this._displayData; + } else if (rawDisplayData != null && rawDisplayData.type == DisplayType.Mesh) { + this._meshData = (MeshDisplayData) rawDisplayData; + } else { + this._meshData = null; + } + } else { + this._textureData = null; + this._meshData = null; + } + } else { + this._textureData = null; + this._meshData = null; + } + + // Update bounding box data. + if (this._displayData != null && this._displayData.type == DisplayType.BoundingBox) { + this._boundingBoxData = ((BoundingBoxDisplayData) this._displayData).boundingBox; + } else if (rawDisplayData != null && rawDisplayData.type == DisplayType.BoundingBox) { + this._boundingBoxData = ((BoundingBoxDisplayData) rawDisplayData).boundingBox; + } else { + this._boundingBoxData = null; + } + + if (this._displayData != prevDisplayData || this._textureData != prevTextureData || this._meshData != prevMeshData) { + // Update pivot offset. + if (this._meshData != null) { + this._pivotX = 0f; + this._pivotY = 0f; + } else if (this._textureData != null) { + final ImageDisplayData imageDisplayData = (ImageDisplayData) this._displayData; + float scale = this._armature.armatureData.scale; + Rectangle frame = this._textureData.frame; + + this._pivotX = imageDisplayData.pivot.x; + this._pivotY = imageDisplayData.pivot.y; + + Rectangle rect = frame != null ? frame : this._textureData.region; + float width = rect.width * scale; + float height = rect.height * scale; + + if (this._textureData.rotated && frame == null) { + width = rect.height; + height = rect.width; + } + + this._pivotX *= width; + this._pivotY *= height; + + if (frame != null) { + this._pivotX += frame.x * scale; + this._pivotY += frame.y * scale; + } + } else { + this._pivotX = 0f; + this._pivotY = 0f; + } + + // Update mesh bones and ffd vertices. + if (this._meshData != prevMeshData) { + if (this._meshData != null) { // && this._meshData == this._displayData + if (this._meshData.weight != null) { + this._ffdVertices.setLength(this._meshData.weight.count * 2); + this._meshBones.setLength(this._meshData.weight.bones.size()); + + for (int i = 0, l = this._meshBones.size(); i < l; ++i) { + this._meshBones.set(i, this._armature.getBone(this._meshData.weight.bones.get(i).name)); + } + } else { + int vertexCount = this._meshData.parent.parent.intArray.get(this._meshData.offset + BinaryOffset.MeshVertexCount.v); + this._ffdVertices.setLength(vertexCount * 2); + this._meshBones.clear(); + } + + for (int i = 0, l = this._ffdVertices.size(); i < l; ++i) { + this._ffdVertices.set(i, 0f); + } + + this._meshDirty = true; + } else { + this._ffdVertices.clear(); + this._meshBones.clear(); + } + } else if (this._meshData != null && this._textureData != prevTextureData) { // Update mesh after update frame. + this._meshDirty = true; + } + + if (this._displayData != null && rawDisplayData != null && this._displayData != rawDisplayData && this._meshData == null) { + rawDisplayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0f, 0f, Slot._helpPoint); + this._pivotX -= Slot._helpPoint.x; + this._pivotY -= Slot._helpPoint.y; + + this._displayData.transform.toMatrix(Slot._helpMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(0f, 0f, Slot._helpPoint); + this._pivotX += Slot._helpPoint.x; + this._pivotY += Slot._helpPoint.y; + } + + // Update original transform. + if (rawDisplayData != null) { + this.origin = rawDisplayData.transform; + } else if (this._displayData != null) { + this.origin = this._displayData.transform; + } + + this._displayDirty = true; + this._transformDirty = true; + } + } + + /** + * @private + */ + protected void _updateDisplay() { + Object prevDisplay = this._display != null ? this._display : this._rawDisplay; + Armature prevChildArmature = this._childArmature; + + // Update display and child armature. + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.size()) { + this._display = this._displayList.get(this._displayIndex); + if (this._display != null && this._display instanceof Armature) { + this._childArmature = (Armature) this._display; + this._display = this._childArmature.getDisplay(); + } else { + this._childArmature = null; + } + } else { + this._display = null; + this._childArmature = null; + } + + // Update display. + Object currentDisplay = this._display != null ? this._display : this._rawDisplay; + if (currentDisplay != prevDisplay) { + this._onUpdateDisplay(); + this._replaceDisplay(prevDisplay); + + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + } + + // Update frame. + if (currentDisplay == this._rawDisplay || currentDisplay == this._meshDisplay) { + this._updateFrame(); + } + + // Update child armature. + if (this._childArmature != prevChildArmature) { + if (prevChildArmature != null) { + prevChildArmature._parent = null; // Update child armature parent. + prevChildArmature.setClock(null); + if (prevChildArmature.inheritAnimation) { + prevChildArmature.getAnimation().reset(); + } + } + + if (this._childArmature != null) { + this._childArmature._parent = this; // Update child armature parent. + this._childArmature.setClock(this._armature.getClock()); + if (this._childArmature.inheritAnimation) { // Set child armature cache frameRate. + if (this._childArmature.getCacheFrameRate() == 0) { + float cacheFrameRate = this._armature.getCacheFrameRate(); + if (cacheFrameRate != 0) { + this._childArmature.setCacheFrameRate(cacheFrameRate); + } + } + + // Child armature action. + Array actions = null; + if (this._displayData != null && this._displayData.type == DisplayType.Armature) { + actions = ((ArmatureDisplayData) this._displayData).actions; + } else { + DisplayData rawDisplayData = this._displayIndex >= 0 && this._displayIndex < this._rawDisplayDatas.size() ? this._rawDisplayDatas.get(this._displayIndex) : null; + if (rawDisplayData != null && rawDisplayData.type == DisplayType.Armature) { + actions = ((ArmatureDisplayData) rawDisplayData).actions; + } + } + + if (actions != null && actions.size() > 0) { + for (ActionData action : actions) { + this._childArmature._bufferAction(action, false); // Make sure default action at the beginning. + } + } else { + this._childArmature.getAnimation().play(); + } + } + } + } + } + + /** + * @private + */ + protected void _updateGlobalTransformMatrix(boolean isCache) { + this.globalTransformMatrix.copyFrom(this._localMatrix); + this.globalTransformMatrix.concat(this._parent.globalTransformMatrix); + if (isCache) { + this.global.fromMatrix(this.globalTransformMatrix); + } else { + this._globalDirty = true; + } + } + + /** + * @private + */ + protected boolean _isMeshBonesUpdate() { + for (Bone bone : this._meshBones) { + if (bone != null && bone._childrenTransformDirty) { + return true; + } + } + + return false; + } + + /** + * @internal + * @private + */ + public void _setArmature(@Nullable Armature value) { + if (this._armature == value) { + return; + } + + if (this._armature != null) { + this._armature._removeSlotFromSlotList(this); + } + + this._armature = value; // + + this._onUpdateDisplay(); + + if (this._armature != null) { + this._armature._addSlotToSlotList(this); + this._addDisplay(); + } else { + this._removeDisplay(); + } + } + + public boolean _setDisplayIndex(int value) { + return _setDisplayIndex(value, false); + } + + /** + * @internal + * @private + */ + public boolean _setDisplayIndex(int value, boolean isAnimation) { + if (isAnimation) { + if (this._animationDisplayIndex == value) { + return false; + } + + this._animationDisplayIndex = value; + } + + if (this._displayIndex == value) { + return false; + } + + this._displayIndex = value; + this._displayDirty = true; + + this._updateDisplayData(); + + return this._displayDirty; + } + + /** + * @internal + * @private + */ + public boolean _setZorder(float value) { + if (this._zOrder == value) { + //return false; + } + + this._zOrder = value; + this._zOrderDirty = true; + + return this._zOrderDirty; + } + + /** + * @internal + * @private + */ + public boolean _setColor(ColorTransform value) { + this._colorTransform.copyFrom(value); + this._colorDirty = true; + + return this._colorDirty; + } + + /** + * @private + */ + public boolean _setDisplayList(@Nullable Array value) { + if (value != null && value.size() > 0) { + if (this._displayList.size() != value.size()) { + this._displayList.setLength(value.size()); + } + + for (int i = 0, l = value.size(); i < l; ++i) { // Retain input render displays. + Object eachDisplay = value.get(i); + if ( + eachDisplay != null && eachDisplay != this._rawDisplay && eachDisplay != this._meshDisplay && + !(eachDisplay instanceof Armature) && this._displayList.indexOf(eachDisplay) < 0 + ) { + this._initDisplay(eachDisplay); + } + + this._displayList.set(i, eachDisplay); + } + } else if (this._displayList.size() > 0) { + this._displayList.clear(); + } + + if (this._displayIndex >= 0 && this._displayIndex < this._displayList.size()) { + this._displayDirty = this._display != this._displayList.get(this._displayIndex); + } else { + this._displayDirty = this._display != null; + } + + this._updateDisplayData(); + + return this._displayDirty; + } + + /** + * @private + */ + public void init(SlotData slotData, @Nullable Array displayDatas, Object rawDisplay, Object meshDisplay) { + if (this.slotData != null) { + return; + } + + this.slotData = slotData; + this.name = this.slotData.name; + + this._visibleDirty = true; + this._blendModeDirty = true; + this._colorDirty = true; + this._blendMode = this.slotData.blendMode; + this._zOrder = this.slotData.zOrder; + this._colorTransform.copyFrom(this.slotData.color); + this._rawDisplayDatas = displayDatas; + this._rawDisplay = rawDisplay; + this._meshDisplay = meshDisplay; + + this._displayDatas.setLength(this._rawDisplayDatas.size()); + for (int i = 0, l = this._displayDatas.size(); i < l; ++i) { + this._displayDatas.set(i, this._rawDisplayDatas.get(i)); + } + } + + /** + * @internal + * @private + */ + public void update(int cacheFrameIndex) { + if (this._displayDirty) { + this._displayDirty = false; + this._updateDisplay(); + + if (this._transformDirty) { // Update local matrix. (Only updated when both display and transform are dirty.) + if (this.origin != null) { + this.global.copyFrom(this.origin).add(this.offset).toMatrix(this._localMatrix); + } else { + this.global.copyFrom(this.offset).toMatrix(this._localMatrix); + } + } + } + + if (this._zOrderDirty) { + this._zOrderDirty = false; + this._updateZOrder(); + } + + if (cacheFrameIndex >= 0 && this._cachedFrameIndices != null) { + int cachedFrameIndex = this._cachedFrameIndices.get(cacheFrameIndex); + if (cachedFrameIndex >= 0 && this._cachedFrameIndex == cachedFrameIndex) { // Same cache. + this._transformDirty = false; + } else if (cachedFrameIndex >= 0) { // Has been Cached. + this._transformDirty = true; + this._cachedFrameIndex = cachedFrameIndex; + } else if (this._transformDirty || this._parent._childrenTransformDirty) { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } else if (this._cachedFrameIndex >= 0) { // Same cache, but not set index yet. + this._transformDirty = false; + this._cachedFrameIndices.set(cacheFrameIndex, this._cachedFrameIndex); + } else { // Dirty. + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + } else if (this._transformDirty || this._parent._childrenTransformDirty) { // Dirty. + cacheFrameIndex = -1; + this._transformDirty = true; + this._cachedFrameIndex = -1; + } + + if (this._display == null) { + return; + } + + if (this._blendModeDirty) { + this._blendModeDirty = false; + this._updateBlendMode(); + } + + if (this._colorDirty) { + this._colorDirty = false; + this._updateColor(); + } + + if (this._meshData != null && this._display == this._meshDisplay) { + boolean isSkinned = this._meshData.weight != null; + if (this._meshDirty || (isSkinned && this._isMeshBonesUpdate())) { + this._meshDirty = false; + this._updateMesh(); + } + + if (isSkinned) { + if (this._transformDirty) { + this._transformDirty = false; + this._updateTransform(true); + } + + return; + } + } + + if (this._transformDirty) { + this._transformDirty = false; + + if (this._cachedFrameIndex < 0) { + boolean isCache = cacheFrameIndex >= 0; + this._updateGlobalTransformMatrix(isCache); + + if (isCache && this._cachedFrameIndices != null) { + int vv = this._armature.armatureData.setCacheFrame(this.globalTransformMatrix, this.global); + this._cachedFrameIndices.set(cacheFrameIndex, vv); + this._cachedFrameIndex = vv; + } + } else { + this._armature.armatureData.getCacheFrame(this.globalTransformMatrix, this.global, this._cachedFrameIndex); + } + + this._updateTransform(false); + } + } + + /** + * @private + */ + public void updateTransformAndMatrix() { + if (this._transformDirty) { + this._transformDirty = false; + this._updateGlobalTransformMatrix(false); + } + } + + /** + * 判断指定的点是否在插槽的自定义包围盒内。 + * + * @param x 点的水平坐标。(骨架内坐标系) + * @param y 点的垂直坐标。(骨架内坐标系) + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean containsPoint(float x, float y) { + if (this._boundingBoxData == null) { + return false; + } + + this.updateTransformAndMatrix(); + + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(x, y, Slot._helpPoint); + + return this._boundingBoxData.containsPoint(Slot._helpPoint.x, Slot._helpPoint.y); + } + + public float intersectsSegment( + float xA, float yA, float xB, float yB + ) { + return intersectsSegment(xA, yA, xB, yB, null, null, null); + } + + /** + * 判断指定的线段与插槽的自定义包围盒是否相交。 + * + * @param xA 线段起点的水平坐标。(骨架内坐标系) + * @param yA 线段起点的垂直坐标。(骨架内坐标系) + * @param xB 线段终点的水平坐标。(骨架内坐标系) + * @param yB 线段终点的垂直坐标。(骨架内坐标系) + * @param intersectionPointA 线段从起点到终点与包围盒相交的第一个交点。(骨架内坐标系) + * @param intersectionPointB 线段从终点到起点与包围盒相交的第一个交点。(骨架内坐标系) + * @param normalRadians 碰撞点处包围盒切线的法线弧度。 [x: 第一个碰撞点处切线的法线弧度, y: 第二个碰撞点处切线的法线弧度] + * @returns 相交的情况。 [-1: 不相交且线段在包围盒内, 0: 不相交, 1: 相交且有一个交点且终点在包围盒内, 2: 相交且有一个交点且起点在包围盒内, 3: 相交且有两个交点, N: 相交且有 N 个交点] + * @version DragonBones 5.0 + * @language zh_CN + */ + public int intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + if (this._boundingBoxData == null) { + return 0; + } + + this.updateTransformAndMatrix(); + Slot._helpMatrix.copyFrom(this.globalTransformMatrix); + Slot._helpMatrix.invert(); + Slot._helpMatrix.transformPoint(xA, yA, Slot._helpPoint); + xA = Slot._helpPoint.x; + yA = Slot._helpPoint.y; + Slot._helpMatrix.transformPoint(xB, yB, Slot._helpPoint); + xB = Slot._helpPoint.x; + yB = Slot._helpPoint.y; + + int intersectionCount = this._boundingBoxData.intersectsSegment(xA, yA, xB, yB, intersectionPointA, intersectionPointB, normalRadians); + if (intersectionCount > 0) { + if (intersectionCount == 1 || intersectionCount == 2) { + if (intersectionPointA != null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + if (intersectionPointB != null) { + intersectionPointB.x = intersectionPointA.x; + intersectionPointB.y = intersectionPointA.y; + } + } else if (intersectionPointB != null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } else { + if (intersectionPointA != null) { + this.globalTransformMatrix.transformPoint(intersectionPointA.x, intersectionPointA.y, intersectionPointA); + } + + if (intersectionPointB != null) { + this.globalTransformMatrix.transformPoint(intersectionPointB.x, intersectionPointB.y, intersectionPointB); + } + } + + if (normalRadians != null) { + this.globalTransformMatrix.transformPoint((float)Math.cos(normalRadians.x), (float)Math.sin(normalRadians.x), Slot._helpPoint, true); + normalRadians.x = (float)Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + + this.globalTransformMatrix.transformPoint((float)Math.cos(normalRadians.y), (float)Math.sin(normalRadians.y), Slot._helpPoint, true); + normalRadians.y = (float)Math.atan2(Slot._helpPoint.y, Slot._helpPoint.x); + } + } + + return intersectionCount; + } + + /** + * 在下一帧更新显示对象的状态。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public void invalidUpdate() { + this._displayDirty = true; + this._transformDirty = true; + } + + /** + * 此时显示的显示对象在显示列表中的索引。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public int getDisplayIndex() { + return this._displayIndex; + } + + public void setDisplayIndex(int value) { + if (this._setDisplayIndex(value)) { + this.update(-1); + } + } + + /** + * 包含显示对象或子骨架的显示列表。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Array getDisplayList() { + return this._displayList.copy(); + } + + public void setDisplayList(Array value) { + Array backupDisplayList = this._displayList.copy(); // Copy. + Array disposeDisplayList = new Array(); + + if (this._setDisplayList(value)) { + this.update(-1); + } + + // Release replaced displays. + for (Object eachDisplay : backupDisplayList) { + if ( + eachDisplay != null && eachDisplay != this._rawDisplay && eachDisplay != this._meshDisplay && + this._displayList.indexOf(eachDisplay) < 0 && + disposeDisplayList.indexOf(eachDisplay) < 0 + ) { + disposeDisplayList.add(eachDisplay); + } + } + + for (Object eachDisplay : disposeDisplayList) { + if (eachDisplay instanceof Armature) { + ((Armature) eachDisplay).dispose(); + } else { + this._disposeDisplay(eachDisplay); + } + } + } + + /** + * @language zh_CN + * 插槽此时的自定义包围盒数据。 + * @version DragonBones 3.0 + * @see Armature + */ + @Nullable + public BoundingBoxData getBoundingBoxData() { + return this._boundingBoxData; + } + + /** + * @private + */ + public Object getRawDisplay() { + return this._rawDisplay; + } + + /** + * @private + */ + public Object getMeshDisplay() { + return this._meshDisplay; + } + + public void setDisplay(Object value) { + if (this._display == value) { + return; + } + + int displayListLength = this._displayList.size(); + if (this._displayIndex < 0 && displayListLength == 0) { // Emprty. + this._displayIndex = 0; + } + + if (this._displayIndex < 0) { + return; + } else { + Array replaceDisplayList = this.getDisplayList(); // Copy. + if (displayListLength <= this._displayIndex) { + replaceDisplayList.setLength(this._displayIndex + 1); + } + + replaceDisplayList.set(this._displayIndex, value); + this.setDisplayList(replaceDisplayList); + } + } + + /** + * 此时显示的子骨架。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Armature + */ + @Nullable + public Armature getChildArmature() { + return this._childArmature; + } + + public void setChildArmature(@Nullable Armature value) { + if (this._childArmature == value) { + return; + } + + this.setDisplay(value); + } + + /** + * 此时显示的显示对象。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + //@Override + public Object getDisplay() { + return this._display; + } + + ///** + // * @see #display + // * @deprecated 已废弃,请参考 @see + // */ + //public Object getDisplay() { + // return this._display; + //} + + ///** + // * @see #display + // * @deprecated 已废弃,请参考 @see + // */ + //public void setDisplay(Object value) { + // this._display = value; + // +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/armature/TransformObject.java b/dragonbones-core/src/main/java/com/dragonbones/armature/TransformObject.java new file mode 100644 index 0000000..fadfdcd --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/armature/TransformObject.java @@ -0,0 +1,150 @@ +package com.dragonbones.armature; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Point; +import com.dragonbones.geom.Transform; +import org.jetbrains.annotations.Nullable; + +/** + * 基础变换对象。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ +public abstract class TransformObject extends BaseObject { + /** + * @private + */ + protected static final Matrix _helpMatrix = new Matrix(); + /** + * @private + */ + protected static final Transform _helpTransform = new Transform(); + /** + * @private + */ + protected static final Point _helpPoint = new Point(); + /** + * 对象的名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * 相对于骨架坐标系的矩阵。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public final Matrix globalTransformMatrix = new Matrix(); + /** + * 相对于骨架坐标系的变换。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Transform + */ + public final Transform global = new Transform(); + /** + * 相对于骨架或父骨骼坐标系的偏移变换。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Transform + */ + public final Transform offset = new Transform(); + /** + * 相对于骨架或父骨骼坐标系的绑定变换。 + * + * @version DragonBones 3.0 + * @readOnly + * @language zh_CN + * @see Transform + */ + public Transform origin; + /** + * 可以用于存储临时数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Object userData; + /** + * @private + */ + protected boolean _globalDirty; + /** + * @private + */ + public Armature _armature; + /** + * @private + */ + public Bone _parent; + + /** + * @private + */ + protected void _onClear() { + this.name = ""; + this.globalTransformMatrix.identity(); + this.global.identity(); + this.offset.identity(); + this.origin = null; // + this.userData = null; + + this._globalDirty = false; + this._armature = null; // + this._parent = null; // + } + + /** + * @internal + * @private + */ + public void _setArmature(@Nullable Armature value) { + this._armature = value; + } + + /** + * @internal + * @private + */ + public void _setParent(@Nullable Bone value) { + this._parent = value; + } + + /** + * @private + */ + public void updateGlobalTransform() { + if (this._globalDirty) { + this._globalDirty = false; + this.global.fromMatrix(this.globalTransformMatrix); + } + } + + /** + * 所属的骨架。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Armature + */ + public Armature getArmature() { + return this._armature; + } + + /** + * 所属的父骨骼。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Bone + */ + public Bone getParent() { + return this._parent; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/ActionType.java b/dragonbones-core/src/main/java/com/dragonbones/core/ActionType.java new file mode 100644 index 0000000..0c30878 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/ActionType.java @@ -0,0 +1,18 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum ActionType { + Play(0), + Frame(10), + Sound(11); + + public final int v; + + ActionType(int v) { + this.v = v; + } + + public static ActionType[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/AnimationFadeOutMode.java b/dragonbones-core/src/main/java/com/dragonbones/core/AnimationFadeOutMode.java new file mode 100644 index 0000000..6dd47f4 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/AnimationFadeOutMode.java @@ -0,0 +1,57 @@ +package com.dragonbones.core; + +/** + * @version DragonBones 4.5 + * @language zh_CN + * 动画混合的淡出方式。 + */ +public enum AnimationFadeOutMode { + /** + * 不淡出动画。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + None(0), + /** + * 淡出同层的动画。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayer(1), + /** + * 淡出同组的动画。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + SameGroup(2), + /** + * 淡出同层并且同组的动画。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + SameLayerAndGroup(3), + /** + * 淡出所有动画。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + All(4), + /** + * 不替换同名动画。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + Single(5); + + public int v; + + AnimationFadeOutMode(int v) { + this.v = v; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/ArmatureType.java b/dragonbones-core/src/main/java/com/dragonbones/core/ArmatureType.java new file mode 100644 index 0000000..dce81c8 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/ArmatureType.java @@ -0,0 +1,18 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum ArmatureType { + Armature(0), + MovieClip(1), + Stage(2); + + final public int v; + + ArmatureType(int v) { + this.v = v; + } + + public static ArmatureType[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/BaseObject.java b/dragonbones-core/src/main/java/com/dragonbones/core/BaseObject.java new file mode 100644 index 0000000..9b95060 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/BaseObject.java @@ -0,0 +1,150 @@ +package com.dragonbones.core; + +import com.dragonbones.util.Array; +import com.dragonbones.util.Console; +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +/** + * 基础对象。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ +public abstract class BaseObject { + private static int _hashCode = 0; + private static int _defaultMaxCount = 1000; + private static final Map, Integer> _maxCountMap = new HashMap<>(); + private static final Map, Array> _poolsMap = new HashMap<>(); + + private static void _returnObject(BaseObject object) { + Class classType = object.getClass(); + int maxCount = BaseObject._maxCountMap.containsKey(classType) ? BaseObject._defaultMaxCount : BaseObject._maxCountMap.get(classType); + if (!BaseObject._poolsMap.containsKey(classType)) { + BaseObject._poolsMap.put(classType, new Array<>()); + } + Array pool = BaseObject._poolsMap.get(classType); + if (pool.size() < maxCount) { + if (!object._isInPool) { + object._isInPool = true; + pool.add(object); + } else { + Console._assert(false, "The object is already in the pool."); + } + } else { + } + } + + /** + * 设置每种对象池的最大缓存数量。 + * + * @param classType 对象类。 + * @param maxCount 最大缓存数量。 (设置为 0 则不缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + public static void setMaxCount(Class classType, int maxCount) { + if (maxCount < 0) { // isNaN + maxCount = 0; + } + + if (classType != null) { + Array pool = BaseObject._poolsMap.get(classType); + if (pool != null && pool.size() > maxCount) { + pool.setLength(maxCount); + } + + BaseObject._maxCountMap.put(classType, maxCount); + } else { + BaseObject._defaultMaxCount = maxCount; + for (Class classType2 : BaseObject._poolsMap.keySet()) { + if (BaseObject._maxCountMap.containsKey(classType2)) { + continue; + } + + Array pool = BaseObject._poolsMap.get(classType2); + if (pool.size() > maxCount) { + pool.setLength(maxCount); + } + + BaseObject._maxCountMap.put(classType2, maxCount); + } + } + } + + public static void clearPool() { + for (Array pool : BaseObject._poolsMap.values()) { + pool.clear(); + } + } + + /** + * 清除对象池缓存的对象。 + * + * @param classType 对象类。 (不设置则清除所有缓存) + * @version DragonBones 4.5 + * @language zh_CN + */ + public static void clearPool(@NotNull Class classType) { + Array pool = BaseObject._poolsMap.get(classType); + if (pool != null && pool.size() > 0) { + pool.clear(); + } + } + + /** + * 从对象池中创建指定对象。 + * + * @param classType 对象类。 + * @version DragonBones 4.5 + * @language zh_CN + */ + + public static T borrowObject(Class classType) { + Array pool = BaseObject._poolsMap.get(classType); + if (pool != null && pool.size() > 0) { + T object = (T) pool.popObject(); + object._isInPool = false; + return object; + } + + try { + final T object = classType.newInstance(); + object._onClear(); + return object; + } catch (InstantiationException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + /** + * 对象的唯一标识。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public final int hashCode = BaseObject._hashCode++; + boolean _isInPool = false; + + /** + * @private + */ + protected abstract void _onClear(); + + /** + * 清除数据并返还对象池。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public void returnToPool() { + this._onClear(); + BaseObject._returnObject(this); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/BinaryOffset.java b/dragonbones-core/src/main/java/com/dragonbones/core/BinaryOffset.java new file mode 100644 index 0000000..9089376 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/BinaryOffset.java @@ -0,0 +1,40 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum BinaryOffset { + WeigthBoneCount(0), + WeigthFloatOffset(1), + WeigthBoneIndices(2), + + MeshVertexCount(0), + MeshTriangleCount(1), + MeshFloatOffset(2), + MeshWeightOffset(3), + MeshVertexIndices(4), + + TimelineScale(0), + TimelineOffset(1), + TimelineKeyFrameCount(2), + TimelineFrameValueCount(3), + TimelineFrameValueOffset(4), + TimelineFrameOffset(5), + + FramePosition(0), + FrameTweenType(1), + FrameTweenEasingOrCurveSampleCount(2), + FrameCurveSamples(3), + + FFDTimelineMeshOffset(0), + FFDTimelineFFDCount(1), + FFDTimelineValueCount(2), + FFDTimelineValueOffset(3), + FFDTimelineFloatOffset(4); + + public final int v; + + BinaryOffset(int v) { + this.v = v; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/BlendMode.java b/dragonbones-core/src/main/java/com/dragonbones/core/BlendMode.java new file mode 100644 index 0000000..f5c5ace --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/BlendMode.java @@ -0,0 +1,29 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum BlendMode { + Normal(0), + Add(1), + Alpha(2), + Darken(3), + Difference(4), + Erase(5), + HardLight(6), + Invert(7), + Layer(8), + Lighten(9), + Multiply(10), + Overlay(11), + Screen(12), + Subtract(13); + + final public int v; + + BlendMode(int v) { + this.v = v; + } + + public static BlendMode[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/BoundingBoxType.java b/dragonbones-core/src/main/java/com/dragonbones/core/BoundingBoxType.java new file mode 100644 index 0000000..4973bbd --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/BoundingBoxType.java @@ -0,0 +1,20 @@ +package com.dragonbones.core; + +/** + * @version DragonBones 5.0 + * @language zh_CN + * 包围盒类型。 + */ +public enum BoundingBoxType { + Rectangle(0), + Ellipse(1), + Polygon(2); + + public final int v; + + BoundingBoxType(int v) { + this.v = v; + } + + public static BoundingBoxType[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/DisplayType.java b/dragonbones-core/src/main/java/com/dragonbones/core/DisplayType.java new file mode 100644 index 0000000..1557c6a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/DisplayType.java @@ -0,0 +1,19 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum DisplayType { + Image(0), + Armature(1), + Mesh(2), + BoundingBox(3); + + final public int v; + + DisplayType(int v) { + this.v = v; + } + + public static DisplayType[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/DragonBones.java b/dragonbones-core/src/main/java/com/dragonbones/core/DragonBones.java new file mode 100644 index 0000000..f2b535a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/DragonBones.java @@ -0,0 +1,74 @@ +package com.dragonbones.core; + +import com.dragonbones.animation.WorldClock; +import com.dragonbones.armature.Armature; +import com.dragonbones.event.EventObject; +import com.dragonbones.event.IEventDispatcher; +import com.dragonbones.util.Array; + +/** + * @private + */ +public class DragonBones { + public static boolean yDown = true; + public static boolean debug = false; + public static boolean debugDraw = false; + public static String VERSION = "5.1f"; + + private final WorldClock _clock = new WorldClock(); + private final Array _events = new Array<>(); + private final Array _objects = new Array<>(); + private IEventDispatcher _eventManager = null; + + public DragonBones(IEventDispatcher eventManager) { + this._eventManager = eventManager; + } + + public void advanceTime(float passedTime) { + if (this._objects.size() > 0) { + for (BaseObject object : this._objects) { + object.returnToPool(); + } + + this._objects.clear(); + } + + this._clock.advanceTime(passedTime); + + if (this._events.size() > 0) { + for (int i = 0; i < this._events.size(); ++i) { + EventObject eventObject = this._events.get(i); + Armature armature = eventObject.armature; + + armature.getEventDispatcher()._dispatchEvent(eventObject.type, eventObject); + if (eventObject.type == EventObject.SOUND_EVENT) { + this._eventManager._dispatchEvent(eventObject.type, eventObject); + } + + this.bufferObject(eventObject); + } + + this._events.clear(); + } + } + + public void bufferEvent(EventObject value) { + if (this._events.indexOf(value) < 0) { + this._events.add(value); + } + } + + public void bufferObject(BaseObject object) { + if (this._objects.indexOf(object) < 0) { + this._objects.add(object); + } + } + + public WorldClock getClock() { + return this._clock; + } + + public IEventDispatcher getEventManager() { + return this._eventManager; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/OffsetMode.java b/dragonbones-core/src/main/java/com/dragonbones/core/OffsetMode.java new file mode 100644 index 0000000..87a547d --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/OffsetMode.java @@ -0,0 +1,10 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum OffsetMode { + None, + Additive, + Override +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/TimelineType.java b/dragonbones-core/src/main/java/com/dragonbones/core/TimelineType.java new file mode 100644 index 0000000..c62b85e --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/TimelineType.java @@ -0,0 +1,35 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum TimelineType { + Action(0), + ZOrder(1), + + BoneAll(10), + BoneT(11), + BoneR(12), + BoneS(13), + BoneX(14), + BoneY(15), + BoneRotate(16), + BoneSkew(17), + BoneScaleX(18), + BoneScaleY(19), + + SlotVisible(23), + SlotDisplay(20), + SlotColor(21), + SlotFFD(22), + + AnimationTime(40), + AnimationWeight(41); + + public static TimelineType[] values = values(); + final int v; + + TimelineType(int v) { + this.v = v; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/core/TweenType.java b/dragonbones-core/src/main/java/com/dragonbones/core/TweenType.java new file mode 100644 index 0000000..4987a5f --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/core/TweenType.java @@ -0,0 +1,21 @@ +package com.dragonbones.core; + +/** + * @private + */ +public enum TweenType { + None(0), + Line(1), + Curve(2), + QuadIn(3), + QuadOut(4), + QuadInOut(5); + + final public int v; + + TweenType(int v) { + this.v = v; + } + + public static TweenType[] values = values(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/event/EventObject.java b/dragonbones-core/src/main/java/com/dragonbones/event/EventObject.java new file mode 100644 index 0000000..28d1dc3 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/event/EventObject.java @@ -0,0 +1,152 @@ +package com.dragonbones.event; + +import com.dragonbones.animation.AnimationState; +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Bone; +import com.dragonbones.armature.Slot; +import com.dragonbones.core.BaseObject; +import com.dragonbones.model.UserData; +import org.jetbrains.annotations.Nullable; + +/** + * 事件数据。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ +public class EventObject extends BaseObject { + /** + * 动画开始。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType START = EventStringType.start; + /** + * 动画循环播放一次完成。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType LOOP_COMPLETE = EventStringType.loopComplete; + /** + * 动画播放完成。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType COMPLETE = EventStringType.complete; + /** + * 动画淡入开始。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType FADE_IN = EventStringType.fadeIn; + /** + * 动画淡入完成。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType FADE_IN_COMPLETE = EventStringType.fadeInComplete; + /** + * 动画淡出开始。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType FADE_OUT = EventStringType.fadeOut; + /** + * 动画淡出完成。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType FADE_OUT_COMPLETE = EventStringType.fadeOutComplete; + /** + * 动画帧事件。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType FRAME_EVENT = EventStringType.frameEvent; + /** + * 动画声音事件。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public static final EventStringType SOUND_EVENT = EventStringType.soundEvent; + /** + * @private + */ + public float time; + /** + * 事件类型。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public EventStringType type; + /** + * 事件名称。 (帧标签的名称或声音的名称) + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public String name; + /** + * 发出事件的骨架。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public Armature armature; + /** + * 发出事件的骨骼。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + @Nullable + public Bone bone; + /** + * 发出事件的插槽。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + @Nullable + public Slot slot; + /** + * 发出事件的动画状态。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ + public AnimationState animationState; + /** + * 自定义数据 + * + * @version DragonBones 5.0 + * @language zh_CN + * @see UserData + */ + @Nullable + public UserData data; + + /** + * @private + */ + protected void _onClear() { + this.time = 0f; + this.type = EventStringType.start; + this.name = ""; + this.armature = null; + this.bone = null; + this.slot = null; + this.animationState = null; + this.data = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/event/EventStringType.java b/dragonbones-core/src/main/java/com/dragonbones/event/EventStringType.java new file mode 100644 index 0000000..32e0b7c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/event/EventStringType.java @@ -0,0 +1,8 @@ +package com.dragonbones.event; + +/** + * @private + */ +public enum EventStringType { + start, loopComplete, complete, fadeIn, fadeInComplete, fadeOut, fadeOutComplete, frameEvent, soundEvent; +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/event/IEventDispatcher.java b/dragonbones-core/src/main/java/com/dragonbones/event/IEventDispatcher.java new file mode 100644 index 0000000..4d1e479 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/event/IEventDispatcher.java @@ -0,0 +1,45 @@ +package com.dragonbones.event; + +import com.dragonbones.util.Function; + +/** + * 事件接口。 + * + * @version DragonBones 4.5 + * @language zh_CN + */ +public interface IEventDispatcher { + /** + * @private + */ + void _dispatchEvent(EventStringType type, EventObject eventObject); + + /** + * 是否包含指定类型的事件。 + * + * @param type 事件类型。 + * @version DragonBones 4.5 + * @language zh_CN + */ + boolean hasEvent(EventStringType type); + + /** + * 添加事件。 + * + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + void addEvent(EventStringType type, Function listener, Object target); + + /** + * 移除事件。 + * + * @param type 事件类型。 + * @param listener 事件回调。 + * @version DragonBones 4.5 + * @language zh_CN + */ + void removeEvent(EventStringType type, Function listener, Object target); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/factory/BaseFactory.java b/dragonbones-core/src/main/java/com/dragonbones/factory/BaseFactory.java new file mode 100644 index 0000000..9bd8e27 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/factory/BaseFactory.java @@ -0,0 +1,957 @@ +package com.dragonbones.factory; + +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Bone; +import com.dragonbones.armature.IKConstraint; +import com.dragonbones.armature.Slot; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.DisplayType; +import com.dragonbones.core.DragonBones; +import com.dragonbones.model.*; +import com.dragonbones.parser.BinaryDataParser; +import com.dragonbones.parser.DataParser; +import com.dragonbones.parser.ObjectDataParser; +import com.dragonbones.util.Array; +import com.dragonbones.util.Console; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 创建骨架的基础工厂。 (通常只需要一个全局工厂实例) + * + * @version DragonBones 3.0 + * @language zh_CN + * @see DragonBonesData + * @see TextureAtlasData + * @see ArmatureData + * @see Armature + */ +public abstract class BaseFactory { + /** + * @private + */ + protected static ObjectDataParser _objectParser = null; + /** + * @private + */ + protected static BinaryDataParser _binaryParser = null; + /** + * 是否开启共享搜索。 + * 如果开启,创建一个骨架时,可以从多个龙骨数据中寻找骨架数据,或贴图集数据中寻找贴图数据。 (通常在有共享导出的数据时开启) + * + * @version DragonBones 4.5 + * @language zh_CN + * @see DragonBonesData#autoSearch + * @see com.dragonbones.model.TextureAtlasData#autoSearch + */ + public boolean autoSearch = false; + /** + * @private + */ + protected final Map _dragonBonesDataMap = new HashMap<>(); + /** + * @private + */ + protected final Map> _textureAtlasDataMap = new HashMap<>(); + /** + * @private + */ + protected DragonBones _dragonBones = null; + /** + * @private + */ + protected DataParser _dataParser = null; + + public BaseFactory() { + this(null); + } + + /** + * 创建一个工厂。 (通常只需要一个全局工厂实例) + * + * @param dataParser 龙骨数据解析器,如果不设置,则使用默认解析器。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public BaseFactory(@Nullable DataParser dataParser) { + if (BaseFactory._objectParser == null) { + BaseFactory._objectParser = new ObjectDataParser(); + } + + if (BaseFactory._binaryParser == null) { + BaseFactory._binaryParser = new BinaryDataParser(); + } + + this._dataParser = dataParser != null ? dataParser : BaseFactory._objectParser; + } + + /** + * @private + */ + protected boolean _isSupportMesh() { + return true; + } + + /** + * @private + */ + @Nullable + protected TextureData _getTextureData(String textureAtlasName, String textureName) { + if (this._textureAtlasDataMap.containsKey(textureAtlasName)) { + for (TextureAtlasData textureAtlasData : this._textureAtlasDataMap.get(textureAtlasName)) { + TextureData textureData = textureAtlasData.getTexture(textureName); + if (textureData != null) { + return textureData; + } + } + } + + if (this.autoSearch) { // Will be search all data, if the autoSearch is true. + for (String k : this._textureAtlasDataMap.keySet()) { + for (TextureAtlasData textureAtlasData : this._textureAtlasDataMap.get(k)) { + if (textureAtlasData.autoSearch) { + TextureData textureData = textureAtlasData.getTexture(textureName); + if (textureData != null) { + return textureData; + } + } + } + } + } + + return null; + } + + /** + * @private + */ + protected boolean _fillBuildArmaturePackage( + BuildArmaturePackage dataPackage, + String dragonBonesName, String armatureName, String skinName, String textureAtlasName + ) { + DragonBonesData dragonBonesData = null; + ArmatureData armatureData = null; + + if (dragonBonesName.length() > 0) { + if (this._dragonBonesDataMap.containsKey(dragonBonesName)) { + dragonBonesData = this._dragonBonesDataMap.get(dragonBonesName); + armatureData = dragonBonesData.getArmature(armatureName); + } + } + + if (armatureData == null && (dragonBonesName.length() == 0 || this.autoSearch)) { // Will be search all data, if do not give a data name or the autoSearch is true. + for (String k : this._dragonBonesDataMap.keySet()) { + dragonBonesData = this._dragonBonesDataMap.get(k); + if (dragonBonesName.length() == 0 || dragonBonesData.autoSearch) { + armatureData = dragonBonesData.getArmature(armatureName); + if (armatureData != null) { + dragonBonesName = k; + break; + } + } + } + } + + if (armatureData != null) { + dataPackage.dataName = dragonBonesName; + dataPackage.textureAtlasName = textureAtlasName; + dataPackage.data = dragonBonesData; + dataPackage.armature = armatureData; + dataPackage.skin = null; + + if (skinName.length() > 0) { + dataPackage.skin = armatureData.getSkin(skinName); + if (dataPackage.skin == null && this.autoSearch) { + for (String k : this._dragonBonesDataMap.keySet()) { + DragonBonesData skinDragonBonesData = this._dragonBonesDataMap.get(k); + ArmatureData skinArmatureData = skinDragonBonesData.getArmature(skinName); + if (skinArmatureData != null) { + dataPackage.skin = skinArmatureData.defaultSkin; + break; + } + } + } + } + + if (dataPackage.skin == null) { + dataPackage.skin = armatureData.defaultSkin; + } + + return true; + } + + return false; + } + + /** + * @private + */ + protected void _buildBones(BuildArmaturePackage dataPackage, Armature armature) { + Array bones = dataPackage.armature.sortedBones; + for (int i = 0; i < bones.size(); ++i) { + BoneData boneData = bones.get(i); + Bone bone = BaseObject.borrowObject(Bone.class); + bone.init(boneData); + + if (boneData.parent != null) { + armature.addBone(bone, boneData.parent.name); + } else { + armature.addBone(bone); + } + + Array constraints = boneData.constraints; + for (int j = 0; j < constraints.size(); ++j) { + ConstraintData constraintData = constraints.get(j); + Bone target = armature.getBone(constraintData.target.name); + if (target == null) { + continue; + } + + // TODO more constraint type. + IKConstraintData ikConstraintData = (IKConstraintData) constraintData; + IKConstraint constraint = BaseObject.borrowObject(IKConstraint.class); + Bone root = ikConstraintData.root != null ? armature.getBone(ikConstraintData.root.name) : null; + constraint.target = target; + constraint.bone = bone; + constraint.root = root; + constraint.bendPositive = ikConstraintData.bendPositive; + constraint.scaleEnabled = ikConstraintData.scaleEnabled; + constraint.weight = ikConstraintData.weight; + + if (root != null) { + root.addConstraint(constraint); + } else { + bone.addConstraint(constraint); + } + } + } + } + + /** + * @private + */ + protected void _buildSlots(BuildArmaturePackage dataPackage, Armature armature) { + SkinData currentSkin = dataPackage.skin; + SkinData defaultSkin = dataPackage.armature.defaultSkin; + if (currentSkin == null || defaultSkin == null) { + return; + } + + Map> skinSlots = new HashMap<>(); + for (String k : defaultSkin.displays.keySet()) { + Array displays = defaultSkin.displays.get(k); + skinSlots.put(k, displays); + } + + if (currentSkin != defaultSkin) { + for (String k : currentSkin.displays.keySet()) { + Array displays = currentSkin.displays.get(k); + skinSlots.put(k, displays); + } + } + + for (SlotData slotData : dataPackage.armature.sortedSlots) { + if (!(skinSlots.containsKey(slotData.name))) { + continue; + } + + Array displays = skinSlots.get(slotData.name); + Slot slot = this._buildSlot(dataPackage, slotData, displays, armature); + Array displayList = new Array<>(); + for (DisplayData displayData : displays) { + if (displayData != null) { + displayList.push(this._getSlotDisplay(dataPackage, displayData, null, slot)); + } else { + displayList.push(null); + } + } + + armature.addSlot(slot, slotData.parent.name); + slot._setDisplayList(displayList); + slot._setDisplayIndex(slotData.displayIndex, true); + } + } + + /** + * @private + */ + protected Object _getSlotDisplay(@Nullable BuildArmaturePackage dataPackage, DisplayData displayData, @Nullable DisplayData rawDisplayData, Slot slot) { + String dataName = dataPackage != null ? dataPackage.dataName : displayData.parent.parent.name; + Object display = null; + switch (displayData.type) { + case Image: + ImageDisplayData imageDisplayData = (ImageDisplayData) displayData; + if (imageDisplayData.texture == null) { + imageDisplayData.texture = this._getTextureData(dataName, displayData.path); + } else if (dataPackage != null && dataPackage.textureAtlasName.length() > 0) { + imageDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, displayData.path); + } + + if (rawDisplayData != null && rawDisplayData.type == DisplayType.Mesh && this._isSupportMesh()) { + display = slot.getMeshDisplay(); + } else { + display = slot.getRawDisplay(); + } + break; + + case Mesh: + MeshDisplayData meshDisplayData = (MeshDisplayData) displayData; + if (meshDisplayData.texture == null) { + meshDisplayData.texture = this._getTextureData(dataName, meshDisplayData.path); + } else if (dataPackage != null && dataPackage.textureAtlasName.length() > 0) { + meshDisplayData.texture = this._getTextureData(dataPackage.textureAtlasName, meshDisplayData.path); + } + + if (this._isSupportMesh()) { + display = slot.getMeshDisplay(); + } else { + display = slot.getRawDisplay(); + } + break; + + case Armature: + ArmatureDisplayData armatureDisplayData = (ArmatureDisplayData) displayData; + Armature childArmature = this.buildArmature(armatureDisplayData.path, dataName, null, dataPackage != null ? dataPackage.textureAtlasName : null); + if (childArmature != null) { + childArmature.inheritAnimation = armatureDisplayData.inheritAnimation; + if (!childArmature.inheritAnimation) { + Array actions = armatureDisplayData.actions.size() > 0 ? armatureDisplayData.actions : childArmature.armatureData.defaultActions; + if (actions.size() > 0) { + for (ActionData action : actions) { + childArmature._bufferAction(action, true); + } + } else { + childArmature.getAnimation().play(); + } + } + + armatureDisplayData.armature = childArmature.armatureData; // + } + + display = childArmature; + break; + } + + return display; + } + + /** + * @private + */ + protected void _replaceSlotDisplay(BuildArmaturePackage dataPackage, @Nullable DisplayData displayData, Slot slot, int displayIndex) + + { + if (displayIndex < 0) { + displayIndex = slot.getDisplayIndex(); + } + + if (displayIndex < 0) { + displayIndex = 0; + } + + Array displayList = slot.getDisplayList(); // Copy. + if (displayList.size() <= displayIndex) { + displayList.setLength(displayIndex + 1); + + // @TODO: Not required in java + for (int i = 0, l = displayList.size(); i < l; ++i) { // Clean undefined. + if (displayList.get(i) == null) { + displayList.set(i, null); + } + } + } + + if (slot._displayDatas.size() <= displayIndex) { + displayList.setLength(displayIndex + 1); + + // @TODO: Not required in java + for (int i = 0, l = slot._displayDatas.size(); i < l; ++i) { // Clean undefined. + if (slot._displayDatas.get(i) == null) { + slot._displayDatas.set(i, null); + } + } + } + + slot._displayDatas.set(displayIndex, displayData); + if (displayData != null) { + displayList.set(displayIndex, this._getSlotDisplay( + dataPackage, + displayData, + displayIndex < slot._rawDisplayDatas.size() ? slot._rawDisplayDatas.get(displayIndex) : null, + slot + )); + } else { + displayList.set(displayIndex, null); + } + + slot.setDisplayList(displayList); + } + + /** + * @private + */ + protected abstract TextureAtlasData _buildTextureAtlasData(@Nullable TextureAtlasData textureAtlasData, Object textureAtlas); + + /** + * @private + */ + protected abstract Armature _buildArmature(BuildArmaturePackage dataPackage); + + /** + * @private + */ + protected abstract Slot _buildSlot(BuildArmaturePackage dataPackage, SlotData slotData, Array displays, Armature armature); + + public DragonBonesData parseDragonBonesData(Object rawData) { + return parseDragonBonesData(rawData, null, 1f); + } + + /** + * 解析并添加龙骨数据。 + * + * @param rawData 需要解析的原始数据。 + * @param name 为数据提供一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @returns DragonBonesData + * @version DragonBones 4.5 + * @language zh_CN + * @see #getDragonBonesData(String) + * @see #addDragonBonesData(DragonBonesData, String) + * @see #removeDragonBonesData(String, boolean) + * @see DragonBonesData + */ + @Nullable + public DragonBonesData parseDragonBonesData(Object rawData, @Nullable String name, float scale) { + DragonBonesData dragonBonesData = null; + if (rawData instanceof byte[]) { + dragonBonesData = BaseFactory._binaryParser.parseDragonBonesData(rawData, scale); + } else { + dragonBonesData = this._dataParser.parseDragonBonesData(rawData, scale); + } + + while (true) { + TextureAtlasData textureAtlasData = this._buildTextureAtlasData(null, null); + if (this._dataParser.parseTextureAtlasData(null, textureAtlasData, scale)) { + this.addTextureAtlasData(textureAtlasData, name); + } else { + textureAtlasData.returnToPool(); + break; + } + } + + if (dragonBonesData != null) { + this.addDragonBonesData(dragonBonesData, name); + } + + return dragonBonesData; + } + + public TextureAtlasData parseTextureAtlasData(Object rawData, Object textureAtlas) { + return parseTextureAtlasData(rawData, textureAtlas, null, 0f); + } + + /** + * 解析并添加贴图集数据。 + * + * @param rawData 需要解析的原始数据。 (JSON) + * @param textureAtlas 贴图。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @param scale 为贴图集设置一个缩放值。 + * @returns 贴图集数据 + * @version DragonBones 4.5 + * @language zh_CN + * @see #getTextureAtlasData(String) + * @see #addTextureAtlasData(TextureAtlasData, String) + * @see #removeTextureAtlasData(String, boolean) + * @see TextureAtlasData + */ + public TextureAtlasData parseTextureAtlasData(Object rawData, Object textureAtlas, @Nullable String name, float scale) { + TextureAtlasData textureAtlasData = this._buildTextureAtlasData(null, null); + this._dataParser.parseTextureAtlasData(rawData, textureAtlasData, scale); + this._buildTextureAtlasData(textureAtlasData, textureAtlas); + this.addTextureAtlasData(textureAtlasData, name); + + return textureAtlasData; + } + + /** + * @version DragonBones 5.1 + * @language zh_CN + */ + public void updateTextureAtlasData(String name, Array textureAtlases) { + Array textureAtlasDatas = this.getTextureAtlasData(name); + if (textureAtlasDatas != null) { + for (int i = 0, l = textureAtlasDatas.size(); i < l; ++i) { + if (i < textureAtlases.size()) { + this._buildTextureAtlasData(textureAtlasDatas.get(i), textureAtlases.get(i)); + } + } + } + } + + /** + * 获取指定名称的龙骨数据。 + * + * @param name 数据名称。 + * @returns DragonBonesData + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseDragonBonesData(Object, String, float) + * @see #addDragonBonesData(DragonBonesData, String) + * @see #removeDragonBonesData(String, boolean) + * @see DragonBonesData + */ + @Nullable + public DragonBonesData getDragonBonesData(String name) { + return this._dragonBonesDataMap.get(name); + } + + public void addDragonBonesData(DragonBonesData data) { + addDragonBonesData(data, null); + } + + /** + * 添加龙骨数据。 + * + * @param data 龙骨数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseDragonBonesData(Object, String, float) + * @see #getDragonBonesData(String) + * @see #removeDragonBonesData(String, boolean) + * @see DragonBonesData + */ + public void addDragonBonesData(DragonBonesData data, @Nullable String name) { + name = name != null ? name : data.name; + if (this._dragonBonesDataMap.containsKey(name)) { + if (this._dragonBonesDataMap.get(name) == data) { + return; + } + + Console.warn("Replace data: " + name); + this._dragonBonesDataMap.get(name).returnToPool(); + } + + this._dragonBonesDataMap.put(name, data); + } + + public void removeDragonBonesData(String name) { + removeDragonBonesData(name, true); + } + + /** + * 移除龙骨数据。 + * + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseDragonBonesData(Object, String, float) + * @see #getDragonBonesData(String) + * @see #addDragonBonesData(DragonBonesData, String) + * @see DragonBonesData + */ + public void removeDragonBonesData(String name, boolean disposeData) { + if (this._dragonBonesDataMap.containsKey(name)) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap.get(name)); + } + + this._dragonBonesDataMap.remove(name); + } + } + + /** + * 获取指定名称的贴图集数据列表。 + * + * @param name 数据名称。 + * @returns 贴图集数据列表。 + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseTextureAtlasData(Object, Object, String, float) + * @see #addTextureAtlasData(TextureAtlasData, String) + * @see #removeTextureAtlasData(String, boolean) + * @see TextureAtlasData + */ + public Array getTextureAtlasData(String name) { + return this._textureAtlasDataMap.get(name); + } + + public void addTextureAtlasData(TextureAtlasData data) { + addTextureAtlasData(data, null); + } + + /** + * 添加贴图集数据。 + * + * @param data 贴图集数据。 + * @param name 为数据指定一个名称,以便可以通过这个名称获取数据,如果未设置,则使用数据中的名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseTextureAtlasData(Object, Object, String, float) + * @see #getTextureAtlasData(String) + * @see #removeTextureAtlasData(String, boolean) + * @see TextureAtlasData + */ + public void addTextureAtlasData(TextureAtlasData data, @Nullable String name) { + name = name != null ? name : data.name; + if (!this._textureAtlasDataMap.containsKey(name)) { + this._textureAtlasDataMap.put(name, new Array<>()); + } + Array textureAtlasList = this._textureAtlasDataMap.get(name); + + if (textureAtlasList.indexOf(data) < 0) { + textureAtlasList.add(data); + } + } + + public void removeTextureAtlasData(String name) { + removeTextureAtlasData(name, true); + } + + /** + * 移除贴图集数据。 + * + * @param name 数据名称。 + * @param disposeData 是否释放数据。 + * @version DragonBones 3.0 + * @language zh_CN + * @see #parseTextureAtlasData(Object, Object, String, float) + * @see #getTextureAtlasData(String) + * @see #addTextureAtlasData(TextureAtlasData, String) + * @see TextureAtlasData + */ + public void removeTextureAtlasData(String name, boolean disposeData) { + if (this._textureAtlasDataMap.containsKey(name)) { + Array textureAtlasDataList = this._textureAtlasDataMap.get(name); + if (disposeData) { + for (TextureAtlasData textureAtlasData : textureAtlasDataList) { + this._dragonBones.bufferObject(textureAtlasData); + } + } + + this._textureAtlasDataMap.remove(name); + } + } + + @Nullable + public ArmatureData getArmatureData(String name) { + return getArmatureData(name, ""); + } + + /** + * 获取骨架数据。 + * + * @param name 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称。 + * @version DragonBones 5.1 + * @language zh_CN + * @see ArmatureData + */ + @Nullable + public ArmatureData getArmatureData(String name, String dragonBonesName) { + BuildArmaturePackage dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, dragonBonesName, name, "", "")) { + return null; + } + + return dataPackage.armature; + } + + public void clear() { + clear(true); + } + + /** + * 清除所有的数据。 + * + * @param disposeData 是否释放数据。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public void clear(boolean disposeData) { + for (String k : this._dragonBonesDataMap.keySet()) { + if (disposeData) { + this._dragonBones.bufferObject(this._dragonBonesDataMap.get(k)); + } + + this._dragonBonesDataMap.remove(k); + } + + for (String k : this._textureAtlasDataMap.keySet()) { + if (disposeData) { + Array textureAtlasDataList = this._textureAtlasDataMap.get(k); + for (TextureAtlasData textureAtlasData : textureAtlasDataList) { + this._dragonBones.bufferObject(textureAtlasData); + } + } + + this._textureAtlasDataMap.remove(k); + } + } + + @Nullable + public Armature buildArmature(String armatureName) { + return buildArmature(armatureName, null, null, null); + } + + /** + * 创建一个骨架。 + * + * @param armatureName 骨架数据名称。 + * @param dragonBonesName 龙骨数据名称,如果未设置,将检索所有的龙骨数据,当多个龙骨数据中包含同名的骨架数据时,可能无法创建出准确的骨架。 + * @param skinName 皮肤名称,如果未设置,则使用默认皮肤。 + * @param textureAtlasName 贴图集数据名称,如果未设置,则使用龙骨数据名称。 + * @returns 骨架 + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData + * @see Armature + */ + @Nullable + public Armature buildArmature(String armatureName, @Nullable String dragonBonesName, @Nullable String skinName, @Nullable String textureAtlasName) { + BuildArmaturePackage dataPackage = new BuildArmaturePackage(); + if (!this._fillBuildArmaturePackage(dataPackage, (dragonBonesName != null) ? dragonBonesName : "", armatureName, (skinName != null) ? skinName : "", (textureAtlasName != null) ? textureAtlasName : "")) { + Console.warn("No armature data. " + armatureName + ", " + (dragonBonesName != null ? dragonBonesName : "")); + return null; + } + + Armature armature = this._buildArmature(dataPackage); + this._buildBones(dataPackage, armature); + this._buildSlots(dataPackage, armature); + // armature.invalidUpdate(null, true); TODO + armature.invalidUpdate("", true); + armature.advanceTime(0f); // Update armature pose. + + return armature; + } + + public void replaceSlotDisplay( + @Nullable String dragonBonesName, + String armatureName, String slotName, String displayName, + Slot slot + ) { + replaceSlotDisplay(dragonBonesName, armatureName, slotName, displayName, slot, -1); + } + + /** + * 用指定资源替换指定插槽的显示对象。(用 "dragonBonesName/armatureName/slotName/displayName" 的资源替换 "slot" 的显示对象) + * + * @param dragonBonesName 指定的龙骨数据名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param displayName 指定的显示对象名称。 + * @param slot 指定的插槽实例。 + * @param displayIndex 要替换的显示对象的索引,如果未设置,则替换当前正在显示的显示对象。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public void replaceSlotDisplay( + @Nullable String dragonBonesName, + String armatureName, String slotName, String displayName, + Slot slot, int displayIndex + ) + + { + BuildArmaturePackage dataPackage = new BuildArmaturePackage(); + if ( + !this._fillBuildArmaturePackage( + dataPackage, + (dragonBonesName != null) ? dragonBonesName : "", + armatureName, "", "" + ) || dataPackage.skin == null + ) { + return; + } + + Array displays = dataPackage.skin.getDisplays(slotName); + if (displays == null) { + return; + } + + for (DisplayData display : displays) { + if (display != null && Objects.equals(display.name, displayName)) { + this._replaceSlotDisplay(dataPackage, display, slot, displayIndex); + break; + } + } + } + + /** + * 用指定资源列表替换插槽的显示对象列表。 + * + * @param dragonBonesName 指定的 DragonBonesData 名称。 + * @param armatureName 指定的骨架名称。 + * @param slotName 指定的插槽名称。 + * @param slot 指定的插槽实例。 + * @version DragonBones 4.5 + * @language zh_CN + */ + public void replaceSlotDisplayList( + @Nullable String dragonBonesName, + String armatureName, + String slotName, + Slot slot + ) + + { + BuildArmaturePackage dataPackage = new BuildArmaturePackage(); + if ( + !this._fillBuildArmaturePackage( + dataPackage, + (dragonBonesName != null) ? dragonBonesName : "", + armatureName, "", "" + ) || dataPackage.skin == null + ) { + return; + } + + Array displays = dataPackage.skin.getDisplays(slotName); + if (displays == null) { + return; + } + + int displayIndex = 0; + for (DisplayData displayData : displays) { + this._replaceSlotDisplay(dataPackage, displayData, slot, displayIndex++); + } + } + + public void changeSkin(Armature armature, SkinData skin) { + changeSkin(armature, skin, null); + } + + /** + * 更换骨架皮肤。 + * + * @param armature 骨架。 + * @param skin 皮肤数据。 + * @param exclude 不需要更新的插槽。 + * @version DragonBones 5.1 + * @language zh_CN + * @see Armature + * @see SkinData + */ + public void changeSkin(Armature armature, SkinData skin, @Nullable Array exclude) { + for (Slot slot : armature.getSlots()) { + if (!(skin.displays.containsKey(slot.name)) || (exclude != null && exclude.indexOf(slot.name) >= 0)) { + continue; + } + + Array displays = skin.displays.get(slot.name); + Array displayList = slot.getDisplayList(); // Copy. + displayList.setLength(displays.size()); // Modify displayList length. + for (int i = 0, l = displays.size(); i < l; ++i) { + DisplayData displayData = displays.get(i); + if (displayData != null) { + displayList.set(i, this._getSlotDisplay(null, displayData, null, slot)); + } else { + displayList.set(i, null); + } + } + + slot._rawDisplayDatas = displays; + slot._displayDatas.setLength(displays.size()); + for (int i = 0, l = slot._displayDatas.size(); i < l; ++i) { + slot._displayDatas.set(i, displays.get(i)); + } + + slot.setDisplayList(displayList); + } + } + + public boolean copyAnimationsToArmature(Armature toArmature, String fromArmatreName) { + return copyAnimationsToArmature(toArmature, fromArmatreName, null, null, true); + } + + /** + * 将骨架的动画替换成其他骨架的动画。 (通常这些骨架应该具有相同的骨架结构) + * + * @param toArmature 指定的骨架。 + * @param fromArmatreName 其他骨架的名称。 + * @param fromSkinName 其他骨架的皮肤名称,如果未设置,则使用默认皮肤。 + * @param fromDragonBonesDataName 其他骨架属于的龙骨数据名称,如果未设置,则检索所有的龙骨数据。 + * @param replaceOriginalAnimation 是否替换原有的同名动画。 + * @returns 是否替换成功。 + * @version DragonBones 4.5 + * @language zh_CN + * @see Armature + * @see ArmatureData + */ + public boolean copyAnimationsToArmature( + Armature toArmature, + String fromArmatreName, + @Nullable String fromSkinName, + @Nullable String fromDragonBonesDataName, + boolean replaceOriginalAnimation + ) + + { + BuildArmaturePackage dataPackage = new BuildArmaturePackage(); + if (this._fillBuildArmaturePackage( + dataPackage, + (fromDragonBonesDataName != null) ? fromDragonBonesDataName : "", + fromArmatreName, + (fromSkinName != null) ? fromSkinName : "", + "" + )) { + ArmatureData fromArmatureData = dataPackage.armature; + if (replaceOriginalAnimation) { + toArmature.getAnimation().setAnimations(fromArmatureData.animations); + } else { + Map animations = new HashMap<>(); + + for (String animationName : toArmature.getAnimation().getAnimations().keySet()) { + animations.put(animationName, toArmature.getAnimation().getAnimations().get(animationName)); + } + + for (String animationName : fromArmatureData.animations.keySet()) { + animations.put(animationName, fromArmatureData.animations.get(animationName)); + } + + toArmature.getAnimation().setAnimations(animations); + } + + if (dataPackage.skin != null) { + Array slots = toArmature.getSlots(); + for (int i = 0, l = slots.size(); i < l; ++i) { + Slot toSlot = slots.get(i); + Array toSlotDisplayList = toSlot.getDisplayList(); + for (int j = 0, lJ = toSlotDisplayList.size(); j < lJ; ++j) { + Object toDisplayObject = toSlotDisplayList.get(j); + if (toDisplayObject instanceof Armature) { + Array displays = dataPackage.skin.getDisplays(toSlot.name); + if (displays != null && j < displays.size()) { + DisplayData fromDisplayData = displays.get(j); + if (fromDisplayData != null && fromDisplayData.type == DisplayType.Armature) { + this.copyAnimationsToArmature((Armature) toDisplayObject, fromDisplayData.path, fromSkinName, fromDragonBonesDataName, replaceOriginalAnimation); + } + } + } + } + } + + return true; + } + } + + return false; + } + + /** + * @private + */ + public Map getAllDragonBonesData() { + return this._dragonBonesDataMap; + } + + /** + * @private + */ + public Map> getAllTextureAtlasData() { + return this._textureAtlasDataMap; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/factory/BuildArmaturePackage.java b/dragonbones-core/src/main/java/com/dragonbones/factory/BuildArmaturePackage.java new file mode 100644 index 0000000..29fd055 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/factory/BuildArmaturePackage.java @@ -0,0 +1,18 @@ +package com.dragonbones.factory; + +import com.dragonbones.model.ArmatureData; +import com.dragonbones.model.DragonBonesData; +import com.dragonbones.model.SkinData; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class BuildArmaturePackage { + public String dataName = ""; + public String textureAtlasName = ""; + public DragonBonesData data; + public ArmatureData armature; + public @Nullable + SkinData skin = null; +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/geom/ColorTransform.java b/dragonbones-core/src/main/java/com/dragonbones/geom/ColorTransform.java new file mode 100644 index 0000000..93fe412 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/geom/ColorTransform.java @@ -0,0 +1,51 @@ +package com.dragonbones.geom; + +/** + * @private + */ +public class ColorTransform { + public float alphaMultiplier, redMultiplier, greenMultiplier, blueMultiplier; + public int alphaOffset, redOffset, greenOffset, blueOffset; + + /* + public ColorTransform( + float alphaMultiplier = 1f, float redMultiplier = 1f, float greenMultiplier = 1f, float blueMultiplier = 1f, + int alphaOffset = 0, int redOffset = 0, int greenOffset = 0, int blueOffset = 0 + ) { + } + */ + + public ColorTransform() { + this(1, 1, 1, 1, 0, 0, 0, 0); + } + + public ColorTransform( + float alphaMultiplier, float redMultiplier, float greenMultiplier, float blueMultiplier, + int alphaOffset, int redOffset, int greenOffset, int blueOffset + ) { + this.alphaMultiplier = alphaMultiplier; + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaOffset = alphaOffset; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + } + + public void copyFrom(ColorTransform value) { + this.alphaMultiplier = value.alphaMultiplier; + this.redMultiplier = value.redMultiplier; + this.greenMultiplier = value.greenMultiplier; + this.blueMultiplier = value.blueMultiplier; + this.alphaOffset = value.alphaOffset; + this.redOffset = value.redOffset; + this.greenOffset = value.greenOffset; + this.blueOffset = value.blueOffset; + } + + public void identity() { + this.alphaMultiplier = this.redMultiplier = this.greenMultiplier = this.blueMultiplier = 1f; + this.alphaOffset = this.redOffset = this.greenOffset = this.blueOffset = 0; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/geom/Matrix.java b/dragonbones-core/src/main/java/com/dragonbones/geom/Matrix.java new file mode 100644 index 0000000..f1b47c7 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/geom/Matrix.java @@ -0,0 +1,204 @@ +package com.dragonbones.geom; + +import com.dragonbones.util.FloatArray; + +/** + * 2D 矩阵。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class Matrix { + public float a, b, c, d, tx, ty; + + public Matrix() { + this(1, 0, 0, 1, 0, 0); + } + + public Matrix(float a, float b, float c, float d, float tx, float ty) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + + /** + * @private + */ + public String toString() { + return "[object dragonBones.Matrix] a:" + this.a + " b:" + this.b + " c:" + this.c + " d:" + this.d + " tx:" + this.tx + " ty:" + this.ty; + } + + /** + * @private + */ + public Matrix copyFrom(Matrix value) { + this.a = value.a; + this.b = value.b; + this.c = value.c; + this.d = value.d; + this.tx = value.tx; + this.ty = value.ty; + + return this; + } + + /** + * @param value + * @private + */ + public Matrix copyFromArray(FloatArray value) { + return copyFromArray(value, 0); + } + + /** + * @private + */ + public Matrix copyFromArray(FloatArray value, int offset) { + this.a = value.get(offset); + this.b = value.get(offset + 1); + this.c = value.get(offset + 2); + this.d = value.get(offset + 3); + this.tx = value.get(offset + 4); + this.ty = value.get(offset + 5); + + return this; + } + + /** + * 转换为单位矩阵。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Matrix identity() { + this.a = this.d = 1f; + this.b = this.c = 0f; + this.tx = this.ty = 0f; + + return this; + } + + /** + * 将当前矩阵与另一个矩阵相乘。 + * + * @param value 需要相乘的矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public Matrix concat(Matrix value) { + float aA = this.a * value.a; + float bA = 0f; + float cA = 0f; + float dA = this.d * value.d; + float txA = this.tx * value.a + value.tx; + float tyA = this.ty * value.d + value.ty; + + if (this.b != 0f || this.c != 0f) { + aA += this.b * value.c; + bA += this.b * value.d; + cA += this.c * value.a; + dA += this.c * value.b; + } + + if (value.b != 0f || value.c != 0f) { + bA += this.a * value.b; + cA += this.d * value.c; + txA += this.ty * value.c; + tyA += this.tx * value.b; + } + + this.a = aA; + this.b = bA; + this.c = cA; + this.d = dA; + this.tx = txA; + this.ty = tyA; + + return this; + } + + /** + * 转换为逆矩阵。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public Matrix invert() { + float aA = this.a; + float bA = this.b; + float cA = this.c; + float dA = this.d; + final float txA = this.tx; + final float tyA = this.ty; + + if (bA == 0f && cA == 0f) { + this.b = this.c = 0f; + if (aA == 0f || dA == 0f) { + this.a = this.b = this.tx = this.ty = 0f; + } else { + aA = this.a = 1f / aA; + dA = this.d = 1f / dA; + this.tx = -aA * txA; + this.ty = -dA * tyA; + } + + return this; + } + + float determinant = aA * dA - bA * cA; + if (determinant == 0f) { + this.a = this.d = 1f; + this.b = this.c = 0f; + this.tx = this.ty = 0f; + + return this; + } + + determinant = 1f / determinant; + float k = this.a = dA * determinant; + bA = this.b = -bA * determinant; + cA = this.c = -cA * determinant; + dA = this.d = aA * determinant; + this.tx = -(k * txA + cA * tyA); + this.ty = -(bA * txA + dA * tyA); + + return this; + } + + /** + * 将矩阵转换应用于指定点。 + * + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void transformPoint(float x, float y, Point result) { + transformPoint(x, y, result, false); + } + + /** + * 将矩阵转换应用于指定点。 + * + * @param x 横坐标。 + * @param y 纵坐标。 + * @param result 应用转换之后的坐标。 + * @params delta 是否忽略 tx,ty 对坐标的转换。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public void transformPoint(float x, float y, Point result, boolean delta) { + result.x = this.a * x + this.c * y; + result.y = this.b * x + this.d * y; + + if (!delta) { + result.x += this.tx; + result.y += this.ty; + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/geom/Point.java b/dragonbones-core/src/main/java/com/dragonbones/geom/Point.java new file mode 100644 index 0000000..3431a9c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/geom/Point.java @@ -0,0 +1,23 @@ +package com.dragonbones.geom; + +public class Point { + public float x, y; + + public Point() { + this(0, 0); + } + + public Point(float x, float y) { + this.x = x; + this.y = y; + } + + public void copyFrom(Point value) { + this.x = value.x; + this.y = value.y; + } + + public void clear() { + this.x = this.y = 0f; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/geom/Rectangle.java b/dragonbones-core/src/main/java/com/dragonbones/geom/Rectangle.java new file mode 100644 index 0000000..9a82aaf --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/geom/Rectangle.java @@ -0,0 +1,28 @@ +package com.dragonbones.geom; + +public class Rectangle { + public float x, y, width, height; + + public Rectangle() { + this(0, 0, 0, 0); + } + + public Rectangle(float x, float y, float width, float height) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + public void copyFrom(Rectangle value) { + this.x = value.x; + this.y = value.y; + this.width = value.width; + this.height = value.height; + } + + public void clear() { + this.x = this.y = 0f; + this.width = this.height = 0f; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/geom/Transform.java b/dragonbones-core/src/main/java/com/dragonbones/geom/Transform.java new file mode 100644 index 0000000..316299b --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/geom/Transform.java @@ -0,0 +1,232 @@ +package com.dragonbones.geom; + +/** + * 2D 变换。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class Transform { + /** + * @private + */ + public static final float PI_D = (float) (Math.PI * 2.0); + /** + * @private + */ + public static final float PI_H = (float) (Math.PI / 2.0); + /** + * @private + */ + public static final float PI_Q = (float) (Math.PI / 4.0); + /** + * @private + */ + public static final float RAD_DEG = (float) (180.0 / Math.PI); + /** + * @private + */ + public static final float DEG_RAD = (float) (Math.PI / 180.0); + + /** + * @private + */ + public static float normalizeRadian(float value) { + value = (float) ((value + Math.PI) % (Math.PI * 2.0)); + value += value > 0f ? -Math.PI : Math.PI; + + return value; + } + + /** + * 水平位移。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float x; + /** + * 垂直位移。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float y; + /** + * 倾斜。 (以弧度为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float skew; + /** + * 旋转。 (以弧度为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float rotation; + /** + * 水平缩放。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float scaleX; + /** + * 垂直缩放。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float scaleY; + + public Transform() { + this(0, 0, 0, 0, 1, 1); + } + + public Transform(float x, float y, float skew, float rotation, float scaleX, float scaleY) { + this.x = x; + this.y = y; + this.skew = skew; + this.rotation = rotation; + this.scaleX = scaleX; + this.scaleY = scaleY; + } + + /** + * @private + */ + public String toString() { + return "[object dragonBones.Transform] x:" + this.x + " y:" + this.y + " skewX:" + this.skew * 180.0 / Math.PI + " skewY:" + this.rotation * 180.0 / Math.PI + " scaleX:" + this.scaleX + " scaleY:" + this.scaleY; + } + + /** + * @private + */ + public Transform copyFrom(Transform value) { + this.x = value.x; + this.y = value.y; + this.skew = value.skew; + this.rotation = value.rotation; + this.scaleX = value.scaleX; + this.scaleY = value.scaleY; + + return this; + } + + /** + * @private + */ + public Transform identity() { + this.x = this.y = 0f; + this.skew = this.rotation = 0f; + this.scaleX = this.scaleY = 1f; + + return this; + } + + /** + * @private + */ + public Transform add(Transform value) { + this.x += value.x; + this.y += value.y; + this.skew += value.skew; + this.rotation += value.rotation; + this.scaleX *= value.scaleX; + this.scaleY *= value.scaleY; + + return this; + } + + /** + * @private + */ + public Transform minus(Transform value) { + this.x -= value.x; + this.y -= value.y; + this.skew -= value.skew; + this.rotation -= value.rotation; + this.scaleX /= value.scaleX; + this.scaleY /= value.scaleY; + + return this; + } + + /** + * 矩阵转换为变换。 + * + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public Transform fromMatrix(Matrix matrix) { + final float backupScaleX = this.scaleX, backupScaleY = this.scaleY; + final float PI_Q = Transform.PI_Q; + + this.x = matrix.tx; + this.y = matrix.ty; + this.rotation = (float) Math.atan(matrix.b / matrix.a); + float skewX = (float) Math.atan(-matrix.c / matrix.d); + + this.scaleX = (float) ((this.rotation > -PI_Q && this.rotation < PI_Q) ? matrix.a / Math.cos(this.rotation) : matrix.b / Math.sin(this.rotation)); + this.scaleY = (float) ((skewX > -PI_Q && skewX < PI_Q) ? matrix.d / Math.cos(skewX) : -matrix.c / Math.sin(skewX)); + + if (backupScaleX >= 0f && this.scaleX < 0f) { + this.scaleX = -this.scaleX; + this.rotation = (float) (this.rotation - Math.PI); + } + + if (backupScaleY >= 0f && this.scaleY < 0f) { + this.scaleY = -this.scaleY; + skewX = (float) (skewX - Math.PI); + } + + this.skew = skewX - this.rotation; + + return this; + } + + /** + * 转换为矩阵。 + * + * @param matrix 矩阵。 + * @version DragonBones 3.0 + * @language zh_CN + */ + public Transform toMatrix(Matrix matrix) { + if (this.skew != 0f || this.rotation != 0f) { + matrix.a = (float) Math.cos(this.rotation); + matrix.b = (float) Math.sin(this.rotation); + + if (this.skew == 0f) { + matrix.c = -matrix.b; + matrix.d = matrix.a; + } else { + matrix.c = (float) -Math.sin(this.skew + this.rotation); + matrix.d = (float) Math.cos(this.skew + this.rotation); + } + + if (this.scaleX != 1f) { + matrix.a *= this.scaleX; + matrix.b *= this.scaleX; + } + + if (this.scaleY != 1f) { + matrix.c *= this.scaleY; + matrix.d *= this.scaleY; + } + } else { + matrix.a = this.scaleX; + matrix.b = 0f; + matrix.c = 0f; + matrix.d = this.scaleY; + } + + matrix.tx = this.x; + matrix.ty = this.y; + + return this; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/ActionData.java b/dragonbones-core/src/main/java/com/dragonbones/model/ActionData.java new file mode 100644 index 0000000..6714870 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/ActionData.java @@ -0,0 +1,31 @@ +package com.dragonbones.model; + +import com.dragonbones.core.ActionType; +import com.dragonbones.core.BaseObject; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class ActionData extends BaseObject { + public ActionType type; + public String name; // Frame event name | Sound event name | Animation name + public @Nullable + BoneData bone; + public @Nullable + SlotData slot; + public @Nullable + UserData data = null; // + + protected void _onClear() { + if (this.data != null) { + this.data.returnToPool(); + } + + this.type = ActionType.Play; + this.name = ""; + this.bone = null; + this.slot = null; + this.data = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/AnimationConfig.java b/dragonbones-core/src/main/java/com/dragonbones/model/AnimationConfig.java new file mode 100644 index 0000000..aa173db --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/AnimationConfig.java @@ -0,0 +1,321 @@ +package com.dragonbones.model; + +import com.dragonbones.animation.AnimationState; +import com.dragonbones.armature.Armature; +import com.dragonbones.armature.Bone; +import com.dragonbones.core.AnimationFadeOutMode; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.TweenType; +import com.dragonbones.util.Array; + +/** + * 动画配置,描述播放一个动画所需要的全部信息。 + * + * @version DragonBones 5.0 + * @beta + * @language zh_CN + * @see AnimationState + */ +public class AnimationConfig extends BaseObject { + /** + * 是否暂停淡出的动画。 + * + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean pauseFadeOut; + /** + * 淡出模式。 + * + * @default dragonBones.AnimationFadeOutMode.All + * @version DragonBones 5.0 + * @language zh_CN + * @see AnimationFadeOutMode + */ + public AnimationFadeOutMode fadeOutMode; + /** + * 淡出缓动方式。 + * + * @default TweenType.Line + * @version DragonBones 5.0 + * @language zh_CN + * @see TweenType + */ + public TweenType fadeOutTweenType; + /** + * 淡出时间。 [-1: 与淡入时间同步, [0~N]: 淡出时间] (以秒为单位) + * + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float fadeOutTime; + + /** + * 否能触发行为。 + * + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean actionEnabled; + /** + * 是否以增加的方式混合。 + * + * @default false + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean additiveBlending; + /** + * 是否对插槽的显示对象有控制权。 + * + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean displayControl; + /** + * 是否暂停淡入的动画,直到淡入过程结束。 + * + * @default true + * @version DragonBones 5.0 + * @language zh_CN + */ + public boolean pauseFadeIn; + /** + * 是否将没有动画的对象重置为初始值。 + * + * @default true + * @version DragonBones 5.1 + * @language zh_CN + */ + public boolean resetToPose; + /** + * 淡入缓动方式。 + * + * @default TweenType.Line + * @version DragonBones 5.0 + * @language zh_CN + * @see TweenType + */ + public TweenType fadeInTweenType; + /** + * 播放次数。 [-1: 使用动画数据默认值, 0: 无限循环播放, [1~N]: 循环播放 N 次] + * + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public int playTimes; + /** + * 混合图层,图层高会优先获取混合权重。 + * + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float layer; + /** + * 开始时间。 (以秒为单位) + * + * @default 0 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float position; + /** + * 持续时间。 [-1: 使用动画数据默认值, 0: 动画停止, (0~N]: 持续时间] (以秒为单位) + * + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float duration; + /** + * 播放速度。 [(-N~0): 倒转播放, 0: 停止播放, (0~1): 慢速播放, 1: 正常播放, (1~N): 快速播放] + * + * @default 1 + * @version DragonBones 3.0 + * @language zh_CN + */ + public float timeScale; + /** + * 淡入时间。 [-1: 使用动画数据默认值, [0~N]: 淡入时间] (以秒为单位) + * + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float fadeInTime; + /** + * 自动淡出时间。 [-1: 不自动淡出, [0~N]: 淡出时间] (以秒为单位) + * + * @default -1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float autoFadeOutTime; + /** + * 混合权重。 + * + * @default 1 + * @version DragonBones 5.0 + * @language zh_CN + */ + public float weight; + /** + * 动画状态名。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public String name; + /** + * 动画数据名。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public String animation; + /** + * 混合组,用于动画状态编组,方便控制淡出。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public String group; + /** + * 骨骼遮罩。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public final Array boneMask = new Array<>(); + + /** + * @private + */ + protected void _onClear() { + this.pauseFadeOut = true; + this.fadeOutMode = AnimationFadeOutMode.All; + this.fadeOutTweenType = TweenType.Line; + this.fadeOutTime = -1f; + + this.actionEnabled = true; + this.additiveBlending = false; + this.displayControl = true; + this.pauseFadeIn = true; + this.resetToPose = true; + this.fadeInTweenType = TweenType.Line; + this.playTimes = -1; + this.layer = 0; + this.position = 0f; + this.duration = -1f; + this.timeScale = -100f; + this.fadeInTime = -1f; + this.autoFadeOutTime = -1f; + this.weight = 1f; + this.name = ""; + this.animation = ""; + this.group = ""; + this.boneMask.clear(); + } + + public void clear() { + this._onClear(); + } + + public void copyFrom(AnimationConfig value) { + this.pauseFadeOut = value.pauseFadeOut; + this.fadeOutMode = value.fadeOutMode; + this.autoFadeOutTime = value.autoFadeOutTime; + this.fadeOutTweenType = value.fadeOutTweenType; + + this.actionEnabled = value.actionEnabled; + this.additiveBlending = value.additiveBlending; + this.displayControl = value.displayControl; + this.pauseFadeIn = value.pauseFadeIn; + this.resetToPose = value.resetToPose; + this.playTimes = value.playTimes; + this.layer = value.layer; + this.position = value.position; + this.duration = value.duration; + this.timeScale = value.timeScale; + this.fadeInTime = value.fadeInTime; + this.fadeOutTime = value.fadeOutTime; + this.fadeInTweenType = value.fadeInTweenType; + this.weight = value.weight; + this.name = value.name; + this.animation = value.animation; + this.group = value.group; + + this.boneMask.setLength(value.boneMask.size()); + for (int i = 0, l = this.boneMask.size(); i < l; ++i) { + this.boneMask.set(i, value.boneMask.get(i)); + } + } + + public boolean containsBoneMask(String name) { + return this.boneMask.size() == 0 || this.boneMask.indexOfObject(name) >= 0; + } + + public void addBoneMask(Armature armature, String name) { + addBoneMask(armature, name, true); + } + + public void addBoneMask(Armature armature, String name, boolean recursive) { + Bone currentBone = armature.getBone(name); + if (currentBone == null) { + return; + } + + if (this.boneMask.indexOfObject(name) < 0) { // Add mixing + this.boneMask.add(name); + } + + if (recursive) { // Add recursive mixing. + for (Bone bone : armature.getBones()) { + if (this.boneMask.indexOfObject(bone.name) < 0 && currentBone.contains(bone)) { + this.boneMask.add(bone.name); + } + } + } + } + + public void removeBoneMask(Armature armature, String name) { + removeBoneMask(armature, name, true); + } + + public void removeBoneMask(Armature armature, String name, boolean recursive) { + int index = this.boneMask.indexOfObject(name); + if (index >= 0) { // Remove mixing. + this.boneMask.splice(index, 1); + } + + if (recursive) { + Bone currentBone = armature.getBone(name); + if (currentBone != null) { + if (this.boneMask.size() > 0) { // Remove recursive mixing. + for (Bone bone : armature.getBones()) { + int index2 = this.boneMask.indexOfObject(bone.name); + if (index2 >= 0 && currentBone.contains(bone)) { + this.boneMask.splice(index2, 1); + } + } + } else { // Add unrecursive mixing. + for (Bone bone : armature.getBones()) { + if (bone == currentBone) { + continue; + } + + if (!currentBone.contains(bone)) { + this.boneMask.add(bone.name); + } + } + } + } + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/AnimationData.java b/dragonbones-core/src/main/java/com/dragonbones/model/AnimationData.java new file mode 100644 index 0000000..6d44a68 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/AnimationData.java @@ -0,0 +1,249 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.Array; +import com.dragonbones.util.BoolArray; +import com.dragonbones.util.IntArray; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 动画数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class AnimationData extends BaseObject { + /** + * @private + */ + public int frameIntOffset; // FrameIntArray. + /** + * @private + */ + public int frameFloatOffset; // FrameFloatArray. + /** + * @private + */ + public int frameOffset; // FrameArray. + /** + * 持续的帧数。 ([1~N]) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public int frameCount; + /** + * 播放次数。 [0: 无限循环播放, [1~N]: 循环播放 N 次] + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public int playTimes; + /** + * 持续时间。 (以秒为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float duration; + /** + * @private + */ + public float scale; + /** + * 淡入时间。 (以秒为单位) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float fadeInTime; + /** + * @private + */ + public float cacheFrameRate; + /** + * 数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + public BoolArray cachedFrames = new BoolArray(); + /** + * @private + */ + public final Map> boneTimelines = new HashMap<>(); + /** + * @private + */ + public final Map> slotTimelines = new HashMap<>(); + /** + * @private + */ + public final Map boneCachedFrameIndices = new HashMap<>(); + /** + * @private + */ + public final Map slotCachedFrameIndices = new HashMap<>(); + /** + * @private + */ + @Nullable + public TimelineData actionTimeline = null; // Initial value. + /** + * @private + */ + @Nullable + public TimelineData zOrderTimeline = null; // Initial value. + /** + * @private + */ + public ArmatureData parent; + + /** + * @private + */ + protected void _onClear() { + for (String k : this.boneTimelines.keySet()) { + Array timelineData = this.boneTimelines.get(k); + for (int kA = 0; kA < timelineData.size(); kA++) { + timelineData.get(kA).returnToPool(); + } + + this.boneTimelines.remove(k); + } + + for (String k : this.slotTimelines.keySet()) { + for (int kA = 0; kA < this.slotTimelines.size(); kA++) { + this.slotTimelines.get(k).get(kA).returnToPool(); + } + + this.slotTimelines.remove(k); + } + + this.boneCachedFrameIndices.clear(); + this.slotCachedFrameIndices.clear(); + + if (this.actionTimeline != null) { + this.actionTimeline.returnToPool(); + } + + if (this.zOrderTimeline != null) { + this.zOrderTimeline.returnToPool(); + } + + this.frameIntOffset = 0; + this.frameFloatOffset = 0; + this.frameOffset = 0; + this.frameCount = 0; + this.playTimes = 0; + this.duration = 0f; + this.scale = 1f; + this.fadeInTime = 0f; + this.cacheFrameRate = 0f; + this.name = ""; + this.cachedFrames.clear(); + //this.boneTimelines.clear(); + //this.slotTimelines.clear(); + //this.boneCachedFrameIndices.clear(); + //this.slotCachedFrameIndices.clear(); + this.actionTimeline = null; + this.zOrderTimeline = null; + this.parent = null; // + } + + /** + * @private + */ + public void cacheFrames(float frameRate) { + if (this.cacheFrameRate > 0f) { // TODO clear cache. + return; + } + + this.cacheFrameRate = (float) Math.max(Math.ceil(frameRate * this.scale), 1f); + int cacheFrameCount = (int) (Math.ceil(this.cacheFrameRate * this.duration) + 1); // Cache one more frame. + + this.cachedFrames.setLength(cacheFrameCount); + for (int i = 0, l = this.cachedFrames.size(); i < l; ++i) { + this.cachedFrames.setBool(i, false); + } + + for (BoneData bone : this.parent.sortedBones) { + IntArray indices = new IntArray(cacheFrameCount); + for (int i = 0, l = indices.size(); i < l; ++i) { + indices.set(i, -1); + } + + this.boneCachedFrameIndices.put(bone.name, indices); + } + + for (SlotData slot : this.parent.sortedSlots) { + IntArray indices = new IntArray(cacheFrameCount); + for (int i = 0, l = indices.size(); i < l; ++i) { + indices.set(i, -1); + } + + this.slotCachedFrameIndices.put(slot.name, indices); + } + } + + /** + * @private + */ + public void addBoneTimeline(BoneData bone, TimelineData timeline) { + if (!this.boneTimelines.containsKey(bone.name)) { + this.boneTimelines.put(bone.name, new Array<>()); + } + Array timelines = this.boneTimelines.get(bone.name); + if (timelines.indexOf(timeline) < 0) { + timelines.add(timeline); + } + } + + /** + * @private + */ + public void addSlotTimeline(SlotData slot, TimelineData timeline) { + if (!this.slotTimelines.containsKey(slot.name)) { + this.slotTimelines.put(slot.name, new Array<>()); + } + Array timelines = this.slotTimelines.get(slot.name); + if (timelines.indexOf(timeline) < 0) { + timelines.add(timeline); + } + } + + /** + * @private + */ + public Array getBoneTimelines(String name) { + return this.boneTimelines.get(name); + } + + /** + * @private + */ + public Array getSlotTimeline(String name) { + return this.slotTimelines.get(name); + } + + /** + * @private + */ + public IntArray getBoneCachedFrameIndices(String name) { + return this.boneCachedFrameIndices.get(name); + } + + /** + * @private + */ + public IntArray getSlotCachedFrameIndices(String name) { + return this.slotCachedFrameIndices.get(name); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureData.java b/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureData.java new file mode 100644 index 0000000..4d09ef9 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureData.java @@ -0,0 +1,417 @@ +package com.dragonbones.model; + +import com.dragonbones.core.ArmatureType; +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Rectangle; +import com.dragonbones.geom.Transform; +import com.dragonbones.util.Array; +import com.dragonbones.util.Console; +import com.dragonbones.util.FloatArray; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 骨架数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class ArmatureData extends BaseObject { + /** + * @private + */ + public ArmatureType type; + /** + * 动画帧率。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float frameRate; + /** + * @private + */ + public float cacheFrameRate; + /** + * @private + */ + public float scale; + /** + * 数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + public final Rectangle aabb = new Rectangle(); + /** + * 所有动画数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public final Array animationNames = new Array<>(); + /** + * @private + */ + public final Array sortedBones = new Array<>(); + /** + * @private + */ + public final Array sortedSlots = new Array<>(); + /** + * @private + */ + public final Array defaultActions = new Array<>(); + /** + * @private + */ + public final Array actions = new Array<>(); + /** + * 所有骨骼数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see BoneData + */ + public final Map bones = new HashMap<>(); + /** + * 所有插槽数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see SlotData + */ + public final Map slots = new HashMap<>(); + /** + * 所有皮肤数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see SkinData + */ + public final Map skins = new HashMap<>(); + /** + * 所有动画数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationData + */ + public final Map animations = new HashMap<>(); + /** + * 获取默认皮肤数据。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see SkinData + */ + @Nullable + public SkinData defaultSkin; + /** + * 获取默认动画数据。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see AnimationData + */ + @Nullable + public AnimationData defaultAnimation; + /** + * @private + */ + @Nullable + public CanvasData canvas = null; // Initial value. + /** + * @private + */ + @Nullable + public UserData userData = null; // Initial value. + /** + * 所属的龙骨数据。 + * + * @version DragonBones 4.5 + * @language zh_CN + * @see DragonBonesData + */ + public DragonBonesData parent; + + /** + * @private + */ + protected void _onClear() { + for (ActionData action : this.defaultActions) { + action.returnToPool(); + } + + for (ActionData action : this.actions) { + action.returnToPool(); + } + + for (String k : this.bones.keySet()) { + this.bones.get(k).returnToPool(); + this.bones.remove(k); + } + + for (String k : this.slots.keySet()) { + this.slots.get(k).returnToPool(); + this.slots.remove(k); + } + + for (String k : this.skins.keySet()) { + this.skins.get(k).returnToPool(); + this.skins.remove(k); + } + + for (String k : this.animations.keySet()) { + this.animations.get(k).returnToPool(); + this.animations.remove(k); + } + + if (this.canvas != null) { + this.canvas.returnToPool(); + } + + if (this.userData != null) { + this.userData.returnToPool(); + } + + this.type = ArmatureType.Armature; + this.frameRate = 0; + this.cacheFrameRate = 0; + this.scale = 1f; + this.name = ""; + this.aabb.clear(); + this.animationNames.clear(); + this.sortedBones.clear(); + this.sortedSlots.clear(); + this.defaultActions.clear(); + this.actions.clear(); + //this.bones.clear(); + //this.slots.clear(); + //this.skins.clear(); + //this.animations.clear(); + this.defaultSkin = null; + this.defaultAnimation = null; + this.canvas = null; + this.userData = null; + this.parent = null; // + } + + /** + * @private + */ + public void sortBones() { + int total = this.sortedBones.size(); + if (total <= 0) { + return; + } + + Array sortHelper = this.sortedBones.copy(); + int index = 0; + int count = 0; + this.sortedBones.clear(); + while (count < total) { + BoneData bone = sortHelper.get(index++); + if (index >= total) { + index = 0; + } + + if (this.sortedBones.indexOfObject(bone) >= 0) { + continue; + } + + if (bone.constraints.size() > 0) { // Wait constraint. + boolean flag = false; + for (ConstraintData constraint : bone.constraints) { + if (this.sortedBones.indexOf(constraint.target) < 0) { + flag = true; + } + } + + if (flag) { + continue; + } + } + + if (bone.parent != null && this.sortedBones.indexOf(bone.parent) < 0) { // Wait parent. + continue; + } + + this.sortedBones.add(bone); + count++; + } + } + + /** + * @private + */ + public void cacheFrames(float frameRate) { + if (this.cacheFrameRate > 0) { // TODO clear cache. + return; + } + + this.cacheFrameRate = frameRate; + for (String k : this.animations.keySet()) { + this.animations.get(k).cacheFrames(this.cacheFrameRate); + } + } + + /** + * @private + */ + public int setCacheFrame(Matrix globalTransformMatrix, Transform transform) { + FloatArray dataArray = this.parent.cachedFrames; + int arrayOffset = dataArray.size(); + + dataArray.setLength(dataArray.size() + 10); + dataArray.set(arrayOffset + 0, globalTransformMatrix.a); + dataArray.set(arrayOffset + 1, globalTransformMatrix.b); + dataArray.set(arrayOffset + 2, globalTransformMatrix.c); + dataArray.set(arrayOffset + 3, globalTransformMatrix.d); + dataArray.set(arrayOffset + 4, globalTransformMatrix.tx); + dataArray.set(arrayOffset + 5, globalTransformMatrix.ty); + dataArray.set(arrayOffset + 6, transform.rotation); + dataArray.set(arrayOffset + 7, transform.skew); + dataArray.set(arrayOffset + 8, transform.scaleX); + dataArray.set(arrayOffset + 9, transform.scaleY); + + return arrayOffset; + } + + /** + * @private + */ + public void getCacheFrame(Matrix globalTransformMatrix, Transform transform, int arrayOffset) { + FloatArray dataArray = this.parent.cachedFrames; + globalTransformMatrix.a = dataArray.get(arrayOffset); + globalTransformMatrix.b = dataArray.get(arrayOffset + 1); + globalTransformMatrix.c = dataArray.get(arrayOffset + 2); + globalTransformMatrix.d = dataArray.get(arrayOffset + 3); + globalTransformMatrix.tx = dataArray.get(arrayOffset + 4); + globalTransformMatrix.ty = dataArray.get(arrayOffset + 5); + transform.rotation = dataArray.get(arrayOffset + 6); + transform.skew = dataArray.get(arrayOffset + 7); + transform.scaleX = dataArray.get(arrayOffset + 8); + transform.scaleY = dataArray.get(arrayOffset + 9); + transform.x = globalTransformMatrix.tx; + transform.y = globalTransformMatrix.ty; + } + + /** + * @private + */ + public void addBone(BoneData value) { + if (this.bones.containsKey(value.name)) { + Console.warn("Replace bone: " + value.name); + this.bones.get(value.name).returnToPool(); + } + + this.bones.put(value.name, value); + this.sortedBones.add(value); + } + + /** + * @private + */ + public void addSlot(SlotData value) { + if (this.slots.containsKey(value.name)) { + Console.warn("Replace slot: " + value.name); + this.slots.get(value.name).returnToPool(); + } + + this.slots.put(value.name, value); + this.sortedSlots.add(value); + } + + /** + * @private + */ + public void addSkin(SkinData value) { + if (this.skins.containsKey(value.name)) { + Console.warn("Replace skin: " + value.name); + this.skins.get(value.name).returnToPool(); + } + + this.skins.put(value.name, value); + if (this.defaultSkin == null) { + this.defaultSkin = value; + } + } + + /** + * @private + */ + public void addAnimation(AnimationData value) { + if (this.animations.containsKey(value.name)) { + Console.warn("Replace animation: " + value.name); + this.animations.get(value.name).returnToPool(); + } + + value.parent = this; + this.animations.put(value.name, value); + this.animationNames.add(value.name); + if (this.defaultAnimation == null) { + this.defaultAnimation = value; + } + } + + /** + * 获取骨骼数据。 + * + * @param name 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see BoneData + */ + @Nullable + public BoneData getBone(String name) { + return this.bones.get(name); + } + + /** + * 获取插槽数据。 + * + * @param name 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see SlotData + */ + @Nullable + public SlotData getSlot(String name) { + return this.slots.get(name); + } + + /** + * 获取皮肤数据。 + * + * @param name 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see SkinData + */ + @Nullable + public SkinData getSkin(String name) { + return this.skins.get(name); + } + + /** + * 获取动画数据。 + * + * @param name 数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see AnimationData + */ + @Nullable + public AnimationData getAnimation(String name) { + return this.animations.get(name); + } +} + diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureDisplayData.java b/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureDisplayData.java new file mode 100644 index 0000000..0475a5a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/ArmatureDisplayData.java @@ -0,0 +1,28 @@ +package com.dragonbones.model; + +import com.dragonbones.core.DisplayType; +import com.dragonbones.util.Array; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class ArmatureDisplayData extends DisplayData { + public boolean inheritAnimation; + public final Array actions = new Array<>(); + @Nullable + public ArmatureData armature; + + protected void _onClear() { + super._onClear(); + + for (ActionData action : this.actions) { + action.returnToPool(); + } + + this.type = DisplayType.Armature; + this.inheritAnimation = false; + this.actions.clear(); + this.armature = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/BoneData.java b/dragonbones-core/src/main/java/com/dragonbones/model/BoneData.java new file mode 100644 index 0000000..f422ec2 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/BoneData.java @@ -0,0 +1,87 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Transform; +import com.dragonbones.util.Array; +import org.jetbrains.annotations.Nullable; + +/** + * 骨骼数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class BoneData extends BaseObject { + /** + * @private + */ + public boolean inheritTranslation; + /** + * @private + */ + public boolean inheritRotation; + /** + * @private + */ + public boolean inheritScale; + /** + * @private + */ + public boolean inheritReflection; + /** + * @private + */ + public float length; + /** + * 数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + public final Transform transform = new Transform(); + /** + * @private + */ + public final Array constraints = new Array<>(); + /** + * @private + */ + @Nullable + public UserData userData = null; // Initial value. + /** + * 所属的父骨骼数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + @Nullable + public BoneData parent; + + /** + * @private + */ + protected void _onClear() { + for (ConstraintData constraint : this.constraints) { + constraint.returnToPool(); + } + + if (this.userData != null) { + this.userData.returnToPool(); + } + + this.inheritTranslation = false; + this.inheritRotation = false; + this.inheritScale = false; + this.inheritReflection = false; + this.length = 0f; + this.name = ""; + this.transform.identity(); + this.constraints.clear(); + this.userData = null; + this.parent = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxData.java b/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxData.java new file mode 100644 index 0000000..581241b --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxData.java @@ -0,0 +1,74 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.BoundingBoxType; +import com.dragonbones.geom.Point; +import org.jetbrains.annotations.Nullable; + +/** + * 边界框数据基类。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ +public abstract class BoundingBoxData extends BaseObject { + /** + * 边界框类型。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public BoundingBoxType type; + /** + * 边界框颜色。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public int color; + /** + * 边界框宽。(本地坐标系) + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public float width; + /** + * 边界框高。(本地坐标系) + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public float height; + + /** + * @private + */ + protected void _onClear() { + this.color = 0x000000; + this.width = 0f; + this.height = 0f; + } + + /** + * 是否包含点。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public abstract boolean containsPoint(float pX, float pY); + + /** + * 是否与线段相交。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public abstract int intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ); +} + diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxDisplayData.java b/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxDisplayData.java new file mode 100644 index 0000000..54c57f4 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/BoundingBoxDisplayData.java @@ -0,0 +1,23 @@ +package com.dragonbones.model; + +import com.dragonbones.core.DisplayType; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class BoundingBoxDisplayData extends DisplayData { + @Nullable + public BoundingBoxData boundingBox = null; // Initial value. + + protected void _onClear() { + super._onClear(); + + if (this.boundingBox != null) { + this.boundingBox.returnToPool(); + } + + this.type = DisplayType.BoundingBox; + this.boundingBox = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/CanvasData.java b/dragonbones-core/src/main/java/com/dragonbones/model/CanvasData.java new file mode 100644 index 0000000..e5746dd --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/CanvasData.java @@ -0,0 +1,27 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; + +/** + * @private + */ +public class CanvasData extends BaseObject { + public boolean hasBackground; + public int color; + public float x; + public float y; + public float width; + public float height; + + /** + * @private + */ + protected void _onClear() { + this.hasBackground = false; + this.color = 0x000000; + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } +} \ No newline at end of file diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/ConstraintData.java b/dragonbones-core/src/main/java/com/dragonbones/model/ConstraintData.java new file mode 100644 index 0000000..1f3a797 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/ConstraintData.java @@ -0,0 +1,22 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public abstract class ConstraintData extends BaseObject { + public float order; + public BoneData target; + public BoneData bone; + @Nullable + public BoneData root; + + protected void _onClear() { + this.order = 0; + this.target = null; // + this.bone = null; // + this.root = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/DisplayData.java b/dragonbones-core/src/main/java/com/dragonbones/model/DisplayData.java new file mode 100644 index 0000000..349c506 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/DisplayData.java @@ -0,0 +1,24 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.DisplayType; +import com.dragonbones.geom.Transform; + +/** + * @private + */ +public abstract class DisplayData extends BaseObject { + public DisplayType type; + public String name; + public String path; + public final Transform transform = new Transform(); + public ArmatureData parent; + + protected void _onClear() { + this.name = ""; + this.path = ""; + this.transform.identity(); + this.parent = null; // + } +} + diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/DragonBonesData.java b/dragonbones-core/src/main/java/com/dragonbones/model/DragonBonesData.java new file mode 100644 index 0000000..8cb2a5d --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/DragonBonesData.java @@ -0,0 +1,166 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.*; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 龙骨数据。 + * 一个龙骨数据包含多个骨架数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData + */ +public class DragonBonesData extends BaseObject { + /** + * 是否开启共享搜索。 + * + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + public boolean autoSearch; + /** + * 动画帧频。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float frameRate; + /** + * 数据版本。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String version; + /** + * 数据名称。(该名称与龙骨项目名保持一致) + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + public final IntArray frameIndices = new IntArray(); + /** + * @private + */ + public final FloatArray cachedFrames = new FloatArray(); + /** + * 所有骨架数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see #armatures + */ + public final Array armatureNames = new Array<>(); + /** + * 所有骨架数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData + */ + public final Map armatures = new HashMap<>(); + /** + * @private + */ + public ShortArray intArray; + /** + * @private + */ + public FloatArray floatArray; + /** + * @private + */ + public ShortArray frameIntArray; + /** + * @private + */ + public FloatArray frameFloatArray; + /** + * @private + */ + public ShortArray frameArray; + /** + * @private + */ + public CharArray timelineArray; + /** + * @private + */ + @Nullable + public UserData userData = null; // Initial value. + + /** + * @private + */ + protected void _onClear() { + for (String k : this.armatures.keySet()) { + this.armatures.get(k).returnToPool(); + this.armatures.remove(k); + } + + if (this.userData != null) { + this.userData.returnToPool(); + } + + this.autoSearch = false; + this.frameRate = 0; + this.version = ""; + this.name = ""; + this.frameIndices.clear(); + this.cachedFrames.clear(); + this.armatureNames.clear(); + //this.armatures.clear(); + this.intArray = null; // + this.floatArray = null; // + this.frameIntArray = null; // + this.frameFloatArray = null; // + this.frameArray = null; // + this.timelineArray = null; // + this.userData = null; + } + + /** + * @private + */ + public void addArmature(ArmatureData value) { + if (this.armatures.containsKey(value.name)) { + Console.warn("Replace armature: " + value.name); + this.armatures.get(value.name).returnToPool(); + } + + value.parent = this; + this.armatures.put(value.name, value); + this.armatureNames.add(value.name); + } + + /** + * 获取骨架数据。 + * + * @param name 骨架数据名称。 + * @version DragonBones 3.0 + * @language zh_CN + * @see ArmatureData + */ + @Nullable + public ArmatureData getArmature(String name) { + return this.armatures.get(name); + } + + /** + * @deprecated 已废弃,请参考 @see + */ + public void dispose() { + Console.warn("已废弃,请参考 @see"); + this.returnToPool(); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/EllipseBoundingBoxData.java b/dragonbones-core/src/main/java/com/dragonbones/model/EllipseBoundingBoxData.java new file mode 100644 index 0000000..c9ad4d4 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/EllipseBoundingBoxData.java @@ -0,0 +1,176 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BoundingBoxType; +import com.dragonbones.geom.Point; +import org.jetbrains.annotations.Nullable; + +/** + * 椭圆边界框。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ +public class EllipseBoundingBoxData extends BoundingBoxData { + public static int ellipseIntersectsSegment( + float xA, float yA, float xB, float yB, + float xC, float yC, float widthH, float heightH + ) { + return ellipseIntersectsSegment(xA, yA, xB, yB, xC, yC, widthH, heightH, null, null, null); + } + + /** + * @private + */ + public static int ellipseIntersectsSegment( + float xA, float yA, float xB, float yB, + float xC, float yC, float widthH, float heightH, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + float d = widthH / heightH; + float dd = d * d; + + yA *= d; + yB *= d; + + float dX = xB - xA; + float dY = yB - yA; + float lAB = (float) Math.sqrt(dX * dX + dY * dY); + float xD = dX / lAB; + float yD = dY / lAB; + float a = (xC - xA) * xD + (yC - yA) * yD; + float aa = a * a; + float ee = xA * xA + yA * yA; + float rr = widthH * widthH; + float dR = rr - ee + aa; + int intersectionCount = 0; + + if (dR >= 0f) { + float dT = (float) Math.sqrt(dR); + float sA = a - dT; + float sB = a + dT; + float inSideA = sA < 0f ? -1 : (sA <= lAB ? 0 : 1); + float inSideB = sB < 0f ? -1 : (sB <= lAB ? 0 : 1); + float sideAB = inSideA * inSideB; + + if (sideAB < 0) { + return -1; + } else if (sideAB == 0) { + if (inSideA == -1) { + intersectionCount = 2; // 10 + xB = xA + sB * xD; + yB = (yA + sB * yD) / d; + + if (intersectionPointA != null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + + if (normalRadians != null) { + normalRadians.x = (float) Math.atan2(yB / rr * dd, xB / rr); + normalRadians.y = (float) (normalRadians.x + Math.PI); + } + } else if (inSideB == 1) { + intersectionCount = 1; // 01 + xA = xA + sA * xD; + yA = (yA + sA * yD) / d; + + if (intersectionPointA != null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + + if (normalRadians != null) { + normalRadians.x = (float) Math.atan2(yA / rr * dd, xA / rr); + normalRadians.y = (float) (normalRadians.x + Math.PI); + } + } else { + intersectionCount = 3; // 11 + + if (intersectionPointA != null) { + intersectionPointA.x = xA + sA * xD; + intersectionPointA.y = (yA + sA * yD) / d; + + if (normalRadians != null) { + normalRadians.x = (float) Math.atan2(intersectionPointA.y / rr * dd, intersectionPointA.x / rr); + } + } + + if (intersectionPointB != null) { + intersectionPointB.x = xA + sB * xD; + intersectionPointB.y = (yA + sB * yD) / d; + + if (normalRadians != null) { + normalRadians.y = (float) Math.atan2(intersectionPointB.y / rr * dd, intersectionPointB.x / rr); + } + } + } + } + } + + return intersectionCount; + } + + /** + * @private + */ + protected void _onClear() + + { + super._onClear(); + + this.type = BoundingBoxType.Ellipse; + } + + /** + * @inherDoc + */ + public boolean containsPoint(float pX, float pY) + + { + float widthH = (float) (this.width * 0.5); + if (pX >= -widthH && pX <= widthH) { + float heightH = (float) (this.height * 0.5); + if (pY >= -heightH && pY <= heightH) { + pY *= widthH / heightH; + return Math.sqrt(pX * pX + pY * pY) <= widthH; + } + } + + return false; + } + + public int intersectsSegment(float xA, float yA, float xB, float yB) { + return intersectsSegment(xA, yA, xB, yB, null, null, null); + } + + + /** + * @inherDoc + */ + public int intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) + + { + return EllipseBoundingBoxData.ellipseIntersectsSegment( + xA, yA, xB, yB, + 0f, 0f, this.width * 0.5f, this.height * 0.5f, + intersectionPointA, intersectionPointB, normalRadians + ); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/IKConstraintData.java b/dragonbones-core/src/main/java/com/dragonbones/model/IKConstraintData.java new file mode 100644 index 0000000..dfa2e3c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/IKConstraintData.java @@ -0,0 +1,18 @@ +package com.dragonbones.model; + +/** + * @private + */ +public class IKConstraintData extends ConstraintData { + public boolean bendPositive; + public boolean scaleEnabled; + public float weight; + + protected void _onClear() { + super._onClear(); + + this.bendPositive = false; + this.scaleEnabled = false; + this.weight = 1f; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/ImageDisplayData.java b/dragonbones-core/src/main/java/com/dragonbones/model/ImageDisplayData.java new file mode 100644 index 0000000..dd950ca --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/ImageDisplayData.java @@ -0,0 +1,22 @@ +package com.dragonbones.model; + +import com.dragonbones.core.DisplayType; +import com.dragonbones.geom.Point; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class ImageDisplayData extends DisplayData { + public final Point pivot = new Point(); + @Nullable + public TextureData texture; + + protected void _onClear() { + super._onClear(); + + this.type = DisplayType.Image; + this.pivot.clear(); + this.texture = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/MeshDisplayData.java b/dragonbones-core/src/main/java/com/dragonbones/model/MeshDisplayData.java new file mode 100644 index 0000000..0e9abb6 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/MeshDisplayData.java @@ -0,0 +1,27 @@ +package com.dragonbones.model; + +import com.dragonbones.core.DisplayType; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public class MeshDisplayData extends ImageDisplayData { + public boolean inheritAnimation; + public int offset; // IntArray. + @Nullable + public WeightData weight = null; // Initial value. + + protected void _onClear() { + super._onClear(); + + if (this.weight != null) { + this.weight.returnToPool(); + } + + this.type = DisplayType.Mesh; + this.inheritAnimation = false; + this.offset = 0; + this.weight = null; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/OutCode.java b/dragonbones-core/src/main/java/com/dragonbones/model/OutCode.java new file mode 100644 index 0000000..32af953 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/OutCode.java @@ -0,0 +1,25 @@ +package com.dragonbones.model; + +/** + * Cohen–Sutherland algorithm https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm + * ---------------------- + * | 0101 | 0100 | 0110 | + * ---------------------- + * | 0001 | 0000 | 0010 | + * ---------------------- + * | 1001 | 1000 | 1010 | + * ---------------------- + */ +public enum OutCode { + InSide(0), // 0000 + Left(1), // 0001 + Right(2), // 0010 + Top(4), // 0100 + Bottom(8); // 1000 + + public final int v; + + OutCode(int v) { + this.v = v; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/PolygonBoundingBoxData.java b/dragonbones-core/src/main/java/com/dragonbones/model/PolygonBoundingBoxData.java new file mode 100644 index 0000000..f8908a5 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/PolygonBoundingBoxData.java @@ -0,0 +1,266 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BoundingBoxType; +import com.dragonbones.geom.Point; +import com.dragonbones.util.FloatArray; +import org.jetbrains.annotations.Nullable; + +/** + * 多边形边界框。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ +public class PolygonBoundingBoxData extends BoundingBoxData { + public static int polygonIntersectsSegment( + float xA, float yA, float xB, float yB, + FloatArray vertices, int offset, int count + ) { + return polygonIntersectsSegment(xA, yA, xB, yB, vertices, offset, count, null, null, null); + } + + /** + * @private + */ + public static int polygonIntersectsSegment( + float xA, float yA, float xB, float yB, + FloatArray vertices, int offset, int count, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + if (xA == xB) { + xA = xB + 0.000001f; + } + + if (yA == yB) { + yA = yB + 0.000001f; + } + + final float dXAB = xA - xB; + final float dYAB = yA - yB; + final float llAB = xA * yB - yA * xB; + int intersectionCount = 0; + float xC = vertices.get(offset + count - 2); + float yC = vertices.get(offset + count - 1); + float dMin = 0f; + float dMax = 0f; + float xMin = 0f; + float yMin = 0f; + float xMax = 0f; + float yMax = 0f; + + for (int i = 0; i < count; i += 2) { + float xD = vertices.get(offset + i); + float yD = vertices.get(offset + i + 1); + + if (xC == xD) { + xC = xD + 0.0001f; + } + + if (yC == yD) { + yC = yD + 0.0001f; + } + + float dXCD = xC - xD; + float dYCD = yC - yD; + float llCD = xC * yD - yC * xD; + float ll = dXAB * dYCD - dYAB * dXCD; + float x = (llAB * dXCD - dXAB * llCD) / ll; + + if (((x >= xC && x <= xD) || (x >= xD && x <= xC)) && (dXAB == 0f || (x >= xA && x <= xB) || (x >= xB && x <= xA))) { + float y = (llAB * dYCD - dYAB * llCD) / ll; + if (((y >= yC && y <= yD) || (y >= yD && y <= yC)) && (dYAB == 0f || (y >= yA && y <= yB) || (y >= yB && y <= yA))) { + if (intersectionPointB != null) { + float d = x - xA; + if (d < 0f) { + d = -d; + } + + if (intersectionCount == 0) { + dMin = d; + dMax = d; + xMin = x; + yMin = y; + xMax = x; + yMax = y; + + if (normalRadians != null) { + normalRadians.x = (float) (Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5f); + normalRadians.y = normalRadians.x; + } + } else { + if (d < dMin) { + dMin = d; + xMin = x; + yMin = y; + + if (normalRadians != null) { + normalRadians.x = (float) (Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5f); + } + } + + if (d > dMax) { + dMax = d; + xMax = x; + yMax = y; + + if (normalRadians != null) { + normalRadians.y = (float) (Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5f); + } + } + } + + intersectionCount++; + } else { + xMin = x; + yMin = y; + xMax = x; + yMax = y; + intersectionCount++; + + if (normalRadians != null) { + normalRadians.x = (float) (Math.atan2(yD - yC, xD - xC) - Math.PI * 0.5f); + normalRadians.y = normalRadians.x; + } + break; + } + } + } + + xC = xD; + yC = yD; + } + + if (intersectionCount == 1) { + if (intersectionPointA != null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xMin; + intersectionPointB.y = yMin; + } + + if (normalRadians != null) { + normalRadians.y = (float) (normalRadians.x + Math.PI); + } + } else if (intersectionCount > 1) { + intersectionCount++; + + if (intersectionPointA != null) { + intersectionPointA.x = xMin; + intersectionPointA.y = yMin; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xMax; + intersectionPointB.y = yMax; + } + } + + return intersectionCount; + } + + /** + * @private + */ + public int count; + /** + * @private + */ + public int offset; // FloatArray. + /** + * @private + */ + public float x; + /** + * @private + */ + public float y; + /** + * 多边形顶点。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ + public FloatArray vertices; // FloatArray. + /** + * @private + */ + @Nullable + public WeightData weight = null; // Initial value. + + /** + * @private + */ + protected void _onClear() + + { + super._onClear(); + + if (this.weight != null) { + this.weight.returnToPool(); + } + + this.type = BoundingBoxType.Polygon; + this.count = 0; + this.offset = 0; + this.x = 0f; + this.y = 0f; + this.vertices = null; // + this.weight = null; + } + + /** + * @inherDoc + */ + public boolean containsPoint(float pX, float pY) + + { + boolean isInSide = false; + if (pX >= this.x && pX <= this.width && pY >= this.y && pY <= this.height) { + for (int i = 0, l = this.count, iP = l - 2; i < l; i += 2) { + float yA = this.vertices.get(this.offset + iP + 1); + float yB = this.vertices.get(this.offset + i + 1); + if ((yB < pY && yA >= pY) || (yA < pY && yB >= pY)) { + float xA = this.vertices.get(this.offset + iP); + float xB = this.vertices.get(this.offset + i); + if ((pY - yB) * (xA - xB) / (yA - yB) + xB < pX) { + isInSide = !isInSide; + } + } + + iP = i; + } + } + + return isInSide; + } + + public int intersectsSegment(float xA, float yA, float xB, float yB) { + return intersectsSegment(xA, yA, xB, yB, null, null, null); + } + + /** + * @inherDoc + */ + public int intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + int intersectionCount = 0; + if (RectangleBoundingBoxData.rectangleIntersectsSegment(xA, yA, xB, yB, this.x, this.y, this.width, this.height, null, null, null) != 0) { + intersectionCount = PolygonBoundingBoxData.polygonIntersectsSegment( + xA, yA, xB, yB, + this.vertices, this.offset, this.count, + intersectionPointA, intersectionPointB, normalRadians + ); + } + + return intersectionCount; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/RectangleBoundingBoxData.java b/dragonbones-core/src/main/java/com/dragonbones/model/RectangleBoundingBoxData.java new file mode 100644 index 0000000..df8416f --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/RectangleBoundingBoxData.java @@ -0,0 +1,231 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BoundingBoxType; +import com.dragonbones.geom.Point; +import org.jetbrains.annotations.Nullable; + +/** + * 矩形边界框。 + * + * @version DragonBones 5.1 + * @language zh_CN + */ +public class RectangleBoundingBoxData extends BoundingBoxData { + /** + * Compute the bit code for a point (x, y) using the clip rectangle + */ + private static int _computeOutCode(float x, float y, float xMin, float yMin, float xMax, float yMax) { + int code = OutCode.InSide.v; // initialised as being inside of [[clip window]] + + if (x < xMin) { // to the left of clip window + code |= OutCode.Left.v; + } else if (x > xMax) { // to the right of clip window + code |= OutCode.Right.v; + } + + if (y < yMin) { // below the clip window + code |= OutCode.Top.v; + } else if (y > yMax) { // above the clip window + code |= OutCode.Bottom.v; + } + + return code; + } + + public static int rectangleIntersectsSegment( + float xA, float yA, float xB, float yB, + float xMin, float yMin, float xMax, float yMax + ) { + return rectangleIntersectsSegment(xA, yA, xB, yB, xMin, yMin, xMax, yMax, null, null, null); + } + + /** + * @private + */ + public static int rectangleIntersectsSegment( + float xA, float yA, float xB, float yB, + float xMin, float yMin, float xMax, float yMax, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + boolean inSideA = xA > xMin && xA < xMax && yA > yMin && yA < yMax; + boolean inSideB = xB > xMin && xB < xMax && yB > yMin && yB < yMax; + + if (inSideA && inSideB) { + return -1; + } + + int intersectionCount = 0; + int outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + int outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + + while (true) { + if ((outcode0 | outcode1) == 0) { // Bitwise OR is 0. Trivially accept and get out of loop + intersectionCount = 2; + break; + } else if ((outcode0 & outcode1) != 0) { // Bitwise AND is not 0. Trivially reject and get out of loop + break; + } + + // failed both tests, so calculate the line segment to clip + // from an outside point to an intersection with clip edge + float x = 0f; + float y = 0f; + float normalRadian = 0f; + + // At least one endpoint is outside the clip rectangle; pick it. + final int outcodeOut = outcode0 != 0 ? outcode0 : outcode1; + + // Now find the intersection point; + if ((outcodeOut & OutCode.Top.v) != 0) { // point is above the clip rectangle + x = xA + (xB - xA) * (yMin - yA) / (yB - yA); + y = yMin; + + if (normalRadians != null) { + normalRadian = (float) (-Math.PI * 0.5); + } + } else if ((outcodeOut & OutCode.Bottom.v) != 0) { // point is below the clip rectangle + x = xA + (xB - xA) * (yMax - yA) / (yB - yA); + y = yMax; + + if (normalRadians != null) { + normalRadian = (float) (Math.PI * 0.5); + } + } else if ((outcodeOut & OutCode.Right.v) != 0) { // point is to the right of clip rectangle + y = yA + (yB - yA) * (xMax - xA) / (xB - xA); + x = xMax; + + if (normalRadians != null) { + normalRadian = 0; + } + } else if ((outcodeOut & OutCode.Left.v) != 0) { // point is to the left of clip rectangle + y = yA + (yB - yA) * (xMin - xA) / (xB - xA); + x = xMin; + + if (normalRadians != null) { + normalRadian = (float) Math.PI; + } + } + + // Now we move outside point to intersection point to clip + // and get ready for next pass. + if (outcodeOut == outcode0) { + xA = x; + yA = y; + outcode0 = RectangleBoundingBoxData._computeOutCode(xA, yA, xMin, yMin, xMax, yMax); + + if (normalRadians != null) { + normalRadians.x = normalRadian; + } + } else { + xB = x; + yB = y; + outcode1 = RectangleBoundingBoxData._computeOutCode(xB, yB, xMin, yMin, xMax, yMax); + + if (normalRadians != null) { + normalRadians.y = normalRadian; + } + } + } + + if (intersectionCount != 0) { + if (inSideA) { + intersectionCount = 2; // 10 + + if (intersectionPointA != null) { + intersectionPointA.x = xB; + intersectionPointA.y = yB; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xB; + intersectionPointB.y = xB; + } + + if (normalRadians != null) { + normalRadians.x = (float) (normalRadians.y + Math.PI); + } + } else if (inSideB) { + intersectionCount = 1; // 01 + + if (intersectionPointA != null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xA; + intersectionPointB.y = yA; + } + + if (normalRadians != null) { + normalRadians.y = (float) (normalRadians.x + Math.PI); + } + } else { + intersectionCount = 3; // 11 + if (intersectionPointA != null) { + intersectionPointA.x = xA; + intersectionPointA.y = yA; + } + + if (intersectionPointB != null) { + intersectionPointB.x = xB; + intersectionPointB.y = yB; + } + } + } + + return intersectionCount; + } + + /** + * @private + */ + protected void _onClear() { + super._onClear(); + + this.type = BoundingBoxType.Rectangle; + } + + /** + * @inherDoc + */ + public boolean containsPoint(float pX, float pY) { + final float widthH = (float) (this.width * 0.5); + if (pX >= -widthH && pX <= widthH) { + final float heightH = (float) (this.height * 0.5); + if (pY >= -heightH && pY <= heightH) { + return true; + } + } + + return false; + } + + public int intersectsSegment( + float xA, float yA, float xB, float yB + ) { + return intersectsSegment(xA, yA, xB, yB, null, null, null); + } + + /** + * @inherDoc + */ + public int intersectsSegment( + float xA, float yA, float xB, float yB, + @Nullable Point intersectionPointA, + @Nullable Point intersectionPointB, + @Nullable Point normalRadians + ) { + final float widthH = (float) (this.width * 0.5); + final float heightH = (float) (this.height * 0.5); + final int intersectionCount = RectangleBoundingBoxData.rectangleIntersectsSegment( + xA, yA, xB, yB, + -widthH, -heightH, widthH, heightH, + intersectionPointA, intersectionPointB, normalRadians + ); + + return intersectionCount; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/SkinData.java b/dragonbones-core/src/main/java/com/dragonbones/model/SkinData.java new file mode 100644 index 0000000..75cebda --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/SkinData.java @@ -0,0 +1,89 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.Array; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +/** + * 皮肤数据。(通常一个骨架数据至少包含一个皮肤数据) + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public class SkinData extends BaseObject { + /** + * 数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + public final Map> displays = new HashMap<>(); + + /** + * @private + */ + protected void _onClear() { + for (String k : this.displays.keySet()) { + Array slotDisplays = this.displays.get(k); + for (DisplayData display : slotDisplays) { + if (display != null) { + display.returnToPool(); + } + } + + this.displays.remove(k); + } + + this.name = ""; + // this.displays.clear(); + } + + /** + * @private + */ + public void addDisplay(String slotName, @Nullable DisplayData value) { + if (!(this.displays.containsKey(slotName))) { + this.displays.put(slotName, new Array<>()); + } + + Array slotDisplays = this.displays.get(slotName); // TODO clear prev + slotDisplays.add(value); + } + + /** + * @private + */ + @Nullable + public DisplayData getDisplay(String slotName, String displayName) { + Array slotDisplays = this.getDisplays(slotName); + if (slotDisplays != null) { + for (DisplayData display : slotDisplays) { + if (display != null && Objects.equals(display.name, displayName)) { + return display; + } + } + } + + return null; + } + + /** + * @private + */ + @Nullable + public Array getDisplays(String slotName) { + if (!(this.displays.containsKey(slotName))) { + return null; + } + + return this.displays.get(slotName); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/SlotData.java b/dragonbones-core/src/main/java/com/dragonbones/model/SlotData.java new file mode 100644 index 0000000..e97d2a7 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/SlotData.java @@ -0,0 +1,83 @@ +package com.dragonbones.model; + +import com.dragonbones.armature.Slot; +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.BlendMode; +import com.dragonbones.geom.ColorTransform; +import org.jetbrains.annotations.Nullable; + +/** + * 插槽数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see Slot + */ +public class SlotData extends BaseObject { + /** + * @private + */ + public static final ColorTransform DEFAULT_COLOR = new ColorTransform(); + + /** + * @private + */ + public static ColorTransform createColor() { + return new ColorTransform(); + } + + /** + * @private + */ + public BlendMode blendMode; + /** + * @private + */ + public int displayIndex; + /** + * @private + */ + public float zOrder; + /** + * 数据名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * @private + */ + @Nullable + public ColorTransform color = null; // Initial value. + /** + * @private + */ + @Nullable + public UserData userData = null; // Initial value. + /** + * 所属的父骨骼数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + * @see BoneData + */ + public BoneData parent; + + /** + * @private + */ + protected void _onClear() { + if (this.userData != null) { + this.userData.returnToPool(); + } + + this.blendMode = BlendMode.Normal; + this.displayIndex = 0; + this.zOrder = 0; + this.name = ""; + this.color = null; // + this.userData = null; + this.parent = null; // + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/TextureAtlasData.java b/dragonbones-core/src/main/java/com/dragonbones/model/TextureAtlasData.java new file mode 100644 index 0000000..c8ae3d3 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/TextureAtlasData.java @@ -0,0 +1,127 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.Console; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +/** + * 贴图集数据。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ +public abstract class TextureAtlasData extends BaseObject { + /** + * 是否开启共享搜索。 + * + * @default false + * @version DragonBones 4.5 + * @language zh_CN + */ + public boolean autoSearch; + /** + * @private + */ + public float width; + /** + * @private + */ + public float height; + /** + * 贴图集缩放系数。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public float scale; + /** + * 贴图集名称。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String name; + /** + * 贴图集图片路径。 + * + * @version DragonBones 3.0 + * @language zh_CN + */ + public String imagePath; + /** + * @private + */ + public final Map textures = new HashMap<>(); + + /** + * @private + */ + protected void _onClear() { + for (String k : this.textures.keySet()) { + this.textures.get(k).returnToPool(); + this.textures.remove(k); + } + + this.autoSearch = false; + this.width = 0; + this.height = 0; + this.scale = 1f; + // this.textures.clear(); + this.name = ""; + this.imagePath = ""; + } + + /** + * @private + */ + public void copyFrom(TextureAtlasData value) { + this.autoSearch = value.autoSearch; + this.scale = value.scale; + this.width = value.width; + this.height = value.height; + this.name = value.name; + this.imagePath = value.imagePath; + + for (String k : this.textures.keySet()) { + this.textures.get(k).returnToPool(); + this.textures.remove(k); + } + + // this.textures.clear(); + + for (String k : value.textures.keySet()) { + TextureData texture = this.createTexture(); + texture.copyFrom(value.textures.get(k)); + this.textures.put(k, texture); + } + } + + /** + * @private + */ + public abstract TextureData createTexture(); + + /** + * @private + */ + public void addTexture(TextureData value) { + if (this.textures.containsKey(value.name)) { + Console.warn("Replace texture: " + value.name); + this.textures.get(value.name).returnToPool(); + } + + value.parent = this; + this.textures.put(value.name, value); + } + + /** + * @private + */ + @Nullable + public TextureData getTexture(String name) { + return this.textures.get(name); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/TextureData.java b/dragonbones-core/src/main/java/com/dragonbones/model/TextureData.java new file mode 100644 index 0000000..c30ac42 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/TextureData.java @@ -0,0 +1,46 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.geom.Rectangle; +import org.jetbrains.annotations.Nullable; + +/** + * @private + */ +public abstract class TextureData extends BaseObject { + public static Rectangle createRectangle() { + return new Rectangle(); + } + + public boolean rotated; + public String name; + public final Rectangle region = new Rectangle(); + public TextureAtlasData parent; + @Nullable + public Rectangle frame = null; // Initial value. + + protected void _onClear() { + this.rotated = false; + this.name = ""; + this.region.clear(); + this.parent = null; // + this.frame = null; + } + + public void copyFrom(TextureData value) { + this.rotated = value.rotated; + this.name = value.name; + this.region.copyFrom(value.region); + this.parent = value.parent; + + if (this.frame == null && value.frame != null) { + this.frame = TextureData.createRectangle(); + } else if (this.frame != null && value.frame == null) { + this.frame = null; + } + + if (this.frame != null && value.frame != null) { + this.frame.copyFrom(value.frame); + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/TimelineData.java b/dragonbones-core/src/main/java/com/dragonbones/model/TimelineData.java new file mode 100644 index 0000000..abe6d7c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/TimelineData.java @@ -0,0 +1,19 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.TimelineType; + +/** + * @private + */ +public class TimelineData extends BaseObject { + public TimelineType type; + public int offset; // TimelineArray. + public int frameIndicesOffset; // FrameIndices. + + protected void _onClear() { + this.type = TimelineType.BoneAll; + this.offset = 0; + this.frameIndicesOffset = -1; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/UserData.java b/dragonbones-core/src/main/java/com/dragonbones/model/UserData.java new file mode 100644 index 0000000..a02c40a --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/UserData.java @@ -0,0 +1,105 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.Array; +import com.dragonbones.util.FloatArray; +import com.dragonbones.util.IntArray; + +/** + * 自定义数据。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ +public class UserData extends BaseObject { + /** + * 自定义整数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public final IntArray ints = new IntArray(); + /** + * 自定义浮点数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public final FloatArray floats = new FloatArray(); + /** + * 自定义字符串。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public final Array strings = new Array<>(); + + /** + * @private + */ + protected void _onClear() { + this.ints.clear(); + this.floats.clear(); + this.strings.clear(); + } + + /** + * 获取自定义整数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public int getInt() { + return getInt(0); + } + + /** + * 获取自定义整数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public int getInt(int index) { + return index >= 0 && index < this.ints.size() ? this.ints.get(index) : 0; + } + + /** + * 获取自定义浮点数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public float getFloat() { + return getFloat(0); + } + + /** + * 获取自定义浮点数。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public float getFloat(int index) { + return index >= 0 && index < this.floats.size() ? this.floats.get(index) : 0f; + } + + /** + * 获取自定义字符串。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public String getString() { + return getString(0); + } + + /** + * 获取自定义字符串。 + * + * @version DragonBones 5.0 + * @language zh_CN + */ + public String getString(int index) { + return index >= 0 && index < this.strings.size() ? this.strings.get(index) : ""; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/model/WeightData.java b/dragonbones-core/src/main/java/com/dragonbones/model/WeightData.java new file mode 100644 index 0000000..d04c3a0 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/model/WeightData.java @@ -0,0 +1,19 @@ +package com.dragonbones.model; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.util.Array; + +/** + * @private + */ +public class WeightData extends BaseObject { + public int count; + public int offset; // IntArray. + public final Array bones = new Array<>(); + + protected void _onClear() { + this.count = 0; + this.offset = 0; + this.bones.clear(); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/parser/ActionFrame.java b/dragonbones-core/src/main/java/com/dragonbones/parser/ActionFrame.java new file mode 100644 index 0000000..25c287c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/parser/ActionFrame.java @@ -0,0 +1,8 @@ +package com.dragonbones.parser; + +import com.dragonbones.util.IntArray; + +class ActionFrame { + public int frameStart = 0; + public final IntArray actions = new IntArray(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/parser/BinaryDataParser.java b/dragonbones-core/src/main/java/com/dragonbones/parser/BinaryDataParser.java new file mode 100644 index 0000000..597fdc5 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/parser/BinaryDataParser.java @@ -0,0 +1,359 @@ +package com.dragonbones.parser; + +import com.dragonbones.core.BaseObject; +import com.dragonbones.core.BinaryOffset; +import com.dragonbones.core.TimelineType; +import com.dragonbones.factory.BaseFactory; +import com.dragonbones.model.*; +import com.dragonbones.util.*; +import com.dragonbones.util.buffer.*; +import com.dragonbones.util.json.JSON; +import org.jetbrains.annotations.Nullable; + +import java.nio.charset.StandardCharsets; + +import static com.dragonbones.util.Dynamic.*; + +/** + * @private + */ +public class BinaryDataParser extends ObjectDataParser { + private ArrayBuffer _binary; + private int _binaryOffset; + private ShortArray _intArray; + private FloatArray _floatArray; + private ShortArray _frameIntArray; + private FloatArray _frameFloatArray; + private ShortArray _frameArray; + private CharArray _timelineArray; + + /* + private boolean _inRange(float a, float min, float max) { + return min <= a && a <= max; + } + + private String _decodeUTF8(Uint8Array data) { + int EOF_byte = -1; + int EOF_code_point = -1; + int FATAL_POINT = 0xFFFD; + + int pos = 0; + String result = ""; + Integer code_point = null; + int utf8_code_point = 0; + int utf8_bytes_needed = 0; + int utf8_bytes_seen = 0; + int utf8_lower_boundary = 0; + + while (data.length() > pos) { + + int _byte = data.get(pos++); + + if (_byte == EOF_byte) { + if (utf8_bytes_needed != 0) { + code_point = FATAL_POINT; + } else { + code_point = EOF_code_point; + } + } else { + if (utf8_bytes_needed == 0) { + if (this._inRange(_byte, 0x00, 0x7F)) { + code_point = _byte; + } else { + if (this._inRange(_byte, 0xC2, 0xDF)) { + utf8_bytes_needed = 1; + utf8_lower_boundary = 0x80; + utf8_code_point = _byte - 0xC0; + } else if (this._inRange(_byte, 0xE0, 0xEF)) { + utf8_bytes_needed = 2; + utf8_lower_boundary = 0x800; + utf8_code_point = _byte - 0xE0; + } else if (this._inRange(_byte, 0xF0, 0xF4)) { + utf8_bytes_needed = 3; + utf8_lower_boundary = 0x10000; + utf8_code_point = _byte - 0xF0; + } else { + + } + utf8_code_point = utf8_code_point * (int) Math.pow(64, utf8_bytes_needed); + code_point = null; + } + } else if (!this._inRange(_byte, 0x80, 0xBF)) { + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + pos--; + code_point = _byte; + } else { + + utf8_bytes_seen += 1; + utf8_code_point = utf8_code_point + (_byte - 0x80) * (int) Math.pow(64, utf8_bytes_needed - utf8_bytes_seen); + + if (utf8_bytes_seen != utf8_bytes_needed) { + code_point = null; + } else { + + int cp = utf8_code_point; + int lower_boundary = utf8_lower_boundary; + utf8_code_point = 0; + utf8_bytes_needed = 0; + utf8_bytes_seen = 0; + utf8_lower_boundary = 0; + if (this._inRange(cp, lower_boundary, 0x10FFFF) && !this._inRange(cp, 0xD800, 0xDFFF)) { + code_point = cp; + } else { + code_point = _byte; + } + } + + } + } + //Decode string + if (code_point != null && code_point != EOF_code_point) { + if (code_point <= 0xFFFF) { + if (code_point > 0) result += StringUtil.fromCodePoint(code_point); + } else { + code_point -= 0x10000; + result += StringUtil.fromCharCode(0xD800 + ((code_point >> 10) & 0x3ff)); + result += StringUtil.fromCharCode(0xDC00 + (code_point & 0x3ff)); + } + } + } + + return result; + } + + private String _getUTF16Key(String value) { + for (int i = 0, l = value.length(); i < l; ++i) { + if (value.charAt(i) > 255) { + return encodeURI(value); + } + } + + return value; + } + + private String encodeURI(String value) { + throw new RuntimeException("encodeURI not implemented"); + } + */ + + private TimelineData _parseBinaryTimeline(TimelineType type, int offset, @Nullable TimelineData timelineData) { + TimelineData timeline = timelineData != null ? timelineData : BaseObject.borrowObject(TimelineData.class); + timeline.type = type; + timeline.offset = offset; + + this._timeline = timeline; + + int keyFrameCount = this._timelineArray.get(timeline.offset + BinaryOffset.TimelineKeyFrameCount.v); + if (keyFrameCount == 1) { + timeline.frameIndicesOffset = -1; + } else { + int totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + IntArray frameIndices = this._data.frameIndices; + timeline.frameIndicesOffset = frameIndices.length(); + frameIndices.incrementLength(totalFrameCount); + + for ( + int i = 0, iK = 0, frameStart = 0, frameCount = 0; + i < totalFrameCount; + ++i + ) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + frameStart = this._frameArray.get(this._animation.frameOffset + this._timelineArray.get(timeline.offset + BinaryOffset.TimelineFrameOffset.v + iK)); + if (iK == keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } else { + frameCount = this._frameArray.get(this._animation.frameOffset + this._timelineArray.get(timeline.offset + BinaryOffset.TimelineFrameOffset.v + iK + 1)) - frameStart; + } + + iK++; + } + + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + } + + this._timeline = null; // + + return timeline; + } + + /** + * @private + */ + protected void _parseMesh(Object rawData, MeshDisplayData mesh) { + mesh.offset = getInt(rawData, ObjectDataParser.OFFSET); + + int weightOffset = this._intArray.get(mesh.offset + BinaryOffset.MeshWeightOffset.v); + if (weightOffset >= 0) { + WeightData weight = BaseObject.borrowObject(WeightData.class); + int vertexCount = this._intArray.get(mesh.offset + BinaryOffset.MeshVertexCount.v); + int boneCount = this._intArray.get(weightOffset + BinaryOffset.WeigthBoneCount.v); + weight.offset = weightOffset; + weight.bones.setLength(boneCount); + + for (int i = 0; i < boneCount; ++i) { + int boneIndex = this._intArray.get(weightOffset + BinaryOffset.WeigthBoneIndices.v + i); + weight.bones.set(i, this._rawBones.get(boneIndex)); + } + + int boneIndicesOffset = weightOffset + BinaryOffset.WeigthBoneIndices.v + boneCount; + for (int i = 0, l = vertexCount; i < l; ++i) { + int vertexBoneCount = this._intArray.get(boneIndicesOffset++); + weight.count += vertexBoneCount; + boneIndicesOffset += vertexBoneCount; + } + + mesh.weight = weight; + } + } + + /** + * @private + */ + protected PolygonBoundingBoxData _parsePolygonBoundingBox(Object rawData) { + PolygonBoundingBoxData polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData.class); + polygonBoundingBox.offset = getInt(rawData, ObjectDataParser.OFFSET); + polygonBoundingBox.vertices = this._floatArray; + + return polygonBoundingBox; + } + + /** + * @private + */ + protected AnimationData _parseAnimation(Object rawData) { + AnimationData animation = BaseObject.borrowObject(AnimationData.class); + animation.frameCount = Math.max(getInt(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = getInt(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = getFloat(rawData, ObjectDataParser.FADE_IN_TIME, 0f); + animation.scale = getFloat(rawData, ObjectDataParser.SCALE, 1f); + animation.name = getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (animation.name.length() == 0) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + + // Offsets. + IntArray offsets = getIntArray(rawData, ObjectDataParser.OFFSET); + animation.frameIntOffset = offsets.get(0); + animation.frameFloatOffset = offsets.get(1); + animation.frameOffset = offsets.get(2); + + this._animation = animation; + + if (in(rawData, ObjectDataParser.ACTION)) { + animation.actionTimeline = this._parseBinaryTimeline(TimelineType.Action, getInt(rawData, ObjectDataParser.ACTION), null); + } + + if (in(rawData, ObjectDataParser.Z_ORDER)) { + animation.zOrderTimeline = this._parseBinaryTimeline(TimelineType.ZOrder, getInt(rawData, ObjectDataParser.Z_ORDER), null); + } + + if (in(rawData, ObjectDataParser.BONE)) { + ArrayBase rawTimeliness = getArray(rawData, ObjectDataParser.BONE); + for (int k = 0; k < rawTimeliness.length(); k++) { + ArrayBase rawTimelines = (ArrayBase) rawTimeliness.getObject(k); + BoneData bone = this._armature.getBone("" + k); + if (bone == null) { + continue; + } + + for (int i = 0, l = rawTimelines.size(); i < l; i += 2) { + int timelineType = (int) rawTimelines.getObject(i); + int timelineOffset = (int) rawTimelines.getObject(i + 1); + TimelineData timeline = this._parseBinaryTimeline(TimelineType.values[timelineType], timelineOffset, null); + this._animation.addBoneTimeline(bone, timeline); + } + } + } + + if (in(rawData, ObjectDataParser.SLOT)) { + ArrayBase rawTimeliness = getArray(rawData, ObjectDataParser.SLOT); + for (int k = 0; k < rawTimeliness.size(); k++) { + ArrayBase rawTimelines = (ArrayBase) rawTimeliness.getObject(k); + + SlotData slot = this._armature.getSlot("" + k); + if (slot == null) { + continue; + } + + for (int i = 0, l = rawTimelines.size(); i < l; i += 2) { + int timelineType = (int) rawTimelines.getObject(i); + int timelineOffset = (int) rawTimelines.getObject(i + 1); + TimelineData timeline = this._parseBinaryTimeline(TimelineType.values[timelineType], timelineOffset, null); + this._animation.addSlotTimeline(slot, timeline); + } + } + } + + this._animation = null; + + return animation; + } + + /** + * @private + */ + protected void _parseArray(Object rawData) { + IntArray offsets = getIntArray(rawData, ObjectDataParser.OFFSET); + + this._data.intArray = this._intArray = new Int16Array(this._binary, this._binaryOffset + offsets.get(0), offsets.get(1) / Int16Array.BYTES_PER_ELEMENT); + this._data.floatArray = this._floatArray = new Float32Array(this._binary, this._binaryOffset + offsets.get(2), offsets.get(3) / Float32Array.BYTES_PER_ELEMENT); + this._data.frameIntArray = this._frameIntArray = new Int16Array(this._binary, this._binaryOffset + offsets.get(4), offsets.get(5) / Int16Array.BYTES_PER_ELEMENT); + this._data.frameFloatArray = this._frameFloatArray = new Float32Array(this._binary, this._binaryOffset + offsets.get(6), offsets.get(7) / Float32Array.BYTES_PER_ELEMENT); + this._data.frameArray = this._frameArray = new Int16Array(this._binary, this._binaryOffset + offsets.get(8), offsets.get(9) / Int16Array.BYTES_PER_ELEMENT); + this._data.timelineArray = this._timelineArray = new Uint16Array(this._binary, this._binaryOffset + offsets.get(10), offsets.get(11) / Uint16Array.BYTES_PER_ELEMENT); + } + + @Nullable + public DragonBonesData parseDragonBonesDataInstance(Object rawData) { + return parseDragonBonesData(rawData, 1f); + } + + /** + * @inheritDoc + */ + @Nullable + public DragonBonesData parseDragonBonesData(Object rawData, float scale) { + Console._assert(rawData != null && rawData instanceof ArrayBuffer); + ArrayBuffer buffer = (ArrayBuffer) rawData; + + Uint8Array tag = new Uint8Array(buffer, 0, 8); + if (tag.get(0) != 'D' || tag.get(1) != 'B' || tag.get(2) != 'D' || tag.get(3) != 'T') { + Console._assert(false, "Nonsupport data."); + return null; + } + + int headerLength = new Uint32Array(buffer, 8, 1).get(0); + + //String headerString = this._decodeUTF8(new Uint8Array(buffer, 8 + 4, headerLength)); + String headerString = new String(buffer.getBytes(8 + 4, headerLength), StandardCharsets.UTF_8); + + Object header = JSON.parse(headerString); + + this._binary = buffer; + this._binaryOffset = 8 + 4 + headerLength; + + return super.parseDragonBonesData(header, scale); + } + + /** + * @private + */ + private static BinaryDataParser _binaryDataParserInstance = null; + + /** + * @see BaseFactory#parseDragonBonesData(Object, String, float) + * @deprecated 已废弃,请参考 @see + */ + public static BinaryDataParser getInstance() { + if (BinaryDataParser._binaryDataParserInstance == null) { + BinaryDataParser._binaryDataParserInstance = new BinaryDataParser(); + } + + return BinaryDataParser._binaryDataParserInstance; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/parser/DataParser.java b/dragonbones-core/src/main/java/com/dragonbones/parser/DataParser.java new file mode 100644 index 0000000..e813e1d --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/parser/DataParser.java @@ -0,0 +1,349 @@ +package com.dragonbones.parser; + +import com.dragonbones.core.*; +import com.dragonbones.factory.BaseFactory; +import com.dragonbones.geom.Rectangle; +import com.dragonbones.model.DragonBonesData; +import com.dragonbones.model.TextureAtlasData; +import com.dragonbones.util.ArrayBase; +import com.dragonbones.util.Console; +import com.dragonbones.util.buffer.ArrayBuffer; +import com.dragonbones.util.json.JSON; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +import static com.dragonbones.util.Dynamic.*; + +/** + * @private + */ +public abstract class DataParser { + protected static final String DATA_VERSION_2_3 = "2.3"; + protected static final String DATA_VERSION_3_0 = "3.0"; + protected static final String DATA_VERSION_4_0 = "4.0"; + protected static final String DATA_VERSION_4_5 = "4.5"; + protected static final String DATA_VERSION_5_0 = "5.0"; + protected static final String DATA_VERSION = DataParser.DATA_VERSION_5_0; + + protected static final String[] DATA_VERSIONS = new String[]{ + DataParser.DATA_VERSION_4_0, + DataParser.DATA_VERSION_4_5, + DataParser.DATA_VERSION_5_0 + }; + + protected static final String TEXTURE_ATLAS = "textureAtlas"; + protected static final String SUB_TEXTURE = "SubTexture"; + protected static final String FORMAT = "format"; + protected static final String IMAGE_PATH = "imagePath"; + protected static final String WIDTH = "width"; + protected static final String HEIGHT = "height"; + protected static final String ROTATED = "rotated"; + protected static final String FRAME_X = "frameX"; + protected static final String FRAME_Y = "frameY"; + protected static final String FRAME_WIDTH = "frameWidth"; + protected static final String FRAME_HEIGHT = "frameHeight"; + + protected static final String DRADON_BONES = "dragonBones"; + protected static final String USER_DATA = "userData"; + protected static final String ARMATURE = "armature"; + protected static final String BONE = "bone"; + protected static final String IK = "ik"; + protected static final String SLOT = "slot"; + protected static final String SKIN = "skin"; + protected static final String DISPLAY = "display"; + protected static final String ANIMATION = "animation"; + protected static final String Z_ORDER = "zOrder"; + protected static final String FFD = "ffd"; + protected static final String FRAME = "frame"; + protected static final String TRANSLATE_FRAME = "translateFrame"; + protected static final String ROTATE_FRAME = "rotateFrame"; + protected static final String SCALE_FRAME = "scaleFrame"; + protected static final String VISIBLE_FRAME = "visibleFrame"; + protected static final String DISPLAY_FRAME = "displayFrame"; + protected static final String COLOR_FRAME = "colorFrame"; + protected static final String DEFAULT_ACTIONS = "defaultActions"; + protected static final String ACTIONS = "actions"; + protected static final String EVENTS = "events"; + protected static final String INTS = "ints"; + protected static final String FLOATS = "floats"; + protected static final String STRINGS = "strings"; + protected static final String CANVAS = "canvas"; + + protected static final String TRANSFORM = "transform"; + protected static final String PIVOT = "pivot"; + protected static final String AABB = "aabb"; + protected static final String COLOR = "color"; + + protected static final String VERSION = "version"; + protected static final String COMPATIBLE_VERSION = "compatibleVersion"; + protected static final String FRAME_RATE = "frameRate"; + protected static final String TYPE = "type"; + protected static final String SUB_TYPE = "subType"; + protected static final String NAME = "name"; + protected static final String PARENT = "parent"; + protected static final String TARGET = "target"; + protected static final String SHARE = "share"; + protected static final String PATH = "path"; + protected static final String LENGTH = "length"; + protected static final String DISPLAY_INDEX = "displayIndex"; + protected static final String BLEND_MODE = "blendMode"; + protected static final String INHERIT_TRANSLATION = "inheritTranslation"; + protected static final String INHERIT_ROTATION = "inheritRotation"; + protected static final String INHERIT_SCALE = "inheritScale"; + protected static final String INHERIT_REFLECTION = "inheritReflection"; + protected static final String INHERIT_ANIMATION = "inheritAnimation"; + protected static final String INHERIT_FFD = "inheritFFD"; + protected static final String BEND_POSITIVE = "bendPositive"; + protected static final String CHAIN = "chain"; + protected static final String WEIGHT = "weight"; + + protected static final String FADE_IN_TIME = "fadeInTime"; + protected static final String PLAY_TIMES = "playTimes"; + protected static final String SCALE = "scale"; + protected static final String OFFSET = "offset"; + protected static final String POSITION = "position"; + protected static final String DURATION = "duration"; + protected static final String TWEEN_TYPE = "tweenType"; + protected static final String TWEEN_EASING = "tweenEasing"; + protected static final String TWEEN_ROTATE = "tweenRotate"; + protected static final String TWEEN_SCALE = "tweenScale"; + protected static final String CURVE = "curve"; + protected static final String SOUND = "sound"; + protected static final String EVENT = "event"; + protected static final String ACTION = "action"; + + protected static final String X = "x"; + protected static final String Y = "y"; + protected static final String SKEW_X = "skX"; + protected static final String SKEW_Y = "skY"; + protected static final String SCALE_X = "scX"; + protected static final String SCALE_Y = "scY"; + protected static final String VALUE = "value"; + protected static final String ROTATE = "rotate"; + protected static final String SKEW = "skew"; + + protected static final String ALPHA_OFFSET = "aO"; + protected static final String RED_OFFSET = "rO"; + protected static final String GREEN_OFFSET = "gO"; + protected static final String BLUE_OFFSET = "bO"; + protected static final String ALPHA_MULTIPLIER = "aM"; + protected static final String RED_MULTIPLIER = "rM"; + protected static final String GREEN_MULTIPLIER = "gM"; + protected static final String BLUE_MULTIPLIER = "bM"; + + protected static final String UVS = "uvs"; + protected static final String VERTICES = "vertices"; + protected static final String TRIANGLES = "triangles"; + protected static final String WEIGHTS = "weights"; + protected static final String SLOT_POSE = "slotPose"; + protected static final String BONE_POSE = "bonePose"; + + protected static final String GOTO_AND_PLAY = "gotoAndPlay"; + + protected static final String DEFAULT_NAME = "default"; + + protected static ArmatureType _getArmatureType(String value) { + switch (value.toLowerCase()) { + case "stage": + return ArmatureType.Stage; + + case "armature": + return ArmatureType.Armature; + + case "movieclip": + return ArmatureType.MovieClip; + + default: + return ArmatureType.Armature; + } + } + + protected static DisplayType _getDisplayType(String value) { + switch (value.toLowerCase()) { + case "image": + return DisplayType.Image; + + case "mesh": + return DisplayType.Mesh; + + case "armature": + return DisplayType.Armature; + + case "boundingbox": + return DisplayType.BoundingBox; + + default: + return DisplayType.Image; + } + } + + protected static BoundingBoxType _getBoundingBoxType(String value) { + switch (value.toLowerCase()) { + case "rectangle": + return BoundingBoxType.Rectangle; + + case "ellipse": + return BoundingBoxType.Ellipse; + + case "polygon": + return BoundingBoxType.Polygon; + + default: + return BoundingBoxType.Rectangle; + } + } + + protected static ActionType _getActionType(String value) { + switch (value.toLowerCase()) { + case "play": + return ActionType.Play; + + case "frame": + return ActionType.Frame; + + case "sound": + return ActionType.Sound; + + default: + return ActionType.Play; + } + } + + protected static BlendMode _getBlendMode(String value) { + switch (value.toLowerCase()) { + case "normal": + return BlendMode.Normal; + + case "add": + return BlendMode.Add; + + case "alpha": + return BlendMode.Alpha; + + case "darken": + return BlendMode.Darken; + + case "difference": + return BlendMode.Difference; + + case "erase": + return BlendMode.Erase; + + case "hardlight": + return BlendMode.HardLight; + + case "invert": + return BlendMode.Invert; + + case "layer": + return BlendMode.Layer; + + case "lighten": + return BlendMode.Lighten; + + case "multiply": + return BlendMode.Multiply; + + case "overlay": + return BlendMode.Overlay; + + case "screen": + return BlendMode.Screen; + + case "subtract": + return BlendMode.Subtract; + + default: + return BlendMode.Normal; + } + } + + /** + * @private + */ + public abstract @Nullable + DragonBonesData parseDragonBonesData(Object rawData, float scale); + + /** + * @private + */ + public abstract boolean parseTextureAtlasData(Object rawData, TextureAtlasData textureAtlasData, float scale); + + /** + * @see BaseFactory#parseDragonBonesData(Object, String, float) + * @deprecated 已废弃,请参考 @see + */ + @Nullable + public static DragonBonesData parseDragonBonesData(Object rawData) { + if (rawData instanceof ArrayBuffer) { + return parseDragonBonesDataBinary((ArrayBuffer)rawData); + } else { + return parseDragonBonesDataObject(rawData); + } + } + + @Nullable + public static DragonBonesData parseDragonBonesDataBinary(ArrayBuffer arrayBuffer) { + return BinaryDataParser.getInstance().parseDragonBonesData(arrayBuffer, 0f); + } + + @Nullable + public static DragonBonesData parseDragonBonesDataObject(Object obj) { + return ObjectDataParser.getInstance().parseDragonBonesData(obj, 0f); + } + + @Nullable + public static DragonBonesData parseDragonBonesDataJson(String json) { + return ObjectDataParser.getInstance().parseDragonBonesData(JSON.parse(json), 0f); + } + + public static Map parseTextureAtlasData(Object rawData) { + return parseTextureAtlasData(rawData, 1f); + } + + /** + * @see BaseFactory#parseTextureAtlasData(Object, Object, String, float) + * @deprecated 已废弃,请参考 @see + */ + public static Map parseTextureAtlasData(Object rawData, float scale) { + Console.warn("已废弃,请参考 @see"); + Map textureAtlasData = new HashMap(); + + ArrayBase subTextureList = getArray(rawData, DataParser.SUB_TEXTURE); + for (int i = 0, len = subTextureList.length(); i < len; i++) { + Object subTextureObject = subTextureList.getObject(i); + String subTextureName = getString(subTextureObject, DataParser.NAME); + Rectangle subTextureRegion = new Rectangle(); + Rectangle subTextureFrame = null; + + subTextureRegion.x = getFloat(subTextureObject, DataParser.X) / scale; + subTextureRegion.y = getFloat(subTextureObject, DataParser.Y) / scale; + subTextureRegion.width = getFloat(subTextureObject, DataParser.WIDTH) / scale; + subTextureRegion.height = getFloat(subTextureObject, DataParser.HEIGHT) / scale; + + if (in(subTextureObject, DataParser.FRAME_WIDTH)) { + subTextureFrame = new Rectangle(); + subTextureFrame.x = getFloat(subTextureObject, DataParser.FRAME_X) / scale; + subTextureFrame.y = getFloat(subTextureObject, DataParser.FRAME_Y) / scale; + subTextureFrame.width = getFloat(subTextureObject, DataParser.FRAME_WIDTH) / scale; + subTextureFrame.height = getFloat(subTextureObject, DataParser.FRAME_HEIGHT) / scale; + } + + Rectangle finalSubTextureFrame = subTextureFrame; + textureAtlasData.put(subTextureName, + new HashMap() { + { + put("region", subTextureRegion); + put("frame", finalSubTextureFrame); + put("rotated", false); + } + } + ); + } + + return textureAtlasData; + } +} + diff --git a/dragonbones-core/src/main/java/com/dragonbones/parser/ObjectDataParser.java b/dragonbones-core/src/main/java/com/dragonbones/parser/ObjectDataParser.java new file mode 100644 index 0000000..1f35306 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/parser/ObjectDataParser.java @@ -0,0 +1,1653 @@ +package com.dragonbones.parser; + +import com.dragonbones.core.*; +import com.dragonbones.factory.BaseFactory; +import com.dragonbones.geom.ColorTransform; +import com.dragonbones.geom.Matrix; +import com.dragonbones.geom.Point; +import com.dragonbones.geom.Transform; +import com.dragonbones.model.*; +import com.dragonbones.util.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +import static com.dragonbones.util.Dynamic.*; + +/** + * @private + */ +public class ObjectDataParser extends DataParser { + + /** + * @private + */ + + private IntArray _intArrayJson = new IntArray(); + private FloatArray _floatArrayJson = new FloatArray(); + private IntArray _frameIntArrayJson = new IntArray(); + private FloatArray _frameFloatArrayJson = new FloatArray(); + private FloatArray _frameArrayJson = new FloatArray(); + private FloatArray _timelineArrayJson = new FloatArray(); + + private ShortArray _intArrayBuffer; + private FloatArray _floatArrayBuffer; + private ShortArray _frameIntArrayBuffer; + private FloatArray _frameFloatArrayBuffer; + private ShortArray _frameArrayBuffer; + private CharArray _timelineArrayBuffer; + + public ObjectDataParser() { + } + + protected int _rawTextureAtlasIndex = 0; + protected final Array _rawBones = new Array<>(); + protected DragonBonesData _data = null; // + protected ArmatureData _armature = null; // + protected BoneData _bone = null; // + protected SlotData _slot = null; // + protected SkinData _skin = null; // + protected MeshDisplayData _mesh = null; // + protected AnimationData _animation = null; // + protected TimelineData _timeline = null; // + protected Array _rawTextureAtlases = null; + + private int _defalultColorOffset = -1; + private float _prevTweenRotate = 0; + private float _prevRotation = 0f; + private final Matrix _helpMatrixA = new Matrix(); + + private final Matrix _helpMatrixB = new Matrix(); + + private final Transform _helpTransform = new Transform(); + + private final ColorTransform _helpColorTransform = new ColorTransform(); + + private final Point _helpPoint = new Point(); + + private final FloatArray _helpArray = new FloatArray(); + private final Array _actionFrames = new Array<>(); + private final Map _weightSlotPose = new HashMap<>(); + + private Map _weightBonePoses = new HashMap<>(); + private final Map _weightBoneIndices = new HashMap<>(); + + private final Map> _cacheBones = new HashMap<>(); + private final Map _meshs = new HashMap<>(); + private final Map> _slotChildActions = new HashMap<>(); + + // private readonly _intArray: Array = []; + // private readonly _floatArray: Array = []; + // private readonly _frameIntArray: Array = []; + // private readonly _frameFloatArray: Array = []; + // private readonly _frameArray: Array = []; + // private readonly _timelineArray: Array = []; + + /** + * @private + */ + private void _getCurvePoint(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float t, Point result) + + { + float l_t = 1f - t; + float powA = l_t * l_t; + float powB = t * t; + float kA = l_t * powA; + float kB = (float) (3.0 * t * powA); + float kC = (float) (3.0 * l_t * powB); + float kD = t * powB; + + result.x = kA * x1 + kB * x2 + kC * x3 + kD * x4; + result.y = kA * y1 + kB * y2 + kC * y3 + kD * y4; + } + + /** + * @private + */ + private void _samplingEasingCurve(FloatArray curve, FloatArray samples) + + { + int curveCount = curve.length(); + int stepIndex = -2; + for (int i = 0, l = samples.length(); i < l; ++i) { + int t = (i + 1) / (l + 1); + while ((stepIndex + 6 < curveCount ? curve.get(stepIndex + 6) : 1) < t) { // stepIndex + 3 * 2 + stepIndex += 6; + } + + boolean isInCurve = stepIndex >= 0 && stepIndex + 6 < curveCount; + float x1 = isInCurve ? curve.get(stepIndex) : 0f; + float y1 = isInCurve ? curve.get(stepIndex + 1) : 0f; + float x2 = curve.get(stepIndex + 2); + float y2 = curve.get(stepIndex + 3); + float x3 = curve.get(stepIndex + 4); + float y3 = curve.get(stepIndex + 5); + float x4 = isInCurve ? curve.get(stepIndex + 6) : 1f; + float y4 = isInCurve ? curve.get(stepIndex + 7) : 1f; + + float lower = 0f; + float higher = 1f; + while (higher - lower > 0.0001) { + float percentage = (higher + lower) * 0.5f; + this._getCurvePoint(x1, y1, x2, y2, x3, y3, x4, y4, percentage, this._helpPoint); + if (t - this._helpPoint.x > 0f) { + lower = percentage; + } else { + higher = percentage; + } + } + + samples.set(i, this._helpPoint.y); + } + } + + private int _sortActionFrame(ActionFrame a, ActionFrame b) + + { + return a.frameStart > b.frameStart ? 1 : -1; + } + + private void _parseActionDataInFrame(Object rawData, int frameStart, @Nullable BoneData bone, @Nullable SlotData slot) + + { + if (in(rawData, ObjectDataParser.EVENT)) { + this._mergeActionFrame(get(rawData, ObjectDataParser.EVENT), frameStart, ActionType.Frame, bone, slot); + } + + if (in(rawData, ObjectDataParser.SOUND)) { + this._mergeActionFrame(get(rawData, ObjectDataParser.SOUND), frameStart, ActionType.Sound, bone, slot); + } + + if (in(rawData, ObjectDataParser.ACTION)) { + this._mergeActionFrame(get(rawData, ObjectDataParser.ACTION), frameStart, ActionType.Play, bone, slot); + } + + if (in(rawData, ObjectDataParser.EVENTS)) { + this._mergeActionFrame(get(rawData, ObjectDataParser.EVENTS), frameStart, ActionType.Frame, bone, slot); + } + + if (in(rawData, ObjectDataParser.ACTIONS)) { + this._mergeActionFrame(get(rawData, ObjectDataParser.ACTIONS), frameStart, ActionType.Play, bone, slot); + } + } + + private void _mergeActionFrame(Object rawData, int frameStart, ActionType type, @Nullable BoneData bone, @Nullable SlotData slot) + + { + int actionOffset = this._armature.actions.size(); + int actionCount = this._parseActionData(rawData, this._armature.actions, type, bone, slot); + ActionFrame frame = null; + + if (this._actionFrames.size() == 0) { // First frame. + frame = new ActionFrame(); + frame.frameStart = 0; + this._actionFrames.add(frame); + frame = null; + } + + for (ActionFrame eachFrame : this._actionFrames) { // Get same frame. + if (eachFrame.frameStart == frameStart) { + frame = eachFrame; + break; + } + } + + if (frame == null) { // Create and cache frame. + frame = new ActionFrame(); + frame.frameStart = frameStart; + this._actionFrames.add(frame); + } + + for (int i = 0; i < actionCount; ++i) { // Cache action offsets. + frame.actions.push(actionOffset + i); + } + } + + private int _parseCacheActionFrame(ActionFrame frame) + + { + ShortArray frameArray = (this._data.frameArray); + int frameOffset = frameArray.length(); + int actionCount = frame.actions.size(); + frameArray.incrementLength(1 + 1 + actionCount); + frameArray.set(frameOffset + BinaryOffset.FramePosition.v, frame.frameStart); + frameArray.set(frameOffset + BinaryOffset.FramePosition.v + 1, actionCount); // Action count. + + for (int i = 0; i < actionCount; ++i) { // Action offsets. + frameArray.set(frameOffset + BinaryOffset.FramePosition.v + 2 + i, frame.actions.get(i)); + } + + return frameOffset; + } + + /** + * @private + */ + protected ArmatureData _parseArmature(Object rawData, float scale) + + { + ArmatureData armature = BaseObject.borrowObject(ArmatureData.class); + armature.name = getString(rawData, ObjectDataParser.NAME, ""); + armature.frameRate = getFloat(rawData, ObjectDataParser.FRAME_RATE, this._data.frameRate); + armature.scale = scale; + + if (in(rawData, ObjectDataParser.TYPE) && get(rawData, ObjectDataParser.TYPE) instanceof String) { + armature.type = ObjectDataParser._getArmatureType(Objects.toString(get(rawData, ObjectDataParser.TYPE))); + } else { + armature.type = ArmatureType.values[getInt(rawData, ObjectDataParser.TYPE, ArmatureType.Armature.v)]; + } + + if (armature.frameRate == 0) { // Data error. + armature.frameRate = 24; + } + + this._armature = armature; + + if (in(rawData, ObjectDataParser.AABB)) { + Object rawAABB = get(rawData, ObjectDataParser.AABB); + armature.aabb.x = getFloat(rawAABB, ObjectDataParser.X, 0f); + armature.aabb.y = getFloat(rawAABB, ObjectDataParser.Y, 0f); + armature.aabb.width = getFloat(rawAABB, ObjectDataParser.WIDTH, 0f); + armature.aabb.height = getFloat(rawAABB, ObjectDataParser.HEIGHT, 0f); + } + + if (in(rawData, ObjectDataParser.CANVAS)) { + Object rawCanvas = get(rawData, ObjectDataParser.CANVAS); + CanvasData canvas = BaseObject.borrowObject(CanvasData.class); + + if (in(rawCanvas, ObjectDataParser.COLOR)) { + getFloat(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.hasBackground = true; + } else { + canvas.hasBackground = false; + } + + canvas.color = getInt(rawCanvas, ObjectDataParser.COLOR, 0); + canvas.x = getFloat(rawCanvas, ObjectDataParser.X, 0); + canvas.y = getFloat(rawCanvas, ObjectDataParser.Y, 0); + canvas.width = getFloat(rawCanvas, ObjectDataParser.WIDTH, 0); + canvas.height = getFloat(rawCanvas, ObjectDataParser.HEIGHT, 0); + + armature.canvas = canvas; + } + + if (in(rawData, ObjectDataParser.BONE)) { + Array rawBones = getArray(rawData, ObjectDataParser.BONE); + for (Object rawBone : rawBones) { + String parentName = getString(rawBone, ObjectDataParser.PARENT, ""); + BoneData bone = this._parseBone(rawBone); + + if (parentName.length() > 0) { // Get bone parent. + BoneData parent = armature.getBone(parentName); + if (parent != null) { + bone.parent = parent; + } else { // Cache. + if (!this._cacheBones.containsKey(parentName)) { + this._cacheBones.put(parentName, new Array<>()); + } + this._cacheBones.get(parentName).push(bone); + } + } + + if (in(this._cacheBones, bone.name)) { + for (BoneData child : this._cacheBones.get(bone.name)) { + child.parent = bone; + } + + this._cacheBones.remove(bone.name); + } + + armature.addBone(bone); + + this._rawBones.add(bone); // Raw bone sort. + } + } + + if (in(rawData, ObjectDataParser.IK)) { + Array rawIKS = getArray(rawData, ObjectDataParser.IK); + for (Object rawIK : rawIKS) { + this._parseIKConstraint(rawIK); + } + } + + armature.sortBones(); + + if (in(rawData, ObjectDataParser.SLOT)) { + Array rawSlots = getArray(rawData, ObjectDataParser.SLOT); + for (Object rawSlot : rawSlots) { + armature.addSlot(this._parseSlot(rawSlot)); + } + } + + if (in(rawData, ObjectDataParser.SKIN)) { + Array rawSkins = getArray(rawData, ObjectDataParser.SKIN); + for (Object rawSkin : rawSkins) { + armature.addSkin(this._parseSkin(rawSkin)); + } + } + + if (in(rawData, ObjectDataParser.ANIMATION)) { + Array rawAnimations = getArray(rawData, ObjectDataParser.ANIMATION); + for (Object rawAnimation : rawAnimations) { + AnimationData animation = this._parseAnimation(rawAnimation); + armature.addAnimation(animation); + } + } + + if (in(rawData, ObjectDataParser.DEFAULT_ACTIONS)) { + this._parseActionData(get(rawData, ObjectDataParser.DEFAULT_ACTIONS), armature.defaultActions, ActionType.Play, null, null); + } + + if (in(rawData, ObjectDataParser.ACTIONS)) { + this._parseActionData(get(rawData, ObjectDataParser.ACTIONS), armature.actions, ActionType.Play, null, null); + } + + for (int i = 0; i < armature.defaultActions.size(); ++i) { + ActionData action = armature.defaultActions.get(i); + if (action.type == ActionType.Play) { + AnimationData animation = armature.getAnimation(action.name); + if (animation != null) { + armature.defaultAnimation = animation; + } + break; + } + } + + // Clear helper. + this._rawBones.clear(); + this._armature = null; + this._meshs.clear(); + this._cacheBones.clear(); + this._slotChildActions.clear(); + this._weightSlotPose.clear(); + this._weightBonePoses.clear(); + this._weightBoneIndices.clear(); + return armature; + } + + /** + * @private + */ + protected BoneData _parseBone(Object rawData) { + BoneData bone = BaseObject.borrowObject(BoneData.class); + bone.inheritTranslation = getBool(rawData, ObjectDataParser.INHERIT_TRANSLATION, true); + bone.inheritRotation = getBool(rawData, ObjectDataParser.INHERIT_ROTATION, true); + bone.inheritScale = getBool(rawData, ObjectDataParser.INHERIT_SCALE, true); + bone.inheritReflection = getBool(rawData, ObjectDataParser.INHERIT_REFLECTION, true); + bone.length = getFloat(rawData, ObjectDataParser.LENGTH, 0) * this._armature.scale; + bone.name = getString(rawData, ObjectDataParser.NAME, ""); + + if (in(rawData, ObjectDataParser.TRANSFORM)) { + this._parseTransform(get(rawData, ObjectDataParser.TRANSFORM), bone.transform, this._armature.scale); + } + + return bone; + } + + /** + * @private + */ + protected void _parseIKConstraint(Object rawData) { + BoneData bone = this._armature.getBone(getString(rawData, (in(rawData, ObjectDataParser.BONE)) ? ObjectDataParser.BONE : ObjectDataParser.NAME, "")); + if (bone == null) { + return; + } + + BoneData target = this._armature.getBone(getString(rawData, ObjectDataParser.TARGET, "")); + if (target == null) { + return; + } + + IKConstraintData constraint = BaseObject.borrowObject(IKConstraintData.class); + constraint.bendPositive = getBool(rawData, ObjectDataParser.BEND_POSITIVE, true); + constraint.scaleEnabled = getBool(rawData, ObjectDataParser.SCALE, false); + constraint.weight = getFloat(rawData, ObjectDataParser.WEIGHT, 1f); + constraint.bone = bone; + constraint.target = target; + + float chain = getFloat(rawData, ObjectDataParser.CHAIN, 0); + if (chain > 0) { + constraint.root = bone.parent; + } + bone.constraints.add(constraint); + } + + /** + * @private + */ + protected SlotData _parseSlot(Object rawData) + + { + SlotData slot = BaseObject.borrowObject(SlotData.class); + slot.displayIndex = getInt(rawData, ObjectDataParser.DISPLAY_INDEX, 0); + slot.zOrder = this._armature.sortedSlots.size(); + slot.name = getString(rawData, ObjectDataParser.NAME, ""); + slot.parent = this._armature.getBone(getString(rawData, ObjectDataParser.PARENT, "")); // + + if (in(rawData, ObjectDataParser.BLEND_MODE) && get(rawData, ObjectDataParser.BLEND_MODE) instanceof String) { + slot.blendMode = ObjectDataParser._getBlendMode(Objects.toString(get(rawData, ObjectDataParser.BLEND_MODE))); + } else { + slot.blendMode = BlendMode.values[getInt(rawData, ObjectDataParser.BLEND_MODE, BlendMode.Normal.v)]; + } + + if (in(rawData, ObjectDataParser.COLOR)) { + // slot.color = SlotData.createColor(); + slot.color = SlotData.createColor(); + this._parseColorTransform(get(rawData, ObjectDataParser.COLOR), slot.color); + } else { + // slot.color = SlotData.DEFAULT_COLOR; + slot.color = SlotData.DEFAULT_COLOR; + } + + if (in(rawData, ObjectDataParser.ACTIONS)) { + Array actions = new Array<>(); + this._slotChildActions.put(slot.name, actions); + this._parseActionData(get(rawData, ObjectDataParser.ACTIONS), actions, ActionType.Play, null, null); + } + + return slot; + } + + /** + * @private + */ + protected SkinData _parseSkin(Object rawData) + + { + SkinData skin = BaseObject.borrowObject(SkinData.class); + skin.name = getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + if (skin.name.length() == 0) { + skin.name = ObjectDataParser.DEFAULT_NAME; + } + + if (in(rawData, ObjectDataParser.SLOT)) { + this._skin = skin; + + Array rawSlots = getArray(rawData, ObjectDataParser.SLOT); + for (Object rawSlot : rawSlots) { + String slotName = getString(rawSlot, ObjectDataParser.NAME, ""); + SlotData slot = this._armature.getSlot(slotName); + if (slot != null) { + this._slot = slot; + + if (in(rawSlot, ObjectDataParser.DISPLAY)) { + Array rawDisplays = getArray(rawSlot, ObjectDataParser.DISPLAY); + for (Object rawDisplay : rawDisplays) { + skin.addDisplay(slotName, this._parseDisplay(rawDisplay)); + } + } + + this._slot = null; // + } + } + + this._skin = null; // + } + + return skin; + } + + /** + * @private + */ + @Nullable + protected DisplayData _parseDisplay(Object rawData) { + DisplayData display = null; + String name = getString(rawData, ObjectDataParser.NAME, ""); + String path = getString(rawData, ObjectDataParser.PATH, ""); + DisplayType type = DisplayType.Image; + if (in(rawData, ObjectDataParser.TYPE) && get(rawData, ObjectDataParser.TYPE) instanceof String) { + type = ObjectDataParser._getDisplayType(getString(rawData, ObjectDataParser.TYPE, "")); + } else { + type = DisplayType.values[getInt(rawData, ObjectDataParser.TYPE, type.v)]; + } + + switch (type) { + case Image: + ImageDisplayData imageDisplay = BaseObject.borrowObject(ImageDisplayData.class); + display = imageDisplay; + imageDisplay.name = name; + imageDisplay.path = path.length() > 0 ? path : name; + this._parsePivot(rawData, imageDisplay); + break; + + case Armature: + ArmatureDisplayData armatureDisplay = BaseObject.borrowObject(ArmatureDisplayData.class); + display = armatureDisplay; + armatureDisplay.name = name; + armatureDisplay.path = path.length() > 0 ? path : name; + armatureDisplay.inheritAnimation = true; + + if (in(rawData, ObjectDataParser.ACTIONS)) { + this._parseActionData(get(rawData, ObjectDataParser.ACTIONS), armatureDisplay.actions, ActionType.Play, null, null); + } else if (in(this._slotChildActions, this._slot.name)) { + Array displays = this._skin.getDisplays(this._slot.name); + if (displays == null ? this._slot.displayIndex == 0 : this._slot.displayIndex == displays.getLength()) { + for (ActionData action : this._slotChildActions.get(this._slot.name)) { + armatureDisplay.actions.push(action); + } + + this._slotChildActions.remove(this._slot.name); + } + } + break; + + case Mesh: + MeshDisplayData meshDisplay = BaseObject.borrowObject(MeshDisplayData.class); + display = meshDisplay; + meshDisplay.name = name; + meshDisplay.path = path.length() > 0 ? path : name; + meshDisplay.inheritAnimation = getBool(rawData, ObjectDataParser.INHERIT_FFD, true); + this._parsePivot(rawData, meshDisplay); + + String shareName = getString(rawData, ObjectDataParser.SHARE, ""); + if (shareName.length() > 0) { + MeshDisplayData shareMesh = this._meshs.get(shareName); + meshDisplay.offset = shareMesh.offset; + meshDisplay.weight = shareMesh.weight; + } else { + this._parseMesh(rawData, meshDisplay); + this._meshs.put(meshDisplay.name, meshDisplay); + } + break; + + case BoundingBox: + BoundingBoxData boundingBox = this._parseBoundingBox(rawData); + if (boundingBox != null) { + BoundingBoxDisplayData boundingBoxDisplay = BaseObject.borrowObject(BoundingBoxDisplayData.class); + display = boundingBoxDisplay; + boundingBoxDisplay.name = name; + boundingBoxDisplay.path = path.length() > 0 ? path : name; + boundingBoxDisplay.boundingBox = boundingBox; + } + break; + } + + if (display != null) { + display.parent = this._armature; + if (in(rawData, ObjectDataParser.TRANSFORM)) { + this._parseTransform(get(rawData, ObjectDataParser.TRANSFORM), display.transform, this._armature.scale); + } + } + + return display; + } + + /** + * @private + */ + protected void _parsePivot(Object rawData, ImageDisplayData display) { + if (in(rawData, ObjectDataParser.PIVOT)) { + Object rawPivot = get(rawData, ObjectDataParser.PIVOT); + display.pivot.x = getFloat(rawPivot, ObjectDataParser.X, 0f); + display.pivot.y = getFloat(rawPivot, ObjectDataParser.Y, 0f); + } else { + display.pivot.x = 0.5f; + display.pivot.y = 0.5f; + } + } + + /** + * @private + */ + protected void _parseMesh(Object rawData, MeshDisplayData mesh) { + FloatArray rawVertices = getFloatArray(rawData, ObjectDataParser.VERTICES); + FloatArray rawUVs = getFloatArray(rawData, ObjectDataParser.UVS); + IntArray rawTriangles = getIntArray(rawData, ObjectDataParser.TRIANGLES); + ShortArray intArray = this._data.intArray; + FloatArray floatArray = this._data.floatArray; + int vertexCount = (int) Math.floor(rawVertices.size() / 2); // uint + int triangleCount = (int) Math.floor(rawTriangles.size() / 3); // uint + int vertexOffset = floatArray.length(); + int uvOffset = vertexOffset + vertexCount * 2; + + mesh.offset = intArray.length(); + intArray.incrementLength(1 + 1 + 1 + 1 + triangleCount * 3); + intArray.set(mesh.offset + BinaryOffset.MeshVertexCount.v, vertexCount); + intArray.set(mesh.offset + BinaryOffset.MeshTriangleCount.v, triangleCount); + intArray.set(mesh.offset + BinaryOffset.MeshFloatOffset.v, vertexOffset); + for (int i = 0, l = triangleCount * 3; i < l; ++i) { + intArray.set(mesh.offset + BinaryOffset.MeshVertexIndices.v + i, rawTriangles.get(i)); + } + + floatArray.incrementLength(vertexCount * 2 + vertexCount * 2); + for (int i = 0, l = vertexCount * 2; i < l; ++i) { + floatArray.set(vertexOffset + i, rawVertices.get(i)); + floatArray.set(uvOffset + i, rawUVs.get(i)); + } + + if (in(rawData, ObjectDataParser.WEIGHTS)) { + + IntArray rawWeights = getIntArray(rawData, ObjectDataParser.WEIGHTS); + FloatArray rawSlotPose = getFloatArray(rawData, ObjectDataParser.SLOT_POSE); + // @TODO: Java: Used as int and as float? + FloatArray rawBonePoses = getFloatArray(rawData, ObjectDataParser.BONE_POSE); + IntArray weightBoneIndices = new IntArray(); + int weightBoneCount = (int) Math.floor(rawBonePoses.size() / 7); // uint + int floatOffset = floatArray.length(); + WeightData weight = BaseObject.borrowObject(WeightData.class); + + weight.count = (rawWeights.size() - vertexCount) / 2; + weight.offset = intArray.length(); + weight.bones.setLength(weightBoneCount); + weightBoneIndices.setLength(weightBoneCount); + intArray.incrementLength(1 + 1 + weightBoneCount + vertexCount + weight.count); + intArray.set(weight.offset + BinaryOffset.WeigthFloatOffset.v, floatOffset); + + for (int i = 0; i < weightBoneCount; ++i) { + int rawBoneIndex = (int) rawBonePoses.get(i * 7); // uint + BoneData bone = this._rawBones.get(rawBoneIndex); + weight.bones.set(i, bone); + weightBoneIndices.set(i, rawBoneIndex); + + intArray.set(weight.offset + BinaryOffset.WeigthBoneIndices.v + i, this._armature.sortedBones.indexOf(bone)); + } + + floatArray.incrementLength(weight.count * 3); + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + + for (int i = 0, iW = 0, iB = weight.offset + BinaryOffset.WeigthBoneIndices.v + weightBoneCount, iV = floatOffset; i < vertexCount; ++i) { + int iD = i * 2; + int vertexBoneCount = rawWeights.get(iW++); // uint + intArray.set(iB++, vertexBoneCount); + + float x = floatArray.get(vertexOffset + iD); + float y = floatArray.get(vertexOffset + iD + 1); + this._helpMatrixA.transformPoint(x, y, this._helpPoint); + x = this._helpPoint.x; + y = this._helpPoint.y; + + for (int j = 0; j < vertexBoneCount; ++j) { + int rawBoneIndex = rawWeights.get(iW++); // uint + BoneData bone = this._rawBones.get(rawBoneIndex); + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint); + intArray.set(iB++, weight.bones.indexOf(bone)); + floatArray.set(iV++, rawWeights.get(iW++)); + floatArray.set(iV++, this._helpPoint.x); + floatArray.set(iV++, this._helpPoint.y); + } + } + + mesh.weight = weight; + + // + this._weightSlotPose.put(mesh.name, rawSlotPose); + this._weightBonePoses.put(mesh.name, rawBonePoses); + this._weightBoneIndices.put(mesh.name, weightBoneIndices); + } + } + + /** + * @private + */ + @Nullable + protected BoundingBoxData _parseBoundingBox(Object rawData) { + BoundingBoxData boundingBox = null; + BoundingBoxType type = BoundingBoxType.Rectangle; + if (in(rawData, ObjectDataParser.SUB_TYPE) && get(rawData, ObjectDataParser.SUB_TYPE) instanceof String) { + type = ObjectDataParser._getBoundingBoxType(getString(rawData, ObjectDataParser.SUB_TYPE)); + } else { + type = BoundingBoxType.values[getInt(rawData, ObjectDataParser.SUB_TYPE, type.v)]; + } + + switch (type) { + case Rectangle: + // boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData); + boundingBox = BaseObject.borrowObject(RectangleBoundingBoxData.class); + break; + + case Ellipse: + // boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData); + boundingBox = BaseObject.borrowObject(EllipseBoundingBoxData.class); + break; + + case Polygon: + boundingBox = this._parsePolygonBoundingBox(rawData); + break; + } + + if (boundingBox != null) { + boundingBox.color = getInt(rawData, ObjectDataParser.COLOR, 0x000000); + if (boundingBox.type == BoundingBoxType.Rectangle || boundingBox.type == BoundingBoxType.Ellipse) { + boundingBox.width = getFloat(rawData, ObjectDataParser.WIDTH, 0f); + boundingBox.height = getFloat(rawData, ObjectDataParser.HEIGHT, 0f); + } + } + + return boundingBox; + } + + /** + * @private + */ + protected PolygonBoundingBoxData _parsePolygonBoundingBox(Object rawData) + + { + FloatArray rawVertices = getFloatArray(rawData, ObjectDataParser.VERTICES); + FloatArray floatArray = this._data.floatArray; + PolygonBoundingBoxData polygonBoundingBox = BaseObject.borrowObject(PolygonBoundingBoxData.class); + + polygonBoundingBox.offset = floatArray.length(); + polygonBoundingBox.count = rawVertices.size(); + polygonBoundingBox.vertices = floatArray; + floatArray.incrementLength(polygonBoundingBox.count); + + for (int i = 0, l = polygonBoundingBox.count; i < l; i += 2) { + int iN = i + 1; + float x = rawVertices.get(i); + float y = rawVertices.get(iN); + floatArray.set(polygonBoundingBox.offset + i, x); + floatArray.set(polygonBoundingBox.offset + iN, y); + + // AABB. + if (i == 0) { + polygonBoundingBox.x = x; + polygonBoundingBox.y = y; + polygonBoundingBox.width = x; + polygonBoundingBox.height = y; + } else { + if (x < polygonBoundingBox.x) { + polygonBoundingBox.x = x; + } else if (x > polygonBoundingBox.width) { + polygonBoundingBox.width = x; + } + + if (y < polygonBoundingBox.y) { + polygonBoundingBox.y = y; + } else if (y > polygonBoundingBox.height) { + polygonBoundingBox.height = y; + } + } + } + + return polygonBoundingBox; + } + + /** + * @private + */ + protected AnimationData _parseAnimation(Object rawData) + + { + // const animation = BaseObject.borrowObject(AnimationData); + AnimationData animation = BaseObject.borrowObject(AnimationData.class); + animation.frameCount = Math.max(getInt(rawData, ObjectDataParser.DURATION, 1), 1); + animation.playTimes = getInt(rawData, ObjectDataParser.PLAY_TIMES, 1); + animation.duration = animation.frameCount / this._armature.frameRate; + animation.fadeInTime = getFloat(rawData, ObjectDataParser.FADE_IN_TIME, 0f); + animation.scale = getFloat(rawData, ObjectDataParser.SCALE, 1f); + animation.name = getString(rawData, ObjectDataParser.NAME, ObjectDataParser.DEFAULT_NAME); + // TDOO Check std::string length + if (animation.name.length() < 1) { + animation.name = ObjectDataParser.DEFAULT_NAME; + } + animation.frameIntOffset = this._data.frameIntArray.length(); + animation.frameFloatOffset = this._data.frameFloatArray.length(); + animation.frameOffset = this._data.frameArray.length(); + + this._animation = animation; + + if (in(rawData, ObjectDataParser.FRAME)) { + Array rawFrames = getArray(rawData, ObjectDataParser.FRAME); + int keyFrameCount = rawFrames.size(); + if (keyFrameCount > 0) { + for (int i = 0, frameStart = 0; i < keyFrameCount; ++i) { + Object rawFrame = rawFrames.get(i); + this._parseActionDataInFrame(rawFrame, frameStart, null, null); + frameStart += getFloat(rawFrame, ObjectDataParser.DURATION, 1); + } + } + } + + if (in(rawData, ObjectDataParser.Z_ORDER)) { + this._animation.zOrderTimeline = this._parseTimeline( + get(rawData, ObjectDataParser.Z_ORDER), TimelineType.ZOrder, + false, false, 0, + this::_parseZOrderFrame + ); + } + + if (in(rawData, ObjectDataParser.BONE)) { + Array rawTimelines = getArray(rawData, ObjectDataParser.BONE); + for (Object rawTimeline : rawTimelines) { + this._parseBoneTimeline(rawTimeline); + } + } + + if (in(rawData, ObjectDataParser.SLOT)) { + Array rawTimelines = getArray(rawData, ObjectDataParser.SLOT); + for (Object rawTimeline : rawTimelines) { + this._parseSlotTimeline(rawTimeline); + } + } + + if (in(rawData, ObjectDataParser.FFD)) { + Array rawTimelines = getArray(rawData, ObjectDataParser.FFD); + for (Object rawTimeline : rawTimelines) { + String slotName = getString(rawTimeline, ObjectDataParser.SLOT, ""); + String displayName = getString(rawTimeline, ObjectDataParser.NAME, ""); + SlotData slot = this._armature.getSlot(slotName); + if (slot == null) { + continue; + } + + this._slot = slot; + this._mesh = this._meshs.get(displayName); + + TimelineData timelineFFD = this._parseTimeline(rawTimeline, TimelineType.SlotFFD, false, true, 0, this::_parseSlotFFDFrame); + if (timelineFFD != null) { + this._animation.addSlotTimeline(slot, timelineFFD); + } + + this._slot = null; // + this._mesh = null; // + } + } + + if (this._actionFrames.size() > 0) { + this._actionFrames.sort(this::_sortActionFrame); + + TimelineData timeline = this._animation.actionTimeline = BaseObject.borrowObject(TimelineData.class); + CharArray timelineArray = this._data.timelineArray; + int keyFrameCount = this._actionFrames.size(); + timeline.type = TimelineType.Action; + timeline.offset = timelineArray.length(); + timelineArray.incrementLength(1 + 1 + 1 + 1 + 1 + keyFrameCount); + timelineArray.set(timeline.offset + BinaryOffset.TimelineScale.v, 100); + timelineArray.set(timeline.offset + BinaryOffset.TimelineOffset.v, 0); + timelineArray.set(timeline.offset + BinaryOffset.TimelineKeyFrameCount.v, keyFrameCount); + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueCount.v, 0); + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueOffset.v, 0); + + this._timeline = timeline; + + if (keyFrameCount == 1) { + timeline.frameIndicesOffset = -1; + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameOffset.v + 0, this._parseCacheActionFrame(this._actionFrames.get(0)) - this._animation.frameOffset); + } else { + int totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + IntArray frameIndices = this._data.frameIndices; + timeline.frameIndicesOffset = frameIndices.length(); + frameIndices.incrementLength(totalFrameCount); + + for ( + int i = 0, iK = 0, frameStart = 0, frameCount = 0; + i < totalFrameCount; + ++i + ) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + ActionFrame frame = this._actionFrames.get(iK); + frameStart = frame.frameStart; + if (iK == keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } else { + frameCount = this._actionFrames.get(iK + 1).frameStart - frameStart; + } + + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameOffset.v + iK, this._parseCacheActionFrame(frame) - this._animation.frameOffset); + iK++; + } + + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + } + + this._timeline = null; // + this._actionFrames.clear(); + } + + this._animation = null; // + + return animation; + } + + interface FrameParser { + int parse(Object rawData, int frameStart, int frameCount); + } + + /** + * @private + */ + @Nullable + protected TimelineData _parseTimeline( + Object rawData, TimelineType type, + boolean addIntOffset, boolean addFloatOffset, int frameValueCount, + FrameParser frameParser + ) + + { + if (!(in(rawData, ObjectDataParser.FRAME))) { + return null; + } + + Array rawFrames = getArray(rawData, ObjectDataParser.FRAME); + int keyFrameCount = rawFrames.size(); + if (keyFrameCount == 0) { + return null; + } + + CharArray timelineArray = this._data.timelineArray; + int frameIntArrayLength = this._data.frameIntArray.length(); + int frameFloatArrayLength = this._data.frameFloatArray.length(); + TimelineData timeline = BaseObject.borrowObject(TimelineData.class); + timeline.type = type; + timeline.offset = timelineArray.length(); + timelineArray.incrementLength(1 + 1 + 1 + 1 + 1 + keyFrameCount); + timelineArray.set(timeline.offset + BinaryOffset.TimelineScale.v, (int) Math.round(getFloat(rawData, ObjectDataParser.SCALE, 1f) * 100)); + timelineArray.set(timeline.offset + BinaryOffset.TimelineOffset.v, (int) Math.round(getFloat(rawData, ObjectDataParser.OFFSET, 0f) * 100)); + timelineArray.set(timeline.offset + BinaryOffset.TimelineKeyFrameCount.v, keyFrameCount); + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueCount.v, frameValueCount); + if (addIntOffset) { + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueOffset.v, frameIntArrayLength - this._animation.frameIntOffset); + } else if (addFloatOffset) { + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueOffset.v, frameFloatArrayLength - this._animation.frameFloatOffset); + } else { + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameValueOffset.v, 0); + } + + this._timeline = timeline; + + if (keyFrameCount == 1) { // Only one frame. + timeline.frameIndicesOffset = -1; + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameOffset.v + 0, frameParser.parse(rawFrames.get(0), 0, 0) - this._animation.frameOffset); + } else { + IntArray frameIndices = this._data.frameIndices; + int totalFrameCount = this._animation.frameCount + 1; // One more frame than animation. + timeline.frameIndicesOffset = frameIndices.size(); + frameIndices.incrementLength(totalFrameCount); + + for (int i = 0, iK = 0, frameStart = 0, frameCount = 0; i < totalFrameCount; ++i) { + if (frameStart + frameCount <= i && iK < keyFrameCount) { + Object rawFrame = rawFrames.get(iK); + frameStart = i; + frameCount = getInt(rawFrame, ObjectDataParser.DURATION, 1); + if (iK == keyFrameCount - 1) { + frameCount = this._animation.frameCount - frameStart; + } + + timelineArray.set(timeline.offset + BinaryOffset.TimelineFrameOffset.v + iK, frameParser.parse(rawFrame, frameStart, frameCount) - this._animation.frameOffset); + iK++; + } + + frameIndices.set(timeline.frameIndicesOffset + i, iK - 1); + } + } + + this._timeline = null; // + + return timeline; + } + + /** + * @private + */ + protected void _parseBoneTimeline(Object rawData) + + { + BoneData bone = this._armature.getBone(getString(rawData, ObjectDataParser.NAME, "")); + if (bone == null) { + return; + } + + this._bone = bone; + this._slot = this._armature.getSlot(this._bone.name); + + TimelineData timeline = this._parseTimeline( + rawData, TimelineType.BoneAll, + false, true, 6, + this::_parseBoneFrame + ); + if (timeline != null) { + this._animation.addBoneTimeline(bone, timeline); + } + + this._bone = null; // + this._slot = null; // + } + + /** + * @private + */ + protected void _parseSlotTimeline(Object rawData) + + { + SlotData slot = this._armature.getSlot(getString(rawData, ObjectDataParser.NAME, "")); + if (slot == null) { + return; + } + + this._slot = slot; + + TimelineData displayIndexTimeline = this._parseTimeline(rawData, TimelineType.SlotDisplay, false, false, 0, this::_parseSlotDisplayIndexFrame); + if (displayIndexTimeline != null) { + this._animation.addSlotTimeline(slot, displayIndexTimeline); + } + + TimelineData colorTimeline = this._parseTimeline(rawData, TimelineType.SlotColor, true, false, 1, this::_parseSlotColorFrame); + if (colorTimeline != null) { + this._animation.addSlotTimeline(slot, colorTimeline); + } + + this._slot = null; // + } + + /** + * @private + */ + protected int _parseFrame(Object rawData, int frameStart, int frameCount, IntArray frameArray) + + { + int frameOffset = frameArray.size(); + frameArray.incrementLength(1); + frameArray.set(frameOffset + BinaryOffset.FramePosition.v, frameStart); + + return frameOffset; + } + + /** + * @private + */ + protected int _parseTweenFrame(Object rawData, int frameStart, int frameCount, IntArray frameArray) + + { + int frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + if (frameCount > 0) { + if (in(rawData, ObjectDataParser.CURVE)) { + int sampleCount = frameCount + 1; + this._helpArray.setLength(sampleCount); + this._samplingEasingCurve(getFloatArray(rawData, ObjectDataParser.CURVE), this._helpArray); + + frameArray.incrementLength(1 + 1 + this._helpArray.getLength()); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.Curve.v); + frameArray.set(frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v, sampleCount); + for (int i = 0; i < sampleCount; ++i) { + frameArray.set(frameOffset + BinaryOffset.FrameCurveSamples.v + i, (int) Math.round(this._helpArray.get(i) * 10000.0)); + } + } else { + float noTween = -2.0f; + float tweenEasing = noTween; + if (in(rawData, ObjectDataParser.TWEEN_EASING)) { + tweenEasing = getFloat(rawData, ObjectDataParser.TWEEN_EASING, noTween); + } + + if (tweenEasing == noTween) { + frameArray.incrementLength(1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.None.v); + } else if (tweenEasing == 0f) { + frameArray.incrementLength(1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.Line.v); + } else if (tweenEasing < 0f) { + frameArray.incrementLength(1 + 1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.QuadIn.v); + frameArray.set(frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v, (int) Math.round(-tweenEasing * 100.0)); + } else if (tweenEasing <= 1f) { + frameArray.incrementLength(1 + 1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.QuadOut.v); + frameArray.set(frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v, (int) Math.round(tweenEasing * 100.0)); + } else { + frameArray.incrementLength(1 + 1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.QuadInOut.v); + frameArray.set(frameOffset + BinaryOffset.FrameTweenEasingOrCurveSampleCount.v, (int) Math.round(tweenEasing * 100.0 - 100.0)); + } + } + } else { + frameArray.incrementLength(1); + frameArray.set(frameOffset + BinaryOffset.FrameTweenType.v, TweenType.None.v); + } + + return frameOffset; + } + + /** + * @private + */ + protected int _parseZOrderFrame(Object rawData, int frameStart, int frameCount) + + { + ShortArray frameArray = this._data.frameArray; + int frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + if (in(rawData, ObjectDataParser.Z_ORDER)) { + IntArray rawZOrder = getIntArray(rawData, ObjectDataParser.Z_ORDER); + if (rawZOrder.length() > 0) { + int slotCount = this._armature.sortedSlots.length(); + IntArray unchanged = new IntArray(slotCount - rawZOrder.length() / 2); + IntArray zOrders = new IntArray(slotCount); + + for (int i = 0; i < slotCount; ++i) { + zOrders.set(i, -1); + } + + int originalIndex = 0; + int unchangedIndex = 0; + for (int i = 0, l = rawZOrder.length(); i < l; i += 2) { + int slotIndex = rawZOrder.get(i); + int zOrderOffset = rawZOrder.get(i + 1); + + while (originalIndex != slotIndex) { + unchanged.set(unchangedIndex++, originalIndex++); + } + + zOrders.set(originalIndex + zOrderOffset, originalIndex++); + } + + while (originalIndex < slotCount) { + unchanged.set(unchangedIndex++, originalIndex++); + } + + frameArray.incrementLength(1 + slotCount); + frameArray.set(frameOffset + 1, slotCount); + + int i = slotCount; + while (i-- > 0) { + if (zOrders.get(i) == -1) { + frameArray.set(frameOffset + 2 + i, unchanged.get(--unchangedIndex)); + } else { + frameArray.set(frameOffset + 2 + i, zOrders.get(i)); + } + } + + return frameOffset; + } + } + + frameArray.incrementLength(1); + frameArray.set(frameOffset + 1, 0); + + return frameOffset; + } + + /** + * @private + */ + protected int _parseBoneFrame(Object rawData, int frameStart, int frameCount) + + { + FloatArray frameFloatArray = this._data.frameFloatArray; + ShortArray frameArray = this._data.frameArray; + int frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + + this._helpTransform.identity(); + if (in(rawData, ObjectDataParser.TRANSFORM)) { + this._parseTransform(get(rawData, ObjectDataParser.TRANSFORM), this._helpTransform, 1f); + } + + // Modify rotation. + float rotation = this._helpTransform.rotation; + if (frameStart != 0) { + if (this._prevTweenRotate == 0) { + rotation = this._prevRotation + Transform.normalizeRadian(rotation - this._prevRotation); + } else { + if (this._prevTweenRotate > 0 ? rotation >= this._prevRotation : rotation <= this._prevRotation) { + this._prevTweenRotate = this._prevTweenRotate > 0 ? this._prevTweenRotate - 1 : this._prevTweenRotate + 1; + } + + rotation = this._prevRotation + rotation - this._prevRotation + Transform.PI_D * this._prevTweenRotate; + } + } + + this._prevTweenRotate = getFloat(rawData, ObjectDataParser.TWEEN_ROTATE, 0f); + this._prevRotation = rotation; + + int frameFloatOffset = frameFloatArray.length(); + frameFloatArray.incrementLength(6); + frameFloatArray.set(frameFloatOffset++, this._helpTransform.x); + frameFloatArray.set(frameFloatOffset++, this._helpTransform.y); + frameFloatArray.set(frameFloatOffset++, rotation); + frameFloatArray.set(frameFloatOffset++, this._helpTransform.skew); + frameFloatArray.set(frameFloatOffset++, this._helpTransform.scaleX); + frameFloatArray.set(frameFloatOffset++, this._helpTransform.scaleY); + + this._parseActionDataInFrame(rawData, frameStart, this._bone, this._slot); + + return frameOffset; + } + + /** + * @private + */ + protected int _parseSlotDisplayIndexFrame(Object rawData, int frameStart, int frameCount) + + { + ShortArray frameArray = this._data.frameArray; + int frameOffset = this._parseFrame(rawData, frameStart, frameCount, frameArray); + + frameArray.incrementLength(1); + frameArray.set(frameOffset + 1, getInt(rawData, ObjectDataParser.DISPLAY_INDEX, 0)); + + this._parseActionDataInFrame(rawData, frameStart, this._slot.parent, this._slot); + + return frameOffset; + } + + /** + * @private + */ + protected int _parseSlotColorFrame(Object rawData, int frameStart, int frameCount) + + { + ShortArray intArray = this._data.intArray; + ShortArray frameIntArray = this._data.frameIntArray; + ShortArray frameArray = this._data.frameArray; + int frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + + int colorOffset = -1; + if (in(rawData, ObjectDataParser.COLOR)) { + Array rawColor = getArray(rawData, ObjectDataParser.COLOR); + for (int k = 0; k < rawColor.length(); k++) { + this._parseColorTransform(rawColor, this._helpColorTransform); + colorOffset = intArray.length(); + intArray.incrementLength(8); + intArray.set(colorOffset++, (int) Math.round(this._helpColorTransform.alphaMultiplier * 100)); + intArray.set(colorOffset++, (int) Math.round(this._helpColorTransform.redMultiplier * 100)); + intArray.set(colorOffset++, (int) Math.round(this._helpColorTransform.greenMultiplier * 100)); + intArray.set(colorOffset++, (int) Math.round(this._helpColorTransform.blueMultiplier * 100)); + intArray.set(colorOffset++, Math.round(this._helpColorTransform.alphaOffset)); + intArray.set(colorOffset++, Math.round(this._helpColorTransform.redOffset)); + intArray.set(colorOffset++, Math.round(this._helpColorTransform.greenOffset)); + intArray.set(colorOffset++, Math.round(this._helpColorTransform.blueOffset)); + colorOffset -= 8; + break; + } + } + + if (colorOffset < 0) { + if (this._defalultColorOffset < 0) { + this._defalultColorOffset = colorOffset = intArray.length(); + intArray.incrementLength(8); + intArray.set(colorOffset++, 100); + intArray.set(colorOffset++, 100); + intArray.set(colorOffset++, 100); + intArray.set(colorOffset++, 100); + intArray.set(colorOffset++, 0); + intArray.set(colorOffset++, 0); + intArray.set(colorOffset++, 0); + intArray.set(colorOffset++, 0); + } + + colorOffset = this._defalultColorOffset; + } + + int frameIntOffset = frameIntArray.length(); + frameIntArray.incrementLength(1); + frameIntArray.set(frameIntOffset, colorOffset); + + return frameOffset; + } + + /** + * @private + */ + protected int _parseSlotFFDFrame(Object rawData, int frameStart, int frameCount) + + { + IntArray intArray = this._data.intArray; + FloatArray frameFloatArray = this._data.frameFloatArray; + ShortArray frameArray = this._data.frameArray; + int frameFloatOffset = frameFloatArray.length(); + int frameOffset = this._parseTweenFrame(rawData, frameStart, frameCount, frameArray); + FloatArray rawVertices = in(rawData, ObjectDataParser.VERTICES) ? getFloatArray(rawData, ObjectDataParser.VERTICES) : null; + int offset = getInt(rawData, ObjectDataParser.OFFSET, 0); // uint + int vertexCount = intArray.get(this._mesh.offset + BinaryOffset.MeshVertexCount.v); + + float x = 0f; + float y = 0f; + int iB = 0; + int iV = 0; + if (this._mesh.weight != null) { + FloatArray rawSlotPose = this._weightSlotPose.get(this._mesh.name); + this._helpMatrixA.copyFromArray(rawSlotPose, 0); + frameFloatArray.incrementLength(this._mesh.weight.count * 2); + iB = this._mesh.weight.offset + BinaryOffset.WeigthBoneIndices.v + this._mesh.weight.bones.length(); + } else { + frameFloatArray.incrementLength(vertexCount * 2); + } + + for ( + int i = 0; + i < vertexCount * 2; + i += 2 + ) { + if (rawVertices == null) { // Fill 0. + x = 0f; + y = 0f; + } else { + if (i < offset || i - offset >= rawVertices.length()) { + x = 0f; + } else { + x = rawVertices.get(i - offset); + } + + if (i + 1 < offset || i + 1 - offset >= rawVertices.length()) { + y = 0f; + } else { + y = rawVertices.get(i + 1 - offset); + } + } + + if (this._mesh.weight != null) { // If mesh is skinned, transform point by bone bind pose. + FloatArray rawBonePoses = this._weightBonePoses.get(this._mesh.name); + IntArray weightBoneIndices = this._weightBoneIndices.get(this._mesh.name); + int vertexBoneCount = intArray.get(iB++); + + this._helpMatrixA.transformPoint(x, y, this._helpPoint, true); + x = this._helpPoint.x; + y = this._helpPoint.y; + + for (int j = 0; j < vertexBoneCount; ++j) { + int boneIndex = intArray.get(iB++); + BoneData bone = this._mesh.weight.bones.get(boneIndex); + int rawBoneIndex = this._rawBones.indexOf(bone); + + this._helpMatrixB.copyFromArray(rawBonePoses, weightBoneIndices.indexOf(rawBoneIndex) * 7 + 1); + this._helpMatrixB.invert(); + this._helpMatrixB.transformPoint(x, y, this._helpPoint, true); + + frameFloatArray.set(frameFloatOffset + iV++, this._helpPoint.x); + frameFloatArray.set(frameFloatOffset + iV++, this._helpPoint.y); + } + } else { + frameFloatArray.set(frameFloatOffset + i, x); + frameFloatArray.set(frameFloatOffset + i + 1, y); + } + } + + if (frameStart == 0) { + ShortArray frameIntArray = this._data.frameIntArray; + CharArray timelineArray = this._data.timelineArray; + int frameIntOffset = frameIntArray.length(); + frameIntArray.incrementLength(1 + 1 + 1 + 1 + 1); + frameIntArray.set(frameIntOffset + BinaryOffset.FFDTimelineMeshOffset.v, this._mesh.offset); + frameIntArray.set(frameIntOffset + BinaryOffset.FFDTimelineFFDCount.v, frameFloatArray.length() - frameFloatOffset); + frameIntArray.set(frameIntOffset + BinaryOffset.FFDTimelineValueCount.v, frameFloatArray.length() - frameFloatOffset); + frameIntArray.set(frameIntOffset + BinaryOffset.FFDTimelineValueOffset.v, 0); + frameIntArray.set(frameIntOffset + BinaryOffset.FFDTimelineFloatOffset.v, frameFloatOffset); + timelineArray.set(this._timeline.offset + BinaryOffset.TimelineFrameValueCount.v, frameIntOffset - this._animation.frameIntOffset); + } + + return frameOffset; + } + + /** + * @private + */ + protected int _parseActionData(Object rawData, Array actions, ActionType type, @Nullable BoneData bone, @Nullable SlotData slot) + + { + int actionCount = 0; + + if (rawData instanceof String) { + ActionData action = BaseObject.borrowObject(ActionData.class); + action.type = type; + action.name = (String) rawData; + action.bone = bone; + action.slot = slot; + actions.push(action); + actionCount++; + } else if (rawData instanceof ArrayBase) { + for (Object rawAction : (ArrayBase) rawData) { + ActionData action = BaseObject.borrowObject(ActionData.class); + if (in(rawAction, ObjectDataParser.GOTO_AND_PLAY)) { + action.type = ActionType.Play; + action.name = getString(rawAction, ObjectDataParser.GOTO_AND_PLAY, ""); + } else { + if (in(rawAction, ObjectDataParser.TYPE) && get(rawAction, ObjectDataParser.TYPE) instanceof String) { + action.type = ObjectDataParser._getActionType(getString(rawAction, ObjectDataParser.TYPE)); + } else { + action.type = ActionType.values[getInt(rawAction, ObjectDataParser.TYPE, type.v)]; + } + + action.name = getString(rawAction, ObjectDataParser.NAME, ""); + } + + if (in(rawAction, ObjectDataParser.BONE)) { + String boneName = getString(rawAction, ObjectDataParser.BONE, ""); + action.bone = this._armature.getBone(boneName); + } else { + action.bone = bone; + } + + if (in(rawAction, ObjectDataParser.SLOT)) { + String slotName = getString(rawAction, ObjectDataParser.SLOT, ""); + action.slot = this._armature.getSlot(slotName); + } else { + action.slot = slot; + } + + if (in(rawAction, ObjectDataParser.INTS)) { + if (action.data == null) { + action.data = BaseObject.borrowObject(UserData.class); + } + + IntArray rawInts = getIntArray(rawAction, ObjectDataParser.INTS); + for (int rawValue : rawInts) { + action.data.ints.push(rawValue); + } + } + + if (in(rawAction, ObjectDataParser.FLOATS)) { + if (action.data == null) { + action.data = BaseObject.borrowObject(UserData.class); + } + + FloatArray rawFloats = getFloatArray(rawAction, ObjectDataParser.FLOATS); + for (float rawValue : rawFloats) { + action.data.floats.push(rawValue); + } + } + + if (in(rawAction, ObjectDataParser.STRINGS)) { + if (action.data == null) { + action.data = BaseObject.borrowObject(UserData.class); + } + + Array rawStrings = getArray(rawAction, ObjectDataParser.STRINGS); + for (String rawValue : rawStrings) { + action.data.strings.push(rawValue); + } + } + + actions.push(action); + actionCount++; + } + } + + return actionCount; + } + + /** + * @private + */ + protected void _parseTransform(Object rawData, Transform transform, float scale) + + { + transform.x = getFloat(rawData, ObjectDataParser.X, 0f) * scale; + transform.y = getFloat(rawData, ObjectDataParser.Y, 0f) * scale; + + if (in(rawData, ObjectDataParser.ROTATE) || in(rawData, ObjectDataParser.SKEW)) { + transform.rotation = Transform.normalizeRadian(getFloat(rawData, ObjectDataParser.ROTATE, 0f) * Transform.DEG_RAD); + transform.skew = Transform.normalizeRadian(getFloat(rawData, ObjectDataParser.SKEW, 0f) * Transform.DEG_RAD); + } else if (in(rawData, ObjectDataParser.SKEW_X) || in(rawData, ObjectDataParser.SKEW_Y)) { + transform.rotation = Transform.normalizeRadian(getFloat(rawData, ObjectDataParser.SKEW_Y, 0f) * Transform.DEG_RAD); + transform.skew = Transform.normalizeRadian(getFloat(rawData, ObjectDataParser.SKEW_X, 0f) * Transform.DEG_RAD) - transform.rotation; + } + + transform.scaleX = getFloat(rawData, ObjectDataParser.SCALE_X, 1f); + transform.scaleY = getFloat(rawData, ObjectDataParser.SCALE_Y, 1f); + } + + /** + * @private + */ + protected void _parseColorTransform(Object rawData, ColorTransform color) + + { + color.alphaMultiplier = getFloat(rawData, ObjectDataParser.ALPHA_MULTIPLIER, 100) * 0.01f; + color.redMultiplier = getFloat(rawData, ObjectDataParser.RED_MULTIPLIER, 100) * 0.01f; + color.greenMultiplier = getFloat(rawData, ObjectDataParser.GREEN_MULTIPLIER, 100) * 0.01f; + color.blueMultiplier = getFloat(rawData, ObjectDataParser.BLUE_MULTIPLIER, 100) * 0.01f; + color.alphaOffset = getInt(rawData, ObjectDataParser.ALPHA_OFFSET, 0); + color.redOffset = getInt(rawData, ObjectDataParser.RED_OFFSET, 0); + color.greenOffset = getInt(rawData, ObjectDataParser.GREEN_OFFSET, 0); + color.blueOffset = getInt(rawData, ObjectDataParser.BLUE_OFFSET, 0); + } + + /** + * @private + */ + protected void _parseArray(Object rawData) { + this._data.intArray = new ShortArray(); + this._data.floatArray = new FloatArray(); + this._data.frameIntArray = new ShortArray(); + this._data.frameFloatArray = new FloatArray(); + this._data.frameArray = new ShortArray(); + this._data.timelineArray = new CharArray(); + } + + @Nullable + public DragonBonesData parseDragonBonesDataInstance(@NotNull Object rawData) { + return parseDragonBonesData(rawData, 1f); + } + + /** + * @inheritDoc + */ + @Nullable + public DragonBonesData parseDragonBonesData(@NotNull Object rawData, float scale) { + String version = getString(rawData, ObjectDataParser.VERSION, ""); + String compatibleVersion = getString(rawData, ObjectDataParser.COMPATIBLE_VERSION, ""); + + if ( + Arrays.asList(ObjectDataParser.DATA_VERSIONS).indexOf(version) >= 0 || + Arrays.asList(ObjectDataParser.DATA_VERSIONS).indexOf(compatibleVersion) >= 0 + ) { + DragonBonesData data = BaseObject.borrowObject(DragonBonesData.class); + data.version = version; + data.name = getString(rawData, ObjectDataParser.NAME, ""); + data.frameRate = getFloat(rawData, ObjectDataParser.FRAME_RATE, 24); + + if (data.frameRate == 0) { // Data error. + data.frameRate = 24; + } + + if (in(rawData, ObjectDataParser.ARMATURE)) { + this._defalultColorOffset = -1; + this._data = data; + + this._parseArray(rawData); + + Array rawArmatures = getArray(rawData, ObjectDataParser.ARMATURE); + for (Object rawArmature : rawArmatures) { + data.addArmature(this._parseArmature(rawArmature, scale)); + } + + if (this._intArrayJson.length() > 0) { + //this._parseWASMArray(); + throw new RuntimeException("this._parseWASMArray() not ported"); + } + + this._data = null; + } + + this._rawTextureAtlasIndex = 0; + if (in(rawData, ObjectDataParser.TEXTURE_ATLAS)) { + this._rawTextureAtlases = getArray(rawData, ObjectDataParser.TEXTURE_ATLAS); + } else { + this._rawTextureAtlases = null; + } + + return data; + } else { + Console._assert(false, "Nonsupport data version."); + } + + return null; + } + + public boolean parseTextureAtlasData(Object rawData, TextureAtlasData textureAtlasData) { + return parseTextureAtlasData(rawData, textureAtlasData, 0f); + } + + /** + * @inheritDoc + */ + public boolean parseTextureAtlasData(Object rawData, TextureAtlasData textureAtlasData, float scale) { + if (rawData == null) { + if (this._rawTextureAtlases == null) { + return false; + } + + Object rawTextureAtlas = this._rawTextureAtlases.get(this._rawTextureAtlasIndex++); + this.parseTextureAtlasData(rawTextureAtlas, textureAtlasData, scale); + if (this._rawTextureAtlasIndex >= this._rawTextureAtlases.length()) { + this._rawTextureAtlasIndex = 0; + this._rawTextureAtlases = null; + } + + return true; + } + + // Texture format. + textureAtlasData.width = getFloat(rawData, ObjectDataParser.WIDTH, 0); + textureAtlasData.height = getFloat(rawData, ObjectDataParser.HEIGHT, 0); + textureAtlasData.name = getString(rawData, ObjectDataParser.NAME, ""); + textureAtlasData.imagePath = getString(rawData, ObjectDataParser.IMAGE_PATH, ""); + + if (scale > 0f) { // Use params scale. + textureAtlasData.scale = scale; + } else { // Use data scale. + scale = textureAtlasData.scale = getFloat(rawData, ObjectDataParser.SCALE, textureAtlasData.scale); + } + + scale = 1f / scale; // + + if (in(rawData, ObjectDataParser.SUB_TEXTURE)) { + ArrayBase rawTextures = getArray(rawData, ObjectDataParser.SUB_TEXTURE); + for (int i = 0, l = rawTextures.length(); i < l; ++i) { + Object rawTexture = rawTextures.getObject(i); + TextureData textureData = textureAtlasData.createTexture(); + textureData.rotated = getBool(rawTexture, ObjectDataParser.ROTATED, false); + textureData.name = getString(rawTexture, ObjectDataParser.NAME, ""); + textureData.region.x = getFloat(rawTexture, ObjectDataParser.X, 0f) * scale; + textureData.region.y = getFloat(rawTexture, ObjectDataParser.Y, 0f) * scale; + textureData.region.width = getFloat(rawTexture, ObjectDataParser.WIDTH, 0f) * scale; + textureData.region.height = getFloat(rawTexture, ObjectDataParser.HEIGHT, 0f) * scale; + + float frameWidth = getFloat(rawTexture, ObjectDataParser.FRAME_WIDTH, -1f); + float frameHeight = getFloat(rawTexture, ObjectDataParser.FRAME_HEIGHT, -1f); + if (frameWidth > 0f && frameHeight > 0f) { + textureData.frame = TextureData.createRectangle(); + textureData.frame.x = getFloat(rawTexture, ObjectDataParser.FRAME_X, 0f) * scale; + textureData.frame.y = getFloat(rawTexture, ObjectDataParser.FRAME_Y, 0f) * scale; + textureData.frame.width = frameWidth * scale; + textureData.frame.height = frameHeight * scale; + } + + textureAtlasData.addTexture(textureData); + } + } + + return true; + } + + /** + * @private + */ + private static ObjectDataParser _objectDataParserInstance = null; + + /** + * @see BaseFactory#parseDragonBonesData(Object, String, float) + * @deprecated 已废弃,请参考 @see + */ + public static ObjectDataParser getInstance() { + if (ObjectDataParser._objectDataParserInstance == null) { + ObjectDataParser._objectDataParserInstance = new ObjectDataParser(); + } + + return ObjectDataParser._objectDataParserInstance; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/Array.java new file mode 100644 index 0000000..240f411 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/Array.java @@ -0,0 +1,87 @@ +package com.dragonbones.util; + +import java.util.Arrays; +import java.util.Comparator; + +final public class Array extends ArrayBase { + private int length; + private T[] data = (T[]) new Object[0]; + + public Array() { + this((T[]) new Object[16], 0); + } + + public Array(int length) { + this((T[]) new Object[length], length); + } + + public Array(T[] data) { + this(data, data.length); + } + + public Array(T[] data, int length) { + this.data = data; + this.length = length; + } + + @Override + public ArrayBase create(int count) { + return new Array<>(count); + } + + private void ensureCapacity(int minLength) { + if (data.length < minLength) { + data = Arrays.copyOf(data, Math.max(minLength, data.length * 3)); + } + } + + public T get(int index) { + return data[index]; + } + + public void set(int index, T value) { + data[index] = value; + } + + @Override + public T getObject(int index) { + return get(index); + } + + @Override + public void setObject(int index, T value) { + set(index, value); + } + + //@Deprecated + public void add(T value) { + pushObject(value); + } + + public void push(T value) { + pushObject(value); + } + + @Override + public int getLength() { + return length; + } + + @Override + public void setLength(int length) { + this.length = length; + ensureCapacity(length); + } + + public Array copy() { + Array out = new Array<>(); + out.length = length; + out.data = Arrays.copyOf(data, data.length); + return out; + } + + @Override + public void sort(Comparator comparator, int start, int end) { + Arrays.sort(data, start, end, comparator); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/ArrayBase.java b/dragonbones-core/src/main/java/com/dragonbones/util/ArrayBase.java new file mode 100644 index 0000000..ffb84e0 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/ArrayBase.java @@ -0,0 +1,140 @@ +package com.dragonbones.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.Objects; + +public abstract class ArrayBase implements Iterable { + abstract public int getLength(); + + abstract public void setLength(int length); + + abstract public T getObject(int index); + + abstract public void setObject(int index, T value); + + abstract public ArrayBase create(int count); + + final public int length() { + return getLength(); + } + + final public int size() { + return getLength(); + } + + final public void clear() { + setLength(0); + } + + final public void incrementLength(int delta) { + setLength(getLength() + delta); + } + + // @TODO: Optimize this! + public int indexOf(T value) { + return indexOfObject(value); + } + + public int indexOfObject(T value) { + for (int n = 0; n < length(); n++) { + if (Objects.equals(getObject(n), value)) { + return n; + } + } + return -1; + } + + public void pushObject(T value) { + incrementLength(1); + setObject(getLength() - 1, value); + } + + public T popObject() { + T out = getObject(getLength() - 1); + incrementLength(-1); + return out; + } + + public void unshiftObject(T item) { + setLength(getLength() + 1); + for (int n = 1; n < getLength(); n++) { + setObject(n - 1, getObject(n)); + } + setObject(0, item); + } + + @NotNull + @Override + public Iterator iterator() { + final int[] pos = {0}; + return new Iterator() { + @Override + public boolean hasNext() { + return pos[0] < getLength(); + } + + @Override + public T next() { + return getObject(pos[0]++); + } + }; + } + + static private Object[] EMPTY_ARRAY = new Object[0]; + + public void splice(int index, int removeCount, T... addItems) { + ArrayBase ref = copy(); + if (addItems == null) addItems = (T[]) EMPTY_ARRAY; + setLength(getLength() - removeCount + addItems.length); + for (int n = 0; n < index; n++) { + this.setObject(n, ref.getObject(n)); + } + for (int n = 0; n < addItems.length; n++) { + this.setObject(index + n, addItems[n]); + } + for (int n = 0; n < ref.length() - removeCount; n++) { + this.setObject(index + addItems.length + n, ref.getObject(index + removeCount + n)); + } + } + + public ArrayBase copy() { + return slice(); + } + + public ArrayBase slice() { + return slice(0, getLength()); + } + + public ArrayBase slice(int start) { + return slice(start, getLength()); + } + + public ArrayBase slice(int start, int end) { + int count = end - start; + ArrayBase out = create(count); + for (int n = 0; n < count; n++) { + out.setObject(n, this.getObject(start + n)); + } + return out; + } + + public ArrayBase concat(T... items) { + ArrayBase out = create(this.length() + items.length); + for (int n = 0; n < this.length(); n++) { + out.setObject(n, this.getObject(n)); + } + for (int n = 0; n < items.length; n++) { + out.setObject(this.length() + n, items[n]); + } + return out; + } + + public void sort(Comparator comparator) { + sort(comparator, 0, getLength()); + } + + abstract public void sort(Comparator comparator, int start, int end); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/BoolArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/BoolArray.java new file mode 100644 index 0000000..0a716d1 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/BoolArray.java @@ -0,0 +1,16 @@ +package com.dragonbones.util; + +final public class BoolArray extends IntArray { + @Override + protected IntArray createInstance() { + return new BoolArray(); + } + + public boolean getBool(int index) { + return get(index) != 0; + } + + public void setBool(int index, boolean value) { + set(index, value ? 1 : 0); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/CharArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/CharArray.java new file mode 100644 index 0000000..d62c4c3 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/CharArray.java @@ -0,0 +1,27 @@ +package com.dragonbones.util; + +public class CharArray extends IntArray { + public CharArray(boolean none) { + super(none); + } + + public CharArray() { + } + + public CharArray(int length) { + super(length); + } + + public CharArray(int[] data) { + super(data); + } + + public CharArray(int[] data, int length) { + super(data, length); + } + + @Override + protected IntArray createInstance() { + return new CharArray(); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/Console.java b/dragonbones-core/src/main/java/com/dragonbones/util/Console.java new file mode 100644 index 0000000..ceb6bdd --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/Console.java @@ -0,0 +1,13 @@ +package com.dragonbones.util; + +public class Console { + static public void _assert(boolean bool) { + } + + static public void _assert(boolean bool, String msg) { + } + + static public void warn(String msg) { + System.err.println(msg); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/Dynamic.java b/dragonbones-core/src/main/java/com/dragonbones/util/Dynamic.java new file mode 100644 index 0000000..7eabf43 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/Dynamic.java @@ -0,0 +1,151 @@ +package com.dragonbones.util; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +// @TODO: Implement using reflection getter methods, or fields +public class Dynamic { + static public Object get(Object rawData, String key) { + return get(rawData, key, null); + } + + static public Object get(Object rawData, String key, Object defaultValue) { + Object out = defaultValue; + try { + if (rawData instanceof Map) { + out = ((Map) rawData).get(key); + if (out != null) return out; + } else if (rawData instanceof List) { + out = ((List) rawData).get(Integer.parseInt(key)); + if (out != null) return out; + } else if (rawData instanceof ArrayBase) { + out = ((ArrayBase) rawData).getObject(Integer.parseInt(key)); + if (out != null) return out; + } + } catch (Throwable e) { + } + return out; + } + + static public boolean in(Object rawData, String key) { + return get(rawData, key, null) != null; + } + + static public IntArray getIntArray(Object rawData, String key) { + Object obj = get(rawData, key); + if (obj instanceof IntArray) { + return (IntArray) obj; + } else if (obj instanceof Iterable) { + IntArray out = new IntArray(); + for (Object o : (Iterable) obj) out.push(castInt(o, 0)); + return out; + } else { + return null; + } + } + + static public FloatArray getFloatArray(Object rawData, String key) { + Object obj = get(rawData, key); + if (obj instanceof FloatArray) { + return (FloatArray) obj; + } else if (obj instanceof Iterable) { + FloatArray out = new FloatArray(); + for (Object o : (Iterable) obj) out.push(castFloat(o, 0f)); + return out; + } else { + return null; + } + } + + static public Array getArray(Object rawData, String key) { + return castArray(get(rawData, key)); + } + + static public boolean getBool(Object rawData, String key) { + return getBool(rawData, key, false); + } + + static public boolean getBool(Object rawData, String key, boolean defaultValue) { + return castBool(get(rawData, key), defaultValue); + } + + static public int getInt(Object rawData, String key) { + return getInt(rawData, key, 0); + } + + static public int getInt(Object rawData, String key, int defaultValue) { + return (int) getDouble(rawData, key, defaultValue); + } + + static public float getFloat(Object rawData, String key) { + return getFloat(rawData, key, 0f); + } + + static public float getFloat(Object rawData, String key, float defaultValue) { + return (float) getDouble(rawData, key, defaultValue); + } + + static public double getDouble(Object rawData, String key) { + return getDouble(rawData, key, 0.0); + } + + static public double getDouble(Object rawData, String key, double defaultValue) { + return castDouble(get(rawData, key), defaultValue); + } + + static public String getString(Object rawData, String key) { + return getString(rawData, key, null); + } + + static public String getString(Object rawData, String key, String defaultValue) { + Object out = get(rawData, key); + if (out == null) return defaultValue; + return Objects.toString(out); + } + + static public Array castArray(Object obj) { + try { + if (obj instanceof Array) { + return (Array) obj; + } else if (obj instanceof Iterable) { + Array out = new Array<>(); + for (T o : (Iterable) obj) out.push(o); + return out; + } else { + return null; + } + } catch (Throwable e) { + return null; + } + } + + static public int castInt(Object obj, int defaultValue) { + return (int) castDouble(obj, defaultValue); + } + + static public float castFloat(Object obj, float defaultValue) { + return (float) castDouble(obj, defaultValue); + } + + static public boolean castBool(Object obj, boolean defaultValue) { + if (Objects.equals(obj, "true")) return true; + if (Objects.equals(obj, "false")) return false; + return ((int) castDouble(obj, defaultValue ? 1 : 0)) != 0; + } + + static public double castDouble(Object obj, double defaultValue) { + try { + if (obj == null) return defaultValue; + if (obj instanceof Number) { + return ((Number) obj).doubleValue(); + } + if (obj instanceof Boolean) { + return ((Boolean) obj) ? 1 : 0; + } + return Double.parseDouble(Objects.toString(obj)); + } catch (Throwable e) { + return defaultValue; + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/FloatArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/FloatArray.java new file mode 100644 index 0000000..720f25b --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/FloatArray.java @@ -0,0 +1,92 @@ +package com.dragonbones.util; + +import java.util.Arrays; +import java.util.Comparator; + +public class FloatArray extends NumberArray { + static private final float[] EMPTY = new float[0]; + private int length; + private float[] data; + + protected FloatArray(boolean none) { + } + + public FloatArray() { + this(EMPTY, 0); + } + + public FloatArray(int length) { + this(new float[length], length); + } + + public FloatArray(float[] data) { + this(data, data.length); + } + + public FloatArray(float[] data, int length) { + this.data = data; + this.length = length; + } + + private void ensureCapacity(int minLength) { + if (data.length < minLength) { + data = Arrays.copyOf(data, Math.max(16, Math.max(minLength, data.length * 3))); + } + } + + public float get(int index) { + return data[index]; + } + + public void set(int index, float value) { + data[index] = value; + } + + @Override + public Float getObject(int index) { + return get(index); + } + + @Override + public void setObject(int index, Float value) { + set(index, value); + } + + @Override + public ArrayBase create(int count) { + return new FloatArray(count); + } + + public void push(float value) { + int pos = getLength(); + setLength(pos + 1); + data[pos] = value; + } + + @Override + public int getLength() { + return length; + } + + @Override + public void setLength(int length) { + this.length = length; + ensureCapacity(length); + } + + public FloatArray copy() { + FloatArray out = new FloatArray(); + out.length = length; + out.data = Arrays.copyOf(data, data.length); + return out; + } + + public void sort(int start, int end) { + Arrays.sort(data, start, end); + } + + @Override + public void sort(Comparator comparator, int start, int end) { + throw new RuntimeException("Not implemented"); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/Function.java b/dragonbones-core/src/main/java/com/dragonbones/util/Function.java new file mode 100644 index 0000000..bca047f --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/Function.java @@ -0,0 +1,5 @@ +package com.dragonbones.util; + +public interface Function { + void invoke(); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/IntArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/IntArray.java new file mode 100644 index 0000000..f4b3c24 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/IntArray.java @@ -0,0 +1,95 @@ +package com.dragonbones.util; + +import java.util.Arrays; +import java.util.Comparator; + +public class IntArray extends NumberArray { + static private final int[] EMPTY = new int[0]; + private int length; + private int[] data; + + protected IntArray(boolean none) { + } + + public IntArray() { + this(EMPTY, 0); + } + + public IntArray(int length) { + this(new int[length], length); + } + + public IntArray(int[] data) { + this(data, data.length); + } + + public IntArray(int[] data, int length) { + this.data = data; + this.length = length; + } + + private void ensureCapacity(int minLength) { + if (data.length < minLength) { + data = Arrays.copyOf(data, Math.max(16, Math.max(minLength, data.length * 3))); + } + } + + public int get(int index) { + return data[index]; + } + + public void set(int index, int value) { + data[index] = value; + } + + @Override + public Integer getObject(int index) { + return get(index); + } + + @Override + public void setObject(int index, Integer value) { + set(index, (Integer) value); + } + + @Override + public ArrayBase create(int count) { + return new IntArray(count); + } + + public void push(int value) { + int pos = getLength(); + setLength(pos + 1); + data[pos] = value; + } + + @Override + public int getLength() { + return length; + } + + @Override + public void setLength(int length) { + this.length = length; + ensureCapacity(length); + } + + protected IntArray createInstance() { + return new IntArray(); + } + + public IntArray copy() { + IntArray out = createInstance(); + out.length = length; + out.data = Arrays.copyOf(data, data.length); + return out; + } + + public void sort(int start, int end) { + Arrays.sort(data, start, end); + } + + public void sort(Comparator comparator, int start, int end) { + throw new RuntimeException("Not implemented"); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/NumberArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/NumberArray.java new file mode 100644 index 0000000..04a0e0c --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/NumberArray.java @@ -0,0 +1,6 @@ +package com.dragonbones.util; + +public abstract class NumberArray extends ArrayBase { + //abstract public int getInt(int index); + //abstract public void setInt(int index, int value); +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/ShortArray.java b/dragonbones-core/src/main/java/com/dragonbones/util/ShortArray.java new file mode 100644 index 0000000..f606b32 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/ShortArray.java @@ -0,0 +1,27 @@ +package com.dragonbones.util; + +public class ShortArray extends IntArray { + public ShortArray(boolean none) { + super(none); + } + + public ShortArray() { + } + + public ShortArray(int length) { + super(length); + } + + public ShortArray(int[] data) { + super(data); + } + + public ShortArray(int[] data, int length) { + super(data, length); + } + + @Override + protected IntArray createInstance() { + return new ShortArray(); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/StrReader.java b/dragonbones-core/src/main/java/com/dragonbones/util/StrReader.java new file mode 100644 index 0000000..bfa5949 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/StrReader.java @@ -0,0 +1,138 @@ +package com.dragonbones.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Objects; + +public class StrReader { + private int offset; + private String str; + + public StrReader(String str) { + this(str, 0); + } + + public StrReader(String str, int offset) { + this.str = str; + this.offset = offset; + } + + public boolean hasMore() { + return offset() < length(); + } + + public boolean eof() { + return offset() >= length(); + } + + public char peek() { + return str.charAt(offset); + } + + public char read() { + return str.charAt(offset++); + } + + public int offset() { + return offset; + } + + public int length() { + return str.length(); + } + + public int available() { + return length() - offset(); + } + + public String peek(int count) { + return str.substring(offset, offset + Math.min(count, available())); + } + + public String read(int count) { + String out = peek(count); + skip(out.length()); + return out; + } + + public void skip(int count) { + offset += Math.min(count, available()); + } + + public void skip() { + skip(1); + } + + public boolean tryRead(char c) { + if (peek() == c) { + skip(); + return true; + } else { + return false; + } + } + + public String tryRead(String value) { + String read = peek(value.length()); + if (Objects.equals(read, value)) { + skip(read.length()); + return read; + } else { + return null; + } + } + + public String tryRead(String... values) { + for (String value : values) { + String out = tryRead(value); + if (out != null) return out; + } + return null; + } + + public char expect(char expect) { + char value = peek(); + if (value != expect) throw new ParseException("Expected " + expect); + skip(); + return value; + } + + @NotNull + public String expect(@NotNull String expect) { + String value = tryRead(expect); + if (value == null) throw new ParseException("Expected " + expect); + return value; + } + + @NotNull + public String expect(@NotNull String... expect) { + final int offset = this.offset(); + final String value = tryRead(expect); + if (value == null) { + throw new ParseException("Expected " + Arrays.asList(expect) + " at " + offset); + } + return value; + } + + public void skipSpaces() { + while (hasMore()) { + char c = peek(); + if (c == ' ' || c == '\n' || c == '\r' || c == '\t') { + skip(1); + } else { + break; + } + } + } + + static public class ParseException extends RuntimeException { + public ParseException() { + super(); + } + + public ParseException(String s) { + super(s); + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/StreamUtil.java b/dragonbones-core/src/main/java/com/dragonbones/util/StreamUtil.java new file mode 100644 index 0000000..beb6deb --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/StreamUtil.java @@ -0,0 +1,45 @@ +package com.dragonbones.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; + +public class StreamUtil { + static public byte[] readAll(InputStream s) { + byte[] temp = new byte[1024]; + ByteArrayOutputStream os = new ByteArrayOutputStream(); + try { + while (true) { + int read = s.read(temp, 0, temp.length); + if (read <= 0) break; + os.write(temp, 0, read); + } + } catch (IOException e) { + e.printStackTrace(); + } + return os.toByteArray(); + } + + static public String getResourceString(String path, Charset charset) { + try { + return new String(getResourceBytes(path), charset.name()); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + } + + static public byte[] getResourceBytes(String path) { + InputStream s = ClassLoader.getSystemClassLoader().getResourceAsStream(path); + try { + return readAll(s); + } finally { + try { + s.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/StringUtil.java b/dragonbones-core/src/main/java/com/dragonbones/util/StringUtil.java new file mode 100644 index 0000000..b6f92f0 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/StringUtil.java @@ -0,0 +1,11 @@ +package com.dragonbones.util; + +public class StringUtil { + static public String fromCharCode(int cc) { + return new String(new int[]{cc}, 0, 1); + } + + static public String fromCodePoint(int cp) { + return new String(new int[]{cp}, 0, 1); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBuffer.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBuffer.java new file mode 100644 index 0000000..9acdeea --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBuffer.java @@ -0,0 +1,56 @@ +package com.dragonbones.util.buffer; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class ArrayBuffer { + public ByteBuffer data; + + public ArrayBuffer(byte[] data) { + this.data = ByteBuffer.wrap(data).order(ByteOrder.nativeOrder()); + } + + public ArrayBuffer(int length) { + this.data = ByteBuffer.allocate(length).order(ByteOrder.nativeOrder()); + } + + public int getU8(int i) { + return data.get(i); + } + + public int getU32(int i) { + return data.getInt(i); + } + + public float getF32(int i) { + return data.getFloat(i); + } + + public int getU16(int i) { + return data.getChar(i); + } + + public int getS16(int i) { + return data.getShort(i); + } + + public void setS16(int i, int v) { + data.putShort(i, (short) v); + } + + public void setF32(int i, float value) { + data.putFloat(i, value); + } + + public void setU16(int i, int value) { + data.putChar(i, (char)value); + } + + public byte[] getBytes(int i, int count) { + byte[] bytes = new byte[count]; + for (int n = 0; n < count; n++) { + bytes[n] = (byte) getU8(i + n); + } + return bytes; + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBufferView.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBufferView.java new file mode 100644 index 0000000..8ea5554 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/ArrayBufferView.java @@ -0,0 +1,4 @@ +package com.dragonbones.util.buffer; + +public interface ArrayBufferView { +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Float32Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Float32Array.java new file mode 100644 index 0000000..6b3b266 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Float32Array.java @@ -0,0 +1,27 @@ +package com.dragonbones.util.buffer; + +import com.dragonbones.util.FloatArray; + +public class Float32Array extends FloatArray { + static public final int BYTES_PER_ELEMENT = 4; + private final ArrayBuffer buffer; + private final int offset; + private final int count; + private final int byteOffset; + + public Float32Array(ArrayBuffer buffer, int offset, int count) { + super(false); + this.buffer = buffer; + this.offset = offset; + this.count = count; + this.byteOffset = offset * BYTES_PER_ELEMENT; + } + + public float get(int index) { + return buffer.getF32(byteOffset + index * BYTES_PER_ELEMENT); + } + + public void set(int index, float value) { + buffer.setF32(byteOffset + index * BYTES_PER_ELEMENT, value); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Int16Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Int16Array.java new file mode 100644 index 0000000..1a6eb84 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Int16Array.java @@ -0,0 +1,28 @@ +package com.dragonbones.util.buffer; + +import com.dragonbones.util.ShortArray; + +public class Int16Array extends ShortArray implements ArrayBufferView { + static public final int BYTES_PER_ELEMENT = 2; + private final ArrayBuffer buffer; + private final int offset; + private final int count; + private final int byteOffset; + + public Int16Array(ArrayBuffer buffer, int offset, int count) { + super(false); + this.buffer = buffer; + this.offset = offset; + this.count = count; + this.byteOffset = offset * BYTES_PER_ELEMENT; + } + + public int get(int index) { + return buffer.getS16(byteOffset + index * BYTES_PER_ELEMENT); + } + + @Override + public void set(int i, int v) { + buffer.setS16(byteOffset + i * BYTES_PER_ELEMENT, v); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint16Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint16Array.java new file mode 100644 index 0000000..2a515f1 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint16Array.java @@ -0,0 +1,37 @@ +package com.dragonbones.util.buffer; + +import com.dragonbones.util.CharArray; + +public class Uint16Array extends CharArray implements ArrayBufferView { + static public final int BYTES_PER_ELEMENT = 2; + private final ArrayBuffer buffer; + private final int offset; + private final int count; + private final int byteOffset; + + public Uint16Array(ArrayBuffer buffer, int offset, int count) { + super(false); + this.buffer = buffer; + this.offset = offset; + this.count = count; + this.byteOffset = offset * BYTES_PER_ELEMENT; + } + + @Override + public int getLength() { + return count; + } + + @Override + public void setLength(int length) { + } + + public int get(int index) { + return buffer.getU16(byteOffset + index * BYTES_PER_ELEMENT); + } + + @Override + public void set(int index, int value) { + buffer.setU16(byteOffset + index * BYTES_PER_ELEMENT, value); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint32Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint32Array.java new file mode 100644 index 0000000..78d2294 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint32Array.java @@ -0,0 +1,23 @@ +package com.dragonbones.util.buffer; + +import com.dragonbones.util.IntArray; + +public class Uint32Array extends IntArray implements ArrayBufferView { + static public final int BYTES_PER_ELEMENT = 4; + private final ArrayBuffer buffer; + private final int offset; + private final int count; + private final int byteOffset; + + public Uint32Array(ArrayBuffer buffer, int offset, int count) { + super(false); + this.buffer = buffer; + this.offset = offset; + this.count = count; + this.byteOffset = offset * BYTES_PER_ELEMENT; + } + + public int get(int index) { + return buffer.getU32(byteOffset + index * BYTES_PER_ELEMENT); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint8Array.java b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint8Array.java new file mode 100644 index 0000000..6702cd1 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/buffer/Uint8Array.java @@ -0,0 +1,24 @@ +package com.dragonbones.util.buffer; + +public class Uint8Array implements ArrayBufferView { + static public final int BYTES_PER_ELEMENT = 1; + private final ArrayBuffer buffer; + private final int offset; + private final int count; + private final int byteOffset; + + public Uint8Array(ArrayBuffer buffer, int offset, int count) { + this.buffer = buffer; + this.offset = offset; + this.byteOffset = offset; + this.count = count; + } + + public int length() { + return count; + } + + public int get(int index) { + return buffer.getU8(byteOffset + index); + } +} diff --git a/dragonbones-core/src/main/java/com/dragonbones/util/json/JSON.java b/dragonbones-core/src/main/java/com/dragonbones/util/json/JSON.java new file mode 100644 index 0000000..5ce3705 --- /dev/null +++ b/dragonbones-core/src/main/java/com/dragonbones/util/json/JSON.java @@ -0,0 +1,198 @@ +package com.dragonbones.util.json; + +import com.dragonbones.util.Array; +import com.dragonbones.util.StrReader; + +import java.util.HashMap; +import java.util.Objects; + +public class JSON { + static public Object parse(String json) { + return parse(new StrReader(json)); + } + + static public Object parse(StrReader s) { + s.skipSpaces(); + switch (s.peek()) { + case '{': + return parseObject(s); + case '[': + return parseArray(s); + case '"': + return parseString(s); + case 't': + case 'f': + return parseBool(s); + case 'n': + return parseNull(s); + case '.': + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'e': + case 'E': + return parseNumber(s); + } + throw new StrReader.ParseException("Unexpected character " + s.peek()); + } + + static public Object parseObject(StrReader s) { + HashMap out = new HashMap<>(); + s.skipSpaces(); + s.expect('{'); + s.skipSpaces(); + if (s.peek() != '}') { + while (s.hasMore()) { + s.skipSpaces(); + String key = Objects.toString(parse(s)); + s.skipSpaces(); + s.expect(':'); + s.skipSpaces(); + Object value = parse(s); + out.put(key, value); + s.skipSpaces(); + char c = s.peek(); + if (c == ',') { + s.skip(); + continue; + } + if (c == '}') break; + throw new StrReader.ParseException(); + } + } + s.skipSpaces(); + s.expect('}'); + + return out; + } + + static public Array parseArray(StrReader s) { + Array out = new Array<>(); + s.skipSpaces(); + s.expect('['); + s.skipSpaces(); + if (s.peek() != ']') { + while (s.hasMore()) { + s.skipSpaces(); + out.push(parse(s)); + s.skipSpaces(); + char c = s.peek(); + if (c == ',') { + s.skip(); + continue; + } + if (c == ']') break; + throw new StrReader.ParseException(); + } + } + s.skipSpaces(); + s.expect(']'); + s.skipSpaces(); + return out; + } + + static public String parseString(StrReader s) { + StringBuilder sb = new StringBuilder(); + s.skipSpaces(); + s.expect('"'); + while (s.hasMore()) { + char c = s.peek(); + if (c == '"') { + break; + } else if (c == '\\') { + s.skip(); + char cc = s.read(); + switch (cc) { + case 'n': + sb.append('\n'); + break; + case 'r': + sb.append('\r'); + break; + case 't': + sb.append('\t'); + break; + case 'b': + sb.append('\b'); + break; + case 'f': + sb.append('\f'); + break; + case '\\': + sb.append('\\'); + break; + case '/': + sb.append('/'); + break; + case 'u': + sb.appendCodePoint(Integer.parseInt(s.read(4), 16)); + break; + default: + throw new StrReader.ParseException("Invalid " + cc); + } + } else { + sb.append(c); + s.skip(); + } + } + s.expect('"'); + s.skipSpaces(); + return sb.toString(); + } + + static public double parseNumber(StrReader s) { + StringBuilder sb = new StringBuilder(); + s.skipSpaces(); + loop: + while (s.hasMore()) { + char c = s.peek(); + switch (c) { + case '.': + case '+': + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'e': + case 'E': + sb.append(c); + s.skip(); + break; + default: + break loop; + } + } + s.skipSpaces(); + return Double.parseDouble(sb.toString()); + } + + static public boolean parseBool(StrReader s) { + s.skipSpaces(); + String v = s.expect("true", "false"); + s.skipSpaces(); + return Objects.equals(v, "true"); + } + + static public Object parseNull(StrReader s) { + s.skipSpaces(); + s.expect("null"); + s.skipSpaces(); + return null; + } +} diff --git a/dragonbones-core/src/test/java/com/dragonbones/parser/DataParserTest.java b/dragonbones-core/src/test/java/com/dragonbones/parser/DataParserTest.java new file mode 100644 index 0000000..0082a80 --- /dev/null +++ b/dragonbones-core/src/test/java/com/dragonbones/parser/DataParserTest.java @@ -0,0 +1,17 @@ +package com.dragonbones.parser; + +import com.dragonbones.model.DragonBonesData; +import com.dragonbones.util.StreamUtil; +import org.junit.Test; + +import java.nio.charset.StandardCharsets; + +public class DataParserTest { + @Test + public void name() throws Exception { + DragonBonesData data = DataParser.parseDragonBonesDataJson( + StreamUtil.getResourceString("Dragon/Dragon_ske.json", StandardCharsets.UTF_8) + ); + System.out.println(data); + } +} \ No newline at end of file diff --git a/dragonbones-core/src/test/java/com/dragonbones/util/IntArrayTest.java b/dragonbones-core/src/test/java/com/dragonbones/util/IntArrayTest.java new file mode 100644 index 0000000..c3431bf --- /dev/null +++ b/dragonbones-core/src/test/java/com/dragonbones/util/IntArrayTest.java @@ -0,0 +1,22 @@ +package com.dragonbones.util; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; + +import static org.junit.Assert.*; + +public class IntArrayTest { + @Test + public void name() throws Exception { + ArrayList out = new ArrayList<>(); + for (int v : new IntArray(new int[]{1, 2, 3})) { + out.add(v); + } + Assert.assertEquals(3, out.size()); + Assert.assertEquals(1, (int)out.get(0)); + Assert.assertEquals(2, (int)out.get(1)); + Assert.assertEquals(3, (int)out.get(2)); + } +} \ No newline at end of file diff --git a/dragonbones-core/src/test/java/com/dragonbones/util/json/JSONTest.java b/dragonbones-core/src/test/java/com/dragonbones/util/json/JSONTest.java new file mode 100644 index 0000000..d4e1f47 --- /dev/null +++ b/dragonbones-core/src/test/java/com/dragonbones/util/json/JSONTest.java @@ -0,0 +1,31 @@ +package com.dragonbones.util.json; + +import com.dragonbones.util.StreamUtil; +import org.junit.Test; + +import java.nio.charset.StandardCharsets; + +public class JSONTest { + @Test + public void name() throws Exception { + JSON.parse("[true,false]"); + JSON.parse("{}"); + JSON.parse("{\"a\":1}"); + JSON.parse("1"); + JSON.parse("\"abc\""); + JSON.parse("true"); + JSON.parse("false"); + JSON.parse("null"); + JSON.parse("[1,2,3,4]"); + JSON.parse("true"); + JSON.parse("false"); + JSON.parse("[]"); + JSON.parse("[[]]"); + JSON.parse("[[[]],[]]"); + JSON.parse("[ [ true, false ], 1, 2, { \"a\" : true } ]"); + JSON.parse("[ [ true, false ] , 1 , 2 , { \"a\" : true } ]"); + + JSON.parse(StreamUtil.getResourceString("NewDragon/NewDragon.json", StandardCharsets.UTF_8)); + //System.out.println(); + } +} \ No newline at end of file diff --git a/dragonbones-core/src/test/resources/Dragon/Dragon.dbproj b/dragonbones-core/src/test/resources/Dragon/Dragon.dbproj new file mode 100644 index 0000000000000000000000000000000000000000..af0761b1b48b5961ee66429f5f113d83901758a5 GIT binary patch literal 31625 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 literal 0 HcmV?d00001 diff --git a/dragonbones-core/src/test/resources/Dragon/Dragon_ske.json b/dragonbones-core/src/test/resources/Dragon/Dragon_ske.json new file mode 100644 index 0000000..f86776c --- /dev/null +++ b/dragonbones-core/src/test/resources/Dragon/Dragon_ske.json @@ -0,0 +1 @@ +{"frameRate":24,"version":"5.0","armature":[{"frameRate":24,"aabb":{"x":-234.40908264561412,"y":-431.81395140042207,"width":693.2805749826739,"height":769.5863484320666},"skin":[{"name":"","slot":[{"display":[{"type":"image","transform":{"y":4.3217,"skX":-148.2623,"skY":-148.2623,"x":27.8984},"name":"parts/armUpperL","path":"parts/armUpperL"}],"name":"armUpperL"},{"display":[{"type":"image","transform":{"y":-0.3072,"skX":45.2229,"skY":45.2229,"x":120.9881},"name":"parts/tail","path":"parts/tail"}],"name":"tail"},{"display":[{"type":"image","transform":{"y":-0.5,"x":1.5},"name":"parts/eyeR","path":"parts/eyeR"}],"name":"eyeR"},{"display":[{"type":"image","transform":{"y":-4.3543,"skX":-174.0434,"skY":-174.0434,"x":49.9847},"name":"parts/beardL","path":"parts/beardL"}],"name":"beardL"},{"display":[{"type":"image","transform":{"y":-6.446,"skX":-146.9135,"skY":-146.9135,"x":101.115},"name":"parts/legL","path":"parts/legL"}],"name":"legL"},{"display":[{"type":"image","transform":{"y":-10.5387,"skX":80.4531,"skY":80.4531,"x":122.955},"name":"parts/head","path":"parts/head"}],"name":"head"},{"display":[{"type":"image","transform":{"y":2.7905,"skX":-85.2356,"skY":-85.2356,"x":14.2173},"name":"parts/armR","path":"parts/armR"}],"name":"armR"},{"display":[{"type":"image","transform":{"y":-2.8771,"skX":98.2989,"skY":98.2989,"x":26.6948},"name":"parts/armL","path":"parts/armL"}],"name":"armL"},{"display":[{"type":"image","transform":{"y":16.0499,"skX":132.4995,"skY":132.4995,"x":32.3981},"name":"parts/clothes1","path":"parts/clothes1"}],"name":"clothes"},{"display":[{"type":"image","transform":{"y":-6.0098,"skX":-94.0239,"skY":-94.0239,"x":82.5819},"name":"parts/legR","path":"parts/legR"}],"name":"legR"},{"display":[{"type":"image","transform":{"y":0.2,"x":61.6},"name":"parts/beardR","path":"parts/beardR"}],"name":"beardR"},{"display":[{"type":"image","transform":{"y":-0.8219,"skX":82.7421,"skY":82.7421,"x":81.6504},"name":"parts/tailTip","path":"parts/tailTip"}],"name":"tailTip"},{"display":[{"type":"image","transform":{"y":0.6195,"skX":94.9653,"skY":94.9653,"x":-0.9572},"name":"parts/body","path":"parts/body"}],"name":"body"},{"display":[{"type":"image","transform":{"y":0.4,"x":0.3},"name":"parts/eyeL","path":"parts/eyeL"}],"name":"eyeL"},{"display":[{"type":"image","transform":{"y":5.0626,"skX":-88.1106,"skY":-88.1106,"x":23.0456},"name":"parts/handR","path":"parts/handR"}],"name":"handR"},{"display":[{"type":"image","transform":{"y":-1.4511,"skX":146.6156,"skY":146.6156,"x":34.7325},"name":"parts/handL","path":"parts/handL"}],"name":"handL"},{"display":[{"type":"image","transform":{"y":0.3975,"skX":-4.9086,"skY":-4.9086,"x":0.045},"name":"parts/hair","path":"parts/hair"}],"name":"hair"},{"display":[{"type":"image","transform":{"y":4.7392,"skX":13.9232,"skY":13.9232,"x":56.5203},"name":"parts/armUpperR","path":"parts/armUpperR"}],"name":"armUpperR"}]}],"animation":[{"bone":[{"frame":[{"tweenEasing":null,"transform":{},"duration":30}],"name":"root"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"transform":{},"duration":8},{"tweenEasing":0,"transform":{"skX":4.95,"skY":4.95,"x":-4},"duration":22},{"tweenEasing":null,"transform":{},"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"transform":{},"duration":12},{"tweenEasing":0,"transform":{"y":-2,"x":-2},"duration":18},{"tweenEasing":null,"transform":{},"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"transform":{},"duration":8},{"tweenEasing":0,"transform":{"y":-2},"duration":22},{"tweenEasing":null,"transform":{},"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":8},{"tweenEasing":0,"transform":{"y":-8.0574,"skX":-12.64,"skY":-12.64,"x":5.1348},"duration":22},{"tweenEasing":null,"transform":{},"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"transform":{},"duration":8},{"tweenEasing":0,"transform":{"y":-2},"duration":22},{"tweenEasing":null,"transform":{},"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"transform":{"skX":9.6205,"skY":9.6205},"duration":15},{"tweenEasing":0,"transform":{"skX":-1.4848,"skY":-1.4848},"duration":15},{"tweenEasing":null,"transform":{"skX":9.6205,"skY":9.6205},"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":15},{"tweenEasing":0,"transform":{"skX":5.44,"skY":5.44},"duration":15},{"tweenEasing":null,"transform":{},"duration":0}],"name":"beardR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":12},{"tweenEasing":0,"transform":{"y":-4,"x":2},"duration":18},{"tweenEasing":null,"transform":{},"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":30},{"tweenEasing":null,"transform":{},"duration":0}],"name":"handL"}],"frame":[],"ffd":[],"playTimes":0,"slot":[{"name":"armUpperL","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"handL","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"legL","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"body","frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}]},{"name":"clothes","frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":17},{"tweenEasing":null,"duration":1},{"tweenEasing":null,"duration":0}]},{"name":"hair","frame":[{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}]},{"name":"head","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"eyeL","frame":[{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":8},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}]},{"name":"legR","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"armUpperR","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"armR","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"handR","frame":[{"tweenEasing":0,"duration":30},{"tweenEasing":null,"duration":0}]},{"name":"beardL","frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}]},{"name":"beardR","frame":[{"tweenEasing":0,"duration":7},{"tweenEasing":0,"duration":8},{"tweenEasing":0,"duration":12},{"tweenEasing":0,"duration":1},{"tweenEasing":null,"duration":2},{"tweenEasing":null,"duration":0}]}],"name":"stand","duration":30},{"bone":[{"frame":[{"tweenEasing":null,"transform":{},"duration":20},{"tweenEasing":null,"transform":{},"duration":0}],"name":"root"},{"frame":[{"tweenEasing":0,"transform":{"y":-4},"duration":10},{"tweenEasing":0,"transform":{"y":-2},"duration":10},{"tweenEasing":null,"transform":{"y":-4},"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"transform":{"y":-14,"skX":-30,"skY":-30,"x":-6},"duration":10},{"tweenEasing":0,"transform":{"y":-2,"skX":30,"skY":30,"x":-3.9},"duration":10},{"tweenEasing":null,"transform":{"y":-14,"skX":-30,"skY":-30,"x":-6},"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"transform":{"y":14,"skX":45.5,"skY":45.5,"x":-6},"duration":10},{"tweenEasing":0,"transform":{"y":2,"skX":-22.15,"skY":-22.15},"duration":10},{"tweenEasing":null,"transform":{"y":14,"skX":45.5,"skY":45.5,"x":-6},"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"transform":{"y":28.4011,"skX":49.67,"skY":49.67,"x":-40.3442},"duration":10},{"tweenEasing":0,"transform":{"y":-8.9278,"skX":-19.23,"skY":-19.23,"x":-22.5206},"duration":10},{"tweenEasing":null,"transform":{"y":28.4011,"skX":49.67,"skY":49.67,"x":-40.3442},"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"transform":{"y":4},"duration":10},{"tweenEasing":0,"transform":{"y":2,"skX":2.95,"skY":2.95},"duration":10},{"tweenEasing":null,"transform":{"y":4},"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"transform":{"y":4,"skX":-21.2,"skY":-21.2},"duration":10},{"tweenEasing":0,"transform":{"y":2,"skX":30,"skY":30},"duration":10},{"tweenEasing":null,"transform":{"y":4,"skX":-21.2,"skY":-21.2},"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"transform":{"x":-8},"duration":10},{"tweenEasing":0,"transform":{"y":-6,"skX":-8.7,"skY":-8.7,"x":-12},"duration":10},{"tweenEasing":null,"transform":{"x":-8},"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"transform":{},"duration":5},{"tweenEasing":0,"transform":{"y":-2,"x":-2},"duration":5},{"tweenEasing":0,"transform":{},"duration":5},{"tweenEasing":0,"transform":{"y":-2,"x":-2},"duration":5},{"tweenEasing":null,"transform":{},"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"transform":{"y":-2.2012,"skX":-38.8,"skY":-38.8,"x":-13.0387},"duration":10},{"tweenEasing":0,"transform":{"y":-5.8451,"skX":38.55,"skY":38.55,"x":3.9043},"duration":10},{"tweenEasing":null,"transform":{"y":-2.2012,"skX":-38.8,"skY":-38.8,"x":-13.0387},"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"transform":{"y":0.5,"x":1.7},"duration":10},{"tweenEasing":0,"transform":{"y":-0.2773,"skX":-2.95,"skY":-2.95,"x":-4.1136},"duration":10},{"tweenEasing":null,"transform":{"y":0.5,"x":1.7},"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"transform":{"y":-0.5359,"x":8.9282},"duration":10},{"tweenEasing":0,"transform":{"y":10.0761,"skX":17.93,"skY":17.93,"x":-2.9969},"duration":10},{"tweenEasing":null,"transform":{"y":-0.5359,"x":8.9282},"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"transform":{},"duration":10},{"tweenEasing":0,"transform":{"y":4.1907,"skX":-2.95,"skY":-2.95,"x":-7.5499},"duration":10},{"tweenEasing":null,"transform":{},"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"transform":{},"duration":10},{"tweenEasing":0,"transform":{"y":-5.5174,"skX":6.04,"skY":6.04,"x":-3.5187},"duration":10},{"tweenEasing":null,"transform":{},"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"transform":{"y":9.9555,"skX":21.72,"skY":21.72,"x":-2.5742},"duration":5},{"tweenEasing":0,"transform":{"y":4.9989,"skX":31.7897,"skY":31.7897,"x":-2.7325},"duration":5},{"tweenEasing":0,"transform":{"y":0.0424,"skX":-15.63,"skY":-15.63,"x":-2.8907},"duration":5},{"tweenEasing":0,"transform":{"y":-5.611,"skX":-19.6672,"skY":-19.6672,"x":-0.2247},"duration":5},{"tweenEasing":null,"transform":{"y":9.9555,"skX":21.72,"skY":21.72,"x":-2.5742},"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":10},{"tweenEasing":0,"transform":{"y":1.6594,"skX":-10.45,"skY":-10.45,"x":-1.4456},"duration":10},{"tweenEasing":null,"transform":{},"duration":0}],"name":"beardR"},{"frame":[{"tweenEasing":0,"transform":{},"duration":10},{"tweenEasing":0,"transform":{"y":-7.1738,"skX":-2.95,"skY":-2.95,"x":1.1289},"duration":10},{"tweenEasing":null,"transform":{},"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"transform":{"y":2.0245,"skX":-45.48,"skY":-45.48,"x":-16.2659},"duration":10},{"tweenEasing":0,"transform":{"y":2.1665,"skX":-0.48,"skY":-0.48,"x":1.4963},"duration":10},{"tweenEasing":null,"transform":{"y":2.0245,"skX":-45.48,"skY":-45.48,"x":-16.2659},"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"transform":{"y":0.9027,"skX":15,"skY":15,"x":-1.6657},"duration":10},{"tweenEasing":0,"transform":{"y":3.3992,"skX":6.45,"skY":6.45,"x":-2.7762},"duration":10},{"tweenEasing":null,"transform":{"y":0.9027,"skX":15,"skY":15,"x":-1.6657},"duration":0}],"name":"handL"}],"frame":[],"ffd":[],"playTimes":0,"slot":[{"name":"tailTip","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"armUpperL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"armL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"handL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"legL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"body","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"tail","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"clothes","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"hair","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"head","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"eyeL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"eyeR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"legR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"armUpperR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"armR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"handR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"beardL","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]},{"name":"beardR","frame":[{"tweenEasing":0,"duration":10},{"tweenEasing":0,"duration":10},{"tweenEasing":null,"duration":0}]}],"name":"walk","duration":20},{"bone":[{"frame":[{"tweenEasing":null,"transform":{},"duration":5}],"name":"root"},{"frame":[{"tweenEasing":0,"transform":{"y":-66},"duration":5},{"tweenEasing":null,"transform":{"y":-66},"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"transform":{"y":1.0328,"skX":-27.69,"skY":-27.69,"x":1.1757},"duration":2},{"tweenEasing":0,"transform":{"y":0.6594,"skX":-27.69,"skY":-27.69,"x":-3.122},"duration":3},{"tweenEasing":null,"transform":{"y":1.0328,"skX":-27.69,"skY":-27.69,"x":1.1757},"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"transform":{"y":10,"skX":-24.65,"skY":-24.65},"duration":2},{"tweenEasing":0,"transform":{"y":9.7511,"skX":-23.1904,"skY":-23.1904,"x":-2.8651},"duration":3},{"tweenEasing":null,"transform":{"y":10,"skX":-24.65,"skY":-24.65},"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"transform":{"y":38.2873,"skX":-15.2954,"skY":-15.2954,"x":-20.6204},"duration":2},{"tweenEasing":0,"transform":{"y":37.7894,"skX":-15.2954,"skY":-15.2954,"x":-26.3507},"duration":3},{"tweenEasing":null,"transform":{"y":38.2873,"skX":-15.2954,"skY":-15.2954,"x":-20.6204},"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"transform":{"y":1.9,"skX":10,"skY":10,"x":3.6},"duration":5},{"tweenEasing":null,"transform":{"y":1.9,"skX":10,"skY":10,"x":3.6},"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"transform":{"y":4,"skX":15,"skY":15},"duration":2},{"tweenEasing":0,"transform":{"y":3.6266,"skX":15,"skY":15,"x":-4.2977},"duration":3},{"tweenEasing":null,"transform":{"y":4,"skX":15,"skY":15},"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"transform":{"y":-10,"skX":9.3457,"skY":9.3457,"x":-24},"duration":2},{"tweenEasing":0,"transform":{"y":-10,"skX":13.7283,"skY":13.7283,"x":-24},"duration":3},{"tweenEasing":null,"transform":{"y":-10,"skX":9.3457,"skY":9.3457,"x":-24},"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"transform":{"y":-4.5108,"x":-4.7682},"duration":2},{"tweenEasing":0,"transform":{"y":-4.8842,"x":-9.0659},"duration":3},{"tweenEasing":null,"transform":{"y":-4.5108,"x":-4.7682},"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"transform":{"y":2.5528,"skX":8.55,"skY":8.55,"x":-0.5979},"duration":5},{"tweenEasing":null,"transform":{"y":2.5528,"skX":8.55,"skY":8.55,"x":-0.5979},"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"transform":{"y":-8.7028,"skX":-10,"skY":-10,"x":8.8815},"duration":2},{"tweenEasing":0,"transform":{"y":-9.0585,"skX":-10,"skY":-10,"x":8.1208},"duration":3},{"tweenEasing":null,"transform":{"y":-7.7261,"skX":-10,"skY":-10,"x":9.013},"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"transform":{"y":6.3001,"skX":2.89,"skY":2.89,"x":2.1698},"duration":2},{"tweenEasing":0,"transform":{"y":-0.896,"skX":8.91,"skY":8.91,"x":0.6375},"duration":3},{"tweenEasing":null,"transform":{"y":6.3001,"skX":2.89,"skY":2.89,"x":2.1698},"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"transform":{"y":-6.3014,"skX":-10,"skY":-10,"x":8.9391},"duration":2},{"tweenEasing":0,"transform":{"y":-9.0585,"skX":-10,"skY":-10,"x":8.1208},"duration":3},{"tweenEasing":null,"transform":{"y":-6.3014,"skX":-10,"skY":-10,"x":8.9391},"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"transform":{"y":19.2267,"skX":-50.29,"skY":-50.29,"x":-19.7777},"duration":2},{"tweenEasing":0,"transform":{"y":19.2267,"skX":-58.5649,"skY":-58.5649,"x":-19.7777},"duration":3},{"tweenEasing":null,"transform":{"y":19.2267,"skX":-50.29,"skY":-50.29,"x":-19.7777},"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"transform":{"y":1.1591,"skX":-13.13,"skY":-13.13,"x":-8.0809},"duration":5},{"tweenEasing":null,"transform":{"y":1.1591,"skX":-13.13,"skY":-13.13,"x":-8.0809},"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"transform":{"y":6.7484,"skX":42.5,"skY":42.5,"x":-8.1489},"duration":2},{"tweenEasing":0,"transform":{"y":6.8295,"skX":50.23,"skY":50.23,"x":-8.0331},"duration":3},{"tweenEasing":null,"transform":{"y":6.7484,"skX":42.5,"skY":42.5,"x":-8.1489},"duration":0}],"name":"beardR"},{"frame":[{"tweenEasing":0,"transform":{"y":-6.0436,"skX":-10,"skY":-10,"x":-0.8181},"duration":2},{"tweenEasing":0,"transform":{"y":-2.7989,"skX":-10,"skY":-10,"x":3.8157},"duration":3},{"tweenEasing":null,"transform":{"y":-6.0436,"skX":-10,"skY":-10,"x":-0.8181},"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"transform":{"y":2.1665,"skX":-0.48,"skY":-0.48,"x":1.4963},"duration":5},{"tweenEasing":null,"transform":{"y":2.1665,"skX":-0.48,"skY":-0.48,"x":1.4963},"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"transform":{"y":-3.8513,"skX":-8.55,"skY":-8.55,"x":-14.1093},"duration":5},{"tweenEasing":null,"transform":{"y":-3.8513,"skX":-8.55,"skY":-8.55,"x":-14.1093},"duration":0}],"name":"handL"}],"frame":[],"ffd":[],"playTimes":0,"slot":[{"name":"tailTip","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armUpperL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armL","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"handL","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"legL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"body","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"tail","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"clothes","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"hair","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"head","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"eyeL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"eyeR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"legR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armUpperR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armR","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"handR","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"beardL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"beardR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]}],"name":"jump","duration":5},{"bone":[{"frame":[{"tweenEasing":null,"transform":{},"duration":5}],"name":"root"},{"frame":[{"tweenEasing":0,"transform":{"y":-66},"duration":5},{"tweenEasing":null,"transform":{"y":-66},"duration":0}],"name":"body"},{"frame":[{"tweenEasing":0,"transform":{"y":8.9644,"skX":27.76,"skY":27.76,"x":6.1797},"duration":2},{"tweenEasing":0,"transform":{"y":8.576,"skX":27.76,"skY":27.76,"x":1.7095},"duration":3},{"tweenEasing":null,"transform":{"y":8.9644,"skX":27.76,"skY":27.76,"x":6.1797},"duration":0}],"name":"legR"},{"frame":[{"tweenEasing":0,"transform":{"y":10,"skX":-69.64,"skY":-69.64},"duration":2},{"tweenEasing":0,"transform":{"y":9.8705,"skX":-66.683,"skY":-66.683,"x":-1.49},"duration":3},{"tweenEasing":null,"transform":{"y":10,"skX":-69.64,"skY":-69.64},"duration":0}],"name":"armUpperR"},{"frame":[{"tweenEasing":0,"transform":{"y":7.9,"skX":50.73,"skY":50.73,"x":22.6},"duration":2},{"tweenEasing":0,"transform":{"y":7.6411,"skX":50.73,"skY":50.73,"x":19.6199},"duration":3},{"tweenEasing":null,"transform":{"y":7.9,"skX":50.73,"skY":50.73,"x":22.6},"duration":0}],"name":"legL"},{"frame":[{"tweenEasing":0,"transform":{"y":-3.4,"skX":-8.73,"skY":-8.73,"x":11},"duration":5},{"tweenEasing":null,"transform":{"y":-3.4,"skX":-8.73,"skY":-8.73,"x":11},"duration":0}],"name":"head"},{"frame":[{"tweenEasing":0,"transform":{"y":4,"skX":92.45,"skY":92.45},"duration":2},{"tweenEasing":0,"transform":{"y":4.2589,"skX":89.9735,"skY":89.9735,"x":2.9801},"duration":3},{"tweenEasing":null,"transform":{"y":4,"skX":92.45,"skY":92.45},"duration":0}],"name":"armUpperL"},{"frame":[{"tweenEasing":0,"transform":{"y":-6.1,"skX":-18.47,"skY":-18.47,"x":-3.9},"duration":2},{"tweenEasing":0,"transform":{"y":-6.1,"skX":-22.44,"skY":-22.44,"x":-3.9},"duration":3},{"tweenEasing":null,"transform":{"y":-6.1,"skX":-18.47,"skY":-18.47,"x":-3.9},"duration":0}],"name":"tail"},{"frame":[{"tweenEasing":0,"transform":{"y":-4.8621,"x":-6.0066},"duration":2},{"tweenEasing":0,"transform":{"y":-4.4737,"x":-1.5365},"duration":3},{"tweenEasing":null,"transform":{"y":-4.8621,"x":-6.0066},"duration":0}],"name":"clothes"},{"frame":[{"tweenEasing":0,"transform":{"y":5.8138,"skX":-53.9,"skY":-53.9,"x":4.3491},"duration":5},{"tweenEasing":null,"transform":{"y":5.8138,"skX":-53.9,"skY":-53.9,"x":4.3491},"duration":0}],"name":"armL"},{"frame":[{"tweenEasing":0,"transform":{"y":-4.6145,"skX":8.73,"skY":8.73,"x":-17.7606},"duration":2},{"tweenEasing":0,"transform":{"y":-3.0052,"skX":8.73,"skY":8.73,"x":-14.8289},"duration":3},{"tweenEasing":null,"transform":{"y":-4.6145,"skX":8.73,"skY":8.73,"x":-17.7606},"duration":0}],"name":"eyeR"},{"frame":[{"tweenEasing":0,"transform":{"y":-1.156,"skX":0.14,"skY":0.14,"x":2.7983},"duration":2},{"tweenEasing":0,"transform":{"y":1.7886,"skX":-0.83,"skY":-0.83,"x":1.817},"duration":3},{"tweenEasing":null,"transform":{"y":-1.156,"skX":0.14,"skY":0.14,"x":2.7983},"duration":0}],"name":"tailTip"},{"frame":[{"tweenEasing":0,"transform":{"y":-8.1532,"skX":8.73,"skY":8.73,"x":-13.0014},"duration":2},{"tweenEasing":0,"transform":{"y":-5.9369,"skX":8.73,"skY":8.73,"x":-13.2195},"duration":3},{"tweenEasing":null,"transform":{"y":-8.1532,"skX":8.73,"skY":8.73,"x":-13.0014},"duration":0}],"name":"eyeL"},{"frame":[{"tweenEasing":0,"transform":{"y":7.7817,"skX":-2.54,"skY":-2.54,"x":0.3247},"duration":2},{"tweenEasing":0,"transform":{"y":7.7817,"skX":25.1339,"skY":25.1339,"x":0.3247},"duration":3},{"tweenEasing":null,"transform":{"y":7.7817,"skX":-2.54,"skY":-2.54,"x":0.3247},"duration":0}],"name":"beardL"},{"frame":[{"tweenEasing":0,"transform":{"y":-3.1965,"skX":-13.14,"skY":-13.14,"x":-11.2069},"duration":5},{"tweenEasing":null,"transform":{"y":-3.1965,"skX":-13.14,"skY":-13.14,"x":-11.2069},"duration":0}],"name":"armR"},{"frame":[{"tweenEasing":0,"transform":{"y":5.251,"skX":8.96,"skY":8.96,"x":-7.8667},"duration":2},{"tweenEasing":0,"transform":{"y":5.251,"skX":-6.04,"skY":-6.04,"x":-7.8667},"duration":3},{"tweenEasing":null,"transform":{"y":5.251,"skX":8.96,"skY":8.96,"x":-7.8667},"duration":0}],"name":"beardR"},{"frame":[{"tweenEasing":0,"transform":{"y":7.2382,"skX":-6.27,"skY":-6.27,"x":0.5909},"duration":2},{"tweenEasing":0,"transform":{"y":0.2075,"skX":-7.09,"skY":-7.09,"x":-6.3221},"duration":3},{"tweenEasing":null,"transform":{"y":7.2382,"skX":-6.27,"skY":-6.27,"x":0.5909},"duration":0}],"name":"hair"},{"frame":[{"tweenEasing":0,"transform":{"y":-1.3692,"skX":29.52,"skY":29.52,"x":-3.9387},"duration":5},{"tweenEasing":null,"transform":{"y":-1.3692,"skX":29.52,"skY":29.52,"x":-3.9387},"duration":0}],"name":"handR"},{"frame":[{"tweenEasing":0,"transform":{"y":1.4681,"skX":21.45,"skY":21.45,"x":-3.5985},"duration":5},{"tweenEasing":null,"transform":{"y":1.4681,"skX":21.45,"skY":21.45,"x":-3.5985},"duration":0}],"name":"handL"}],"frame":[],"ffd":[],"playTimes":0,"slot":[{"name":"tailTip","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armUpperL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armL","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"handL","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"legL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"body","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"tail","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"clothes","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"hair","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"head","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"eyeL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"eyeR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"legR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armUpperR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"armR","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"handR","frame":[{"tweenEasing":0,"duration":5},{"tweenEasing":null,"duration":0}]},{"name":"beardL","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]},{"name":"beardR","frame":[{"tweenEasing":0,"duration":2},{"tweenEasing":0,"duration":3},{"tweenEasing":null,"duration":0}]}],"name":"fall","duration":5}],"defaultActions":[{"gotoAndPlay":"stand"}],"ik":[],"type":"Armature","slot":[{"color":{},"name":"tailTip","parent":"tailTip"},{"z":1,"color":{},"name":"armUpperL","parent":"armUpperL"},{"z":2,"color":{},"name":"armL","parent":"armL"},{"z":3,"color":{},"name":"handL","parent":"handL"},{"z":4,"color":{},"name":"legL","parent":"legL"},{"z":5,"color":{},"name":"body","parent":"body"},{"z":6,"color":{},"name":"tail","parent":"tail"},{"z":7,"color":{},"name":"clothes","parent":"clothes"},{"z":8,"color":{},"name":"hair","parent":"hair"},{"z":9,"color":{},"name":"head","parent":"head"},{"z":10,"color":{},"name":"eyeL","parent":"eyeL"},{"z":11,"color":{},"name":"eyeR","parent":"eyeR"},{"z":12,"color":{},"name":"legR","parent":"legR"},{"z":13,"color":{},"name":"armUpperR","parent":"armUpperR"},{"z":14,"color":{},"name":"armR","parent":"armR"},{"z":15,"color":{},"name":"handR","parent":"handR"},{"z":16,"color":{},"name":"beardL","parent":"beardL"},{"z":17,"color":{},"name":"beardR","parent":"beardR"}],"bone":[{"transform":{},"name":"root"},{"length":150,"parent":"root","transform":{"y":50.5419,"skX":-94.9653,"skY":-94.9653,"x":26.0941},"name":"body"},{"length":120,"parent":"body","transform":{"y":46.9,"skX":-156.0107,"skY":-156.0107,"x":-95.6182},"name":"legR"},{"length":150,"parent":"body","transform":{"y":31.3927,"skX":159.9921,"skY":159.9921,"x":80.5853},"name":"armUpperR"},{"length":150,"parent":"body","transform":{"y":-60.2758,"skX":-154.3312,"skY":-154.3312,"x":-71.0496},"name":"legL"},{"length":150,"parent":"body","transform":{"y":-5.8037,"skX":11.4957,"skY":11.4957,"x":163.1145},"name":"head"},{"length":70,"parent":"body","transform":{"y":-93.6047,"skX":-171.7742,"skY":-171.7742,"x":74.4813},"name":"armUpperL"},{"length":250,"parent":"body","transform":{"y":70.127,"skX":79.7425,"skY":79.7425,"x":-117.1092},"name":"tail"},{"length":80,"parent":"body","transform":{"y":-31.7416,"skX":-37.5342,"skY":-37.5342,"x":1.423},"name":"clothes"},{"length":60,"parent":"armUpperL","transform":{"y":2.2256,"skX":30.7088,"skY":30.7088,"x":66.7632},"name":"armL"},{"transform":{"y":-23.9957,"skX":80.4531,"skY":80.4531,"x":140.2628},"name":"eyeR","parent":"head"},{"length":150,"parent":"tail","transform":{"y":-3.1008,"skX":-37.5192,"skY":-37.5192,"x":257.8621},"name":"tailTip"},{"transform":{"y":-101.188,"skX":80.4531,"skY":80.4531,"x":133.7701},"name":"eyeL","parent":"head"},{"length":80,"parent":"head","transform":{"y":-133.6248,"skX":-105.5036,"skY":-105.5036,"x":7.4588},"name":"beardL"},{"length":50,"parent":"armUpperR","transform":{"y":0.5285,"skX":35.2088,"skY":35.2088,"x":138.7492},"name":"armR"},{"length":80,"parent":"head","transform":{"y":-35.857,"skX":80.4531,"skY":80.4531,"x":23.2753},"name":"beardR"},{"length":50,"parent":"head","transform":{"y":80.6309,"skX":86.9099,"skY":86.9099,"x":104.8249},"name":"hair"},{"length":40,"parent":"armR","transform":{"y":1.1079,"skX":17.875,"skY":17.875,"x":43.3874},"name":"handR"},{"length":80,"parent":"armL","transform":{"y":-0.4273,"skX":4.4133,"skY":4.4133,"x":66.6309},"name":"handL"}],"name":"Dragon"}],"name":"Dragon","isGlobal":0} \ No newline at end of file diff --git a/dragonbones-core/src/test/resources/Dragon/Dragon_tex.json b/dragonbones-core/src/test/resources/Dragon/Dragon_tex.json new file mode 100644 index 0000000..07cc681 --- /dev/null +++ b/dragonbones-core/src/test/resources/Dragon/Dragon_tex.json @@ -0,0 +1 @@ +{"SubTexture":[{"height":209,"y":234,"frameWidth":112,"frameX":0,"frameHeight":210,"frameY":0,"width":111,"name":"parts/tailTip","x":456},{"x":340,"y":234,"width":112,"name":"parts/armUpperL","height":86},{"x":373,"y":859,"width":48,"name":"parts/armL","height":80},{"x":1,"y":922,"width":96,"name":"parts/handL","height":78},{"height":180,"y":677,"frameWidth":204,"frameX":0,"frameHeight":180,"frameY":0,"width":203,"name":"parts/legL","x":238},{"height":347,"y":397,"frameWidth":236,"frameX":0,"frameHeight":348,"frameY":0,"width":235,"name":"parts/body","x":1},{"x":238,"y":397,"width":216,"name":"parts/tail","height":278},{"x":1,"y":746,"width":208,"name":"parts/clothes1","height":174},{"x":443,"y":677,"width":124,"name":"parts/hair","height":282},{"height":394,"y":1,"frameWidth":338,"frameX":0,"frameHeight":394,"frameY":0,"width":337,"name":"parts/head","x":1},{"x":459,"y":961,"width":28,"name":"parts/eyeL","height":46},{"height":58,"y":961,"frameWidth":38,"frameX":0,"frameHeight":58,"frameY":0,"width":37,"name":"parts/eyeR","x":420},{"height":231,"y":1,"frameWidth":180,"frameX":0,"frameHeight":232,"frameY":0,"width":180,"name":"parts/legR","x":340},{"x":211,"y":859,"width":160,"name":"parts/armUpperR","height":94},{"height":77,"y":941,"frameWidth":46,"frameX":0,"frameHeight":78,"frameY":0,"width":45,"name":"parts/armR","x":373},{"x":340,"y":322,"width":98,"name":"parts/handR","height":58},{"height":36,"y":955,"frameWidth":120,"frameX":0,"frameHeight":36,"frameY":0,"width":119,"name":"parts/beardL","x":237},{"x":99,"y":955,"width":136,"name":"parts/beardR","height":36}],"width":1024,"name":"Dragon","imagePath":"Dragon_tex.png","height":1024} \ No newline at end of file diff --git a/dragonbones-core/src/test/resources/Dragon/Dragon_tex.png b/dragonbones-core/src/test/resources/Dragon/Dragon_tex.png new file mode 100644 index 0000000000000000000000000000000000000000..02cc390989b27934da368d08ce383a6abdacfb3e GIT binary patch literal 159196 zcmZU*c{r5)`v!c^7&W#GvXo`)lr`BRX6&*=%915($Py~q&5-O{DcOpUD6;P{vL}04 zvJDZkjeVQ#o#*!+@AK&U{^4N$aNM8!TF&b_&+Gb3jPZ3H2HNwq001yt)73Nq00`wz z2mn1r`Gw*Zdjfzx^R8*C-SP*m5$US#nuaXJjd7gI>vTQ!$Fc6*fegw1M^UE!y;%P9 z6Qj(<6=f^PFVAvg%~_K!(#qYC4WaTByjOk?d`Ua{>RAR^FB&N((PvS#m+WL+!>h^@ z%nki)m1-ZZ>olA`cdqtyv{?!H*rOl!!)rigDR8Z6f5sh0RB>FpH1_b*6^#3*fW?CY z>vDCJIuZ&6@$o_;&@dSIe?R=tn0<8zKk@CT#HMk-VGQp3p?eXqT;V;!&2q#?zlC)h2M`G_?~74Wv_$cJ57PgdsUb&x3~ZMgzu3p zT=~<{B+f+Dg^sd+TK~S-Wiv(su080 zUYaMJO)sC3Y%sy47k`r7eoB!B1Q9v5WTNZ>bzZR|$jJ^E@#jH*+}z>}pH&+!+*=v;RgzXxXfMgPO3X$wi@ z{Ip~})L>2|Uy|m3g3*{YtX}9cnLVy5CRqpS{LC41W=^VsjSdWTFIKt94_QtoDJ?EQ zZOT&XZ~|U93!}4h=8w*VF_@j7ZM-|5na3dj{h;Juu-uSXgNbdVi{R`d{W13{E$)-z z-!aT;s{rUg5lrQ{&P4k@UbU9936{QEe|zherrrH(^VxzVm}c}ZM%?5?bSfq~t+U^r z2_{gKqGx=mLmO@HR9qaf`Q(fAmXUqDH$Pmba+cZnn0xaL?UZ)vGuKvIl;HfN!BOykUGrS}-PB(4gI7>D%h_Zr}G`F&R`=xY8fQ zrgcgSzd?$g%_V-nc84h-Myh~5+AX|v%Ig3fYF-F=cam~Pm|_IK*2 z=g@`a<~UO^k-Zi*$&-^6YvdjjdG3ceerSIMLw;dP9y?0HV|WHQ>@->R(SzJM3F#o$ zn@pqHGJKQs!ofneM+nLN%y!3%80 zS3@6}{q4CbPEb|tg%Xr)JNai;A=&i$INyeEce4#%;V1;rjYBo3Z3daRO+xr&P4r?G zD}cTH-o3fXxn7XIwJu64L~BSG4yim)E(!r!yphSl>rJi`AJnEIOt4N z%T@j#;|dBO%RVPZR3r(%p7nYeBU(U6-e*4+Bu+&=1xCRk8HJM}Z%dEUN`OUPeJHGBm)Jr6~pT&aP2F|Y&2 zQZEMEZBne+t`)!8VRE&X zIBoPgTS7H7v?dh$W-Tph-)WU+JcT>-U_%e_={L{D(wLL-KvR(UkMqD#=EgU8Nk@Ty z<=a0XCTA#{;Vj#GA@`i}nWMF~Y%EJ(!=ybW$KBs4pC?ZZw>X}^pC=*m`p$Ioqfe(X z4QgkjG>_Z%zrQall^B2{UNH|Ny`#8)qPo}zaLL>DFp>-iJfO*e1zpaops&L`VwFh-c1#m-x zqAp5L6lvuxx7;NI@X@3)lU`RgIeA_l8}=)8{u^||{^;=jUW!ls%zR16*t#csD&eIfYJ3YaEh8xlz&+X>v)nsZL+`7N?eWM zV7L{K3U+K&3BJz(^XB@(PN(|ih~vn1ys_RV1r;ruvG=mJHuEs5_4I^3>`Oy9ATFZ* z3WxwcnwQSp*;IX`_cww-!-Scl?-fck+3L;&?hk3d(mL=8tAYO_Z^Ol%@EGq0>`dBq zb8;z$P#|`@eW%#+CyRKhy6G!g2)N*n7tI`FmjOpGlfm}Z)TxJ?uAOlmakcV#B$1bg z3VcvrNi=!JBPjZlg5mX-AN2ozuz@Uih}R|Uow>}BPNlV`0UrrAeu?FVE?FOg5eoVv zU==71xMn_s^{7=1=}VrKIy@#kmPkOH4=TR+L386EAET8)%01}k*cq=v(s9Y*vHNd3 zItfHRQrfXmMkhj$G}n9^60t>Zf-kxi#tb&tB{R$2IeCPf-_YKUa3a%h%=52^XNxx% zmtbR;SjbeU?ZmbBj9D+5f~VD^4mC(e9lAv#xgiAwV)UDSlvd^zOChf)NTE!ExtL?a zx~c{*WCg2Di#bssSGxfcyy2 zWXs;kuaYoTv4$k%yVy>+IUxN8#zIcq)8cu^H?b6)wLAO9MUSKF)!8`Ikl;}g4IOWn zYmd)qw0PbX_=`ui>!Bv6Hx3=@<&YN*dBdxH;!msGJn26q)PMo3pTDP78t{~0K5U|) z>S%e7K;RU7cetv-GsHta>|_ZvIHbE4s>zF-MaYsbZ8KhJ`rXzwHljK3_U$gmguI1` ztq?n{^vCB{K%R*3SA4YQ8J{@y>1SAQmrVUcfkO9yp>~~^f%+z8vD!OzgK3KhZBks~ zoG=;*Y){FnW4(g99~l2|>3hvCP9Xo9h4nab zo(A(11)T6BFq`CxJFB1KQq=VEUs^Bep<( zniU_pfUz&ZJZrs?y30MhagEo9iFvTU!=R(SHnkoBPT_bHiHk@-+G+OgL(XFi2(OBz zW2?whV^P1gevRz<)`={`7vR~uH<$zk zrUm~F=K|KSvqw@wli1#`Zp%2tTT7HR*P!A~&{~GXIi}?{*+$!blEW`xn22Q%^I~va%~QmbNQ3p|ZDbtZ+`*@FMRsw`UKZK@bKgY!nj9s$T&BG( zSG!T7f@zP`0QLCSwvvf-FnuObzLqMIp9$u#`gdN7SDPgE%&gm0mt>W@r}NOu=?$}C z1u?q83o}@SP3aqdEV%7IJO=+31`i=ExH-KZr{PN#2GEDKq8XGEWlsf}+|#BuIwZ=E z0&kYPYTD?5&q=|v19D1-EH68nW9&~8>0$`Hc-NsAma^^rukkF%#*a`?tJjMc@AA$I z#JtUG`ztoobDE&-(Pt)b9DJ)vr;ZfD^=JaPnXbt>FseoTm@j}ahuN<=&fu_u<7$en zE_}BNBls){{0~vmLI7_n$Z_z{@7?t^kvw(5aefeIIkV_0<0!{lZ{c<F(wiuov?~TKEMBqz}%^u7SOUswV>l#5d>$aae#qu+i=h3@6&xkk{`{2s?<+?5@;Pg?KEFzY1<^KqFn_t}50PbJYHSS-zq+>>bs(NwZ77Byg zhl2d0@;Jl-Bmd^kX=fpee5Truc&%R!69VAAvOm&3C8;Uf?4?7gTX{oAm&!C(^)s&E z)%a6``H-M(-W4B_}p(n!p-U)E1#F)oh~ zHJT5YF)Z9t@VKB;)W`5tIn&QGgLd0X9ncGhB*yg~;H@KoX2!Y4;wrPxN21wh40{O0 zk7@tT>Q30Qo@ZodHS^KIy+6`6@D$r)UPxLY>5WB&4eLnSZN>cRic-|YZg_jPB5+xo z;4{)9lNWucF{@p8Wc#JEb?eff0y5u?8X~uC*40-)F?%tw{J9@%GXkPyit(`#`JeP< z2$S4SO1fGw_H=V#K#81>jCgbpInraq~XtvFpQu*Fc2LwgpW-p zN1iP&z}Tbf`LWyoR9hGS+cAUrCOMjAm%qdu9X)aUMkQQOCZ?3g3dzTOaK@JH3WcW$ zNvx0SS{4#@Qmi#)-mg#1`57e&A#WQaAqr4$0>?*AoZ~V}1rP7vzKeW{KCq1{G!-Vh zemo7`J-wx)Z~Lm(yq@%Xl}$;V+8PoYjd?aEEj0Vw%v&=2D695`G;^5tPi%wH`~QliQ7%}wf31SQR6>r2kzsV!f>$Fw1a95d`^Lu7psBsF ze5S8qA8U2l;5p20YpdBBWT`;XRv6wBJej>=McOSXWIa`K+HqdFHgr(rNF>enZ4qkY zl${{vD}XB6@9ZW&&kh)CWUOvU9@PW0c&o2^6_8%!>vOd{;2(K)O^K&X<@9IYg>NW< z&pWq&kb*!!D)4dRHN78N11Fw11bax`QvH6lZ7lKcmrpwd`7GZkbJXS4G=M~DS)#%Z z-j0Z5pjaOgg`*|!pSgs2RMm8ZU+2%ggd*#Ok$8_FI4e&q9ooxR zdoyqt5ps>nwV$BGfWmQBJN(P{yB2xU3N>!9510O~D|Sf8V($xXmi^&JzG-;JPc!dF z;fA3GtBhN?F%Jy321($M50-ZkgcvN}v z-I0?p=@MbVI$1ZBb~t%Y^($G-Z()dt80MUYUnbvh!)G7usz3gXm)DL##F3K;Qnz(K z&&H^|17hy1BHp!QJHa@q{rl@2xU{Oo#~~K{x?6|Lr*jOku>Wc0kN7oF+Rm+=gU3@z z`&85q{2ngDE=g;BA6I-AjJ|@Euh}|x(0*ewsFH%L^nAd&c%Ur>;8&QzRUYCKKk`lf zZd`Baw19t_@{_3`MH-j0_@nMFz)Pevj+28K9N{G>j&o@@>2K z6jBjw-QQa8%UER#HBM!N@g+5R>D>m^{k)O+SCpnaK_?w1-42OOW(ee}+_We|blZ!} z+TK40Q+<*XT>ip4l<$tO^4Kz_C3iX$rYC#6uK|6IslIy?b#N*uoM zb*U#LLXNGQG55^ZC6#yG!HBN7@T;ni`%)!aJAxkIoU$@^LVLLzeVV#aJcp$Q$ziEY zeOrJNwRFFc-oRf<9tSJ<+X5RoAb8~_0(!fsK8T;gj_D{$@qwyftp&fG1MX`oR-2A4 zCaTUc@taiiFhV-=M~oO+<<%Up3x;gw{2D!fYY|uf&AmW)kJ-hkif9|F9fY;C^rb1jzfe4*5U+?ZrcaFN{*tq z=EC7Y0-2(WUjvN4fC0X)*1VD9pm1YCdZ(7R8kIDhIT{2N z`*Vx(=N|;mCx~jO(|!Gg^ZLUVUdIv9o+O|2;F)I;j6uu+=I=1k=?UF4+EBT0&aQk@ zWkHf7Ptk|~OjuB3qyb(wG0(%)wzJ8xB-;%<{P~}MR6XuMm!NqNtW4UY5{tm6UUoDC z9(rmLqD7LlOnA{cHpVo z++~|BV;IqKTl!k*k$Drd$Z}NQTW{SV@+uv``~7gDc7)dM_j<<#&^<&dJha*M2D+yl zCE)g#`q>iA#4Gydz^3-;#i1TPLUJk{kCg2~V2OF1;T;di={fcBH(E3?_(m}Wo$7CC z@1xoo&A}+dq=pPW`^j!p^VD4B$2EbqoauQO^CNNb2V${jL0&70!g!L7HlQ1FD3E5i z#7?u!(Y%@)0#W1JKN9&t%iw-!!*I;~6gwimUfNLGWCpZf6b)p5Z`;)59{=l(+^>6g zlKy9uBxVLGi`@EN_c=Y#9|Lnou zOKJB~jWjBrHsooG1^7TAg3W3#TVk{z=?{}PO~SM3PG9wLQ5IZ>GNr~SLqd_;cSbiZ zE`8OW+k(Ht>wM*s!A(9D>gC1u6=UPXfQfy1OYn<#kcDYJ+Om+la{@~?qnOzxb z8$<<8rKW1n=o#RYV7|p5Kj>R~GU$+vOwkmS%|PgFdqJpEmY+6dHnMe!KOYKzFGC&i zXQrZNrNSATX9M7(vkh27Ac|SGNsiQP^y*!J!??-az{5pJxtye zce9o1*m;XZ^iOGrX->P1ARGB@kQU!Y=94KY#IOMSU9`qHS;3W^S^4@%?M=g0_s*i8w0shM6!D{m=x~un`$}& zn}V7o{j_@Q(sh4wyjs`!OZ-=b0$k`;?>=yYyu_DaA5z1(CGx;;$RYIB(g!EwoM~av zOD4E#axzN!&BaTNQJb8nQj8slL)sD-!-bOIW;}W4r7AbGxNSXLEL&t0fabdh$?<;j zNEN?x$64aHo8~9Tl5`_9LYSO4c#I2PF&#!7w*8L4Mq{MNL-6&!#5-%O;0QXGef%J4 z;Az@npibBTFNEPO#BUUJT(Y#aP$TR+0Le-2*w>O&C za}V;}E3ZQ&1P(@9uu)e6$a%)Cg9G{c*N#Lmt~=DV<6G#_l055#F-7LAkQfz|4=s4> z@sSlh1qdHx7g$RE$Be>aGBnvfMhbuY%q#10;TPkz zNy-!|^4><_H70fRONG}dC5LSr@UGFRhj)sk(RSfQYvAkw36M8PmzvOK!^@_HO);C) zp1d!}lYO_lgxE5ga(ofz$o2^&(w6jq>zur{%A2mO&+?sMUR`@8HW~%AnPo+9YwZWs z6Xf2GpUJZ$YzGkstow?t%K%tMZ3; zlb##~Jt&)xQTb_K`+8CUBK;OvV&l1HMLkFw%uiFje`VkBC#peW?UlY`Kgzv~tI7guqqQoXkM4ML)qj>>a!ehC=vd-=-w71+{r|7?jj~rvcKY;gu^0_L;`23XC=7s`5Ea)a~CoOR+3bw`Tp}1h)Jtketr!rleVm8*#ko7t{iR0pi7 z$~dHd&Fc@JI&Pkj2a$TZ5gSaP)SFvP@s%u*h<7r8tkE%X9GhmxF7^@d;-v3 zvxCZhwR%uvw$o^N{H4~%s?19n@PrRHPSS*&YADB?RF4skJppC~9%uNLHBBIVi#`(V zpFg$v5Pl`kWoT^+TKmQ2#WSMHIh(^XoXi7~qqyk?KS3 zd8T-CMvY0Y2&!$28`i&yq)CoiD-Fb5`#JIb`+{6#0=I^=j6pE{`vQGykV8He z-loUP%7`wv=XmjQ`v~5D3q}jT)a6vJ-?FW>vs-$#gIgTkw*VD4C`jh-;3VRy(A8t! z+WBs*|DgvO#=#DL8iqHC=#wR;l_!P&*a&u$6(++%Wbp{p&wD?m?s%(5QKs#w^A}mh zVN%}elS&)iq|j&Bf&DqZf=X~2FQ6Z0F zMp`rX9G?yS$SRXb?=|?r`DC9Ewg_9+`NkNAjO*j~Ih&7V``8BEbWnEevqX@G%GdLI3%G$i@ zs9t>bGauV#AB{^)40!lt)EWyR$;Dn`6EpKL^zmUEuJ@nn6aOfJGrNx0iZDDw|B>3t z!YJ@|D)V45Wk>|XP64U9odl;~^^~7I#(;D&2X~5Uf7B3(GBfOAK!yP#J9yKNCkETb z>>vS>R43HaKmNy~H0Xf_v*hv0Q9|;J3<|Z=1=n{x`@&ZqI zk`@?}EkDXfj|({_tSOLp32Ooa8-EC@ME1tY$>wTh{J6rtQ`X0uW1^+&hce{3EAM;& z7`V7$b;=c?j&(??1}BUVvsP`TK*%Pq>aRHWKH@sfsk%_xt9ReyO2ME}a`U686P=Xh z6QF=(Doe_|K0UZ)ia6M?xdC2ck1k(F9qp-b%S=W9yuWd%Zib~tgze11UyeUp)Y)I1 z>b`&|=E~R}A@8}|5yE43T!Jc+P&=j`8^rw$aYC3C{eV2T71=I;4X6Zk>p{t9hEqZ( zQ?X>%0$LiNQv^V+&ZOF*iB4c+yZ)izyujEKCpx8N$AfVbuq+?$#p8vVTub=sT+8|D zlV{Xo+rtjQgL83BU7_Nc%ZYtPjjJkYMx{4RF{w@#|EM0Wi|cZX@(x zNQK3y11WBV4+*YMg`5Il*`eK%&TGjQp-@mywA0I-w-`j&acneM)P#|(niHIKM8brA zGOvU)hhmbFb7=Hqa%<##6T3;Kx){uC>Ow4H zz0By^h8JGhGdb8<+`5o?HuXhyWz3H2wn}+v!)v|MuJeO>OmUXk`$%?uK>7{{X;lH@ zdTbs7Ld!g&-~IFFWa82@f(S(k)F*%YTz)McGT z%1K`tvw3T)?xBWi*N6>#hUe}q%OA`^hseuJ#VP4+5c54Bl1{D&Zmd(ZRGG~g< z#emr$H+?Sjc z%BG80cW+ha-}@99@cH@=@(XX?QPr7u@b}EX?q2WG8N2B8%H6U3(@J@V)Oz1P0ChJ3bB{!`&n`gDU#45_JdNUV zg1?1Q{%_xoy~f>gUt!}Td{;^s59*L*$5B`E;&jA&86m?dH3Jh#iI zeZ9<*RyQ8_ZwIO@TkQB7?{d3y8ZQBvOyu%w#umeygF*3*ybXJ+2Q7ikFuv zDHI3U5qyB2iJtLIN3GkyF=_2l-U)Ea(BO?fPWpqYD|4T4dSd~ayF6}7wm^Z=wm%2fQ zMRne@Kzqc~a=!w{K3ZCNRelh1NO9!KUp7|!=WWxpy*Mm)ENGFz#1JKnOdnziMXLB7 z*i8Xb7_4_oMGd|$e}nMe20ECJ!8{AK?TmI51<)@#qiPf76I$HQTv=ea^D(ocDyB(+ z+xG?M6EPy_Xvq1`%Y2VpP#={lzNY@V@l=fV{DrHCIq-9c6W99jX2Jq zfmn?8OPfVO00va_hwCSLJzu8(+a@MB@FW=46>8kH)$~4n<@A*^F+SX406!VOU-^1i zm*0aUzr=7Vj@NEj0=&8Br8H=(drS;fbm`P8Rlaf_j`*d|= zv1I;;DWYucwTwK$;zn_zGe%?NM7t3-0X^(EH~Ej4<8ni1=9qt*E~e`}`JYmKq~`yP zf1~RcNIclb>zy5%GMBlqL$VQuiV-1(DvvH1 z1IdhpqlqWB3cCqFhBd;kedbxBoYA3%L038rr8=R7(%}LglrTFGdCz$QIHeWA_R>;p zu5bSY-&jCJhj86gmRE@{Mle#U}g0Y~IV5u*XSO-6OOTiTSs%Ax?mvI2XMpVDZSon2NsK$)Q^ zw$bc(ivku+fqVNsPYl@qYJO$ofM?&^s4eRhlW2g!@h)hPzn5EfkcJvkoOibWeNPGS zffhK9Atkk-Nn>(9m)?A6jjW*s@e*C}QO`yPqC-YxdO032=)j2%m9~*?Vj6(q zr#Yi^=7x@$*NJi>06HS+8?_y=*#U$U&3DWawQ%|Q>fO!>IOE_4&+&(TFXGI#ylOCN z$a2QV%MFzD4L$OjS+p3h?qk`K2JjXn#M8(W8{OhQWWpVdlj zyT8Z2{o_UT=b$yr0u$_giJFb`m*BHPC3>EW2aPdJ%G{Y}KrO%KJMJ6UpQ0@B$IRvb zy`zwaq*yOMeCgb?62}c&-)BkAs;M+B8zQ`RH!f11-mI}d$ zsgXZ}=&69kR3)i=ofrLo$x-y&VIRQgil;MW1Eoj76b1VOkQ0s0lm;q8Ak1wmjN$0P zy)SR3UkrvJLz084j?y-F1RM~5jwi0~YW(uTmmkbg1MXv=n(i;d<9J~F(n~ggNo(79 zcECe%t8TfqN}T13 zv@E%ZT1Nd;g#gFV`*w9c-w=PU@BzjLNnc5VDM129T0&b;b^6Z$+UM#oBb}sgOvt>| zYj+M4tFT-{M)p@ELCD)c%ewiSVF6&!@54Qf6KLS5%}Wm+H{B%_Nz zlL?jCjKlTi^tV)Qop>j8ihx&e1Ax(Kn=O#B+S{1zf``Jklc+xqjv=BffNrJYn{yIb z2nXzp`19=>`vF{FwA{gg<-(zAS1%cLw48@gd2{2#`@hok5$yjolQ6CHu^&~wAln5n z%o1oHe%1lT&Fvu0RH87(iJmO&Ub)l&dF6#i#}Q`*tN9zHTOhQ;rBuMqBV{5h8)34g z;4p99mEl9p5e4MHcTm(TT$2hPPXAYDD-(hCY}ekmX$1>%S1tLN5SZ(_=!hx&8ytFX;}rjW+ts zR5$y@S*d21I}&V21^;Y7iQ$JB&xIYDFOf?cUzX$Rtr=+)N?2!pp;CAjt$kZXy^g^B*eJe`*1ps33zdj93TQk#qU~CitK*yd$*W>n=NTA=qwg~ zYQBOx?Im51f**k}S+I2wchm-#96JsIp%2J9WkZj!Y&=&LtRC*%{`nS;kg(bc3P^5z z4j=o3Sz7ZrNV#|UHWn*f8^xmt+xD6WwUy`E^twGhYfa+-M)x(!OQbMRgSc=``wap~ zpSu^&=|SQR6Fog--TDBJtv4ih|ZX3?yzA?Fx4Aan78uaX(WQ#U~!}ls%eXlrMHfd0Y4D`wX?_SgZ{XvshVo1^p zXpu;$@kgo?z`-E^ez;(=PbWSZ2_49&mzcnM^I5vU5h(Efh|u2Q{=6`H7I+mle)&p& z0Ogk5_~kR0xp%Je1oI@%4GoAV}FhN>rT5tnuwz!xN5xhMkA@cJUK3 z>rq2s!=*s>ei%*(L^5#C<|o|cu<{5?d-tVq3T)9``uR`R$^vn?pybJ%zI zU>jhUOl_n2U20y?#()Kn*ZWxnjl4$K-uFKMbB-=Rpxs3V*50?w{Pb&L=`7q zt_`_?Sjoy8_(+l-yF55XgkP^{ZYn?IWyEz*;`?vdXg37BL5 zolS);GFim#k{#;m_@_+}agI=l{7N{+PoNJM{^26EX#|ee=C7Pq$&gV?jXFL z!BzJ*9(~SQ?vg&A`pcxz(+gW~3=&o5icBtWz_AayKiAGMlaZUu;| zvK{CP3qS-lGrIPB?>pVyY=v)k)>4ccuLlK^@pWrO%z%uPl?mt-#ag{3A<)SD%=w_N2u-GBZRfl%VtmY>pK0isbar$$ zCbGH{R8$S!$c&gEKkblaQttY#9z;-AdniZnkHS;`8UP9HJp)!bU#T=i;!8+N-g)vO z?|0_`X05Bb2p)0et~!pIu1&B=i*9(lp5v&?CTzZZbuzH`SZy-ur?&2%%uy{bN}?Lb zd3`}#oI6KX_oHy{n=6!Y%E;GHkK)pxoO4)IG1Ou2eIn}-Q2;PL-)|P;=NA8O%t_Ng zBMQix{rB}r9?;Nd`XKeFAFVzwx)NlA<}@?=h~LV}N%WPBha(42z(EZty;^;s#KI9@ z*6zmllv7jlsB2PgvP5~MFrq=Ts>&J^f z&j0()c3>FqZ`-;;x4Z&+_wW}%pd}N!?i*YR6&?#HE=v^KsOzY7$=$cyal?IAJ{7I_ z>0`=TIh6_y{S6ye1L+;Jp{(xJWY5F*b%O+dV5)>|DE0q4b?IQaWSx78(JkGYPV^~$xJo~^? zb5c(n61mq~5qK|!-5_2@5~Rtajve^*c_o*NuSJ>)e1GZ{o!DnK^2FsJDiHtK&9V4< zLB9=`1c|AJH;W#j4f_oGey~`A?51z+8?FY|zH8wvAWvC!jbY2A=#Ebxna}n)H#3d= zmwuE@CzbORDvSjouRVR_`(=b696I6vHuZ)p@wTqi)xgls+y?kC+--4OgjvBiapyHp z;I}K&5V8VW!&9J+IzDDMYQXR=6}k+mw{U8(fu_nO@nhysrz~t|U3SwmyVploZyeMv zl2oeuh$W@L`cOCZZ?YJv@8r=C7q{e-q40U5TR>_%?qY8GB!6+AkQ3H@x*Wn$P#Q>2 zXGFSotvhtBAvEzBd*)Mx2_mIs-ALQh_^~S4x@v8!aM2Gz)SIR%+TfqKBnHSps*q4) zC+ZvzU_EQEH6F-Mao3Me`JpfrIZr$!Y7o*f$DRn>U5cha`xQa1bh`Jw-^;M%KmFD+ z5$Q@oT*Q+9KcRMwBD|!R1kb+yY0ubvS$T1Yu3{QBztvn0BeG_PnD6>6FU_Q{`&Tr;fWAg{a6F|^n)Xz#RI4JTZRgGDG*Yw+o4b57 z?Q-+XV6Mkj$;_K6%9X6D0xd_JmI46MLhaO(}JB|+@Btz&k?#s4hl%<%tyK>+1cCQ{{#0i;A#YmYxvkkK6F4V9fe)}e`oUirGkf^y@4>bmuW!q z0~R2;a)vE+UUF!^(mPS2P~WSW@OILwKPbrMGpT1XsSlc{EB(!$CgRJp<1bT~C%K+9!z2yr%D;cdEe3xHXIszfF1dTG%)8QQU?ZTxBf!8B#JqtES2I+3e5qP!XKlPz zA5*(NV@0Mh0sQxbM=HP^J!j>;-`QWh1>Gp_q>82ir458`v`to4zi;*w325_-((p$Os5*sCvrCG~O^awCP4z(#n!D>7_#{^3PhaAj zs9Uuv6(~#w8J1!UMHhMd_m%CZ+y~&(LlOYxEG=_>Zzi8GMszlp2PdXyj|3F-5j&OI zW}dyQlSJ?*`aNc>6O2CyH&_nz6o>BzXnW4o??`lr06H_)= z>`d;(DOA0D!mI?P+yn4LjWl?(7rN0Hv%$Q(^6JTfk^qJCtn7TeV_v0rKW-5<($uK` zglM`hH8$jet*tsef$Y(ILgcF{c0p@Sc`<*LW)v<^)V}}@2;^KB6mb`{Kf3`3G zfrfk%JD>MGQ1UF{2#2jcn z*s0d@qq%-v?ET;5XM!F-?p;?73gr?3hosX1OCK#jv!@0h38STrQzarMO&mTkMz-+^ zsrG*<3r=>J32c{o!2zW@Jqj)P+#lvy03kgZV2Ig!yD(GnrEkgUom zoO6sqgeW6rG?cQpjB_d(k)6#kGP3tM$64Q3pWpA(yU%}czs7xE*L_{j=i_pf3R{7< zp;jD%9DUh1&4P>*xE7ZEe}ymsRT(PCvh4BnuO9JGON7&t62sWfAZ`XXksv{Smk41@BH! zGP^o>=?lBhE4&q%bRWz(PhHu5?8WCNb2>f(+PFLzfap;}W+~g7oX0FK-~74*#=OCw zadS<+vvNV##ZjXljJy_4o=>bj>Ezt))?gHHFmSZi(*?Wg&+Y&jl2GrlJefGe>YN>_ zhCc6mSl{TN1PTgc4ee3VlGlD7Jl4SpF+M@MpL&!bzDZ2PYFB;Nl}Y_Vj!wLS{By^F zhjW}l+Hdnd<8dOTgp_GwgN;v2S#q#qh7V+4 z#O>DYZEsh~2=VS?W$D0I3Lkd6lHPXRK=um-kt;v4aJXgnb^q7ugl^xvm|M@NhZCRL z3OUC*Lo^?eqi2)-EQGXRz+kd*?#2|1p>OlIz@Vjsruh8^$% zDyD0hc;=;2DEy4g3;H>a1|2S^80LN+4s!tmVVFkKRSyFMP7zRtEIJLZRo;i<)WiwC zFZ#tG=nfwACqT~A*uGRcRn%$VKG4KUa3l(n@~TQz-s@N*-sW|P0l9$sLHKISH5?tW zx}MTba0^SkQTT7*hr!e=cAxE|seDjrt>JZKY9!-V1=qSTTRnDV(OJyCg~Z$Tf`xL@ zFk}e&{UhD%h3wb7cB4ORkM(6g&}5t&du|29;l4(*$L+@z`|S62SZwG&aaA6u(USDN z&ak9p&DhBR1P$aJmK-8EWmG#A`&r|X#Am$$x2FQo?apEwV_UtXyjJ{=NL+3w4gKDj zX)#=V>FqHo$l4X6TZ&^M=*;==x4x2yt{Ey6sc-=q#@>JNQlft*OGkD=Dysga>M|) z3y)gCO_nL@nT#P-N#9b?vCH$@vZcfYTn+m9Shx~%-iqZKM-o@j=e155qJjJO3OY-g#BfSH*Mj4hXbEExt{Dq&L#cL3!13+W3FMOr9^m^-f0z7)-cMG? zIc-m)uUx|%7$hBiIM4e2o! z8S|;h<-Nxz)^KxHn&E|&*k8!e{z`KverV0Ha4yGquXhhe9Paqo=ocv>nTHND;krfG zxv6G9LlM8PX=|Mc3Y%7%OGUmL5Ky(>d$T5BRik zI{j#zD*$ZnXcg_qc?%VBv4TFng)fATl2@l=1j^xPIBtJ5w%B{rAFO$ac%wszPpJDMhE5eg7PtA@AyF_m z`|>Dv`PA1aZzC|O09yWHU{_36%QUcl zQnWTnoM4kz6E5*k>$q@oqsLnJHw~}+{^v)%TPT6C{Jl>O?cbS9y`+tH!q>Q*Na9o> z@4ZU6rz5F%n}r8CuJl(J(2|}Mt^xB*u%ZD+M)OfLL>;A*(=)Zt*tiC4#CP6Se~Z`F z_6B9uTKYZaYJ^-kAaI@OF%zwz6zlBXlB#|u0@OQs$8wbTJH}E_rx`S!aVXAmZiCm@ ze7!x(L?|*T22s&rDszoNkF%=q7f|vLGytNs87Ipu>;bqNxzjyBk_VF_%EDW>bjcam z+AdL_)ipvO8eNrs{uHoU_g{GO@8OjJmS>8T9?&AK5Ws%Zz)FE z1KqF1(XWI6j!nz=Urt5HXoaihix{Tis^AdLKIW-SIRaC1itsIS+O3-^q1Zj-*7^AE zhxu-JG>pGmp%!+h<(m2jpf_4;R+^w^5oROK-KT?NhUIzz&|4suXt(atmp|J+90qj| zh0r2|l>JQ^QWX|Sy*dHw9cOh@p-`<^w(j)iMZV63PqDkbKIR)s+W|I%`a74qc3^PX zqDbN0_}`k=pKADfkMfJ*>^I=4JbPt^}(U$Zs9agdMyIQ=Id$&r9!oR`Ld0h+UF zsZpk$Qu4F+Y3_kAU@&XA6zXwA94!L{D*8L?C#p8^zFZV-dshQsT6eq7N@Bb5{0b_M zF)uNw3^;LDbkK++k!YEwrc5E%^Y&}){Xe`7oqo3rrJ}9^1Q56|TCDeGo*q5pY)z6{ zJWccMUwoMJfs!}`>2FwHps={_D40E>;0ZmVe5V(x@3ncF-8U2a(q6a+ zjih+tKy$*;UjVxhaN3+XYR0TN;vVOfTnctZM!7x$vtHz_TSDZ8ayk zNFzvoIO4$y#dL13rF)M-I~zhm2Q=vd#B<}(9N32h?OV^|mD1*+ogdD&TaTA1j*`1q zM+PAEC?#E5okLyVNC`}SM0Y`9SID}cYac`0{|%2KM$Y$g z7QfT{1^?_m9j>8p4T!8cv!}!^WYqq_FvR#5rfD-O1CinEu$Y>Q4u(;^oqU*30BgBtH&Pm`hhL)#`JBdK-DNx zHecqB4R2A+Pfql=mU9R}^I0>F0B~i3As-**P(DiY2sCDsb@nP^)4b^bo(Pj~OxyS;WY zH*Tydb||m_&=0)l>JOv}KRkqa<1pwz%oHoN;Aei|gp^pX|AN@=ON=;n;GUVp@zR(M z=D?ZpMy6m6{VhrWxR~XhxAXbL7}Vty)ItOu4?sHhjhlSZao``CV){7{$!ihS&ms;-_L zAPljOi23OlqEe*cc$?>TpadV1hQCe~UprZMalLlu^L-UFi3#F=#C5-fRHwNSjJ4HUom6;u~^gy7Y+Xlu%tdsSV*`zmQcctzFSrjdhf4d>n)gm356GL`Vq{6Dig+f^Y+)~1-GQI ze>aU2@->>j!397qdSy@3Ri&BFxh}Bq_HpKP)3OOES+w%;%~s~s<5CbptNVvDcPGb| z67)8uLt7rL3qOUkz$IeTaChz)Z4DlK@!_QKWhn;ZSBY7>a zLnCgy{jImnPLCert^-QS<;7)%R)eM0r&hzG;>XKK~K zt@X)sOI{oRl!%2gZ9@(>$W}%0!ENL&Szl6i%cWpF_AC#8?h$2;4OOo=CE&34XK}BP z`QH_m>LN8@383{zz3P)kywj8nS;72RIn6Ch#b18HyWfj@o$o$Ck$)z+WZL_0tOISC z+R!!HQ;RCZ%bVqanN@{#bwh6Doa%+kAz~X+-mgNMkP$IwAKX8L8h&}-Z@<0k;DO)w zRRhTzOjQSS$I4N7UpSuA+TFn_@c)aY;1vQ_MKp1f&(=$xTry}$%3 z;)3t#CJ4U{mInUOut_ym?#v&t0qdBQ+gVQ{)HjFM)L|@c;v%zrT=!q@y0~EH9PTbB zIwxTq=QV48^d#3^u*sWK)8)PDEEzMeMz*u&`Ri8}(S-V(I>u4E;`vJX8=HbzpC#*v zbj8oZQR&SBOMF6KEj~gfCD$rv9Y(JL=pzK7Op0(Nk7BgnftLZAWk|=VbCw=`6ut9Z z{CaBD@^^ch2V~O_HyQ;czc|@L0S!nL(XVC=@A>86RL7kJt(|{?dg(r}=Kx^gH`=D` zJw|Vdd<#|D55O2N`-Et!p(B&2f|4xPRl68p(j80W z;`lrM1vm?snz4`sWL|lza@e;9oqN*ev;f7Sj?3JDSRG=$p~Q=W0k0$|_p<&RCEYOS z?TLMx`S^Q9An|6ThU`&1pegHoje0--t0K3>bvFp8xac*AD5JK7ND-Jfb1aF_xhcfVgnUoZFw!2m+o zsYSgP1kCFw_=cd{Ebm_O$MHL2Z*G)E0660@FiEX)iJ*htX+YgmD*}BYLoo8nNgo*E zz$vv%HEMLcFG$jTSMm*8E|iogkP<|_8-D7h_{*+JkG9&uLEC`36!j+Rl6J#Ecz`#? z@hQ7xL9g-p7EyB))Xq>9d$#^fsrTR=B>*VAeV&silo6i4P+`o}p7wonjYYma&f(gp zdVj~P!1fr-`+6PA@|gYT#nAS|78)}QK=*$9!ITeZ;g(i&kIK$@EY-8@E~&UL=EUpz zZzP>gFC-{UdfFwNPpOHWDFtw~MuY^_-H+={B|!W7$=`%%DtE%A0NX!lL%Ij}vp9{* zO`z1Tucn3WRI^_N-&NN9J4l;WFUI*NUsdt1O!=%4k(e@TpY zEc%3g9?9kf`n>DU%115TA6>&W?-Zh-6PaD@)-Z^}<*T=itJISlWbXg?P2Pe66SGkX zMwM@P zOmUwrIYnp`b{(1d*b=|&+PijP{*CF<@dVdP*HA76Wa2X_$?Z+X&^)HdLzK(``5?jLTy;uo{-tADTE zoC7F< zqn3}RK0H77wXyb`MC5|u`sMLDUES?YsmyhfB2crqee;^nB7Uyt>ld$242If> z9oRB)caKZ#4~io^g;sMil|!U((oF4Lh5Wx7L`uJxQJ2p1(g+2f@tscqAdX!L;Kc`) zEKF6}1BXokoRf_4d$sSory+&wHjSPqE7W1}%Q79F(mE(NN$f57VK@8=hMNAZI%8XW zxTOIXX#Hp*dk>>dvgF4$dV4a&sTCLhYAIU7Zk4f5T|f{HeYZve=}k_U$O_SL&{T03 zOj4~PTA2z=XG!^+Z6?75*_9Gk#lz3KVUE=&(eunHQdH32p7_|gf)28MkJ1)stk1AA zB#$jmu2nV|Z-od;{+ilA_K^B?z`74DXo)o#BW}jWv3&z;`SH}Bt>K{z6$A^B%i@<$ zSC*9Czq%;G)%H%|1M8zJpRXY_PR5d+0btjQv+hXC+a4%#)+8QZBFFs@F)=dSDW>I) zq5c+UJ6`zDGhZVr-@}{7ZX;HXmbS_HAPQ4(u4hA zG#VdwD1~`K{P>YSM;TZYq`;N<$Itu|M4E6{k%)O-W?CQ(q|2H=6VM`G#Fc)%^8>Wq z%$}BhX_VdXnoq#KDE%41JSG2xQS8v?g5GtMmkztsc}iMc*td>|nf29_V<0wlPV3iK z#SdNfZqFHF}GSV)~c(lD(LEyylJt2HW zkP`%$dp#vxRlWwMgl)<%&vba}ahHj-#0Q^m!wju{@zK@x+~YGQ2a4yTy@r0y=YKpR zQ*!e&-`y{quVRs5ea5?V?MI?v_@-=Xx*_{U9mzYt?vXVyC5*{4Qf>3rtpKrfDv$9L zukG+JQ`cMxil^*`8IzyMKK@eR)shm)1*|JP1t#&v_w}_T7FE7|S=z|pYukRk(ieTu za`_DB^Yuf!rw!+rhS?nR9L)n#l;US=d<8w#By9zL%9pi*RsE)H3LlEPa3Ecc1e$<< zN%k`v&xU*tmBfY>sOz6-u(rY0-?~MaZB01090+oji(9Wk$u2_~?`3 zXEdzcozFPsFHBz+0uFj1nol3pa~+hx%-0I40)(eh1KPR|YD*t;{$s@Hi@9N_80W;= zJ69^<7Sb!dIT|cpVGnX-xuqpvP^FtBr6B$gzYMYMVI$J3@AK?E(Lc3~wnb%ZW)Vw} z+@9nI*hb2^_hNtlA`0;OAbKDecnvzKqs&E1G258K7LK4T2^5!pt3T66rtS)~mc&%} zsl-d4U934n*|r<&JTWbQ?D0K5=o9<1r>R+xGT%{Wx`+<{e4~BVu6)rS z0qVlj!7vJst#&s-~7X~@jvK##JUtfv6v$DB5MaAO(FY>)gz>^bEtD)l;H2K-lG>&zpw-7zrNFSR}1@c(>X<^)@ zpi4)YEgfTA0Q}g%ba8!vMI>$h3RC#x1C011jq5)(W{QpXC=he6C4dbW>#)u3@X`nAAVuxBRR7XqhzArjdRB5MyrHmL@-z3Eveyc_ z-+RWAXLc{TttOh8$@jlE*xTr9xx@VJS9~0?af!-y=jors010bOBqWOye)m_vhdxW| zz5g^O!?Vfd8YtI!+qo(L&?bGadMHbLDUn6)myJkt^&y^68<T{eQ%PlKH8*#^H-9mR6!@J3`sNbl;Q{j&6{*uf%W z_;3j;5KUYCHQYttty&hwczadN#m|&ij!szb&FB=(H)c27G`Wc8mod{yD0l+oFfIxm zrMI+2x)Fa#viAo?0*NC^tG)w^+SeHGcUk5&NAUl6(alrL2&`{Ldg9 ziunGGHD8-0mA}`f2CchFWdpSZpR`~E>L((jW%-F5J0B>XDbPq6p50OrL}x}yYk8ks z?{_>o$RB#_DFlF4ZszIbLH+mNps8({up}PVmkp}IQ#-tepW-Q5%cXXxRQh^;m)kHt zq-cy>$KK8rOWb%-Ya#^9Ze_Iy>9I=<=Zfln7K0s) z?6(b6-AObg02I~CFNj-tBbJ$;T4sDlo36=YZ+|rSlevMzf1K`t;&aw+Hbq=}wzxgj zQGuLY4Zt-Z6>SG!dV;O?Iz~pcE)g5Bqj6Fq3975XcG27kM`Z~6u^2;{IPde$ z0gpq9S1i5jjsr7IPES5RkYP+lG}D-+AK$q!5(ly?LX9g5n$jc%>HAJe&iapWzpnwW z4p#d3@W&0V-!SI8hIr;FC64$UnV6i3BqbR*fzzqKDLYVEKMQNfdi(N`hU^`Mxjg8c z+04bC_|Tfgzuy|D=1z}hjD=V(z#+}K5d2cHgl`lr&8XunCtDG*_9m+ump=d+3BOBb z^}tszRWMN@!wC|FsOtyAJ6!w10cPRi-f$Ai~~S!O0;YptfK%q=GEpu=mf zM<{*rE97RRKFcXUl-;0L9)hM^Jd<-eQTz%?r%8vKrfrHm6~$3%!<)oBN2Q3fh3XpJ z7W#>ACE{af?aTPk(EoiwN>Go7Ht&kZ_Xc>?Wl^+u9X+Vc?}|4bL+$jUudPgCb9H}L zbcCShb>hGr6RsDCs&#i-=EIjC-vNt>@h}70==%*-fqe)W+%jZ<@7vgoxvzr<@BTD8 zs_S`ify{4mptQ}^T6;foj=^AH?BVHh=fgLejTju;(F6F_pN>EApMkzZ|MMHsr6x54 zUd6NfEjdnTs6jMO5%$9F?%PZ19~{o+*TxdSyFXXN+B zpdQoW=8imOepY{z@;|GHl*S$IQ>|hq5{CzR5PU~9CudL|&1*!VQ6o%+QQXSxZSDDU z%c|H)qDM;$KbJG;S+p=>5;soktVmize8Wf|o?&SVa_5$^1z=7*h-Nl|7+PUqx*V}# zL>t?z4AXYQZ&k*b-3Oc(@tDwUjyYjta&?u`^0@s7Tc+KfLaC{AiR4xmAtB-(b4c3)rn*3-p^>|HWD@fVVe5BFAeO) zhE3BSk?K4TEDew%@pp6k@P;TI8^Y0J8K93to9-AyygS^MmfhPk;i83Fe1cJ!p4j$> ziil;reqx4J%U4=?5Dxg(F?tgYwT59gdJK}q_n4#<1GR!L_+rdr+~Zq~tZ-c+)7MDl z&0l=67?3CI!IWlhY`p#7W%9#Zpny;vEY|MsY`*9f*H%}D&!ShE{nd?+!+yqEy0zF> zrWe-T@(LsywYV#Gg_u=M7ibGJtR2cu*ww6T8+=B;ULK10I8cfdnKbNT{vw3&s*B9) z3xU-=HXcUxVi9Q2YGZ=l(=?f6R~6#1Up{tW&S0NEPr5kBQY|;2rw+3cKkL7tO{_!J z?RBZdVg}ca&pSrRL#cj~0X}>x0jNQjak~2JeR$wE!u)0A)?$ z_Q+rIDjY)o6!H*&hL>!`jt@@_W~K5UFOoE%2@|Q+!@d(3hrp%~O9ffVH3OhiM#*MN z)v`4Z!+0+5DZf=%SRo$-TK2df9KZPqfF3x1fcHH;@eS>Z7?1{RRb!S15|vZxs~+#> zjmk)&H-1KVMadBnLrlt-mXFOXe2r9-45t4?%N25KH1YC@K%D2V3)eR*-gJ<%Td5w~ z|EU};7r9{R|J?p2@X6944w=hIAsrv7YQ=7l`)vOT+wgEW)CdaLS*hyzodwJ8pjhb| zELl;yz+(@)(kJN|^*d?vlyExv1|oof*4WxdEaq5c`DxH9i1^5Y?sVhu^LxoL1L#rTSO#$b+$N4L;(z$kAokP{yd4COz7rrqq>@sEF?2>tjj_ zLpoQ2b27VMo-tFdQj`S0K_7x^QkAh6!s5jgmR#c5i^elIYsl-n`JB7+Z5~g(IUv1) zXGPd27ZaJrppkwnajd^qq8%sRxG^=W?(V9pw6Vt5R<_bI#sMGF=Cr^bXCiN^P1z2y z@A6-~IZ>%FBFvHAJ7eMgKl$Z9h~I>XKs)4xW}#Q5uIXSw7h}hkYw5Xo0<%yz@ywg{ zW#yz8)#gR1>$R?2A1skz0JuPE;(;$657ap00DI9A55mJQGZzEIw=ki!uy3dW$TGw6 zyTzNg3cc9g_C1`mn%1E z+}TJ#UJstvo9 zX!|MFivFzfL4ydiQ+}hc_v167#;u3DB}R6VZie(G zasfYe_rE~dFANM5GXy*LN*#VT z^CuV*l%&xTD#y+OO+fDR zey919cvR9a)a$P_hJx$$b`t%o$t&4Tc)wDbx&S9f*4Gp9`q94t%dwC7?#oRDa>&n3 z*6)s{x(tcu7RdmU88%QgNp;2t8$o}bUo5f8h)&lj{U*uV*z+=1sG)83sHIey^1X(4 z#D5=*TN*uCkVJOeSmim$gGIeY1@L{w@nw+)I-wwUzso1<)UG&ypIqVFNQ2b16cC z$(G)j85B_Dqmw-yd?2|9T-E)!l_Lf?SBZN+KIfQ>&X+-vFnP1cp$bXt_+AltbNt{Y zcIbz0*|=q(okdj5>s`>#z!#P7#Rz+bU%%qX%vO@kOS4aZo7&D%!2GU}%Qat)W$vJ^ zG^-jhcyy-~FYbpnX=vD-3}6KuneF0f^8!)8$=hF&^Rj2a@r*f2G@oxVDDS5OST^Rb z5AFXx+f8ZU6r4^0M}6(=i}jr*lYDigzMRB;l}iP2SszlP9q-Vrl%Q&K?P;%M8H6t$5-N1LhbFkJx*vhy(IYhpeF{h@tn+qHre&%*egE#R zjEb(h8*a3~NhlAAX%K`4L(nZSeeHRN1P;HgyAJt~L~lVI@% zUf~DjvXd@VLgfX3b^XOg$2b{f1)pZ*ty($SO znN#z=F#JEYjI8ps(da`F9FU=^dE3}spNxLp%`WvQmcWCD4mUUq3Lw@tFBbyHVK`(Y zSt98U)|jC^5rW_&W*-^-jSCw9C$uR)O-eaNs;Wy>lLk?c2EKZ$3>^9-A`Cpx0G4l7&=qq>exhSv=iB(VSW z4H3}t7<3mn9WPAbmj3%0xMas6-2LU+pdfbQ7MCOb(ZInaKxXQR4XmkRgG`bP9RF3> ziunhLQwtBA8M);%! zENm!Dsw~X(j=Lt(X@L!q>{6EUlL?z6o8aD@4wi8KCj*2-0DxJ<$F)%?X8D?zj3Q;w+FpLXT2`q~c`HCB#`Lf^&h(QlU;z_T+RvLe9E zwdNee3XMd=0g5q8w)Damy|XtA;w;o+=1@)VJhHbv0?zaoI7%Alb!p;NM`YE^4qabW zaEaf4F~-Q;3H=N`&Gx$a;$r~kKKO`b9ZbIQuB=~a>{G-$ix19!#}p)bP=9qPu}5$d zi~oius+qw%?tfyaHK_Klqsr3{k{MM>RKB-?^y5`buQmC`!8csAHV3=%%RYq?7n6`t zRXJZPDq{{jnD^r&KnXBN>160wB%7pwZ&YJ;?|Im!d5FX{4^~`u$R#dd#P}W|Yl$Cf z@4u))c@ULy&-dadi2q3&QY=Z8on{w2>4a`tKX|M*@x+~n!M}oa6n`VW3a&tqv=U0w zH*l=to_n{9Y-LEyuB0Gr=&qt6=|};5G5!)1k#~M)_~`jVLOic;eWz-m%$Q^Sm;Wc> z2EzT$UGdmu-cKoK!7>t5dL=m_L#Xx3wMZns$||Nr79Ko1Cs>}g1w^94-aXUARl{Pw zvJ##XsngM~`|4P8a^(Wi!QVUo!=^90g}36G4k4f{QJ^49MvW;9LH+ABqrJ zCs{5DK%IDS)|m7w%-;po_Ac2U#01rS)MfF**3v+Ja#2SS>CjwvKx<0TN%?&-HjsLR zIoHur@y;;TpTzYA{?vP)d2&ft!mtS|^~scV5g*Y@&DYQU^Qq+QF8`wR&^a_JB;fDX zBNAqv!@n8V5~2$F?MI}T{DoL^pqn2`%e>GVa6%CPazeA6s0Y-Mb*& zKCP{azsV4Vxe`q<{JD~@+Tf{g4N;c@2KlB1oO}RhW1N~Igr8|xhynkiz?~YX4dRp6 ztvD9p10Y#*I+OSW3A96DTyslZM+azAqLmlu&fn48Fy__8n~HnPQwEOr(R*Gl)4&@-9F-uhNiHBIkF#L@7zE*?(_Am^b z*!a;$e_A;86v%1rCNc4=niR{&Slx+OK133I=x8@X1_%b{Q)(zdT?WanO|YS|sqgJ^ zE)kA*H$8f&>a&)%ER#^DIf{`1?h$GJ@Gkx`@eq#cA^7?J)A@#L6kE7tsNLWi2$4V{ z)(4|TjYMJAlLF|F+b*kEM4&y(-XnfO*x1^V-uA0n)mz_>VLfQ2E;bo&wO&g)6W_0f z80Z$QWQVRjUS@`XrTeeNq0-bf$NKk6Bve*?-t7dh<{ynO=O0)D9`WveV$UN@NisB> zXDG+@)Act)IEa*W9XO_^PI>?xoajlOZ9zr8vUd3EP(h>M!FX)zopbN;EVWuh)36uG zR6T#y5o2m1fFrgKKCOcx-V(SVq2|CbW>!V<-j}0kEL(RY?si;?Yi~L*2w*#XGtr+0 zZL1nUe`e~^mJmDqVExxq{lzF@AZf3wT52r8miLaWK}2zL1p&dq@n+09>M)bueMXe(WTt&Btonw9k|i6}vBSbpO> ze!+C}A$(G;)A^o6@;6)Al*nhTGJ42&S7WZ#tg$NP?gs|%4Ti6WMF)JJ4q2SXK41N} ze+}N%YzzpQjb$}T+te-=#t$hvW8|z7j#CIYEP_Pla6qo^dDNN#DqI+U^9e7R$GLo{ z0U(ZgFRcIM3BJlLYvDr%Q5wB#U0Zr}+5M5%z0soAr52=DS@VHHeMQ#|mQaTp&H}t@ zS42|gLUDbWu2s%siq7nBfvfO_b|Jo!hYMITM9u!d2DaI>ZYwf(bFY9zB3`FM-G}3V z&;dH>!YB5tw>_Yc^S_)QtZi(Ag0-Z}>T89?HN4f~Hedk|(kQWNcI;I2Umag0EDF6Z z`~;p{zaBrsS-BlRW1OT^d&`h6wV&0)9Wn!=fa0-p%L0>;&@wCir3ZaFKQ*p>^yS|> zxuHjUIg`e5&$M$zCv-1Xc@pHDYe6_xFxlZaZ{4#Qo4-t4SBtr-r3TV_#Y+>OJ~tU{ zq_&+D<=-0|54|2pt{jK3TrdENX6~)dFxDxTb{ht=cMEIr_2s_ufWTf)y!cR2&d~D%nJBUp5wj5)D5I8Hy482h}#3dET<-#ce zZ1+$f|J6@{!TUZC{*v~2t5y$iOn#2S+#-%JuR#cD@2|0xXx*8H{A|Jw3xIxYR*(xX zT%}szcv$0g+sM}B2L>ts4hBZriV{c(we0?a4hsZPH|?f))Y^R>xKRCmLT8txd7AK} zb>HY`bde4COVZz$D5 zIv!QMx%cd^-e(k{NeXd;ncaBf_7!Tj;06ovmnu11m~FYM5Uy8S{EBZiux1h{T+_*LP(c9gWjX^XI`~J0d?(U{pDL@qR^jgYK;7PpDU+qA@R%? z`K*8LMd0XgO=xavEPPL4)4PRwh#n{@1hc-3y4JBjM_v~V`uQ*8c1X`1JXq1sLG3(= zpX$#MQw!}cg|1t(HTu8+ai$+tBR^U`dgQj{#D^vpoSOC_*m_q{-6N}e8Vs@!bgO{+T)h^=fkt$5<`8&F_fC4t9S z>NMnGejLiI>l_Ynes=1EqEg!dCz92b=MWg+Jf1Z7MC+gcFG!PqQ`K?^Hd$+tNqxIV zj$C8(Siz5;u7BUm#OvQOdLYR}g|0Zdt756;?I^PylQ#dC4A*nu1Z8T2+xYV@D>*Um z_?GOOcqZ@fes?PWA*}>Ol8sPNtmXF~-c$V7e+HHkIUqtQS5rKSm@bH5_c>HtA-lb3Gla>Grnaf8G=*TK;7dOUOS)s7q@hjk^c7W%rE`vDZ# z4bvfLGB=}U@A0!m!GxvIN0gBUxc9KS);Bpt#`xvEOQZy?FF^V@Nm%kAr>)8sHG11s zs=K&ZBH0%jZq=>U*#W>_Y~7AJ|NYXlD*^vX+rWbx{1bSf*U#=nI1ZINe5FYmoHRuc zSg`svyF^pEqINboqpbecQtUY?!s>;IUZd*?Ov0HrP@L5TzF!~#;xjJkUAg0RTc^*! z7-AXI!6>}?k0d*xC|C9d#vB0*?+)(wmQj)~lb4s-y*6)>zrja65q}&o%42%$^~{AR z>*bHMj$(*%s%xjcFJm{aH7|PWLuvhn-X7P(Z%xYpS7#mGRt%EV;9g718Tr zpDsFnp22Q4Q0w5ea`OSz>Vqx9#F(0=>8qJ%PysF~iCwhSqtyW%83s~zJ^CbR`5YB5 zxh4>^=Pd$iSPi&|*Wa)xJ$HROEo&{&^kB*X&v^GL>n#0vq9Qca?QY9cjNdU|Eaq5Z z&xJpg-0)aqoY6DKrWroweZ`51%93IMIx$9Df!6UHf3}vH@%7zxOzp(j$DGx`UQT2+ zZ_JN?DbbdI9cm46=*kgrA_`Q6ac)&7$?F&8D-=55&$1rQ)(~!d#Rp`6aPOzOR3T(9WIvpqi z9v=r(&u+WDYc}D>H5EJ5?S7PoluBlodQZ1mnJ|FI{qo-;CG9^4tv|f@@3b?u7x0pI z?ZS6dhg`hdA7}@~pqh^NKloj6I`{d2OwR$`^}-7`I3P9pmj;n7nI%xNW3hhWMfl{a zT|=9O{pfdvj$=VrJ;UbMCSAG7#{oEifG0`ict#xfka&}&M%by**P69d;4>by<`s5t zx9mB$FjlF2d`d9%7hf^#vGw%XOeDlbFQ$sv*jCod1r2Vj)+wptuH&8oewM$1Pi)iL z(+yJ`wRo4Z=9#?KFfqmNy!-sTtBn6*SA(O!r(Ui;Bl&iOMlmx{CHZE8SAQ_E83ps< zG__yFE)X@PO<(UbS0H2j)lj%A6)-;6R8XF1>03jDrwuUpj(j-Fx=54xA8jRoykgg5e za;Qs}#)itnF-J{790!!QZgrb`5E7#ZBMLJ6wV?1ZzVo6i*B#{lQ`asa;&ACB(IbH! z8}#&8Z(oqDd~>VFVi<%B1%4aS)IEDbA%v09rOcF|E$0@XI}#D%w>lIWM}_k)3~!=FdPWq?|6i zJP@F66XA@pig=>pRw48M9~->y*=&-qJwkTZ^yz^wo*MnUC(!u={2s1I9827gA;zoJ z3SP2W^`adLzyrT==A1>M1))~Sr@(})KQRwX{Nb#jV-VGS1P$O6VO7=IlJ&UaXNWz7 zG0!I{ZgU${);7wW@f&zvekf$dB+$*B*z5h&A5<_UlV}T6OZVY8;tGR~?^3B2?0qzM z^6;HWdr?o{O+8N@@2rwrY;T8R*KWxptAc)+!Rg@O>Nb_&dWQYy;Q6aCXk+J)mJmea zS~2Q1w^{8}f6LjR|B|!QkH9|PcMzqRjQVnM{3AVM32jsLnn^?j80_|%RBh8rcw@%J zn@_2kTfYbk-93uGed8hmaUF)_$&s7MdqmutJTaW-73fyn5Nfx}6`~bHXZ$M8PNxt{ znVScPdoKI5Cr~j@g@*V4vbVfW z{MORuPJH?wme?w4HNcP{O=y0qx>mRH%m6#URc%u` zEK#)Y+uiGSLH*~b&+^ZKuF3zVGbu6X!OunUG{Y#v6;cJr<-J85kk|yHa<;zT`HOHw zvq1^#fOula?cF%{n~Tz`#y^S4T=4E&8zD;xJi{Z8e2>`wyz=7GKSCWIJ>7Yw0BHay zWjzrkc^MXW5T{9ar@`Jd(l_7=hwS;YldG}!Lbk^l)2woCsI82KgPXrE(BOo)g)-h> z_4v5D``%h?ek=>6fSMEm%M47V6R`q^$OtS<;QyF96Gy1p|NWmCBZFd)rNr1Ngc2o; zeJP?Od$w#LNhsTlEy`M{s2D|B$dWxVwkS*XtQjG)j&)|3<@`?1@7wcy{)4mJ=iK-E z{l2c(g+z3iKxn6y5w`xxbKeQ~BsS7~u$Y73JEBHRyhI^T%X(4xtnJPyT{nv;-DG;= z_rG$)=mot-V_JI&reJ|9EglY-K!~6GRRVoI{tasCmq9v|mWz5yjkk8FT5oz^ce33H zaK$OW!YbEMkN*q^FFXMp_aMb?jjNaZ7C&mNbge6jJaf7(k-!f8VM~M~0K;nlhW>rV zN4ycFo`bZpQe`FfHbTg?epA#+lRK{3C)?3PrBKio>}%Sg%pr5>7V*2xzRijdyy$qlqdySGUvU@gb%b z>~RjU&!9d7a5sJ?vEf~By`BJyKW$A{0Dvz}fF1UyZSJ8!<+>81sRACG>n%+P5;TZ# z++-Ix_cj22mbLatYx^ZR04StB`X6$knLONyv+hU%hzc|N889*aK0ZqZrXwrlBE_X+ zEOdS7aq{NjrakZsNKa9N^;J(t;V_q5g zi5@8UiX95zT`DN`UzRLQN9Bfog5Gy&2P9;#zhL~|4)oSQ%y9%7i>>Q~ijPL_e2iai z`!OI7$pABH31ist*Pyt}Pi@;tXhPVDm`tP(*g!Iyb?f(v%^y3-Zz+E^*k;xEs29nY zm70oBYeCAxD3Q62sR$@aDdQ@m9>A@9Rtn~n+YMp)vx;foO&AO-Jr>NKCtunxetT~< z`1Yu{3dwKK6ZF^wh;|C`&`FuD)n(pSCsZS^0>e25?zv;l|MvsU6hh3=-9EkJ#>lLp ze)h%HH*MKa!;nFH+_O)?7kBNYlaboub9ESJA44Ci2MKeV^-Vzc z)5b~sqv5Enem8Z14^Hp4X+Me(V~MVOb_}m**lSN$lHAX``AuvhxPhfEq+PJ5=R0Zq zp~$8sB@Hr4;PET;jh)D$vkY5FDBB`&B80oxRw2RBazl?|{Xc?`0^aEBt_hwWIZheU zv^e3w#38d8{1G1Bi%otL!>D|eZ(K$=PzLk6U;N>AG$6z9h{J?vo3Ur!U>T`j+PVr^ z2wCWLvhBNnB${+rgGGf-2(bO?^io)M;Qk5k_#_ z+vk1HNEb~6%5>gp80*k&emFo@XZAg)LoO<%w6|BAfic04EOI|)o62|^te)wAFLnz5 z(Ny?9@(nW)xCw0qjgfAcwyqe&G_1#Yyr(K4fe5VD0(W)UJ?dAdg=N6H^z$@8;V9y` zt|Ybxwp|c~VGgoq`xXw0T#h|~!-7@j7fJ6p>89dDfA4vfG_ovka=B^J1xGG!-YDyt zv^59T@L)s{L@(mc?N6^H6VIlR(Xfk;NbFYF3aVji13t)>_aYA>?(wk>wZQAix?3%^ zv5|IX4z-&6Ykr2_rzNN55D31~gg4wLzK&w}J4t=GDk6Tse^Wbua@XNiT#-#M=UN<| z_HGdWagVN{)1knf#9D+2viB1w@RWYcAG=8Z_WI-a!;a|7Pq})hfpi|1-+gRLo^tj zqBDQL;0ivNssz~r{{Xq|f#`n*>KhOO*9(db1rGo2Sj?>0w4Mg?O-?mG$RJO0UU)!x z-H(zWU}SU${y48Z%88z!agx$ktJ| z=$plL0lwscgmdqoLsAqj1NwL z1F8=cpB@~_n7BBZcDSmiKHO$O9YXwf)9CF;?6S}S7B`|xrkYg~U{i!7`qwBWtFr$4 z^Mf*^u)Ed>Kt^SC-nqZd3FP#|qgYk;NCDmy41ZUnzvlT%eaxAM zXvw)eO{2Ex>)NAHzYaTr_$&SwjsliyxDYJyeCn7Vuyr%Eil?pCIcx$x)FE`Ko@gqW$D`< zh}TSQ2qlRY0+5tBnxqZsSc%6sZw2fvZ&4ORSt?0=kHX)?=55fF_~cyJr^*qn7vOWq z9zW$q$<&i>RwoJNB&SBGb2b@ZY4NYOSQU!f(&3*LEeEKvP5~lotLyUGtu8EMY5gW#+6y7M99YL0$eZGRZ(~}Er>94s8!^aZ@>L$~$ zHd(J|@<$S+fDzCO-@!#+yQ{|uOt3_RLw2rqFiCk0O?q>WjLn#BSS*it+Ndl&rQloB zGMM_weQvjxarPRpLX{c%S2vvkF`1_PAk*ospZ(Xmn^ZmFIJqZ26svjhu^BO{M^Ed% zXy?U`g!;|aqYv7InmELyUK*KLi%QL_C_F_0P~~r!1w>Kbw|D*km;=LSO~dY^v5OPT zl8A~6^-;|GKyKgL`jU=b>TYPWnqI+(ExCQH00Nc5j(8t^z?Dl$^%qv`*N&Kjk}P*1}q>Cxt<$GoLf=HS5kJ{H(Z^V0BwS7toW zxWbz`K8BqDyiXtAW95Iv?A8UBOTZ0QIT>1x*eLl=>TsMa(sGxv^Uu}hVCRB^M^7-rC4%6i}*;x*hq~Tll znsZxFmr@(9V$VoF4l;IE+O@;oYaufm^Whl-Eu$@~_BD_QRxZg8Ese{=bb>a+&?ma% zn_VXN^=}{Wu5v<-OBCW(1S5QXy!xUkt8IFLlHpos>I{S+6s}!+q4%Sq9&+NZU<@

s%;4`m)y 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�A&h3= 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 VL}Nb10igdF>Y3;kYunxXzW`hjQ_27U literal 0 HcmV?d00001 diff --git a/dragonbones-core/src/test/resources/NewDragon/NewDragon.atlas b/dragonbones-core/src/test/resources/NewDragon/NewDragon.atlas new file mode 100644 index 0000000..53ba7c1 --- /dev/null +++ b/dragonbones-core/src/test/resources/NewDragon/NewDragon.atlas @@ -0,0 +1,209 @@ + +NewDragon.png +size: 1024,1024 +format: RGBA8888 +filter: Linear,Linear +repeat: none +author + rotate: true + xy: 195, 309 + size: 372, 56 + orig: 372, 56 + offset: 0, 0 + index: -1 +bozishang + rotate: false + xy: 2, 2 + size: 301, 230 + orig: 301, 230 + offset: 0, 0 + index: -1 +bozixia + rotate: true + xy: 253, 418 + size: 263, 194 + orig: 263, 194 + offset: 0, 0 + index: -1 +chibangL1 + rotate: false + xy: 455, 240 + size: 95, 62 + orig: 95, 62 + offset: 0, 0 + index: -1 +chibangL2 + rotate: false + xy: 327, 749 + size: 270, 273 + orig: 270, 273 + offset: 0, 0 + index: -1 +chibangR1 + rotate: true + xy: 575, 638 + size: 109, 73 + orig: 109, 73 + offset: 0, 0 + index: -1 +chibangR2 + rotate: false + xy: 2, 683 + size: 323, 339 + orig: 323, 339 + offset: 0, 0 + index: -1 +chujiao + rotate: true + xy: 449, 419 + size: 106, 112 + orig: 106, 112 + offset: 0, 0 + index: -1 +dabiL + rotate: false + xy: 392, 2 + size: 62, 68 + orig: 62, 68 + offset: 0, 0 + index: -1 +dabiR + rotate: true + xy: 456, 2 + size: 87, 55 + orig: 87, 55 + offset: 0, 0 + index: -1 +datuiL + rotate: false + xy: 305, 2 + size: 85, 68 + orig: 85, 68 + offset: 0, 0 + index: -1 +datuiR + rotate: false + xy: 455, 304 + size: 86, 113 + orig: 86, 113 + offset: 0, 0 + index: -1 +er + rotate: true + xy: 451, 629 + size: 118, 122 + orig: 118, 122 + offset: 0, 0 + index: -1 +jianbang + rotate: false + xy: 449, 527 + size: 119, 100 + orig: 119, 100 + offset: 0, 0 + index: -1 +jiaoL + rotate: false + xy: 447, 169 + size: 97, 69 + orig: 97, 69 + offset: 0, 0 + index: -1 +jiaoR + rotate: false + xy: 746, 648 + size: 91, 105 + orig: 91, 105 + offset: 0, 0 + index: -1 +shenti + rotate: false + xy: 599, 755 + size: 239, 267 + orig: 239, 267 + offset: 0, 0 + index: -1 +shouL + rotate: false + xy: 447, 91 + size: 75, 76 + orig: 75, 76 + offset: 0, 0 + index: -1 +shouR + rotate: false + xy: 650, 650 + size: 94, 103 + orig: 94, 103 + offset: 0, 0 + index: -1 +tail + rotate: true + xy: 2, 234 + size: 447, 191 + orig: 447, 191 + offset: 0, 0 + index: -1 +tou + rotate: false + xy: 840, 809 + size: 176, 213 + orig: 176, 213 + offset: 0, 0 + index: -1 +tou1 + rotate: true + xy: 195, 236 + size: 71, 46 + orig: 71, 46 + offset: 0, 0 + index: -1 +toujiaoL + rotate: true + xy: 840, 700 + size: 107, 153 + orig: 107, 153 + offset: 0, 0 + index: -1 +toujiaoR + rotate: false + xy: 253, 260 + size: 200, 156 + orig: 200, 156 + offset: 0, 0 + index: -1 +xiaobiL + rotate: false + xy: 839, 653 + size: 104, 45 + orig: 104, 45 + offset: 0, 0 + index: -1 +xiaobiR + rotate: false + xy: 327, 686 + size: 122, 61 + orig: 122, 61 + offset: 0, 0 + index: -1 +xiaotuiL + rotate: true + xy: 524, 100 + size: 67, 31 + orig: 67, 31 + offset: 0, 0 + index: -1 +xiaotuiR + rotate: false + xy: 945, 633 + size: 61, 65 + orig: 61, 65 + offset: 0, 0 + index: -1 +zui + rotate: true + xy: 305, 72 + size: 186, 140 + orig: 186, 140 + offset: 0, 0 + index: -1 diff --git a/dragonbones-core/src/test/resources/NewDragon/NewDragon.json b/dragonbones-core/src/test/resources/NewDragon/NewDragon.json new file mode 100644 index 0000000..e6e90d9 --- /dev/null +++ b/dragonbones-core/src/test/resources/NewDragon/NewDragon.json @@ -0,0 +1 @@ +{"skeleton":{"hash":"SInqWiGuNCBY0iY6UU64SzuOo5w","spine":"3.2.01","width":648.36,"height":676.96,"images":"./image/"},"bones":[{"name":"root"},{"name":"IK_Lhand","parent":"root","x":144.22,"y":158.18,"color":"ff3f00ff"},{"name":"IK_Rhand","parent":"root","x":-13.64,"y":169.81,"color":"ff3f00ff"},{"name":"bone","parent":"root","x":45.23,"y":95.63},{"name":"shenti","parent":"bone","length":209.27,"rotation":106.65,"y":4.69},{"name":"chibangR1","parent":"shenti","length":76.33,"rotation":93.15,"x":166.51,"y":34.93},{"name":"bone2","parent":"chibangR1","length":148.46,"rotation":-85.15,"x":58.47,"y":-8.06},{"name":"bone3","parent":"bone2","length":95.22,"rotation":-26.5,"x":148.48,"y":0.57},{"name":"bone4","parent":"bone3","length":123,"rotation":74.86,"x":95.08,"y":1.15},{"name":"bone5","parent":"bone4","length":142.68,"rotation":50.1,"x":123,"y":0.09},{"name":"bone6","parent":"bone3","length":79.56,"rotation":127.12,"x":75.77,"y":20.28},{"name":"bone7","parent":"bone6","length":93.07,"rotation":35.04,"x":79.56,"y":-0.34},{"name":"bone8","parent":"bone3","length":62.03,"rotation":147.55,"x":54.96,"y":14.64},{"name":"bone9","parent":"bone8","length":60.68,"rotation":31.02,"x":62.03,"y":0.29},{"name":"bone10","parent":"bone9","length":82.09,"rotation":22.38,"x":60.68,"y":-0.28},{"name":"weiba1","parent":"bone","length":137.24,"rotation":-165.01,"x":-2.34,"y":1.16},{"name":"bone11","parent":"weiba1","length":47.48,"rotation":-24.37,"x":51.86,"y":-57.38},{"name":"bone12","parent":"weiba1","length":32.41,"rotation":-52.31,"x":100.31,"y":-46.38},{"name":"bone13","parent":"weiba1","length":26.78,"rotation":-62.99,"x":128.5,"y":-45.26},{"name":"weiba2","parent":"weiba1","length":66.37,"rotation":-27.7,"x":141.22,"y":-0.91},{"name":"bone14","parent":"weiba2","length":21.16,"rotation":-52.56,"x":37.58,"y":-33.74},{"name":"bone26","parent":"weiba2","length":62.39,"rotation":-22.66,"x":67.21},{"name":"bone15","parent":"bone26","length":14.13,"rotation":-64.01,"x":19.07,"y":-26.6},{"name":"bone16","parent":"bone26","length":17.04,"rotation":-111.95,"x":42.55,"y":-24.63},{"name":"weiba3","parent":"bone26","length":56.85,"rotation":-81.13,"x":63.75,"y":-1.25},{"name":"bone17","parent":"weiba3","length":12.36,"rotation":-60.23,"x":32.65,"y":-18.49},{"name":"bone18","parent":"weiba3","length":14.54,"rotation":-48.63,"x":48.15,"y":-18.65},{"name":"weiba4","parent":"weiba3","length":52.76,"rotation":65.44,"x":50.54,"y":-0.9},{"name":"bone19","parent":"weiba4","length":11.04,"rotation":-97.79,"x":-5.44,"y":-20.7},{"name":"bone20","parent":"weiba4","length":9.59,"rotation":-88.32,"x":14.2,"y":-26.57},{"name":"bone21","parent":"weiba4","length":10.62,"rotation":-1.16,"x":40.58,"y":-18.03},{"name":"weiba5","parent":"weiba4","length":50.66,"rotation":65.02,"x":54.11,"y":2.34},{"name":"bone22","parent":"weiba5","length":36.48,"rotation":46.24,"x":41.93,"y":15.26},{"name":"bone23","parent":"weiba5","length":24.3,"rotation":31.92,"x":71.69,"y":8.06},{"name":"bone24","parent":"bone23","length":34.97,"rotation":33.88,"x":25.26,"y":0.07},{"name":"bone25","parent":"weiba5","length":35.92,"rotation":-7.73,"x":78.32,"y":-6.5},{"name":"bozixia","parent":"shenti","length":96.53,"rotation":-54.16,"x":203.63,"y":2.93},{"name":"bozishang","parent":"bozixia","length":62.92,"rotation":-35.23,"x":86.13,"y":3.76},{"name":"chibangL1","parent":"shenti","length":60.7,"rotation":54.67,"x":116.89,"y":-56.72},{"name":"chibangL3","parent":"chibangL1","length":270.66,"rotation":-43.37,"x":56.91,"y":0.22},{"name":"chujiao","parent":"bozishang","length":86.22,"rotation":130.37,"x":25.11,"y":-26.29},{"name":"dabiL","parent":"shenti","length":41.18,"rotation":-165.85,"x":103.87,"y":-47.07},{"name":"xiaobiL","parent":"dabiL","length":62.83,"rotation":46.38,"x":46.85,"y":-1.88},{"name":"jianbang","parent":"shenti","length":25.92,"rotation":112.65,"x":140.03,"y":-0.14},{"name":"dabiR","parent":"jianbang","length":74.82,"rotation":-15.05,"x":24.35,"y":7.44},{"name":"xiaobiR","parent":"dabiR","length":62.25,"rotation":140.33,"x":70.15,"y":-1.98},{"name":"datuiL","parent":"bone","length":65.8,"rotation":-41.71,"x":3.53,"y":-3.53},{"name":"datuiR","parent":"bone","length":76.81,"rotation":-104.57,"x":-40.02,"y":16.48},{"name":"er","parent":"bozishang","length":110.18,"rotation":109.1,"x":46.71,"y":-8.35},{"name":"jiaoL","parent":"root","length":45.47,"rotation":-73.82,"x":42.81,"y":49.74},{"name":"jiaoR","parent":"root","length":63.84,"rotation":-101.43,"x":-53.15,"y":75.74},{"name":"shouL","parent":"xiaobiL","length":44.79,"rotation":15.4,"x":61.41,"y":0.67},{"name":"shouR","parent":"xiaobiR","length":83.18,"rotation":-35,"x":61.96,"y":0.1},{"name":"tou","parent":"bozishang","length":84.76,"rotation":-17.89,"x":55.05,"y":2.61},{"name":"tou1","parent":"tou","length":64.76,"rotation":162.1,"x":14.79,"y":36.22},{"name":"toujiaoL","parent":"tou","length":129.94,"rotation":124.1,"x":70.29,"y":32.52},{"name":"toujiaoR","parent":"tou","length":205.58,"rotation":131.51,"x":41.95,"y":40.46},{"name":"xiaotuiL","parent":"datuiL","length":53.81,"rotation":-141.04,"x":65.75,"y":-1.86},{"name":"xiaotuiR","parent":"datuiR","length":52.5,"rotation":-119.99,"x":75.98,"y":-1.61},{"name":"zui","parent":"bozishang","length":160.13,"rotation":-66.19,"x":57.56,"y":-28.97}],"ik":[{"name":"IK_L","bones":["dabiL","xiaobiL"],"target":"IK_Lhand","mix":0},{"name":"IK_R","bones":["dabiR","xiaobiR"],"target":"IK_Rhand","mix":0}],"slots":[{"name":"tail","bone":"weiba1","attachment":"tail"},{"name":"chibangL2","bone":"chibangL3","attachment":"chibangL2"},{"name":"chibangL1","bone":"chibangL1","attachment":"chibangL1"},{"name":"dabiL","bone":"dabiL","attachment":"dabiL"},{"name":"xiaobiL","bone":"xiaobiL","attachment":"xiaobiL"},{"name":"shouL","bone":"shouL","attachment":"shouL"},{"name":"jiaoL","bone":"jiaoL","attachment":"jiaoL"},{"name":"xiaotuiL","bone":"xiaotuiL","attachment":"xiaotuiL"},{"name":"datuiL","bone":"datuiL","attachment":"datuiL"},{"name":"shenti","bone":"shenti","attachment":"shenti"},{"name":"bozixia","bone":"bozixia","attachment":"bozixia"},{"name":"bozishang","bone":"bozishang","attachment":"bozishang"},{"name":"toujiaoL","bone":"toujiaoL","attachment":"toujiaoL"},{"name":"tou1","bone":"tou1","attachment":"tou1"},{"name":"chujiao","bone":"chujiao","attachment":"chujiao"},{"name":"er","bone":"er","attachment":"er"},{"name":"zui","bone":"zui","attachment":"zui"},{"name":"toujiaoR","bone":"toujiaoR","attachment":"toujiaoR"},{"name":"tou","bone":"tou","attachment":"tou"},{"name":"jiaoR","bone":"jiaoR","attachment":"jiaoR"},{"name":"xiaotuiR","bone":"xiaotuiR","attachment":"xiaotuiR"},{"name":"datuiR","bone":"datuiR","attachment":"datuiR"},{"name":"chibangR2","bone":"bone2","attachment":"chibangR2"},{"name":"chibangR1","bone":"chibangR1","attachment":"chibangR1"},{"name":"jianbang","bone":"jianbang","attachment":"jianbang"},{"name":"dabiR","bone":"dabiR","attachment":"dabiR"},{"name":"xiaobiR","bone":"xiaobiR","attachment":"xiaobiR"},{"name":"shouR","bone":"shouR","attachment":"shouR"},{"name":"author","bone":"root","attachment":"author"}],"skins":{"default":{"author":{"author":{"x":3.27,"y":-61.59,"width":372,"height":56}},"bozishang":{"bozishang":{"type":"mesh","uvs":[0.48093,0.53756,0.40112,0.5215,0.32131,0.48936,0.23024,0.42642,0.15861,0.3983,0.05731,0.37553,0,0.37955,0,0.35678,0.05628,0.32464,0.14838,0.30723,0.26298,0.30188,0.36326,0.31527,0.26503,0.26304,0.17396,0.22287,0.10244,0.2058,0.12893,0.17466,0.24047,0.15457,0.33768,0.1452,0.27117,0.0903,0.19545,0.03807,0.17498,0.022,0.18624,0.00325,0.308,0.00861,0.40112,0.0461,0.52084,0.14118,0.47966,0.09482,0.42635,0.04892,0.35347,0.0021,0.43965,0,0.50889,0.01844,0.57927,0.0456,0.64568,0.10503,0.59247,0.02334,0.61128,0.01626,0.75836,0.11461,0.85,0.19883,0.92963,0.31161,1,0.47063,1,0.81729,0.84241,1,0.79396,1,0.80641,0.80932,0.58408,0.6915,0.43385,0.59966,0.53881,0.40723,0.45097,0.17942,0.61547,0.28392,0.45539,0.36353,0.53383,0.23206,0.56338,0.20534,0.70018,0.17506],"triangles":[19,21,22,20,21,19,28,26,27,18,19,22,29,26,28,25,29,30,25,26,29,34,31,33,33,31,32,24,25,30,24,30,31,23,18,22,45,17,23,17,18,23,50,31,34,24,45,23,49,24,31,49,31,50,13,15,16,14,15,13,48,24,49,45,24,48,12,16,17,13,16,12,46,49,50,48,49,46,11,17,45,12,17,11,47,45,48,44,47,48,11,45,47,5,8,9,7,8,5,6,7,5,4,9,10,5,9,4,46,44,48,3,4,10,11,3,10,2,11,47,2,3,11,1,2,47,0,1,47,44,0,47,37,42,44,0,44,42,43,0,42,50,34,35,46,50,35,46,35,36,37,44,36,36,44,46,41,42,37,41,37,38,39,41,38,40,41,39],"vertices":[-32.75999,58.56,-54.61,69.21,-75.36,83.39,-97.25,105.33,-115.93,117.9,-143.5,131.94,-160.25,136.17,-158.69,141.17,-140.32,143.21,-112.66,138.82,-79.35,129.77,-51.43,117.89,-76.11,138.12,-99.56,155.07,-116.33,165.43,-109.21,169.67,-75.78,164.14,-47.2,157.53,-62.58,175.52,-80.78,193.75,-85.57,199.1,-81.06,202.22,-46.42,190.18,-22.2,173.64,5.72,142.07,-2.56,154.61,-13.58,171.28,-29.06,184.79,-6.71,179.93,10.25,169.43,28.18,158.32,44.08,138.88,34.34999,161.57,40.24,161.45,74.86,125.72,94.14,96.86,105.48,71.37999,121.02,26.96,98.03,-47.12,84.94,-89.31,25.71,-70.94,6.35,-40.46,-24.82,8.64,-50.52,49.12,-7.23,82.01999,-16.95999,139.9,23.2,102.28,-28.24,99.07,3.26,120.95,13.58,124.18,54.97,118.63],"hull":44,"edges":[0,2,2,4,4,6,6,8,8,10,10,12,12,14,14,16,16,18,18,20,20,22,22,24,24,26,26,28,28,30,30,32,32,34,34,36,36,38,38,40,40,42,42,44,44,46,46,48,52,54,54,56,60,62,62,64,64,66,66,68,68,70,70,72,72,74,78,80,0,86,88,0,34,90,88,92,22,94,94,88,2,94,90,96,96,92,94,96,48,98,98,92,96,98,62,100,22,4,20,6,18,8,16,10,32,26,34,24,90,22,44,36,46,34,56,52,60,48,62,98,100,92,68,100,84,86,80,82,82,84,74,76,76,78,48,50,50,52,56,58,58,60,50,58],"width":301,"height":230}},"bozixia":{"bozixia":{"type":"mesh","uvs":[0.43834,0.72029,0.38736,0.79202,0.31233,0.84027,0.26327,0.90026,0.22575,0.99938,0.20747,0.99677,0.2017,0.93939,0.21228,0.82593,0.23922,0.73334,0.27,0.67335,0.30271,0.63422,0.23825,0.68508,0.18727,0.75159,0.14302,0.86114,0.1257,0.85592,0.14206,0.70986,0.18631,0.57815,0.23248,0.51164,0.17476,0.54685,0.10839,0.63813,0.07087,0.74507,0.05644,0.72029,0.07472,0.54815,0.1132,0.45165,0.14783,0.39035,0.18535,0.35514,0.11608,0.40209,0.06895,0.44512,0.0093,0.54293,0,0.54163,0.00546,0.41904,0.05163,0.3121,0.09973,0.23647,0.16514,0.18561,0.20939,0.16474,0.13821,0.17517,0.07087,0.20647,6.5E-4,0.25342,6.5E-4,0.21299,0.04297,0.13866,0.10165,0.08649,0.16611,0.04346,0.24884,0.01607,0.31329,0,0.523,0,0.64806,0.03824,0.76926,0.10475,0.82217,0.15561,1,0.26907,1,0.85462,0.43738,0.77507],"triangles":[34,41,42,40,41,34,35,40,34,39,40,35,36,39,35,38,39,36,37,38,36,25,33,34,32,33,25,31,32,25,25,26,31,30,31,26,27,30,26,43,17,34,25,34,17,24,25,17,23,24,17,28,29,30,27,28,30,18,23,17,22,23,18,42,43,34,44,10,17,16,17,10,19,22,18,10,11,16,11,15,16,22,19,21,20,21,19,43,44,17,45,10,44,46,10,45,47,10,46,0,10,47,12,15,11,0,9,10,0,1,9,1,8,9,0,47,48,2,7,8,1,2,8,0,48,49,50,0,49,15,12,14,13,14,12,3,7,2,6,7,3,4,5,6,3,4,6],"vertices":[-37.2,33.3,-56.4,35.46,-75.83999,45.41,-92.93,48.56,-114.19,44.68,-116.72,48.8,-108.81,56.78,-89.66,67.98,-71.1,73.3,-56.94,73.97,-45.68,71.76,-63.83,79.19999,-82.23,81.98,-106.17,78.26999,-108.14,82.49,-83.05,96.34,-55.69,102.67,-38.06,100.9,-52.73,108.78,-77.4,111.84,-99.87,107.03,-98.37,112.97,-68.94999,129.49,-47.94,132.87,-32.96,132.89,-21.53,129.22,-39.84999,138.12,-54.02,142.87,-78.62999,143.75,-79.92,145.85,-60.18,159.19,-36.33,162.2,-16.98,161.1,1.30999,153.46,11.61,146.7,-1.39,160.32,-16.99,170.66,-35.46,179.77,-29.24,184.54,-11.03,184.5,6.39,178.42,23.34,170.06,40.8,156.04,53.6,144.49,87.19,100.74,101.33,70.14,110.51,37,111.16,19.95,122.18,-30.54,32.08,-99.72,-45.78,27.03],"hull":51,"edges":[0,2,2,4,4,6,6,8,8,10,10,12,12,14,14,16,16,18,18,20,20,22,22,24,24,26,26,28,28,30,30,32,32,34,34,36,36,38,38,40,40,42,42,44,44,46,46,48,48,50,50,52,52,54,54,56,56,58,58,60,60,62,62,64,64,66,66,68,68,70,70,72,72,74,74,76,76,78,78,80,80,82,82,84,84,86,86,88,88,90,90,92,92,94,94,96,96,98,98,100,0,100],"width":263,"height":194}},"chibangL1":{"chibangL1":{"x":31.02,"y":1.53,"rotation":-161.33,"width":95,"height":62}},"chibangL2":{"chibangL2":{"x":130.75,"y":-1.03,"rotation":-117.95,"width":270,"height":273}},"chibangR1":{"chibangR1":{"x":36.43,"y":-7.51,"rotation":160.17,"width":109,"height":73}},"chibangR2":{"chibangR2":{"type":"weightedmesh","uvs":[0,0.40391,0,0.30686,0.08034,0.13778,0.19389,0.08185,0.29847,0.03034,0.43156,0.01273,0.53323,0.08318,0.61885,0.10006,0.69406,0.11488,0.74951,0.09198,0.74397,0.04267,0.72918,0,0.80682,0,0.89185,0.06556,0.91958,0.18357,0.89555,0.24874,0.83187,0.32677,0.7935,0.37379,0.78348,0.49741,0.80703,0.60679,0.83548,0.68339,0.87978,0.71579,0.94623,0.71645,1,0.76561,1,0.85227,0.91325,0.90881,0.84786,0.89993,0.79599,0.92257,0.74027,0.84934,0.62566,0.86343,0.63675,0.94445,0.66448,1,0.60717,1,0.53878,0.93564,0.53844,0.87724,0.53809,0.81754,0.45312,0.68447,0.38621,0.63988,0.36388,0.66957,0.33729,0.70491,0.30217,0.79122,0.2652,0.77889,0.24856,0.69082,0.26704,0.58867,0.33938,0.56399,0.34243,0.44449,0.28362,0.36141,0.19261,0.32872,0.10278,0.32911,0.0489,0.4074,0.03043,0.4918,0,0.49708,0.36241,0.52773,0.433,0.39962,0.47496,0.35601,0.66949,0.25607,0.61799,0.22518,0.54838,0.21519,0.48926,0.15977,0.42633,0.11888,0.34909,0.11525,0.23848,0.16885,0.1641,0.22246,0.41554,0.55583,0.47253,0.42184,0.50378,0.38506,0.59017,0.33427,0.68301,0.30449,0.70415,0.30975,0.68301,0.32814,0.63797,0.34741,0.59845,0.41221,0.55341,0.45162,0.51297,0.63553,0.59891,0.7905,0.57481,0.6385,0.61728,0.47885,0.63334,0.43073,0.66892,0.38262,0.7045,0.36293,0.66663,0.50618,0.72172,0.67896,0.72172,0.7227,0.75615,0.74676,0.7814,0.78175,0.77566,0.81893,0.5719,0.30621,0.70483,0.626,0.40205,0.21656,0.31258,0.32028,0.4397,0.28856,0.37562,0.36182,0.22996,0.26585,0.37465,0.16413,0.29613,0.21933,0.352,0.27459,0.40862,0.32409,0.55931,0.40099,0.51935,0.43908,0.47455,0.6041],"triangles":[32,30,31,32,33,30,33,29,30,33,34,29,34,35,29,35,74,29,29,74,28,74,35,73,74,73,75,36,73,35,81,74,75,36,99,73,72,73,99,73,72,75,76,75,72,99,98,72,72,71,76,72,98,97,80,78,79,80,77,78,76,71,77,72,97,71,77,71,78,71,70,78,71,97,70,78,69,79,78,70,69,69,68,79,17,79,68,69,70,67,69,67,68,98,65,97,65,64,54,97,66,70,97,65,66,65,86,66,65,54,86,96,90,54,54,90,86,67,70,66,67,66,55,90,57,86,66,86,55,86,56,55,55,68,67,40,41,39,41,42,39,39,42,38,42,43,38,36,37,99,43,44,38,38,44,37,37,44,63,37,63,99,63,44,52,99,63,98,98,63,64,44,45,52,63,52,64,52,53,64,52,45,53,45,46,91,45,91,53,91,46,89,64,65,98,91,96,53,64,53,54,53,96,54,96,91,95,91,89,95,96,95,90,95,88,90,51,0,50,50,0,49,48,49,1,49,0,1,89,46,92,47,48,62,48,1,62,46,47,92,47,62,92,92,94,89,89,94,95,1,2,62,95,94,88,92,61,94,92,62,61,62,3,61,62,2,3,94,93,88,94,60,93,94,61,60,88,59,58,88,93,59,61,4,60,61,3,4,93,60,59,59,5,6,59,60,5,60,4,5,86,57,56,90,58,57,90,88,58,55,56,8,56,7,8,56,57,7,58,6,57,57,6,7,58,59,6,75,76,80,87,80,18,18,80,79,76,77,80,18,79,17,16,17,68,9,15,16,55,16,68,9,16,55,55,8,9,15,9,14,14,9,13,9,12,13,9,10,12,10,11,12,28,85,27,27,85,26,24,25,21,23,24,21,21,25,26,85,84,26,26,84,21,21,22,23,74,82,28,28,83,85,28,82,83,85,83,84,82,74,81,84,20,21,84,83,20,20,83,81,81,75,87,83,82,81,81,19,20,81,87,19,75,80,87,87,18,19],"vertices":[1,9,174.14,48.06,1,1,9,160.71,18.02,1,1,9,113.63,-23.71,1,1,9,72.41,-26.05,1,1,9,34.45,-28.21,1,1,9,-7.22,-16.12,1,2,6,300.89,21.22,0.00799,8,90.75,-8.74,0.992,3,6,287.95,-3.86,0.00374,7,126.81,58.24,0.00425,8,63.39,-15.73,0.992,3,6,276.58,-25.9,0,7,126.47,33.43999,0.00799,8,39.36,-21.87,0.992,1,7,137.48,17.32,1,1,7,153.56,22.24,1,1,7,166.86,29.67,1,1,7,171.6,5.04,1,1,7,154.97,-26.12,1,1,7,117.38,-42.48,1,1,7,94.22,-39.03,1,1,7,65.35,-29.03,1,1,7,47.96,-23.01,1,1,7,1.78,-29.47,1,1,6,106.6,-27.34,1,1,6,83.89,-27.9,1,1,6,70.94,-39.78,1,1,6,60.57,-49.29,1,1,6,48.2,-64.74,1,1,6,-0.09,-51.26,1,1,6,-7.16,-21.08,1,1,6,-5.88,10.16,1,1,6,7.11,30.08,1,1,6,32.8,26.63,1,1,14,79.25,14.9,1,1,14,106.92,13.63,1,1,14,127.03,19.15,1,1,14,123.79,0.93,1,1,14,98.44,-17,1,1,14,75.37,-13.01,1,1,14,51.79,-8.93999,1,2,11,105.6,44.06,0.51049,14,17.04,-33.18,0.4895,1,11,98.14,18.54999,1,1,11,108.85,16.02,1,1,11,121.6,13.02,1,1,11,152.71,17.14,1,1,11,154.78,4.66,1,1,11,131.19,-14.39,1,1,11,97.96,-25.81,1,1,11,75.82,-12.75,1,1,11,58.86,-32.11,1,2,9,102.06,79.32,0.51199,11,45.98,-63.09,0.488,1,9,124.63,54.31,1,1,9,142.15,45.94,1,1,9,163.15,60.75,1,1,9,177.32,79.26999,1,1,9,187.02,76.89,1,1,11,64.87999,-8.45,1,1,11,16,-9.62,1,1,10,79.5,-6.31,1,1,10,8.16,-8.93999,1,2,8,45.03,22.5,0.992,10,18.45,-25.68,0.00799,4,8,66.72,29.32,0.992,9,-13.67,61.93,3.9E-4,11,-56.73,-7.01,4.2E-4,10,37.13,-38.66,0.00718,4,8,92.12,20.81,0.992,9,-3.9,36.98,5.1E-4,11,-64.03,-32.79,4.7E-4,10,45.95,-63.95,0.007,1,9,8.99,16.03,1,1,9,31.27,4.73,1,1,9,71.3,6.74,1,1,9,100.65,13.53,1,1,11,65.14,10.88,1,1,11,16.45999,5.17999,1,1,10,75.5,6.62,1,1,10,42.85,3.51,1,1,10,11.5,7.7,1,1,12,-4.44999,-6.52,1,1,12,4.76,-7.2,1,1,12,19.49,-13.3,1,1,12,44.23,-7.51,1,1,13,-3.12,-8.88,1,1,14,-3.17,-7.41,1,1,14,53.4,10.72,1,1,14,1.29999,12.07,1,1,13,1.49,13.24,1,1,12,41.06,4.98999,1,1,12,21.31,2.15,1,1,12,8.57,5.93,1,1,7,-5.45,17.06,1,1,6,90.03,16.87999,1,1,6,75.75,20.86,1,1,6,64.91,12.35,1,1,6,51.29,7.68,1,1,6,39.65,12.85,1,1,10,43.95,-7.62,1,1,6,108.78,17.31,1,2,9,29.66,43.06,0.51199,11,-33.59999,-48.23,0.488,2,9,70.39,63.38,0.51199,11,11.12,-56.66,0.488,2,11,-18.04999,-25.83,0.48,10,79.61,-31.86,0.51999,1,11,13.67,-32.04,1,1,9,87.23,35.64,1,1,9,30.49,23.23,1,1,9,61.28,29.96,1,2,9,52.45,54.43,0.51199,11,-8.58,-52.94,0.488,1,11,-2.66,-28.84,1,2,10,61.79,19.39,0.50399,12,50.14,-19.31,0.496,2,11,14.31,21.25,0.54103,13,-4.92,-20.53,0.45896,2,11,70.32,35.46,0.53831,14,-15.83,-17.76,0.46168],"hull":52,"edges":[2,4,8,10,10,12,16,18,18,20,20,22,22,24,24,26,26,28,28,30,34,36,44,46,46,48,48,50,50,52,52,54,54,56,58,60,60,62,62,64,64,66,78,80,80,82,82,84,84,86,86,88,96,98,98,100,100,102,88,104,104,106,106,108,110,112,112,114,114,116,116,118,118,120,120,122,122,124,74,126,126,128,128,130,130,132,132,134,134,136,136,138,138,140,140,142,142,144,144,146,146,70,58,148,148,150,150,152,152,154,154,156,156,158,158,160,162,164,164,166,166,168,168,170,170,56,106,128,108,130,144,152,142,154,140,156,138,158,146,150,70,148,108,172,172,110,132,172,152,160,160,174,174,162,150,174,36,38,38,40,174,38,40,42,42,44,56,58,124,96,2,0,0,102,98,0,96,2,124,4,4,6,6,8,122,6,120,8,118,10,116,12,12,14,14,16,114,14,112,16,20,24,18,26,104,126,88,74,84,78,74,76,76,78,86,76,160,36,158,34,110,134,162,40,66,60,66,68,68,70,58,68,132,140,166,40,168,42,30,32,32,34,136,32,18,110,18,32,116,176,178,92,108,180,180,176,114,180,106,182,182,178,88,90,90,92,182,90,92,94,94,96,124,184,184,178,94,184,120,186,186,176,186,118,184,188,188,186,122,188,176,190,190,178,188,190,180,192,192,182,190,192,192,106,104,90,130,194,194,142,140,194,128,196,196,144,194,196,126,198,198,146,196,198,70,72,72,74,198,72],"width":323,"height":339}},"chujiao":{"chujiao":{"x":47,"y":-3.97,"rotation":-147.63,"width":106,"height":112}},"dabiL":{"dabiL":{"x":20.03,"y":-0.15,"rotation":59.19,"width":62,"height":68}},"dabiR":{"dabiR":{"x":22.26,"y":-1.51,"rotation":155.67,"width":87,"height":55}},"datuiL":{"datuiL":{"x":39.21,"y":-0.64,"rotation":42.65,"width":85,"height":68}},"datuiR":{"datuiR":{"x":40.73,"y":-3.12,"rotation":104.98,"width":86,"height":113}},"er":{"er":{"x":44.31,"y":-0.49,"rotation":-126.36,"width":118,"height":122}},"jianbang":{"jianbang":{"x":12.5,"y":-0.58,"rotation":140.69,"width":119,"height":100}},"jiaoL":{"jiaoL":{"x":34.66,"y":23.29,"rotation":70.67,"width":97,"height":69}},"jiaoR":{"jiaoR":{"x":49.85,"y":-10.76,"rotation":95.27,"width":91,"height":105}},"shenti":{"shenti":{"x":104.83,"y":-6.26,"rotation":-106.65,"width":239,"height":267}},"shouL":{"shouL":{"x":19.15,"y":-2,"rotation":-2.59,"width":75,"height":76}},"shouR":{"shouR":{"x":54.61,"y":0.78,"rotation":50.26,"width":94,"height":103}},"tail":{"tail":{"type":"weightedmesh","uvs":[0.43539,0.33299,0.43522,0.3471,0.4213,0.39349,0.39882,0.41862,0.41694,0.43746,0.38942,0.4728,0.4166,0.45945,0.41703,0.47413,0.4005,0.52621,0.40251,0.54034,0.42969,0.49008,0.45689,0.57742,0.47432,0.57647,0.47947,0.50202,0.48459,0.49678,0.54054,0.54915,0.52338,0.47222,0.52858,0.46292,0.56841,0.5017,0.59526,0.52553,0.56554,0.43593,0.57797,0.41652,0.6303,0.46773,0.68056,0.46622,0.61975,0.3858,0.62545,0.36614,0.72072,0.33266,0.83533,0.17391,0.88595,0.20616,0.95813,0.25213,0.99027,0.49033,0.97526,0.71846,0.89142,0.89232,0.78614,0.96143,0.63256,0.98798,0.53772,0.97332,0.41793,0.91358,0.33172,0.77172,0.30164,0.72222,0.25737,0.58129,0.28533,0.42438,0.30898,0.34513,0.31877,0.31231,0.31899,0.28185,0.31919,0.25456,0.30332,0.20368,0.27631,0.18235,0.24022,0.26417,0.20599,0.31054,0.18139,0.36444,0.15605,0.42458,0.15408,0.35797,0.1572,0.29262,0.12609,0.34472,0.09616,0.4578,0.07752,0.5715,0.06497,0.56479,0.06636,0.44341,0.06488,0.30863,0.07912,0.23668,0.04888,0.21829,0.00791,0.19157,0.05127,0.16139,0.10835,0.09246,0.09703,0.05932,0.10924,0.05193,0.15055,0.06843,0.20215,0.03444,0.27482,0.03871,0.30202,0.05475,0.32498,0.08432,0.31017,0.03019,0.31644,0.02207,0.34738,0.07369,0.38485,0.13341,0.41115,0.13059,0.41056,0.16676,0.41023,0.21993,0.43351,0.24353,0.41838,0.30444,0.53966,0.68156,0.60656,0.66559,0.70628,0.58685,0.77236,0.41092,0.44944,0.64165,0.38786,0.58822,0.37811,0.57059,0.35845,0.52574,0.39259,0.30939,0.38471,0.19457,0.33571,0.10632,0.12584,0.19016,0.173,0.159,0.19242,0.19536,0.59887,0.57023,0.68725,0.49763,0.73088,0.34806,0.54028,0.58806,0.45324,0.6089,0.39449,0.56657,0.38757,0.55183,0.37112,0.5174,0.3721,0.48119,0.38482,0.40768,0.40232,0.30752,0.3929,0.49539,0.39343,0.24347,0.39978,0.23942,0.39544,0.18303,0.38089,0.16245,0.37796,0.4021,0.36319,0.4812,0.40946,0.35652,0.39355,0.35769,0.38542,0.35479],"triangles":[73,70,71,71,72,73,82,95,83,95,19,23,83,95,96,26,96,23,95,23,96,25,26,24,23,24,26,83,28,29,83,96,28,28,26,27,28,96,26,15,19,94,95,94,19,19,22,23,22,19,20,20,21,22,97,94,81,97,15,94,97,12,15,15,18,19,15,16,18,16,17,18,15,13,14,15,12,13,98,12,97,98,11,12,11,98,99,11,99,9,10,11,9,100,8,9,100,101,8,101,105,8,101,102,105,101,111,102,102,5,105,8,105,7,105,5,7,102,103,5,5,6,7,5,103,3,4,5,3,103,112,3,112,2,3,103,110,113,112,103,113,2,112,1,104,112,113,113,114,88,113,88,104,1,112,0,79,0,112,79,112,104,107,78,79,104,107,79,107,104,106,107,77,78,106,89,107,77,107,108,107,89,108,77,108,76,108,109,76,109,74,76,76,74,75,63,91,59,59,60,62,60,61,62,63,59,62,63,65,66,63,64,65,55,56,54,56,57,54,57,53,54,57,58,53,53,58,52,58,59,52,59,91,52,50,51,49,49,51,48,51,52,48,48,52,47,52,93,47,52,91,93,47,93,46,91,92,93,68,46,67,67,46,93,93,92,67,92,91,63,46,68,69,63,66,92,92,66,67,42,43,88,43,44,106,44,89,106,44,45,89,89,45,90,89,90,109,89,109,108,90,45,46,46,70,90,46,69,70,109,90,74,74,90,73,90,70,73,110,114,113,103,102,111,103,111,110,87,40,111,39,40,87,40,41,110,41,42,114,104,88,106,106,88,43,110,111,40,110,41,114,87,111,101,114,42,88,87,101,100,86,87,100,86,100,99,99,98,85,84,37,85,37,38,85,86,38,39,86,85,38,85,86,99,99,100,9,39,87,86,84,36,37,97,84,98,84,80,36,34,35,80,35,36,80,80,84,97,84,85,98,80,97,81,81,94,82,33,34,81,80,81,34,32,33,82,33,81,82,32,82,31,30,31,83,83,31,82,83,29,30,94,95,82],"vertices":[1,26,18.9,2.07,1,1,26,18.12999,-0.5,1,2,26,9.82,-7.46,0.86422,25,18.95999,8.04,0.13576,2,26,-1.12,-9.5,0.19289,25,8.64,3.84,0.8071,1,25,16.52,-0.22,1,2,25,3.84,-6.24,0.18894,23,8.18,4.44,0.81105,1,23,19.78,0,1,3,25,16.15,-7.22,0.01096,23,18.42,-2.45,0.98779,22,19.03,6.64,0.00124,3,21,33.68,-28.41,0.0211,23,6.82,-6.81,0.73113,22,8.02,12.33,0.24775,3,21,31.39,-26.72,0.05835,23,6.11,-9.57,0.50368,22,5.5,11.01,0.43796,1,22,16.94,0.56,1,3,19,60.62,-35.15,0.02092,22,2.43,-14.12,0.78367,20,15.12,17.44,0.19539,3,19,53.05,-37.03,0.03313,22,3.86,-21.79,0.30362,20,12.01,10.29,0.66323,4,15,165.08,-71.47,0,21,7.51,-52.57,0,20,23.96,2.23,0.98965,18,39.97,20.68,0.01034,3,15,162.61,-71.83999,0,21,6.22,-54.71,0,20,23.91,-0.26,0.99999,2,20,4.32,-18.76,0.21424,18,14.99,6.45,0.78575,4,15,144.65,-71.87,1.0E-5,19,36,-61.25,1.6E-4,18,31.04,2.29,0.99845,17,47.28,19.49,0.00136,3,15,141.94,-72.98,0,19,34.12,-63.49,2.0E-5,18,30.8,-0.61,0.99996,2,18,13.36,-8.87,0.93322,17,27.84,11.79,0.06677,3,15,116.27,-53.69,1.6E-4,18,1.94,-14.72,0.28786,17,15.53,8.16,0.71197,2,15,124.65,-73.66,1.0E-4,17,36.47,2.57,0.99989,2,15,118.32,-75.8,1.0E-5,17,34.29,-3.74,0.99998,2,17,9.74,-10.1,0.98468,16,43.48,16.5,0.01531,3,15,76.51,-54.72,0.03447,17,-7.96,-23.93,0.29275,16,21.35,12.59,0.67277,3,15,98.76,-76.61,1.0E-5,17,22.97,-19.70999,1.3E-4,16,50.67,1.82,0.99985,1,16,48.76,-2.29,1,1,16,7.76,-15.48,1,2,15,-4.8,-90.65,0.25929,16,-37.9,-53.69,0.7407,2,15,-25.05,-78.82,0.38649,16,-61.23,-51.27,0.6135,2,15,-53.92,-61.96,0.56992,16,-94.49,-47.81,0.43007,2,15,-55.97,-14.29,0.84896,16,-116.02,-5.23,0.15103,3,15,-38.16999,26.03,0.99936,20,-106.63,-181.62,0,16,-116.44,38.84999,6.3E-4,3,15,6.64,48.35,0.99999,20,-121.04,-133.64,0,16,-84.82,77.68,0,3,15,55.51,48.87,0.99999,20,-113.27,-85.37,0,16,-40.5,98.32,0,2,15,123.12,35.93,0.83565,19,-33.14,24.22,0.16434,1,19,8.83,30.75,1,1,19,63.59,31.31,1,4,15,242.24,-38.89,6.0E-5,19,107.12,13.29,0.02908,21,31.71,27.64,0.97085,18,46,104.23,0,4,15,252.77,-51.52,2.0E-5,21,48.15,27.68,0.93617,24,-31,-10.95,0.0638,18,62.03,107.87,0,1,21,79.86,17.12,1,1,24,16.73,20.87,1,2,24,34.99,18.12999,0.74658,27,10.85,22.04,0.25341,2,24,42.56,17,0.50258,27,12.96,14.69,0.49741,3,24,47.81,19.5,0.33702,27,17.42,10.95,0.66297,25,-25.45,32.03,0,3,24,52.52,21.74,0.21685,27,21.41,7.6,0.78314,25,-25.06,37.23,0,3,27,33.43,6.98,0.86154,31,-4.52,20.7,0.12647,32,-28.2,37.31,0.01198,3,27,44.21,13.8,0.4182,31,6.2,13.81,0.48472,32,-25.76,24.8,0.09707,3,27,42.23,36.18,0.02573,31,25.65,25.04,0.3134,32,-4.19,18.52,0.66085,1,32,11.08,9.60999,1,5,27,43.93,68.67,0,31,55.83,37.23,4.0E-5,32,25.47,5.16,0.99995,29,-94.34,32.5,0,25,-87.81,19.89,0,3,32,41.07,1,1,29,-110.42,31.18,0,25,-99.8,9.09,0,6,32,30.45,-6.05,0.98231,33,9.54,23.5,0.01748,34,0,28.21,5.0E-5,35,-16.17,37.74,1.4E-4,29,-102.79,41.4,0,25,-99.93,21.84,0,4,32,18.91,-11.03,0.50422,33,-0.4,15.83,0.48779,34,-12.52,27.38,0.00796,25,-97.81,34.23,0,5,32,34.45,-18.18,0.06208,33,16.42,12.74,0.7257,34,-0.28,15.44,0.21221,29,-110.62,51.49,0,25,-112.28,25.11,0,3,34,23.34,6.07,1,29,-134.86,43.85,0,25,-126.91,4.32,0,3,34,46.19,1.69,1,29,-155.35,32.82,0,25,-136.51,-16.87,0,5,32,84.51,-21.11,1.0E-5,33,65.65,22.29,5.0E-5,34,45.92,-4.06,0.99993,29,-158.77,37.46,0,25,-142.04,-15.26,0,3,34,22.98,-7.52,1,29,-143.17,54.63,0,25,-140.06,7.85,0,5,33,30.47,-11.73,0.34676,34,-2.25,-12.71,0.5478,35,22.43,23.96,0.10542,29,-126.86,74.57,0,25,-139.2,33.59999,0,4,33,16.16,-16.7,0.29248,34,-16.9,-8.85999,0.05717,35,14.58,11,0.65033,25,-132.04,46.95,0,6,31,106.51,-4.26,2.0E-4,32,30.56,-60.14,0,33,23.03,-28.87,0.00206,35,27.63,6.01,0.99773,29,-121.02,92.32,0,25,-145.33,51.26,0,3,34,-19.78,-41.72,1.4E-4,35,45.27,-1.08,0.99985,25,-163.32,57.43,0,2,35,25.36,-4.67,1,25,-143.63,62.05,0,5,31,74.87,-21.11,0.13544,32,-3.49,-48.94,0.00137,35,-1.46,-14.93,0.86317,29,-85.18,93.19,1.0E-5,25,-117.37,73.69999,0,5,31,78.24,-28.48,0.14617,32,-6.49,-56.48,0.00151,35,2.86,-21.79,0.85229,29,-84.89,101.29,1.0E-5,25,-122.05,80.32,0,5,31,72.6,-28.53,0.15994,32,-10.42,-52.43,0.00145,35,-2.71,-22.59,0.83858,29,-79.83,98.8,1.0E-5,25,-116.52,81.41,0,5,31,55.45,-20.96999,0.63112,33,-29.14,-16.06,0.06527,35,-20.71999,-17.41,0.30352,29,-67.89,84.36,5.0E-5,25,-98.26,77.17,0,4,31,31.49,-21.66,0.99317,35,-44.37,-21.31,0.00639,29,-46.16,74.22,4.3E-4,25,-74.83999,82.3,0,3,27,65.94,-2.97,0.28793,31,0.16,-12.97,0.71206,25,-42.44,79.57,0,3,27,55.67,-9.47,0.69421,31,-10.05,-6.4,0.30578,25,-31.17,75.01999,0,1,27,47.94,-14.35,1,1,30,16.62,2.08,1,1,30,16.12,-1.07,1,1,30,-0.15,-5.93,1,1,29,3.4,6.59,1,3,24,92.02,-4.56,2.4E-4,29,12.66,-0.67,0.99975,25,17.37999,58.46,0,3,29,7.95,-5.73,0.87183,28,11.94,15.91,0.12816,25,16.70999,51.58,0,3,24,76.55,-11.78,0.01222,29,1.21,-13.33,0.04525,28,6.54,7.3,0.94252,2,28,13.09,-1.95,0.99999,25,26.09,36.33,0,3,27,-13.92,-20.84,9.0E-4,28,1.27,-8.38,0.60508,26,12.96,9.31,0.39401,1,19,20.16,-23.81,1,1,15,118.34,-26.54,1,1,15,71.39,-29.48,1,2,15,34.13,-54.25,0.08198,16,-17.43,-4.46,0.91801,1,19,61.19,-22.44,1,1,21,31.45,-15.47,1,1,21,36.96,-15.7,1,1,24,13.92,-17.02,1,4,24,57.73,-12.31,0.16985,27,-7.39,-11.28,0.09623,28,-9.07,-3.2,0.32506,26,1.57,11.37,0.40884,1,27,11.86,-22.37,1,1,27,39.04,-16.26,1,4,31,71.82,-1.1,0.36321,33,-4.73,-7.85,0.37803,35,-7.16,4.48,0.25874,25,-110.66,54.6,0,1,31,49.92,-1.75,1,3,31,43.18,7.09,0.69398,32,-5.03,-6.55,0.30598,29,-69.51999,53.76,2.0E-5,3,15,116.93,-45.02,1.6E-4,18,-5.47,-10.2,0.28786,17,9.08,13.98,0.71197,3,15,75.17,-48.15,0.03447,17,-13.98,-20.95999,0.29275,16,17.43,18.02,0.67277,1,16,2.8,-13.31,1,2,20,-2.36999,-15.54,0.21424,18,9.55,11.52,0.78575,3,19,60.9,-28.92,0.02092,22,-3.76,-13.48,0.78367,20,10.35,21.45,0.19539,1,21,31.42,-20.56,1,1,21,35.57,-21.07,1,1,23,-3.3,1.71,1,1,23,0.8,7.29,1,2,26,-6.63,-5.86,0.19289,25,2.51,6.29,0.8071,4,24,59.98,-16.04999,0.16985,27,-9.85,-14.89,0.09623,28,-5.16,-5.16,0.32506,26,5.87,10.59,0.40884,1,23,7.15,-0.02,1,3,24,69.18,-7.05,0.57899,29,-7.41,-11.84,0.17047,28,-2.21,7.36,0.25053,3,24,71.12999,-9.25,0.01222,29,-4.75,-13.11,0.04525,28,0.61,6.54,0.94252,1,29,0.8,-3.68,1,1,27,17.7,-24.91,1,1,24,38.95,-14.33,1,1,24,22.48,-15.13,1,1,26,6.53,0.72,1,1,26,-0.39,2.34999,1,1,24,48.54,-13.3,1],"hull":80,"edges":[88,90,90,92,48,46,66,68,40,42,42,44,44,46,48,50,50,52,52,54,34,36,36,38,32,34,32,30,68,70,70,72,40,38,26,28,24,22,20,18,18,16,16,14,14,12,12,10,10,8,8,6,6,4,4,2,2,0,158,156,156,154,154,152,152,150,150,148,148,146,146,144,142,144,142,140,92,136,136,134,134,132,128,126,126,124,124,122,122,120,120,118,118,116,116,114,114,112,112,110,110,108,108,106,106,104,158,0,64,66,64,62,58,60,62,60,28,30,24,26,20,22,114,108,116,106,104,96,72,74,74,76,76,78,160,70,162,68,160,162,164,66,162,164,166,62,164,166,54,56,56,58,166,56,168,72,160,168,170,74,168,170,172,76,170,172,174,78,172,174,84,176,88,178,90,180,180,146,178,180,180,140,124,120,128,130,130,132,96,98,98,100,100,102,102,104,98,102,92,94,94,96,118,104,126,132,126,118,78,80,118,182,182,184,184,186,186,104,186,94,184,132,186,134,186,92,38,188,188,162,46,190,190,164,188,190,52,192,192,166,190,192,52,46,46,38,38,30,30,24,30,194,194,160,188,194,22,196,196,168,194,196,18,198,198,170,196,198,16,200,200,172,198,200,202,174,200,202,202,204,204,206,158,208,208,176,10,204,6,206,22,18,14,210,210,202,16,210,210,10,6,10,176,212,212,178,84,86,86,88,212,86,154,214,214,212,208,214,152,216,216,178,214,216,216,218,218,180,148,218,218,178,206,220,80,82,82,84,220,82,174,222,222,220,204,222,222,80,6,224,224,158,2,224,206,226,226,208,224,226,176,228,228,220,226,228,136,138,138,140],"width":447,"height":191}},"tou":{"tou":{"type":"mesh","uvs":[1,1,0,1,0,0,1,0,0.30764,0.29612,0.37783,0.28012,0.47868,0.29745,0.53596,0.36345,0.58357,0.42145,0.58921,0.48945,0.60616,0.55745,0.51499,0.56812,0.40445,0.52745,0.34717,0.47879,0.33587,0.38612,0.31369,0.31542,0.41575,0.33012,0.49724,0.35812,0.54161,0.39145,0.57227,0.44812,0.57711,0.52745,0.57066,0.55079],"triangles":[5,2,3,4,2,5,6,5,3,15,4,5,16,5,6,15,5,16,7,17,6,16,6,17,3,7,6,14,15,16,8,18,7,17,7,18,3,8,7,19,18,8,13,14,16,9,8,3,19,8,9,17,12,13,17,13,16,12,17,18,12,18,19,19,11,12,9,20,19,19,20,11,10,9,3,20,9,10,21,20,10,21,11,20,11,21,10,15,1,2,15,2,4,13,1,15,13,15,14,1,13,12,10,3,0,11,10,0,1,12,11,0,1,11],"vertices":[168.1,-156.16,-7.88,-158.1,-10.22,54.88,165.76,56.82,44.6,-7.58,56.92,-4.04,74.71,-7.54,84.95,-21.48,93.46,-33.74,94.61,-48.22,97.75,-62.67,81.73,-65.11,62.19,-56.67,51.99,-46.41,49.78,-26.7,45.72,-11.68,63.71,-14.62,78.12,-20.42,86,-27.44,91.53,-39.45,92.57,-56.33,91.49,-61.32],"hull":4,"edges":[0,2,2,4,4,6,0,6,8,10,10,12,12,14,14,16,16,18,18,20,20,22,22,24,24,26,26,28,8,30,30,28,30,32,32,34,34,36,36,38,38,40,40,42],"width":176,"height":213}},"tou1":{"tou1":{"x":26.8,"y":-0.45,"rotation":-161.47,"width":71,"height":46}},"toujiaoL":{"toujiaoL":{"x":57.58,"y":2.34,"rotation":-134.25,"width":107,"height":153}},"toujiaoR":{"toujiaoR":{"x":101.02,"y":9.72,"rotation":-140.32,"width":200,"height":156}},"xiaobiL":{"xiaobiL":{"x":26.27,"y":-3.85,"rotation":12.81,"width":104,"height":45}},"xiaobiR":{"xiaobiR":{"x":19.01,"y":-3.84,"rotation":15.26,"width":122,"height":61}},"xiaotuiL":{"xiaotuiL":{"x":19.79,"y":1.04,"rotation":-170.08,"width":67,"height":31}},"xiaotuiR":{"xiaotuiR":{"x":16.5,"y":-0.4,"rotation":-132.48,"width":61,"height":65}},"zui":{"zui":{"x":69.9,"y":-4.34,"rotation":48.94,"width":186,"height":140}}}},"animations":{"stand":{"bones":{"bone":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-1.73},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0},{"time":0.2666,"x":7.11,"y":10.67},{"time":0.5,"x":0,"y":20.01},{"time":0.7666,"x":-8.54,"y":9.33},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"jiaoL":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"jiaoR":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"datuiL":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-7.4},{"time":0.5,"angle":-0.78},{"time":0.7666,"angle":9.84},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"datuiR":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":1.61},{"time":0.5,"angle":10.44},{"time":0.7666,"angle":11.68},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"shenti":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"weiba1":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-1.36},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bozixia":{"rotate":[{"time":0,"angle":0},{"time":0.2333,"angle":-0.58},{"time":0.5,"angle":3.22},{"time":0.7333,"angle":3.12},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chibangR1":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":-8.28},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"dabiL":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-9.16},{"time":0.5,"angle":-0.28},{"time":0.7666,"angle":5.24},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"jianbang":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"weiba2":{"rotate":[{"time":0,"angle":0.09},{"time":0.0666,"angle":1.97},{"time":0.5666,"angle":-2.22},{"time":1,"angle":0.09}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.0666,"x":0,"y":0,"curve":"stepped"},{"time":0.5666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.0666,"x":1,"y":1,"curve":"stepped"},{"time":0.5666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"xiaotuiL":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":12.32},{"time":0.5,"angle":21.51},{"time":0.7666,"angle":9.22},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"xiaotuiR":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":14.51},{"time":0.5,"angle":15.92},{"time":0.7666,"angle":-0.55},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bozishang":{"rotate":[{"time":0,"angle":0},{"time":0.2333,"angle":-1.16},{"time":0.5,"angle":1.98},{"time":0.7333,"angle":2.46},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"dabiR":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":13.11},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"weiba3":{"rotate":[{"time":0,"angle":0.6},{"time":0.2,"angle":3.95},{"time":0.7,"angle":0.03},{"time":1,"angle":0.6}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.2,"x":0,"y":0,"curve":"stepped"},{"time":0.7,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.2,"x":1,"y":1,"curve":"stepped"},{"time":0.7,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"xiaobiL":{"rotate":[{"time":0,"angle":0},{"time":0.2333,"angle":-0.38},{"time":0.5,"angle":-6.49},{"time":0.7666,"angle":-2.52},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chujiao":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"er":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"shouL":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":5.73},{"time":0.5,"angle":-4.28},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tou":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"weiba4":{"rotate":[{"time":0,"angle":-1.6},{"time":0.2666,"angle":5.94},{"time":0.7666,"angle":-8.21},{"time":1,"angle":-1.6}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.2666,"x":0,"y":0,"curve":"stepped"},{"time":0.7666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.2666,"x":1,"y":1,"curve":"stepped"},{"time":0.7666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"xiaobiR":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-14.43},{"time":0.5,"angle":-13.08},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"zui":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.1666,"angle":0},{"time":0.5,"angle":-5.24},{"time":0.8333,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.1666,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":0.8333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.1666,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":0.8333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"shouR":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":3.32},{"time":0.5,"angle":-3.46},{"time":0.7333,"angle":6.13},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"toujiaoL":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":3.57},{"time":0.5,"angle":0},{"time":0.7666,"angle":-2.7},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"toujiaoR":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":3.48},{"time":0.5,"angle":0},{"time":0.7666,"angle":-0.5},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"weiba5":{"rotate":[{"time":0,"angle":-1.51},{"time":0.3333,"angle":7.93},{"time":0.8333,"angle":-6.23},{"time":1,"angle":-1.51}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.8333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.8333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chibangL1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"chibangL3":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"tou1":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":0.5,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone2":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone3":{"rotate":[{"time":0,"angle":0,"curve":"stepped"},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone4":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":20.19},{"time":0.7666,"angle":12.57},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone5":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-11.08},{"time":0.5,"angle":-5.23},{"time":0.7666,"angle":6.26},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone6":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":18.2},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone7":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-6.66},{"time":0.5,"angle":0},{"time":0.7666,"angle":6.77},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone8":{"rotate":[{"time":0,"angle":0},{"time":0.5,"angle":9.19},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone9":{"rotate":[{"time":0,"angle":0},{"time":0.2666,"angle":-7.35},{"time":0.5,"angle":0},{"time":0.7666,"angle":3.63},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.5,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.5,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone10":{"rotate":[{"time":0,"angle":0},{"time":0.1666,"angle":-2.78},{"time":0.3333,"angle":-7.66},{"time":0.5,"angle":-6.46},{"time":0.7,"angle":1.1},{"time":0.8333,"angle":1.23},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone23":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":7.19},{"time":0.7333,"angle":1.21},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.7333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.7333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone24":{"rotate":[{"time":0,"angle":0},{"time":0.2,"angle":9},{"time":0.4666,"angle":3.11},{"time":0.7666,"angle":-21.64},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.2,"x":0,"y":0,"curve":"stepped"},{"time":0.4666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.2,"x":1,"y":1,"curve":"stepped"},{"time":0.4666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone25":{"rotate":[{"time":0,"angle":0},{"time":0.2333,"angle":18.5},{"time":0.4333,"angle":12.09},{"time":0.8333,"angle":0.1},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.4333,"x":0,"y":0,"curve":"stepped"},{"time":0.8333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.4333,"x":1,"y":1,"curve":"stepped"},{"time":0.8333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone22":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":3.46},{"time":0.8333,"angle":-12.88},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.8333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.8333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone21":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":-21.8},{"time":0.6666,"angle":18.27},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone20":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":-14.4},{"time":0.6666,"angle":31.8},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone19":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":17.43},{"time":0.6666,"angle":-38.51},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone18":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":24.63},{"time":0.6666,"angle":-19.23},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone17":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":39.99},{"time":0.6666,"angle":-16.69},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone16":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":17.8},{"time":0.6666,"angle":-32.46},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone15":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":12.56},{"time":0.6666,"angle":-22.2},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone14":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":-5.93},{"time":0.6666,"angle":-11.63},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone13":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":5.76},{"time":0.6666,"angle":-4.04},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone12":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":9.53},{"time":0.6666,"angle":-1.93},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone11":{"rotate":[{"time":0,"angle":0},{"time":0.3333,"angle":3.7},{"time":0.6666,"angle":-3.62},{"time":1,"angle":0}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.3333,"x":0,"y":0,"curve":"stepped"},{"time":0.6666,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.3333,"x":1,"y":1,"curve":"stepped"},{"time":0.6666,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]},"bone26":{"rotate":[{"time":0,"angle":4.79},{"time":0.1333,"angle":0},{"time":0.6333,"angle":-4.37},{"time":1,"angle":4.79}],"translate":[{"time":0,"x":0,"y":0,"curve":"stepped"},{"time":0.1333,"x":0,"y":0,"curve":"stepped"},{"time":0.6333,"x":0,"y":0,"curve":"stepped"},{"time":1,"x":0,"y":0}],"scale":[{"time":0,"x":1,"y":1,"curve":"stepped"},{"time":0.1333,"x":1,"y":1,"curve":"stepped"},{"time":0.6333,"x":1,"y":1,"curve":"stepped"},{"time":1,"x":1,"y":1}]}},"ffd":{"default":{"bozishang":{"bozishang":[{"time":0,"offset":6,"vertices":[-0.54631,0.16979,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.66614,2.18981,0,0,0,0,0,0,1.66614,2.18981]},{"time":0.5,"offset":2,"vertices":[0.39909,-0.15237,-0.76017,-2.81369,-4.76631,-10.08128,-11.67932,-16.11244,-12.87498,-24.64079,-26.08101,-27.19285,-11.69793,-23.18663,-7.10708,-15.5899,-5.63208,-11.07275,-1.18116,-9.16714,1.39007,-5.60423,-3.23986,-4.04275,-8.67079,-12.96566,-16.84547,-21.14059,-6.57843,-14.39357,-4.02623,-7.4048,1.96569,-7.56994,-8.99745,-9.374,-15.71865,-15.71713,-25.49047,-21.09736,-23.43983,-15.56904,-19.69587,-9.45701,-9.13946,-7.0227,2.98738,0.39505,0,0,-5.6336,-6.26731,-16.11631,-9.15596,-7.77491,-4.34162,0,0,-4.96264,0.92071,0,0,-6.26344,-1.55409,-2.99334,-2.13903,0,0,4.42803,-0.42726,10.55395,1.42237,8.31709,-2.13948,0,0,0,0,0,0,0,0,0,0,-0.3366,0.85484]},{"time":1,"offset":6,"vertices":[-0.54631,0.16979,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1.66614,2.18981,0,0,0,0,0,0,1.66614,2.18981]}]},"bozixia":{"bozixia":[{"time":0,"offset":8,"vertices":[1.10426,0.21304]},{"time":0.5,"vertices":[-8.58589,-11.87962,-8.58589,-11.87962,-8.58589,-11.87962,-8.58589,-11.87962,-7.48162,-11.66658,4.06758,-6.14323,4.89106,-6.73164,3.24205,-9.90687,2.0182,-10.40029,2.55815,-12.77673,9.22341,-8.27536,7.43252,-1.43287,1.38748,-1.90908,1.38748,-1.90908,-3.3168,-3.86715,-0.7987,-4.71955,-2.82904,-7.51142,3.98394,-9.40925,2.54252,-10.17247,1.26657,-8.66304,-3.54208,-3.96939,-0.52188,-0.37893,-2.72117,-6.75529,-4.03936,-8.25877,-0.48744,-12.24523,4.31379,-13.04454,1.77854,-9.20007,-4.56512,-7.17195,3.40151,-12.20761,15.45115,-4.94531,7.50912,-11.24177,-0.37512,-14.17028,-6.63336,-15.99578,-7.31326,-12.93998,-2.37908,-11.1842,-2.18479,-12.07969,-6.69622,-12.09716,-8.03213,-13.5662,-4.74479,-12.75979,-10.09953,-10.11999,-12.88264,-6.91882,-11.56013,-4.35638,-2.77673,-3.65936,0.20387,-5.00454]},{"time":1,"offset":8,"vertices":[1.10426,0.21304]}]},"chibangR2":{"chibangR2":[{"time":0}]},"tou":{"tou":[{"time":0.6666,"offset":24,"vertices":[0.01285,0.20153]},{"time":0.7333,"offset":24,"vertices":[0.01285,0.20153,0,0,0,0,0,0,-12.78933,-11.95648,-25.18135,-25.46112,-23.14934,-28.2377,-14.56987,-22.86676,-10.98754,-7.93289]},{"time":0.8,"offset":24,"vertices":[0.01285,0.20153]}]}}}}}} \ No newline at end of file diff --git a/dragonbones-core/src/test/resources/NewDragon/NewDragon.png b/dragonbones-core/src/test/resources/NewDragon/NewDragon.png new file mode 100644 index 0000000000000000000000000000000000000000..21ec3fd910b05e1c8d3d7cdcafd40dfca29e94cd GIT binary patch literal 824720 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�Jc93c_c;SSzFb{g*bqf4 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

N~zdaN~pr^t0yia282mD2)_r~gZC^ctDJmS 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

Mc_6!(^8Z*o722mvo5e~|FHSf^o?Uw{W_E``rb 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 BI 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�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

  • F)$i9wsw8_iz@X)Uj`?W_0HeE z3=({Q!dmh4zt!?MIg+~ra0^p&2gX74|n7+UuCVtn?xq3K9X0-Gi@8IvB3 zek>)QWMGaSfD)=F;W-UtnMJsa{_VRrKVnj*>@c+vsq zYB-VyPDc9+{*Jb?>pphYe6n=$Y`wJQbg7TF8u2sL=W<-teKt_lz1umuYBgJXSL}DG z0zkzc1sw8oB2)ibfR2>>Gs~?@$O#ij2E52f z?jt9|nHYqnUQSO!dx&o#9`Vw8r)PzxuAb?XTLiU!m1>^+A3;wtGz~VkCW?+)Tr$DJ z1N0gK696W-?22Z|`AA4V=rcNg5Yop1!3kt<#)d}cx6 z-`0(-T7wox$JiQk+c+rmv5{qypi<#%^O`GbCbP);qY|RYM~C$*2S0OuA|9yxRqhl@ zfHy?rPFQ-5)hXnqVXU-P`4ygdu=XA__n$QDMI0TGH&&>)E%U^4+C;*6>^Ig-T3K>d zpQ(PW1Bdf!#BN<_YwIOgF9!?x;3~L%=h$vOnaS{;Zj8Fty8IN~v4Mvtqc8X3^%_^z zDn)Zc|KTfJ!tN{E8Ma>B5vzWCGIpeRYWLE68~k2_?`#^H{BBhBlAm-`;0aj>j2)sA zLpWt1hQcT-Q3rqv}-dXyi0!$k+FnJW2^8hXZogJ zGjWba^X|Th1e80A+9yuG@ZD6_UEbD77iCWVUBPP>GVs8-ZTVifQS^=v(NV^Scz92B zb%o0d;NKmR;@@Agpl~pB^lo=J6ehV-c#~UFh<(~=xQpnt^zujId-=MOjN-wUfO=O! zW?vgx5wWnyM}MEgjwDT6c$6to-R(zqH zJe#g2nEA{;WVixp!SZm1qSzj*pS6>V2Q>3GIn*2$57w~m!z9Cq-6L6K)UdHpe^v$j z)h?MoB&X3VFbD$e58_o_0>Xz*0}xS07cl^;#MG(;lwdpNSTI)0h>^kvvmHZ~9J3BZ zE{n~)AT#QmtUkUjdCx@tM$A<2$Qk7IsD@I+j&1(a>&bB!c`}+=;R1RxbZi1mO~vlt zZ|SZy)ybof8yk1~Q2K5ol6uF!!tiE5FCH>q@s!w>Png)*jD0h_-6K8rh9H>N;nZ7& z9kS*S3D;JceU+%v{-5m_+pacadHTk>>WnS1PHasJ>%5oUwVHNss;smA_Ly;wd0UsP>>@r}`>kiD|bPV0;&$!}3^R>!oma$;*{DgJGkdqb*cVrnHw5$CbGRVo!$1GP&x~7NZv6 zGX?_kr3gCjbv1TBU`R1MxSrQkFKD1khfFc}4wSm{+4->7MCdVjnu`|T?>(s`EH_g9 z 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 z z($KIDc5Ig?d$#Bghmng!xv+yn*1j#g>Z9TbdSjBR&)x~As23OwW^t}FU_Oua( z`dS|O^>y@Dtxs9ahE9{mPxTBLEz5;Js@Mv=fHcqnTUo&)Z{4R*GI|c7%#(N%9qLmpdTliY9PJ6{2{@o zyTdGpF_o+R-f6)*}!ElZ8o-{Hr>Ex~FW$cH_#TAz~hVqztBW+;)!3(nE$jlBcC^idZq;pY7E9DJj=sl+n<6AtOO7~uP^Nn zkL`onSuX#>PscfLcI%ohtxr{)AG*nwe;GO|LJo#B|$d{+Fw4( zS7a>PhhJvWjyI7JGnCH+AV>K>I8~N+gXxMw5=XIFLOk?Oi4bR!ZoWt1>m04@?w@gc zQfrn6H!cwe&g)1ba20j@T6JqQe+$gWzZdvX=! z(}4FwKvCx3-D=NT!$v6-%{@9VfoOku9_y)inHl*0MTJ-qSf zZGC54ar8(g9TW3pPZhD&{Z`ry%J1d=GepWqwwNEV7k}B}R@o~IhYGOwY?3|%$naA>KzhkW${b0;j`s6oQ8n`TlFte zc-{%a+JMOsPzvxQtzSXNY&5V z;9Wbp6ziB-Jh|7&5&BISXp#IU=QK9ZII7x#BzKDcuH9pI-=b5dahz4v8 zCZ^=IPq0%8{V-J0`jlVIFDtPUXxY`bgy5~|v35wAGJ@m>jL8te=o`dPE&cz)Iy+$$ z?42DZ|L`}@@ndtumuW!k&z)Br5t&WCo?j;1tYW?$-8f6?Xu_kHlAy|Br_FOh@8f2i z9FLR#-%3&`;-T=f5_Sq^cE~nXZ%oC~NMWapB8S$WLjg4uN3_4d9Jc&g^#&jyA4B?H zZr*@oR*~yL?Bt|M>Ev^-y?O|cLNv|Mp=e*=O-x8r;3n6{`YU-gokXB6gM76DD|%|n zD1YF3D!tn8`L%0}Njfgpi|q}rF{*ERM283Yo+maAmFP^m*q^jBBcS?5Dd{xM+Y>I2 ze*oucOkUofhLFLk+eX=Z`Ekju07XIM`htLwo9ThzN!Vvl#Z8wXGC0q&4 z6@a|RMWD!XNm^~l-)u=Qn6Zezz-t&lIa)fRX=+QYB2s2N8v@MkEm|t$6D}b&WKODD zR`!dCQGK)5ccUOn&-4k4Xdoye$d9zu!Ync<+cNKU6{XY+R-XBKLL&<+{9vZw&JFD{ z+D9d>vnQb*-kordbLOeC%2kAT5Y6&Xh&XPmNo%b;BgW!aX4FSjaRPFt27_dK^XJGB zYd>ZgiQ9jD=L~6kVp*y0P9+}XQ$$ZZv!4_dj02hO9NLv3-1(~v0OYU5qiCpGd4P5< zx6*$kzurG;v0)Yf!PW^-D-TT=31% z4F8Kztkj#%Fk<~BrL>% z)qih(-y^q>MsKM~onCkdC2oaOc9VEZ=i_)4Di<<2Aw<#~KVr=Fh4I!4$QCcv^keiz z$vw4a&yjs?xl2M|>qbElLODFe^PQQzikqMt|3YYCE;5td(MWTk6oPUv!%hISu3AP% z9SnyyRs`2dzvd+OZMzGxltxNPjc?39QEF%)<5ZfD?Ybwei<3)TcI|yyogB}WJNjY8 z7Us>Kk5z2BfVbbAifwl7d__XR+@~P^I8X~&j(B&=&v#HnMNy}|Zaoa&BB*3AZHu(CR=m|G5iB_MJ=f4Lh(?A_R&) zrM?Ll`y@DZ$nxtAUPTDH=@WT(Y+->0FpMM2{kBqRso`75=Nr6=tIMhc!k+3hQiGLT z#SoMv8FDC2s)z`Me?hF!hMJw&}M|79wstb%c$}aaHol7 zGJ}@w0iO2jJ_)Z7515aoA&+K7u=n5p@0i#4qeqcG+S)_XQ$|LvyPEv(?-5Ad%#y|o z=a5Fg@T}Q9GnS{jRa|~)4isz5TEEs|+_~qvle^vf1$m!&G3#0U5 z`t;xj(ELg$@unQ`vXZ!4M`xtO_}fywYreR4jh$4s64Ay5rHJWknK0KVv5&p#_OkB& zXfpLECw5?(?rZj|vPv%MYzXI+Ba-r%P2`QigXNtp`EE(fZ)_9fn}|G?7P+-t->CYj<D-=gny|Hy+FbH4`X`)2;Z|x#rHB0~2JBMvZI<}HVhpxuZuZ}p;R>=W@S|3R z;xdWx4?Lam*tbzknIGT;B1n7~6PA>!Y^RgVVFocKUIpfo!O9bAkpA+Usx%^-|A^59 zm`8%`2lR0OQp)g6SW{127p)+P?~83wRg$VP-6EFgAXspbT}~SraM;I&Ff5fQ_vqiG zIsHXm|0N^DUH0YTj+csQxzY2wy0G!$9!ehAIc~@mCHFjX42G_}blk+66#cvs=3H^r z#L{_x;=Igc#h&8X`m!(GP*dy$Qx0}sliu5R{J`mCg8#RNQG6-2s>*x~L#^`j$BTq= z%hOUd)yrZ#Vx~*7oM*^i)+=mN^{%?-c2ZbgJtB5*%`LjOb{JR13k96LDK_5*0!uea z6`JDVsa93*G#0|M16&#;|Jupso|9?JfBwEUOIz4*+V_kCB9d08ao8A8&4ah(yQ$-Y z@$6cNe$V-_Vr!6n2 zoN@am@>OTtu>eWwIRhm_!L# zOfh4k|MRPEs9*YejT|i9^bfVA&z20v$Z3mr_*(0|Fl4)R8b$Dhg!ik{^&Rq83b(`| zhUNujVzR2;U%(SnRb~_~3AKOt9;d=`(Hv0&@~o;hvJ_Cepr|JDMD(X$(l;!qTQh2qHn zCWogV%g=v#s~w!YyB+B7hsR-K97mY*b+wNFj=$gI$Q&^ysav~4)z5e;_%X%+_vO#M zKs6o9fuWWfI(OZqZEPm~e)WrSI)JlP1c*XS#z`OfbsuI2@+l&6&gddlQU+17hP*sHlYpXsx~ zdoy}n*uT}aSRQqsos>N3{4EY|#O9=Y%q7emimxJd=@N-c4xxxmw-U+EaHT>eBlVT@ zv7yP;P0L%|ccwnTRhdKx0i&jlbkR1yst$SOC? z9y=9+kR1=yGMAaaKwT;wD(4J3$v3$s?6UPf*0ZcI8nSQQ&b=rn%>}5A*t#;LCJ#u`ISOW16kX!4|=pC|OUVKl# zFej!$yvdreO5I|bJrPgL1?q#DhiNI)T!>_yXP^(qtIY0StDCwAbwLph(63JEybcV-(P!?cF)lPGLt3Bt z0%!01TFCGy=U^Hctf2;U!IMgvz&WP2jDl#A7(B4igBHoBJ~m)S%L-cD#&Ue%#6+?N zx%@GZ$e4m3ep@nR&ey8<;b1B5WIN=(C}G}0*x2C+85f`O6W2MWTdIQv)C$9iDl>abG7B*c^BmE* ziDI8RtY)j*(%?HcRv!{f9-er@g{Es^*n1rS(-Lj-8`n;xw=)nj= zqme^nyRl{M2ekd)P+&W@&lCcb6e(@n5tY}kUn_m=LXLRLwS>{S8fU04{8c3vU1XZO zXVjp`YyXmzQ#Q;}+-qcj_Ey2c$rlE%N0M|CVuHtA1^L)1B}~`esoz|ui_*s>v1CkF z&#b4wljDhgfKJ4%(rw3V@CHKd*50W#9Dd{u^xD<{zDv_qddwLl?ACOZ3`+Y zQ~xKpP^+ysLE{4r^LtW@>0t1C!`DH#+kPJ8A%$)nXh9e|!i{R6(sfrJ_ zIFXp6z26wgzaDeMHLlXjYzOl^H#9kSZ$&y*uul z0gKqi zC`;#*fKso5*eE9aBW)lCXnUSxoaXr5o`VP~o2Vf+QsEucqnS+PwH^%OXISGj>9!>~ zYcW|FFcssG%FhFBmrP@u3*vq1+UMyn#FMu_wq z+1p42W$^C`wOjSQZ$nC+PW1b{U4wzLjI5fp4R%caN?K}%Q20YVXv0>Qo&Y@;xHsT| z*)Z;(Xl(RjoErrhnL}9}A!n^I$|HVV1OP{>kAH8ar{8?{P;HzO0XQj!UFCfVtk+3t zKX!hr>ou}#&B00GYAJ}@j%4rni0M~<8@APY6)UZ8pZC>y9r;xpf#Vtl-=fOWb_o;a z2)TB#JopD`D1^E#nOzf^#M8RniJddWauoMTsR15Sv=LHl53IQUhlim62Xv^~E<+M7 zMq?m(5DezTAq8Q ztD&w2=~v1V_yfJ3Fvo#~-!iL|Nt(-Vy(zOUFlDe{tX^BHZ?;-{o~ zWex&U8 z%$?3YzHTn}tqJSO2YWU+h%)}<-?xqu2TlxMA(=p1-Z0yWR=;kqA}cn#OBv$)SPwBg zJ|z_HOh&7i4_O>3)mF6>|66=i!sAM&u56QTRi{kT^L&#f4@jfG&oB zy?r=JdVk4a=V}tu-63~_DVD>Wdazw0WgYiDlMd!*cjUmi+lYVY#|m52*Dm6fjQ4@FErLzpjHygX%6H7l9=(0hj z^!W*sjfFg0A#N0jB>Py$Jfek_2V8p=(h)n^3xW<;Zw^(Vs1HFGufZ~Z4%A}tO9)VU zx1EN<0%vB?%`ynm|?c|3Ts3oHIPUQW(n)v- zrges!j;P@R_={6XzuP4MKmi?f71MAV0^H0piq>kDPZtJ^b;(ru?T3b>6F?c&!@Fd? zo~+wv!A?wG0vGa!s?x1j+S@jmPX_u<7}Cqrolp7-?=2JMWRsEb?R85Q6{0dg;bJGt3T zD;p4xJZ7rNTNkxZt7bNj?BpuE7hYrc2`o5qY;|hfh0<>SHO_#FnB^@C%cW(C(HJeb z4CE~(NzaDhHVYeYOCI#g<%5>e=tr}7XoyKGs1VpTK80U$SdsUOagO=+v z>q^2fFL%E`-~V^1V!;DNc@8H}Y)xP9vy}hEwg)yU{9X!ekJ%ign1lcFci)54?hv9Y zunG|Hh!`pXB=p#0`{p2_B4`O}a9xVqh9M`=R)sN9-MUM&i-P_TJH*)PLM4dG=()kd zEcxm;5LB1Fd^;xs2 z1jGdThDvgjK8j5dC6=gyARj5vgxG|!37*|#Ctq_&oeko&R>w;LCj>Zp3r%c-5^Z9I zI`4%MEtUKC2ntL8l{l-|#P|%dSuyLkXnRf?v_5?gkSMDkC`s&#uX< z&ca7k04*Lw3ywvda2SxVRsHTfLk9%5y`!N_5$pR=KA-n6KYrfplwRY+<}w-CtNa^x zKq`(H$NPuwzMOEgIs492e2YhIGx}4;cBzY&&$jwQhrjjI)`$FgI)8a8_KOuCh&8X!!5fv5+e{CUq&Mi1!ok)sTl1 zyH$U`<^?m6kkUV@ME9lsDo!=`t6;j~P^t)C&x~d)1K(aj)Opu~-vE7;ThlI%=&7^x z?YPIBxWb|SdWdV-oET})Sa5bX-fkF$lPrqL^E_RTcN9h$cNmfwI@689OgSaLydh=+B3tM$x`{pdSyBzhb!P1s%Yp4( z;R?zQI2}gN`EF~>`B6;&+|5e>D107%o8QB3y?ws2UO0LVPnO~wzCCkrF<#ShQ>Wnc zNzUlg8z}yFS8h)a8kz-~^R2GJQRH;<@PS!lyeC_2iQAlx*+V}6KM`)C&6(WwbO234 z0IUwD3o@X9>$odmtOds$RRzJE-<3KAn0;RqDTj2_4QJP|y0 z>jIEW7(kr04xKBK44b+r+Uf9T6}a(Lc+hBKX-C^jtaSwp`O~6R=o4VMEd4>ea)4y&F*u_ElrE90EWYb> zNHaLBGFFMKenR7xIYsQZBrcR7bb9JhaqPewQyH^LU#dyNjO4cWPNob3FS%x7YMof8 zX+*UXWO;8dMw%MG|4xPz3;WF8LIcYDz_j9Qf-RVk-E@zRr-0(Hi-R3vxQg|wrveHG z(T%IWLdhiNV)F6lMDbXnNIZ&3tY)3k$&!>8L9v#>fURIMX5rgp%a-IRT=+@%BMwU4 z02;O^lNFW{^1%bqxdIdW+7ngU29;uGfhi5P9pdzwxSslr8GviSYoW0CwE^1~3E7Gn zE8jD^zYiqL+%zsoO8JwAS!%M-V~RLPG17pVv*}*eu-T=XZhX zMHA%qTMyJybD6l!A-O;c8%&*e7}Qx9KZ0{?|3;vgLvQH6z{sq>0EJ4}3mXFP%Gw0r z1(I;(ESlu!K^x{BGK8S05pKjEeqz8cRV=dJcE<_RJapz^_@b=$KuK^mnW_N#z7vo^ z8%lt|hsJq`M?=6fc1+-m#csGaUjDyNejeDRp}GCRw55_QQDQ1%;Hpl9E`U74Egzh3 zt}7QQV(7;?ZrEHY!jeyKko`3soXhLx`>W@S`{|8>d%>()%0Z-Y%E4Jts4UwX=BiU% z4e!Ljs?JChPB#eUF1Jg4SKoFyd?$Twch$ok_{5l*gT*@fj#`ssmjJWwpBV}6tq60* z=V*JG-KUCPS68uQ=eYHS^m|yMS2vnDi#Jc!A8S3@(O{CsO5?;^h|SW!YoM$js*?@L zyl))Ck@1NhIZkZgkRsQEXLwhX8jn)a`aAgC9ZPHRvZlG8Xm2U2)zzqem8=gi$2;fQKOCn z&!5he2H4?Coi0Y6+>_-FJ2Q5gRtQ;ovcCH;qCLu!N-3D}DD7wJ&!~}%%YLOktUe4N zOM2`PJz7oaC;g9Fo~6ds{)nvBljpm*ubn6pPb3m#8%2a<<1yBDH`bPNjvp>Re%?s& zStModpYDvFVTm4glhNT9rp3Kd4a~?=o)8W|C^Kj%Y8{><|3>|%&9gQN5K2kd2|cxo7j$$^+D43q zYYF_>fg9tq*ono5D6N1!>$MizLOyBQPluy=0<`)0Ew_mKVxoz-TjJ~@md$<&|1~bd zzwh_S_-FHN?;4)lbaAzh_ro5jE}t$gT-|%TggxsT3o7}yEA7gcl_4GSt|NRW&N1op z^6s0?mJcPgz{jT&igpX_2!M9}lFWaH!G3s5@t4zP$n2amtTED#KaIYf3Y`RL2M1e8 z&TJQOeQoSKj{Su*hj$?clGcy<`}M&2zn@;$p`kRLiw_e#6~FjxG+|oaH_6uR?Z_;LDB1(EYx;aA5!l)15;ojtDK7u z5#z{?#pgAVMEa9(gT-`V7}0&6taB%Ns8sW#TL=+g$cSL14f@MX#KIC)=9fUkwnPxy zZFI10tP6xrB6x~v0b9rJ$})d!hZUJLE9p6lwWNO_Y#=$c`}Es|+=m2OAeGf&>kCEP zB)2`*{dL;aV3fK3tHm$N{oUB8Pm-7Sk{m6KfFGAHU2oLs=kIN5^p!4srSq3F9^cQ7 zKVqM?6Cup6*V@a;%+;v*;(8E7U2twJ=Ee0buCr{_)on6YEmpbsQSRrAJaYyS9|C!K z=lSz9g!B^Zn$Iu1l1fd7GpH=KV$Y>#n(=|j0e3ZKC5v@Em*KbM~ zifx>HQc^ILu+{b%St4=b`EXch(`kIjEvp0}hFovL`$^O8!S7E3Z zfk?jS9V!)Tu#T);U)s7IRnB5#EJd@$U)x;P{jf(J!f8PKlvu(DvEAcLATfx#b&Juk zkxIpNh<`l2O}^(_e+e;!B3gSU8!6i={pj_2Gyiv^mM?6U%HS5^fqzU>NN8ARyq7@FQt95#Cq);xU7J3uWkqwgf<<8n7tuEbX$Y6q@5De`*>%`0 zLzVHErX*g8w{kR13Yzxzxq-ENGYqVkA9@9EW*Qt33KXfL1K(1f9_~#U9IVaXJO8(! z8+f{K7I?TW*dF>UEggFmeLZssVYOAlBv@llx@Fq|!W=7}aW!SvCEfD8uXw!tcGg|#{11;f?2*gbgzST?g<|x-;t}7#C$3)n6Q14^ zPPMz4C_iRR(@JK^tZT~NA&U(5SfdL`qO<=Ne;14M?t}~EU;p;G^RxcTlWGo^n^r1B z6U55GkP&UiUfWi~J(S%mVhw$3N@+2L3!7lBb+EQ)-X&VNOSAR+b;a1f47amyfgd^~ z8TNcq)vj|Lsl%VMIsDaE`@Zz4Y;_)D+9{X##k|xJrn2!ii|O(Y?6OlK@+4Q0=wj)9 zJiMQQ4=xyZN=y@O8#NSiOm*2S0}E43NXPmSwcLxPx~7)+#YC~zY%gKMPBKGJ@*WvP z^!&mFKUC~r)Y(PJfx<#ma>q)@Yqs$31ikw^_p9$dL&@ntA$x9!D00W*779WPkHtC3 zyqh~sw?ceT)UeWGV+vtW9zbUyIUeY6G^F`Oq${POMvvd|<+$0;UIwiVjD^3uvis(Z z%zgJ?Z>;{~nXES*+0NNwhLJ7*$^ZO=?KEb%)Eb7<0*V(B5Y#-jYJlpfKCbh#_(=!3 z1UZ@J{f~mGVfaE5X9HE7P7V`As%#H`(z}|S_HX=)^4+VjZ~1qq9oif~=DBuuQ@34v zv()RD)Jh*-at&8*PF!K&7B!dcwqr=yqA-<2}4n8y>{r{q9fa8CNRh*Pi{2M%luE`budrE zBqf9&BVjzrg)ZqP;(G;m(}V87?AYk=OY2k)#O{2R1M9*fEtfOv-XdVGTZK2abrR}P zOiN&{Zg(=o<&I{J7E+QGh{Xd;z0SmURFIBia<{IpEMsjXbK72@IL+tIf>>wEX zIf++kJ=*JXxIE!&&n+EF_WZ3s)B2*LX%ThTGcT}z+OQux5A^u@;P-XoyJ()=zZOoG znq4$_AdTmi*)bZCj`VDiCn+H+8^J?-!WQ5cNtr=b33EhyY7 zUcreOIJx3@<|zx>?W&KXR&?UKczQul0cV8xTWqfDr6eKB^A*jwijx$hsV*QoK}E^l z##{aYeh3FqqtcPo{MaX|eZm)2x3K>GrLV7#qr2{22vR95G%5iSMSgiLk6+x+-p6HU z|3^;`h*s*~b2rcv+uvHn#RhPd-KmY4eQa@Fdhg7srQT`CCWn1Z zd=R!%X+B7E1W%k@%33Oxas?7hWcnAt(ii93$YxD6JqlFV=%Xe#q4OfxH{62B^Lb!$Api4m2@DsahJv2=nLzXK*S! zHmk2x*dI_7Gw!Tewgx=UNptWKiqPu+c+Mpu%huG(VGvX-h<#H`y|Ixf*P%#?H%j?m zxof1X!0$LIh#f)qZYGoHPIk2ZhWp$coc`fumAz{a!83EZ<@J|-EuGH9or@h5@UTW! z%E!e$Yn)|No=tDx;eIyZCQo!06H45+aRA%4iS~_=9wZl+rCVV00>osHA|Pv~+g~ z64KJ$Db3iPJ#Y4Q=j`l!@4cVA0YVyTa#AqC4T1J#Z8EJya5Gs%poI1s`p}D?bp@1s zEX3SdC_v=?#(l|Q{?VXV|*Jo3|vP6OAz3}26v)J{g%|GRb+?~{YaJrvTmxh>JlxZLBXAGQ9q zU!9?>b93vp(Y6q~L2EjmlzaG3I|bz}_C6;F+0*};{AymK=c!rv4t_lBbSMakmZW4~ zexWcnvrg{*`T;TW`YuN(`uG!ijQNms(Ib4cxpUvn&_9bqa)MdzOa}klt80%yW+)7r4{Zq?4P{0`k7r?}@*u3h>mZ}jogMM313^~r+CEd8&<*ndBX$aH?JN13TbF@g_VasCa#C)U1F-PFRKR|{2b+25BlGQs-m>@O1C`E&|R+UkJ4qM4*#{tT)yfi!z9($!MMHuHgOp+V) zE$rRNAr0}dt{~QS3H+p@UT`J?AnCs8Dc=u7+;t>X6Jz?maY;$G#GM(wd+Nb& zBpZ+JbnEZQ+(-!CK)sRIw2z(sy!p`h=_YyFU|OHlhTLp{X<5CsKz~nIfavlcH*#4< z2C$%)J>8x_?W((AKKoL&>F@+7QLp2wWDv&5D+(Jou!e=<)S`xD7uh^$yB8Gz?O3`z zJnBD`iNiM9gP{s0kTbom*C)w6@Uzw?jL9QRtqS5XORb<7J0hG6uM|WA84ig5D~MRj zq+|IHf;Bbi$_`ZR$-hhwb$Nnd+jH?IgpyX!N*yCclnNiQ( zRsjh4h{qCuP$ANgmsGipAZbAf`QzOYA4;7Dg%?VYS8mU7ig`Pbfa2{U^v16M6fW2T zW%CKIj^>oI*G`)2?47{>7!RNiZNxDeJmrvF6Ch=dGW=ElK*+A(4sDJkhiH&Xs7ao_ag`aBNf=|5T-kK+Z9Y>Nj|@^MI5(bWj~ zS}16g#jI-re+F8eNU5|5C5=Fz$ zfzmmQ_+Mmh1?hAlgOQ((VoC+VM@`$vPq+IsA&!Wka8b#&-O-WR0ZDfs_(6y`o`)X~ z+jUV@OfwwEHk-M}Oc4bS@&UzLSgxIHiEgzwB5@&lmN_bOC7e5_XKYRF3(2lRmwD&C zEZ#v?M3JMuY?!&Cf#9Fi^zESuzR40lwScO2LACSyNGQgG8|<1KwHygLksGHp=@NT< zC#~3+kCWC+lq>fVyf~MQM3IH9+T#+}M|EOKR&`2;qlA~3)A7i?z}O=LQ32apdQv$y z-|@a9-Av5|P3j`sK!bSbh6||i0S}rKG>=}pa3trE=SEWd0FOie@r+FQm@Zygx*ruU z?})t>rOx=$eom0eW}{2YkzUB|sn2awx50^)f4BzS$xwd|_|kMe=1ViZKibQv-BQbGG#&26T|IUNnWEm%D2Y|3!)sf91M!LQER(lX*rv=PDttGnDJdO&k zZW43n=x7Fa(0s-bmde2em1m_y6y{I7h9ClL=ks195KE_WYPwJfKX_<0JjRhb!1^r- zE$sc45khA~AK&rrRQN-?5U|7k`YId9t&aGR50tZTq>(^72Uf?8+J%YKBtF_~|FB8m zi{HdWsG9EIkIrOHyM$IG^6l4zOr*a@3IJa%31*NvwUApQL1%VK>^W%19dn(&CM zN{t_$!DYn%wNBTGzufhT$aQ0d9uEUMe+C_-5^<{U_0F_iFyA-+El!jD@Mli5<0yp| z*jW-j#5KQ=@E`>WEeIoj(H|jCo@KhMC|%AY_X)yCmHLOFio={njBTV3r(%lPZyrzO zRG+KOn9L=Y)&3og2fR_(gquU#U6G)8`8IL3lDklCV4yID>rO+r`y@~c|U z!3QhKDu5w=I*EL2dqf1ZoRDXLQ+#X#qL|7`sP7AVxpDvU-Ic*7Yda3aSB6h`7Qk4i z_}9N6wp9(#Y#aVQo>fs{XNZ=Y7+_a(l#>!lmc7y3Qj77@0>(`xfUpcWcTGMR!Tef# zr_>{q)B9(jEf?&iv1#hF!on4gq4ct(l+gp|+1!gVY~8N%{Vj>^XYto<(|;6CdX|4Oyj#0UK18w`-H>3 z_;uR*0zlUWj0lEUL>AIDu0=x z08H*fpIv_^3X{z-NM|znEODP|j^q3hf+Awi{Y$O0_+Rc{T(-CI1{`}}$D1dxlv+rQ zogm=Q2v}%{W4#%MBgUF_N_JK z8?}m+eLr34K~CJ$R1J?eooqpJ4lq*E(e5_T!&xz2%0Sh$m4Wk4$?70N*N{32zvK|j zEp5}2i7J8X&3KpVi#=Ca^d)Zy=JY`)t$)xJgeBMuLe?f5Zt2R@t^JW~^{DYFHvUj+ zL8_73GUpm%$;v6&7MZ|G`KE71O=5jsNUry4+jq79d9?d+-?m*S>quEnoKkAD^>(G% z!S~_bch9oiJ+)X5==G4F0y^omM)qw7145xv^;gBq9^Z0%Sr#Z~WNFNA zyt}!CtmW+uXJsg`W@8RpvrX(|4ytnXr>N5$=xLi%k!-7E94X(4ezYI8venOda&dWj z?Sy%QjZKTGKNE6zgd(mTz@%2crVoJ+#RHSL?mz0FC+tV8U(|&0$+QJK+#Dp&v<)$= znb}xZ;4xWp=fx=A+OJDdv&C_;`pb*%mH#}TLSyW&HAHQqqu5K6L3#Iy$ZLEyJ3Ha< zUx{NqO$w_o2H;`3wj{BW6rQ3WhCf`;{i5xae5b>zSN0&eEPYfRI&=&E7vuMWt0yM~ zeP8`{<)lSU^3pn#$zdltpXhFF1!ZwiC-cqM1`PbhCcza#S+$QkAc%|9zqY;DeZD{e zVXIr|ugf59_iko!8Po@%Cyphg)0MU6s0gS9tafN(5N)f_(inx67|9Gg<&Jt&7$wjW z2UXb1jg~bgkO*~<3~2WOjATr^mj>}#?;y6yuO1tWj&_VE5B{@UBp)hzm8TM)-ae75 ze)g%V^zQGZ3raOs_VBgqkA9yRcg{)<;ce@|ikE+EYa$DxQa)~|CNf;)KOKMgPV}{l z@64~RwGWAj;z%3QSs4mX^_cwVznh7}4}#a}^UJAi;1=ks|yczzD8R8gu6>kXmCxSnmjb$|7xqHMZ^%+ADS&>!Z}z6aQxIt6R6{@A`30}P9W}TM z_-d(#xAMUL(ft$$a0sw{10z}ml*=#O&pbod3p@h2I7YFpT$+5p1w!8ZDcC)Kd$GrO zJsRR7@^Y!vc&MzdZq4vAY2$c4*4or0(G8&`r_MSWOi`>D+o6Dfm zKVWJW8eYFD`A?M8z;Lef6v`pwVtKFPT2$hP<*0Hux)_ij!~k*^Ipt_Sj|y(g7ViyZ zPdfwdh&`0578y@Xf`hW80Gv~Uo8DsN_@!!ou5}2`v@M}naUN1IDFkYs59i z*oP_2ZM}DLHliN}0k6k?1Y?Wb8&SK%fl z9_-5d6~y#qjCq?TsiRDrW@Th)>iV+d?ZRR`9-PG}?2c!8W#-ZR$-Lp+$$S>h^~EL2 zLVFt}+ds(&NNL}F`?~)+Y2k86iFNf~ z?}u6OuQ+vv8^UX$PQ9>9Y4)HahRgZhLpf#7)#_xw6F_ z$2RO*rJH@94k=#f*FR-m@u-A+4Hy@GWGE(qctzi7#R}ykfh7oceH*5oUTm?_`w{8F zqlg}CbMfn}iTFQwVs|EOQRUWe@zS7R>PNfk zmEl&#)I1O!{va>mo*P!8HC<|p7PcY)$f}yQS zTM11?07%|KqP1imJ#UDq7rP5BG0@&na2<0f$vrNPFvJ%?MMrl@a?yaiC}0;(_&u!r zDr>8{5beaswjQFTtcx+9%P>P$%C6@vPVX1!%uGY}n2paJXVQK-r+3lX}abds*Y!cEDl0^(@e^S+}`=2fB4**M6K#*sEIqOf|x-OlTwZ^gsT zqUVIG2X=ak1Rdo^U;foE?`V8$vhI#j!fvB=)js>_4$x0>?I-1e!UJ=ed0Xn z|DaK}?O7_f-VUE5_PV&lUKh(XKdEG^s<Ir+ z8^i)HAmejNprxa6E1U<=nQu?W!xS>+I&Jq$g9ak>Q|Jp5uAkpatqBq6$SbHuCR2GT zdcV@e=PmFZD={ahE>JMg1>&kX2yT+F>_zzVONY*oaao1XW<_not$3$qIp_J&a?-Ov zTK*NG_-2yoYq77acVt|E8@c&&Xzn4}#^|nnO|yI}rwnb_40!%f0m>l=0^l($g%*&u zi((TJqYKy#bIhTMId~}u6Mi~~@O43@Pz^N#YhAT5q*H8@1>p)p5vuEWjkE#xgKZ0j zBjM!K+*}(9&S#&UbD>j;&lD~{ggF-zYxwUK>I9G%KV{>wTh2}a>FtkQ{(6&3?O}Kf&?OS} zeTkn#mKUcEqz(b$$we@ZIlpknAh`AL_jrxRKZj8LLwNA5?{CHzOarEv@4%S$uXmVo z+0zQwJ3|yJ6i^x2QulQv`QYOP9sbhB3Dn%i8{S}2P^K-<(Wb`YCFBtF?%``>nDa@p zc@~+~{c$hCptfSWH^QLH-i$`x=OIGxQH*mfWTOjs-3%PO_5`rFfSlbaoIX0}cok=X6pudn0{jUjxW+JE_ zzqmW?%Q9vBr8FIy@HmMOY-n?0DtDnvB(fW+ad8x+*-){v2;uE}|F3iBF&~631IJ1} zoW+@T{3__lf1S(s_>HmEa}Nejb$PWeqRzbCX0=Gd0vZ|8HmGtz$ zJX#KUzHc?J|9k~^-eRfp@Y&cLQ8>g8+LdKReE@x}_`Y!HuVQGe#N+z6c{3G^l{j#l z;Hej-fnGTK%L_dwqUCSBn1{Z@I+TGuNJD~0g?9dSNd#{|BYv-tZ{GdC!vX&~>hIcc zg}u}l>YP3BNVe1Qw-1C%m1HSF2JE-!XyGL~!ozXhVqY5hx`&Kszl~Eu-;*4kmJ92E z5Np0%#Msb}Z4Idh)${W5G9bDJT|5(T2R4a}$PF}vQ%TD8Z^4l#W{u!9*(b`J>ZUBl z6T!Ox0_Ud?0A=O^ODF%#mYbX`7B81u3dhObPJH_vT73oUdSp!69@Z)R`-M$i$gu?; zT~Tj`u+-;Rz#}lu7!P5s!{*&Ru@{U0&GDf>uIz{ zE4n9$Aha{9bDI|sJIon_Y-0mOdzOXz00v7B_{y<};&*5++}SX+NePD&0EYEf{bh^y z?(VN8dbSEN&Ow9FOzj?xrsn+nn3w8RvhgmXSbbn(F&ong;BiiTl@K}VJnVH5C zy^gB3eTgL}JAQgHS^i2?xbugH zn_DNOcfc+1Fb{BvKmGN?MOfrPd6SV&>Qo8$-K+CYi&cR!9ejC4+=U;wz!HeD?iTtC)bH|?c&R)qt0K!jkT7K)tR8KW z8prTVx{#cV5ZRvmB8%qc1bzx@`(OLZQxqdawff0JM9J;GW9%mFua&Y6aP$j4&!M>9 z`uSh$o(V-Hz(NBM6dG`Ps+A`y?2e1xfZI@-NBWW{jU z-1do7_Dn(YgG4|rGw@S0)c=9w3KQS@A%;Q{mmK@8eOO9)-;B*5bucrH6TOBtvHGm! z?3?}^y?jjs)R5#-&M=JqcWAb$YC((t;gR_uChxy|)$ToySC25xujeYQyInUVd^j8L zbv)96~`oDx;UuLsau_kS_}41LLehQ<&sy^{dA{ysW&Zbebff4BQT#a`Pvek$A*DyE4T7*%9`SF z{N)EQK5v4&;;nH&)VR|x7p=+xKJeHZ#D5i9U#~Y=Y6=%Y*`dQGICTL{*jk#uvU7+A zwG!AJmQaS9Jg-dZXLz7PzOoc_Z7JYTf<7y2ObJdSnCsKz2K(n65>3qHTi-fUY1XTy z%#%c+73mjvl)L#lNYhnCX2?6{KMUcqom5$OA*i|T{?n?A^$i#PL(Ty<^&I}SOtapD$VacW>9F0W+Ig~gkoi`j9%j^Xnvlw2XDw}$e5G(+#d3nJV;5k*L9@cZ zQk*nV5C4Oje~K$klsY*oh%gMJv0!e=6*!Ho8Y5Z_Q|!V2YfZ(TOmwSk<)R|W0}S)` zZ4(8qbp7y5M`I{W?=7(t%LIctndO*9AAiIlIvGOaHu$Y5dA=cF$ucv>=1r_=LovN1 z{=TvJ)IfPDr_u9DJZ+&0J7$0-YaIvp1PD|6T^f3VI~?v$rJ)%g$9F_b=qX>P7lwfMyO0fN61G}+)hzFA7);cFlUxB>Ud)Oc&bN_podTGgbO zzTsFGcSl=-%Zg*9OFYqvom+Q3xYVKa?iS@D@gKIfxv9=^e6PUh;6!8nyQ-ak&k*YJ z(DGt$oHDD~TfxK52gO-*uEszd96eej=1Me7d&F8TIO=3KrtCGTNh zi(~#Ms&M=KJ+N~8sg(PhBj5DnHD2A8`Z0xf2#U0blzZ;u)_yYG4rezqWdi(DWPKsJzc&QatEzbanUBBpi z>}9c?xWg+1QFC0SEk*t+MotzZdI}K3Jy_q>BH4qx&TJiJ=e(G4rDyXz6vb;7Iy__L zgj69q?}A@tlD(WPBR|Gb$w+T8+z`Q$%_F|z7*pJP6kXDVE2xWafVbl4fa6!jcr8n4-nBy7Z0)esQw`9KN$V)|`8UNd)pd%-wzOVmD}I4@KG z)<`g40Qfy__-pF^W0Pk(29tI@ql)h!hKw^+=ph2i(0rg3I1GeV0Iu7~LHy2(OJ_My zaC+@8LPtZ;{KZ?n-ApWCH?dL4;395%sTt5#mW)Se}o4 z88Crk#|t&gf1nZJy3s82M1qcTQ0hY*Aokp*>Ki{UtD)W6N$F8Ts~m6e@c6s@(fN(3;z`R zkCA76U^shLe~tye&!?wXzuV(gH=UWW7!&OP(;n)*=K;NGf(q`tj0rj7iJuX|d{fBI zmq1KW7(yBu&?LJ-Fpq4%ar5FlJwX`$J&scHdc}5bnS=}<-o*XTR(VhnF$J(f@oqZp zGYGzphrtpFkuINv+HWgtVef<4slkL#trrcz3I&fKRpst<@*!^8AG_AQ@zd^G$m@ZF z;#(H%<8~D$fnEXTDSbb{u#0;r3tH?_RQ*}GD`_Oh9&L_hIom<8? zvrmek^SgUk@vAg8Uq}u8y$pl;OsI%bJLw61nFw@LmYYD?;GX+YtHXPp*Fkf@LCy?L z&Wqz7T#%N44Jl%3{pTkftD9?ne#V^GLdri?b~X&2&}U>ZCkQtxg-ogtmk+{QyVj*N zz*|W7q!979pTcyvr(k&pPH$$Cv5f$w^jt)9C-ul%e91E~BBF?SxRf8pSYpGD(Cg>1 zIlkp!LKRcV7*KIeJ_zWVKa`#hjzIgGih(hGiHxIl!qwN)y}h-+)QZ&n-FHfMVop9< zvny0^b}JH`lBww+@_v~X{m>m)VDs<_kI#R4(2KPC?@WlIb2^<6=;C_~D!ZZWdLb0? z_$7|ir_vugd|vi!lXKj~?=Mn57bHv$K?e<0U+22+6A3AjKBYWQnK%P9t}l+i}ABCq+>Ms8FMEEn&_JPibECU1X%hoVCJbY zSBCd8_s`NO{wy~J%XlBjr!12eHa^=xyFjawZ3S^OZl$^`v!vu>WaUdR6gr_3k)MPER<>=xk4 zBrkG#h!oCqAN_;qh9;r({s`sI{5KRz7c9hkbG0@Q%8yU|$-QL2_TfX`-6C6JdfV&u zjk-8TWG0dmH#G^;_Mio%lv-S-w?>% zu+$o8&z#0=!wU9R8S)Sj$udmd<&_hS9V0^oHh*umtw;CnKLKp3N*HG*V9n1E^Ewq{ zvI*GGY7xVv2}+pkwDfJfV)jhdZw+2Bva;}1%NK5x0VzCh z%%`v@QvU_|uN7a3mTOrKY078)59Hv#-C3`%u5#Yrb2wD<#ep5FB_i$ky*ci*%1YJ_ zO*_LVj@#d(F!&tuwZPa98WWRNwH-{%07ix#kvGV?4Sl(d5A`2wf37MP2rjx8=>9? zFu4J;{y*8zt{XUr0=cQzx_*RVrvb~+B08KL^HH01eY3jX|NczMqWx{yb~_q*M|-(8 z^6gQchB)5r0HS!ODi#jLtIQx$T*|hj*YE-3-e%e4zVg4r{En zmKqT#>)BQ5cE9Z=bTu;y8{Ph}eu8gaRn39l{OF&%od&I$nHa^)lcfIM%?-Kufn_7J zsEL1fRpkKDSyu*B_*3Q#UfsADDA!U}0QV$Hf8SvF>_~aEy;fX%{5Es#jS!^843u-+ zrw|w@`Jg$D;B=<@XS)Psv#pZe8TlfTpi2Zh1Bems01p`Y8Ul#^F++g0jp{w3*?v(^ z6CAmJq9;o3Zq&))?>yW7=t0>bh(adn*Jm&y;y^Y0R^oHpKSAX-yZb{Km|HM+i*zK5 z&?V>k&65Xk4Beo%(-(PBxw(V_o-dMjnEa`jdmpZ^$3jX6-PCR>h@9=N?I5>-`ppj8 zSA4PtMG8L!NwV*xyRI+PAwf^^K$c12tG{$Sn?Wbie@I;QY^^8y5^KRVxy+yzDNx5k zKLbrj9Y60F-vWyPIVo{EyYGfHh!QAmaT#xT_U}g&$rrQoFPBp;m_$=)E>B2%ym=|P zEGP9d!)VGg%cvdOU|8^13B|e%g?W9lQCaPsp%=ml$;jhMm_K!Z!n_5E4Z9 z7$%f*)yIC8w{PT*n9XAF)jn3116Vo6TqFsm;a2;kMHMiLcbG9)-xc?~d-VKtzcB!7 z0o&ZLL%9d>yB=Y0LYX1=V7E~3eabk9Vu}|}y~+$g%1_&?-fTjvkat)-|w>l(U4# zV{xN^ZgsOcVM0UyKcNAOydedOz&50z(p7S#tgK_MR_UZS&hy~Y#D`bFn@_sPWbQ57 zi&>^Ez(^!J4htv^bi@tP@90w?I^6xP)dJmzRwpm;$bk5vPP6H0t3xmrHeytq5=|AICR(zy*UN-1R zBElYIqj-Iz9~z?!L7osfVZ1%({{F&yjNdVs3iDSyDSYQ#45gp^^U~iLlk^8>bBrfZ z_NYLC(ASu{B$7|#H^u!^Z&%1h+nXuu^H;)?rYh>3#eND?+GG#^Z$0W7Ch(Ku1@cWa zN4q&MeYeq%Q2eF6QQYI+Dd*mgIz+L=;#vs)a;DsZ%PKe@!N95+PF4mq1vwIs36&pz zDDiIUcA_+_#n(FFq`qi0kxfWE?I1cu1StzYGn?o(`qJLTUp}2PjjC=6UAnZ)pw>_i zrPCPLXh_pMk=abSE2Mv?$ld>+wKLt|>#yHR?m&D4P}u~m^t3SLn(|B=my!=iu|3nF zWZVNANl4T->e6bi8Sh z&v;06i1W>7%Rw*4`=1ed`#*e>%2w^B&MSB@7)|2qZc&8&F%+mZ2OUT&2pEY6&Tv`X zIGlmeydM$KoAbe9U+S^892SxGItAyXAeFF(rnnFpP-`GFRKK)KtM0?dab)n?( zdPZ{rv&WPT59lEPX-l@ey@XU)wz1u{ua3`bpLFNxU!UclHq_Zc1xJsfi6#P97baOG z#TxOov=723)(0}(G)3Cz^kXO=>$oekBqi~8kcW47|MRH)`t*`y(0cZHrGru60rMP4 zjoYuUSDbS;DE2+JP%d!gAUfFns2eRQ+enoDp~p&4s{h3(VHfY2i~=sA&EqBHL^UMk z%*S?`Ie&bly%slDCI4Nx&BK-vLpG)_~aXmHCOY!^wh)slKS=?xjS+jf;fu8ZA@5 z9ycV&?1I`0DBbV^(qU)XrntJa9i@ib!l#?Gyn!B2snPmsU4%0T5eu}tDSqi^%(#bd zb&4u4TPjx4d9;^XF@rfmGC{xJQK+Jx8WeQd>hl%sPt3)Ic4UcQ)f|fqpd7JRV>t&T zhiI)7e)Vvd9}pUgX|speZ9)Dy=!XhII1q1$O#~}l;e5n5qJV={4+0Qbh)N#=-T{a3has3>^( zFcZmosnwr+XTRFtS}k?JKKqmiez113ek64rAjEzWO|v?_J@g4G-;LolA_dAY?LAYN zY6?ID9ROOHtNq~b=|j(Aj;d4z8Uno^yB;va%s1n&OeQU<@8_!B=JMKUYbvgdsrQg1 zD;^A}_av~>u_liFly_7z&poY=?lUEh{EK(A5iQv>%HpNQW&7^{t6zOSfMII7U5>Tx zKhQnk>bc+fDkoX%2^$gH$3VG(7V`_%3#^Gs01PuT(pEv_NjBRHYw;f^n^!km?N4&N z$w-M7KPCW%xb3WNHi)q@R7Il#$Ty>h=NqkK{X;7sHMmhKA;R8IL_r<1k05<*?AZC> z3p&{~699GwALLL1nZZm(|92QmIt>i!yusB@uzp-kNjA)%^0byySZj(xoM>q(`F>E-bVe# zg`l)d-tfvv+nbS*-TX9qEd6~bISv;_6R6~d&2}txlOJ)@Kf)O+Nb%D2W#i0Y389dD zl(nLv&iM!jnpQm?F?|zA?oYX3>lIzc`z!7qACw#13{ypW-Motf0-PrQvi?#=d@XgS+D7Kv zxIG|sXPzlu#TQT zDasFro~5J&$L0|0nusdIgv%=6OHqT?b~M^Z`Su{t2}PD4k^Dx#8zBiAyor3gFZhbX zCr=W_L}-EEkQ2>~fp&))+6Db`_q;<)W{-OfXkr2M2&USbs8ws_UMYUa+d6Z>TYQPeP}_@)vD2O~f5XSOVo;sORwSHfd<3#?CKw zc+b(LzAr_z#HDCIAO0uK16d{`DMaGHWud&?-K^@HyMaHy_P%hx_&i+N@6&ueG|^}J z*jci+qIquL`iO>Z&p9kaYs+!5VORSCz4qr(^j0GGMOsGdk=j5gZ9QBKy~`K+!@R_@ zpo~Gt1l?e{vC^1zd=B{xUpa*>ZmeT@k3a-GHm#FYRG{=&L5Q(}cp469jmX zPo=g72mtPfXNoU(C`y!$A#N}2GlZ*xp;1NnR(1x$=~pj0(YuA$nZu@n-ugHue6wU&NVT*&}RaR%VelOe~hjdrqRtUouHX5~`ktx42wLE9ven`lNr_TJQZHqZB zAavex|MudgJvU>`h!67qoX)YrP|+`xKW+O?{%1an)N5^Sul+X+Ya6`#Dxv_>e}BIu zdsDQdhzkfon*+MJmnjX#%PR>z5k7Skq(p00^`fL-d;dFGGDG~7*{?dEdiAFBYBn-( zHi`9=yshhxgrUgs1+HeO4^66NmOZ#*hn7cp<%WF&en;%`9XLtz0v_DAz3X02PPz7H z_5v&4|Af734~ogSdu}9bbuzP_xA3WdpuPW$O7xpN+T%%31?iSDLdF*B5WjOI+kr-p zA00w^ffJ zM0quf1+KLJrc-XxJ9+XIV)GQ{uc$X;MOoOXAdP2Zee77u`j=FOXLEHH<=Rja1v^Pr zTNx=@KV2Ldybif~jH(Re?!J<7SUI|My7rxa8C2~<*v55zG~smZdgmQdR)$I#Oz&OWPx?(LDe@aCPGhB-w3%iT2vSEE53xlAx8fTMYw3ch^I!Ok**q zTKaisxl~qFfG21=VN(<^NCMS^>4h-?_D7b1y+7JIRTX?E%Tw&>jbr~lEOzx)q8nu@UjJ5M+$!v)e4P%eLL=m}qQil?U> z(@~A-z`1#QrfMK|J@9D8=bmf-{gDF|227HS(J&95hEGBjZd=!6x%L)X4BOdAkX_P|?%G#4)y%6fdkXA`TE&yS62WP2zbV{fm*% zlbPfu)&IHFI5O&i?wYo0ELp&d*1^{$ABEWw(l|S>e~W)_PsI- zgcE)r#wAR|-)G7tK11?##lH(}{IAnQN_t-JOej1e74}n}npnkUpz$HD#f`O&&d=o$ z{4**BKs{S1jK3HE=Sx;CV1Q!-KE)`QM>reU*rnB*8p=f$$*GOH3EqPEYXd9nTSx?- zNTdwo@>p=7L|}~hp)oW!B`8~CSE5K5NgZc%twA?(#n8{F ziqbW4N1be^ncG*jK#I-$o=>W3qBd$ObjES+z{-!TdgiGt+UyV9{DO@7F?^!M`u@p9 z14SNu;j?)0@{?x^XERjM)B3ud7#y&?0DG=@fSi5T7DNCFa_ihXooh>(cc@(LK!W$L zAQA9&(n{2oB0$Y)lG-m$iv>L!xJolklvbSa^5W^eb;-jCIvt8F?s=dSlAP(8l$?(R zq569G2pq8frTU4Fnrbew%4+sb>P|$POOVde2pOeU1eP>>zy(lBE884TYDw0n!LB~w z49L1b%gZV{{Gtur3ovt(EpPii;IynnVy)Gqp%^T}zP>rZNlF&RvZrxJbSJM%y^s!@k);taKQkzU|!^ zi;iQevZ%p=Z=&!52Lzjiaw*J*gfoeAutcIr z_Y`;-s4Gu3rVmfyG4kLF>p0I5lJK2TnAIb*{=~`yM#^;a^$ z-WqR!rcP<&T_^9oHA&x7neg6*Sn7s|0K3fac)EYLMAL+o2R91mZ`)W4NB!8>cWEBz zomp}MDW@XTpeJmnr*C^OO$_7h{K`GrUZ3b-|J)yWG7`tyH-~ zVjbGoeS84;A3ltpA8Lq)r3fK2lcq7R<<@%~vD@oUtkLpI%5p>Zod>||GgpUmI zppW{8CRa_bv?Eb#?(eH`!*aaO4?OuNnb|>?0|Z`uxtap1bwyx#fD(}7;JInlBl7UH z);2RUPx`{DzgALa>#;o%d+mE?r+7p#w=9S2R~Le)fM+8sp1kNeOzvC1jPf9!w7J~; zMsU5i9((pSPwKBV|^^!k(!Fd4op$) zzqF-5wYYE&^QJiUDjS6+b=rgQ$Rv&bX8P_!m##9AJ9|eV&C5rY?VDyZ!L1G&_U{KX zKmBXY=~II)$^K+m&N5jZ#)bvh0SnTt#Fng~X^cS55lb?e1xu39Wl~oh7xOzk+Nj$A z{o>C?h_xyyUZ$Lg@Ik4896>sOzuQ<#I_WE2~47ZJRAyd4?EK$~qcOE8~)zJk~B zFCG_XrLZ^n6z@I}-#~64AEP#t+(vo7Ec^ZY7Um;fN5MBafEe8fs&ryXaw`xTN#s1G zX|<>jV(tkfk`*tBw*uTL;gh54uG=VJj~cpP4k81+TJ>BS%~}; zN3Q_{6XT^H$H@S}gctzw7kG$9V*)@7JQMgG& z5#HIbj2m&BT;$xt9BfVfd^N-%AyH2o6ddHXTk|%9I9j6{whyI(r-`0cWGeM zYyC0d217Ih`oo%!-yh7}uSB5M-Lg<|L=C{}nP0WC#X#-Ls=|b&6NK?$sEJsC95Br3 zbsWlc&Pb~HodG8bijus(drj^t!8ZO%Nl?Mvsfp;r+<5Uwypjt@40snIW`C0H~W6S$Ba?^f<5od4y1xzO#JN^g-;^DK^a1n=vpmN|o|| z99?x(lkeYt7L0C??h-}1Yok$8ML?965~QVJqf0^%m2SZ=C@n~i25C?bBnGII!01ui zyWe{be{;5-=lR^%eSNMdas+80LF}$wCKddiWd1ed&yy|!g*NwX?tH&G(#~d}FYL_|m&rPRk`rMw$37hPzSFDrJi=k6JG)jdsDH_q-B z%1Em1UNOPj9Rc#)fZa6%Khdxo+wT@DG(^SNF)JKpuhv~VUKTl988=WA_YFa~-N6vD zFqbPgncFBRN7Yz=c@Qptnud=TmX}YvHqorERj!ttc^Q%d4r$7O2bx*m$bilE{7~aa zJ#^*1rWKsOU7|hZ^kMrZR5Gj0Zn##wE&8SH@dW)lW$W~Gu@pdC zMtKY)TcH@Qgy=w-O_xJq++W9Y_VTX+iE(?SH-5M>TrKdr%0izZOW82{&p<(<3oD|K z$0zp z(yt{X6;!0io~a^eZ}^B`*IdxS^)c8yt#V-M2kqKWPO*Q1Jh);@^>?(3@Y=}P>0u+% z6G+Gg!V0qig{}eH9DlBr6^4|^T-()LcNXl4NQL+6hR?N?q zTbx|?qXc@P9dad9q#>u)fx;vP< zk*4SNy0W8A8kJbJL4SLWpkYk{F~l<3&zd!3L-X^9??Y&_6ycNY@+Y+?CP&8iyW8Ta zrpbjOlco)ZRL6-otcojrE?(onj_UXN8XpHEr2iEYYr)Mp_fQ@tp8UjR z7WuVeFWc_g!sR}#<}*9&?$YLE@9oX=rQ}WQZh+arYt#gVF8Y&;={F-(MGLv^e^ItwAaG3cHZvaSois}>-( zC&UUQhpzt^B(>ZBM(Uk_A84LS5lraH#3OS!fXoPD_GOQo&x;%~UUooaQ%F3XJg#L4wsKr+~a=I!{M z!R0&GwP#!SpB*1*eP^P(7-#-nEUEp6H}Uk99~d3c^3~?Ez?c1SwVz~*kl#FpZ^cpDQ9Dkri3!H#*m2 z#pbN!x+(H%V$gH>sJk5bzb|6zZ2)MMM^mo7aP3jUbGx${-aJ53e3X`LD&V(}^8Ji$ z&BwY-w;CMpXX;^X(_@T<+{Q`>g3iDjCx&X519c!}{X9q)A@I*)V`Zv_*hfgbXiO9p zR%x2eIModzj8f^YH@@lBq>eHTt*>9VTDX)@CgU<&A659g6gSa*p&@&#{;6s-A6$fD zt1PD4Rr`-FpQ-|k?;LujQ+?NgUvm?0|3j4QQ%RF5cd<^Lw=*MdaDMCMkpL@8gV1{r zq9)%qA=bsTwk`|?+w}OW2I{=0$8Txj#(Y&jpigjVpnxUkAZ#EU-3?j13z}GuFRn4I z5v|L1_cgqVvQSoDW?BafB0Ig_QsY1z&MnOnYiK&+ z%Fh^&FR%JX9{PT;{uOY0^LiOwZ@t-3ea*YD?QtLsar@D)-F&lng-On~B< z+Gm57NTKz>zKLqEh+Z<{yL}`Eggk{241JqKO2CcngazEw% zyU`}>KhUW}9ptWI`>$|@F_d`Oh*au0_=j;&U6!*R0#_RMv}CY)0+MR!`%%pmgY)v5 zy@o4<>3#2xz}mBkX+ya(YmfAkK*a1E&0{#J*-VDrvS}=Oj-3wsz+|(9oR0DbHpmm~ z`k?|Lb0=1-t3L3iS$I!TE1Y6`D$$fS`A;0GzKXH)JOVo`$*8@ltN|%3RNY z#Q9UkdLW?BX!{XrcOamVD*6sbVEQyo7vJW0|FHkT8)OIf59EAO>waL-dZ5ZzHq-E( z$7Zj;d8tQFJ7)v23PiPj)sLah7U<)5+&ce0-X{zC4;Dd$!5UT%Bheemyr;cB`s#2} z(TxrMgG@K?-EGQ^x8h_APva*yTKPg=C|Lg28=M3mfu;}8T@6<4vjT2bLu+QL577z_ zVo#TCs%g?}+n%>!7PZgCm#EP~M!CJSD3SvZnWgH_K5@jVNA8hA`*}Qa63*le``UIyFry29OLk_bUhIhY zFk(uL9%6?d&h(2Bn|b{&#R`i;f_hMo>-MXOD)yF_+;dUD7W!bf$Jou^aS<3~yS=6f8^BSeScK!Lm=d0}Q zF7wjjN8wMZoK7wY&KIj*D_5ueO`i@aixaw{%#w{yy-hKilAHS~ME4+vj>Q&=%W zbD-(aOIRBy1Rg?L@8bh?r{Ww7U{nB)QeB*PlFt$cHXarOW2e*d&RwHGguH@$Juqex zj4u|v!|-Qbs&YIc1<$2?|)8Wol*jeL2r|0pxw<|P&WsO6_?7kAUV>R6XSFop74hU0g_ zMPd>ZkIB0elIsP8rJz!eUz3d_>zEQHcu9$*-0PNa{zQ>9_5%u5ApROk(w5z3fs_GGB0?2Bx20=J8L=7;Y5cziO z(CzmiY(pI0IqSX_vWlY9_nem7vw(D=(M_gFC;5ixDE7ic4@aP971@NVP4jC7eo|Oy zettCCbxpNe5Ng;Il6HiYI4P97IC?(jUQH0`pj&)gh$=Wf%7RJU%t--XIXZz7gn?u< zK@BsPc+oM^#YaADunsawQBmCrZlRxC1k$fxvH|X}Au8bGHwaAwc=$NNgj$|I~|101JF`kZP1I-~f96TbBw&&;&?u zqc4H>27B4%6=`Ok{k-U8z2@W&z;j6oXd(Ab-XY~a@$v+R^{*Ck01BObfpax$ziPw} zs!_S`;DZ($%f01+r|U;*6PSNr`h&dY^@+A?deVJjeuu{VPd{7r0NOi)d-RWfs?}4} zOkaE>!vE}f#`yQ-k`1K95aLJ+-8l!X!l$a!qSSuRGb9_N>9r_h9stf@vwo6@+Xbbn z7b_P!%gYtJ0bUiyE^hS<^}dYHr~`1vzUT^dvct=s;{1G2*Qb2@&@VELGt7l<90dV*d7D17NzIwg@wD_$ifcQg;>=wJBs7bp=RSs3??aZc{3q`ZwZ}-t){P5$*H}i!=hp9M zg>Fz@mf0`WGW^S%ruP!_KzEm)t^NEj-uwBke%@pF4VT%J{;ej*gK_rhZQYdKExC1{ zi(zs_t&qS^cHpoUA8GYv)kmY?_mO@?>tw@jgEziExaI1CXoqZLwdIKbujE;!cuiFE zeOiN|$7W1q*?_`MbsCn_)c(YG+z2B*mR1u{ox#V26JgA+XZxpa&1Uw#;4YJjS1W*Tv?TWGjDN_UynBByGm;IXrGR|L$x-kS@2&(a; z(m#R~V-6cI)&S_PZ~lF)*mA1Tt~*f|eqT*~V(XQN4kJndT(+{Y>Z5aWv_U{=kY_bf zH>TnV-CJXkoj=BXr>}IWx+BCikcI@P_L%{~Y(-mJUIAbrEC7D61cj}v9=~n5y{_h}w2pEJ;3)srr*~$r71D4P%ZaCyTh~g9s&weCY!H?* z5e9H5DVg!jcB%>*wP=81LnjW9vb1opi7}w%$)$5T!aiZl35Kc{)iKj#?I9Qu0`jC-}bszXtL`NRDk$~zqv;H@*N{Wnpydmp{c2GL!L?V=Yv zro#W_nbCs?8Q#V7wv9X!#xqd1VrqPfJ~9)8XeK3h0$F9GT7TK`a{mX#2dJ5xyU-(N zy&wGD^;=q6T6c2xo(kmW*x0z^z0c!!^A!04 zdbK>UxvyWsQcn^jqcNW^NEy5eZ^H8y$$KmAG`?ykUXvm4-(2|Hg$MlDjWg1d zCV%cFHr^{-GK?b+yK7V8-0O%Dj>d(ibh`FrxwYb;(n#$$_O zaQmL3{4B4-6E%i81@u#9ihWZy2~xWg0@YP`12uNoX`aezS<*D?g(KUH>r(5kOP~oY zajvT$drkR9krCiSg7rL`f@BP|qN1-xBeAv=#UuI88+T$IeWg0Fh91B3D@J+F;= z>s)@=wI2uBs$P3rR2TjrcW37SjsMrpD0Az+1$|PVnM}{xiRO{!1%hVeRL}pNe&6vc z9gqE>zT@N#7{Xr$g6)U5V z+&{!Wq%&X>T(8hBWHYy=b~2_$u)N+_+D+?X`yc-6esb&DR0nI)`iVH_pH*4iwVNns z;jvOE@8}7Kwt57l z6Oi6&;XHXXvp>m~TNO&$n)33j=Gh71?#;1egs&lQPwy379!6VVgG%$TWHrGD4WA@K zBGo>H{QL*QDZRp${$MDIkNw14BvbIT-5hc24uM1VP zsqF&kdeVsEn4%Jlhsk!|#GoETU1@>|C1g@3wlT=o<(fW{t{%FJ&bnU2WXa1M?MVf^ z94>iU`IQk2h(<(F5;m%YD0n=(ksy~4YoW5?Q>23gdj$VLPLmM z2O#L*X0??FZQ~X#0ij#*8?jG9{hZCY6L(^E0CL zyEhAWd#+=rSf6sHtjZm{pOjTc} zJioDm^vi^(^HBd36F}txE5tj623!K-I!e|u{0;PZHMeTRXFZwr;KzI*_RpY*_xZ8< zQ^kv0;`w2W7RzceJGNn{C-2nz|Ma#Is|ig0v0I|vky>D~;{U6450bNCe;mCu6N14k z+WeI1;3(iRPpp9bb_`Av6SEUWykro5H)!u_FBtc`ZBpbm(~DoNOV8))$2#G5aT7=f z_aF5}$$NXxo6o|d!g!N~CymT|D@MU91>Naq)PEi<^N?S+du(oOXv&DQeWO1xO-+q| z?k&i)ly4f~_y22%(cu{95cbB*%=0(E3Ya78&?CM4F|U9ymgYh4$Oqm{5tQ+Z!3~GH4M!+Q%gfNoEk$ zlfwZw;BKG^BXRJ*HJT~Wsj3JbLq0k4VwOHPp~#kK?|6n4#JNlngdr&L(2$_+_nul; zzYY5``2TM71|vB~hoSLPR+d``IYy>j$IUXC9Ajm2b^(X6&2+bc>+%4q+qB)d1^v;z z*9lH%e=#5LGY8o}cWGDe0+GI@>UsS~%RB6kWeH<$`J0a9O(=@$>#OMuNNeB-HZKSIM)ZAoEf5)|xbDkza6XdxW~$ymRo-y#zH~(l2XHrEfbO+N zwGv1VUw-^=aMRzbWSa1&Vs7% zi;h~|YvR{vnIRs-i|ka}Y-!(RmHE=<1l}-ZxW>rLzZ&{xN<0^cEX`Cnas(iYx-(B< zP)+|qUo8#KL5?45ymhR(6c9e4XvmtCBA5K%SCF^e2;$$8Dp0I3;Jy~`Ftwz$YtnVz z=(!Y<(A<1RdM|cO-fOucouGXQ_uI6faJ#rwo~PBB6W#gqdzubm{$!L1^BS4;lMw+R zy6IXNuPu^OKx|hsAGbpC?+eK0Gp^cxdPuZ`fb1BkfYK}s9G&0_HoS3S!jCYbIn(e2Fr5A1w6C1Mak3IcQ0~|;Y7Ixj9rGH!=1YpAmydLh2CJlly3=$P zJAUDdg~7E0;Tg7aP>*l0$*VXJ0y!x0eGzK6;{_1B?rNT$On+r${n~3FltZ&^o0LVW z@3gz>VFN=9lDmT~nMB!vsmPmYUrQ-IxZ2-Iv;T{N-*VX9%;S6&@s*y{j44H`Y54uL z99P43L#>CYQ~}o#y~x|ew6nR?fp`;>9uZ>i^@i8yo~E^Na%374dIojU-P z&!xj&f3nSjEMC=b9X8wA^rTSo_%UJ@^aj1pzjKF0cyp*P9m%TyIujG;MnWvcIr}zh zy!z_qudx?J;C9(crim4c#C)y)>cTCl1B^Cf6e|3?s~lDAMlk%<`s6(VC( zdJE)eP%70Z3GNpDaZb3XLp3&KHQM}HmxvY9q;ZR4sOOAYObr+cjn|wKq52jn?kZf4 zP?4kFuDffR`YPTRMS1Ai-M(zAbD6{D76q#1~qGru|>&%Cs-r`kpojo8?4qDbvOc%hjZQ`ms z#-xD0UhGcT+NNsRBu#N%*-2bmMN(ihyx06k>&vzV&1U48yVX}1EGtf7F@p|k;Ixc& zHqL8fSyXFpA?JM^(yJ$`VOc|_Z8D~b#XiH$blWG*Xt8{VTP}|kH-m(~k5fpNnbF`j z!B`f$^h1OKs3d5+V`%PcUK6g*gF^gCY~Ih3c#ZC-K$1yUcb&AnJ^D>OfxM@34Exn= zTD9<0J7kpQK0FqMWLJ-H7FG{WO#$T%o@||dRXkhtm^Re-L7#cTsT52Yt_mHt2x+T3>y$nRXxY3K1^T(=f|y|eUsEMX=96UQlDBMt3<;#j zgT~EXDarW;U$Hdwb)vsChasWP4+qSX!U18LVNLTm>Z!ZJiu0R2L27yAx-oxo0$4%?3OGkUVX zg%E!|A5C$-HUy>Kc*jTAhpC7g<_u`F7Bzh2eH~O8(64(97x*?Kl`dd?53cg2k`*%{IrIxxCl1N{4O_tjZuiBbArXVxfCdu&Z zj~=?ATI;kCvQXB^D%r7VLiSI`+EJhbxEvKURdAxNjCF0&*p%nNcp;wEk`e491Ub5q zfOIL>kP(^2-6Tq8wyDbD6g}$*e&rkGMedIm^4|~^!tVD3b=q)QmUSicsGY$IXd7}+Ut z^Om73$dV1X%~2#bbgwJk3Y2+28m&m$-7Oc#y^CeM zitou_hCXEIM&?n6T&TzqPo(t!-RLyk0F&#kv9hKey(vHF0Pfwb- z`J=in3;EUvx!A?lu`jcCo}^xzsJ^SWu3AlTyXfLRaq)In%hh2bB*wp>7kY8#;CS5i z_1lS!B!hS8^;A9ZyUP)9MGgXz@{DcOUN;V0P+rFu)Z}vpxe?=x4AG>j)X)p%z@R$a zD0T%tNTd;)ofEj^afx{lzqqN$Gmv6R`vK1gU`K>xn}n>NC;v{t7f(e~5A|NOL#!Wa zO)5w*9Buna)mX^?J^j}0cuiKxQ`s}(*tWX4sG)c=M3)!rpqQU))HlDev3?bqLgZmo zH2Z7~uUYPaJ!LgFKGS2G*m@+ZS+8R;TP7Lv-FaI{fXO;)?-?*UPWKJC@rS6Ko0=yt>;Z60q?&Jc zBys>}eXv~ml1u6dw4DS2;3AC<}`PNj&yf6|HJEF9EY(_RR z&48oFT)y~>_#UeD`g}~f%;qWTJLS>q5GQ(vv=r^h)?13R7JPP(*%}|w=tsv+p*+BV zJ9snG5#`lMuYMjflwmfR1ue;s-=A8`)6tz(fKp|A()cMcosc@H? zP8EzH@f0Byu(y(2(rZ+k7Mt;;NnEV=ZzK)BoC+#4xizb5igMAlSnc160(pB6cNoFY ziH`)x@OtakQOmUQM#7lFIFshF?pPLf9PY}A9sxNy)kLoVI1tl4wU&D6y z)aeBIC`A$+J6b^4o{Z%n$9`VUrhiCgeUOow=g>LL<_rp2nzDNPg_8OrUuMml5IEA3~y=N z?c}=aX0BM;NR~Rqr??EbB(c%U*%P;q-+&8Y{#LJPq6C4L?28%Pa(zrvhf!6V344t}5d8sr&l(cW}z!?_S5@pioOPdH%p#Upfc&;G1px#w527ojX| z^o*k%Ai!^h{b^?Q{W@8c)(!t^Dwj3#P$OsjOrv%&X%)C@qR zOA)u9fn=Q-vBRKtMzs;Bsg?oux!iyB>_vKs97jbb1C|%=bRKGGWDZ))yO?iB+QHubLFF04xk!;KKvN z4=Mv*d!LPX$903t@Hj$pW}jX^?T=WpuIVFL59sxmJUW~VPJ${PK5V|mPk+S%?ala$ z;!_9WSm9B~WHQ3V3Ms)(W5F&8ulHmv8vsziU2P3Bx+sF(^^2E4V)^CF<=~UG@GmcR zzWDW};&%zOoP`>KN659rU{IHi3v%g%h zKpe(OXYxA!7D;;3<&F)|CC7{)gnIA4tWZVcF3(=$@BQm6&~*l13LUBS(I?U&Gt8tFXZ^n#F4s5nK#EP?lFOxj@6wt_d-|K38HbRmJcL882+SCe zdqV2^VPF}EBKKxqi3lfIiFirU{5hiA2(@F|o>nuS-~HokWgwQZW<6OzV*N;KV!Z+K z%iHtJIqd3+F(~kdC1=5R@*22lRQ_?>3l6hLmy4{mdA!h1{F4Y1O$tvY+ z44myqpHf-S(PvQbcbj2~Bd7x3jGPa}wZ1r&W3Y=K3T_U4+)C5=GE!3*p>^}kbx%<{ zJV^oaOca0UX*`q-LgxVE!q`Hgw;R(is0q430IMuje{)K)I~bp6JcKp3RuW>_m_F{5k1w!A^&TeeshY ze^J;?jUtYE%;LBx?l|@%&SB2~=`x(wmiw`OPTGjqSWoQrL+{-o+4e4XMP>TqSw_jg z@D|8(mp7#!zJjp&a=v=b0`haILqP(X0+tYj+&>yyCeYry~c2cN!O?-k^Z9yd0D_@y9!B-9b z;pLLVCQ0mP*Z>5ZU^Dr#=BD&@!>qdtEG0DNsap{JklIMHNtso`NnwV%T zC=$z?J<9~fH^$hNiIBOoTfZAHL@AOol>XCq;J4IIsuNI})u^(g>C=JwYN3czU&&6h zEF~9eoJ$`Pg)Dtcspl)H`K{DWA}!{Q1QlMX7)mJPUyz{KFv5F?{ee%A`&se6I*?~| z_{52C;&YZdB+S83U+Ay$VVimFQkWOB*tGJ?hO;EYTbBb%OGhW>cb=Tsb^n9A_Ynx| zvpw5W&IdKrD39`AZFgcj$qCOqPZ0Pl8DQqYVu|AQl#wRuX)v{D}4{Ij?E$_PG3J+Vv96mgHK!g}*c6?n3p?(u( zi$?ybA<8W1YPmsK{>GNfE_&7ubZ?hdxLDFUQZpySdQKD74t`(%`6*o@V8gWnsY%(1 zT*}<8^Lh@UG2Bn?B_{f?%0Rfk^6+@(q#6tc&@bBdo4~^)j=>lVGXD(Xy2v8FLYIP) z_)3l*fGoFPv3WklLFc+~=`N6`!TWUMJjj$>z_$GatPZb@c7cRl9o}m13Klk2mu4j$ zm|Jzaxc)*dHYgKrQ2Q|w)5S+SadI1-Nrdq4&`9&FbWm-rIEg{q2ggTgX1IH*aC(Cq zy@X%1{t{V(9G$x4Op)qXdur@-BX-vzz69A~N+XGy4HXDFL(T%G%R;Q*G)h2|mBD3t ze#PwB=vVMIc%wxeFrIc4X3Sz-aOfx>nCpE z>d%{>|JZXp9qcODnjpQ%w%C7YXAY{R%Ix|HiAJUo1OPbb1sy`#Gk+SVI)_7X>Ez zAYO^l_Ku4CST4XRIpW^hUB+1b%UObi-Z<^=9^6|u0!%)$CCWhC#I}*Ee_~rsg(C@_ ze_A5Eg*-bu-lCBLoho%(HOIR?&J@-CCy)`J7iW$wE$$%o(1;u3i7>Q?itzfs@w1nF+lu;5|;qy zyecQDLai7IuS#h*({603R%*^ls#tTQl-MQhDW9Jwl1tC|QOElYO)9He)Qng{buz+G ztKAMbc7!2RHC43H;_QG2Q<2at^dZv-j&1~S{bBXUb#4KY{SowDQkrsR@VDb-l4p?n zuW-f26ZMw74>f(Xef4eetA(D#4U*G{vWdw=hws;`P@(t;VWpVOE<2!-Y?R2LV=Y9@ z{PP)nVLR=^9MNIw!gN+mEfZ+lijEiZbY&UG%3KPhW+nFMa=HdGGYTID0Mu1;CEt}| zU1PpHn@(jVcSZi(Iua%rgX4>pyY?gDy}iKaf9XO^c<^`|$#hGGsF2S^wO&2*7t?1R zz%y4A``!JZcp+i%?`NUFGpO0$3@D_?<{vGuHhyHX!ZF(tW;)GuvOh*7yDv%8mFt?) zIY3e5=_#JjE7g;(D0G)}Y{g~ZEt9{F_}00y(!dQv?(+#j9Bqo78y@_RRPRFIy}6#_ z_rl+E?=L2_=Pswh@6a&DBO402g`*nB9eJ}f*^>OsTF`eS=($$+OzbCx}aI{0zjP(FTFB#sN6MyZSS6jAVpKum0HK18Y zR2dlsvg1kQYED=%g^^wIeM7Uqs+Vm!D&uofq{_}-^*y|B`z8N^g`sy~`f_1+ulRa` z4TvoGWN}?$Y`fv}$$I1l3E>`E%4&8mYvmrn%PcTcVa<%&G|3S};F2UrC_t~Czz~dA z21M{K?==Ir18N6rrzdLJcM+oPFP76SH}hU)gR1Wq&2n)kop#}#SPsM(|A`H%!G}kAq@jqq0 zve@vfFnSqQ4;F}a)OuM-aK2wg5yw6T*A5Eux;A{O(!c|c2!+6}vG1I(fzQboR+1q0 zP>3WW=HgM<(H|XkcI-fZLrVl+K%Ecs?K0kH6<38@docx7Y=IOKmDhe=9zF5DxcftQ zgx7H;q}adj#eXVQQkk5H_hl~m)s^${JmEO3ZFFRJwh(j(aN_6wY}CCr?q<1s2QqVO z-BJt9W7X(--Ls^1U0^O8f8l7`0i}SmJrj>wF_Vkzj7F^Vm$TB*1fS8}Y*XRe-!2=W zpBx=(aU^0YRP4N|$-P*Uuhyp7`3lfC!r6S}3cV>LTz7PX^mNfGaR`+=l+zja^pmUj zL@QAi=6tFQGL!1k+%J0hC*}KMzi1dYHd|soFiV4pgwAKXKcKy^le=Gfke*5o#;-Jc z^d6=ko__I}tAX0@?sM&#TV!fDJJTkbLUj3uh(0Ze!d90>uldznm~R^)GBqTii)T(6jGFNW{4m-eEs098xY z7@sWh(Ve#_Cx~Bdur^yk;Uay__@@eqOni|0mK~?9990E*0(@SX>z%Ew;ba$Bfu=?n zi)2{gTtXCeu_2XCWbudNGB~{K%#AQ)oPUn>8B?c9)9bzF8@4=_aaCU8-Lck32V3K8 z#BE48gB!p4yb`FeU6Q_VFXxp+fJr~m@hJP?Hh(ovt2f*0ivF7Z5mb#!qnq`p8bX> z)}CtEgVC_4^OI62#BRxwC62t7BSqflGF(U1cm^#5R*o{I+X-b>++_K6aNrym#N2K#Uls<1E%Oje!Nc zyO9bN=t+vEvzBlMj!kr*?FYrYBwA>uUxYEBvwX81=| zI6sGh%Uj14nQNbCgLcO|8ONoQoaKL}+w|57|9N!jBnv7ioPAPP?_9Y_))OB72RCgBl<?f6sO$QX`D~!e3l#B{k}&x(qnT3z(&<)pGm@eDtGVvKj3^4GsLTqg?mP zZ>lus2fpIqAR_i`-j|_7Z%!3CdWcX9C^13w9y|V3J|vWr~{Z!4xBZDSQ& zsruDa;6Kr2dbBB8l4U$$w`@Z@yE$( z(V+5eg+T-9^or||htQ)z70G6C4pNKp-X9Gv#M7azC1}lv6Y0wyFtHii%*~C;Orz;u zRf@*`Ewc#qbw2HUqgbWT>o`v%s0p|t#QY;so0XAGy zY$j*oJ#pMhL0|ZIOio6-qyBp~`cc1c@td|-rO`lX{xnv**-+a`mM0mMyxkUmsrEpx zaqDf`xPc_7kPY?7dy$nC7cED9f=9b@|>p?DwL0b zYEeuEzhz-H%E_AKs<29TvHU>)(wDwoLOp76B#rk^uPE946mz$`JFkho5#<&x*%ZNE zRklJfmH<3~+B($hdzB4i=?hJ3N?uh$fh(GU&4iWQcB9-=+h(u*^WD>m!hym4&Sc7s zar>pDL3#}lBjHaR-+f^O=sEYXPS0=A)yqx_^02JNeNlARI}t9+y*(_}mGaM!O@d}6fEs3EfhRRn_W3S zFG}@SaulRRjBHQ&1Tb$qKPqw#5c==0S~XdCT3YN@T9+=^bM-F>paM2pldN z@~91a_{~NWhMryyTCH3D*|Dv@40sc^Nn;sMFQHpIx@()Q_Z4-KJ5wThN1Mn}koU7c zuAiIVrL9dOF?IHewa;#T(%L%oj(~S7vJQ?xx}mJS93bv_L3SWFZWS}Y7vvNS_ptsB z$=wJX$eC}llxkpi=l;w`m#FzXiKMt1sS$G{(*9Ny1$C6ni-doi!_=tvpy7n=OrrNz z13OXMEs<>}&`sg@ifw=la_qo{5;ddc`AVz05LEOEcG6kG;9%Nmnx5LWm(_Y#{Yp|UJN1mm)>69icM&LIxKK-~H^ zU(W%qRUx7Vj8okqAveBb^#BEuJLFS_ApCY9*!=1Wn0|b`*L|;lG6{SNB-h*lEfP#5 z_dn1(!v6!Hy9tR19bT&-STm!{PfK2yX5ZMdDvIUi%A=>tIF^GGZzmvCcU8kuz>RME}0O>xeK(zk)j;F+i$TzL-8TuLj)|O>~i2pt|7k99ra@UbRV40uR=nl@tUIQaW zkY8Q06yxK0q`YSrH?QEAb~>|_P`rvRBd@g_)LIX9e~T6^MA}Gzf%gvz zn1iohUj%fu_ZC2xIwEPN$0*@w`CI(BqNujO7w*sw!G}=Jxo=I7+lyV-Je?epGM=cW zpWYhlQ5h0m8(-iH_qJy7-Ls4L+zD=cZ>hX-lLRH#AWD8z^Rls2nVwQbu&1eWpzoI7 zT$JvCSr_qyeNGxPrDS4VWq@q%~#UcqFbw?Pm z$a+wUThpP>8ac#;dl!O>27W%2?T8HxJjzB-cqD{bi&SnaWin3&;!j0ulIXBKorPT__hCVV_Pu=hS*g{nnaH%nI`iomc7 zBIm%)_XUw>rE967L%Ay{x|A|e3nKAzq2o34n97$Ldd^Zo!cWIp5OGmK_us4Wg8t21 z;fzb!&tJY^dU~kuq%yVBUH=uMb?juCu~vaYWz11NPJ@XSF%fK~nBw0{izomBM%vPK zlI*DwRnC)GRaLe3P$|=$SOu07Oj%W2(DPFKLONTU@p$yw9#})V?!mp{i6-`3%pb0i zso>UUq=`OivfT%R=hAK0&8XR1;GhMg}&eMtg---q2l|q4nnnCRlnD zBQLwd3m4_HH~<#fk?zS>50~Dk{I?~BnU~?T#Sn9aFBI~@q89S443im8G`=<8tqggg zXM?gw%oQ_KWML#hHc_SkVYdHE%Ru~n^ zgmxuuGOjTy$V|1VRP5I1LGKVyT=*a^Mf>J<6E~;@8Ifc(9Y@5Y}wr-1@-oNbCD5)Y`oZ}fTQ@8O{mwk7E;`#=2 z+(xwRr}GwzfHpswd>7a4D_gDx;)9yW%!@%H|I2UncLbLXo`#2W2L=Z(|EPEP;_f%s zTr~Cm{?3J6i?5AQV~*(<&(nKwi)4*; zMm$SnGm?gw^>#4%nlgb!kRB%-Jab_GDsi+Ac3L@lU3|6V+vGcuPH+dhP!-USgBUCt z)XJg$L7gp-81Os*d^P(sQT0MQIw~ph_`MiiIf0nb*#u<#F`h@pZ|U@_Dd*4hg8r5T zZ4`__oO^+bf+?3djC%i74s%#8RQJxiAIwryckejxo)Vuf%aX_Vo$f@>Up={4F5GEv zkPX(mDXa9CuzyN_G^}n}O*8w}H#g>QH&gM&GM^N;Zr$thS`#P+scO4n175mqf?%qr?O1*IOx)A;iS&xFHG!S2o)PkYH9s{Zz zXWbJ0KvXl!u}d-MNy*T^hWtZ?IFN|awkAW=UA?lEf7oo+uJ|Q-s#G%$)4UvR{cH1_ zXp?HvHuFRUaxw8RVeOh2WojvsLb6u;Wr0uO{-qhtN#Po=);9_kO6QB}JfJp^TNWbt zq>G0ddrtcXsya>4Xj;&u%FG<>99!z)vgC%QfhLYp}5yT{TLO%a-Po3 z{y>gq{73|_`t2kF-@5n$*GRJ#)X=QZFdi{OPq{b*?p)GG683`@kVL=Rvcw^?{g+*iZr*tr%GwM9{;d?$yrD60CE zz#SbKGUf|ceLul(o(y$HZeApX;TCgS5BI=A7wnI^3>zY$KJ;bT<(`4x?|YXw#ZO~t*X!zH2zPw; zj$yw4U+;L!?DEX4vZ`ECkiu1f`j*C_y&4E%aDwCadqHhtcF3sndX1H)WR>}G>>Hp(~4n}KLSU*b+OCL&IQZVEeV~@cDJco7WH~shKw5hrpa60DK(~~$N2?{?0OBaytUG- z%*9x&K=t1#v1{x>d-BA4qi?cPFZ0Bp>)decf{&h{rYkG=W|2Ya*nn|q+@W{jsRCIBp^tFSb}VF&HO=uhhDFq7WNJ-5Tz6AO@m z@{z0GR79}$R=6qZhup!#-I7ESvF+}=lPMfPQqF1bhinfL=d^Ls(kZ}Nws0qa3Xr{& zEwZ~63uZ}dP@_M5z6uPX>6|W)2{i`FUIL)!%ocN&))VMo;S3bc${~cO{;e${T81V1 zHfD9L6)GgGOuf@|U)u7kd?S+y+DE+jg;BppUgE42DbS1<#cAI&lq*;1=lgh*na>YK zf;L#57S7@obTlBvz4#Yz7q5~5#W_>_`ryxysq~p)Cf;qKQO-E>21x-6)5_{e^wwP2 zx3PcT0P8`TIrrHd!bE+zr=*@jA6k1+xjGX_D9>AAFA#v1o@`R+Qt&C zGD7yqZWCLie%6GGo!$J|)YMcIV%0`1IZ@E*zr=Ol!;B<)yC%{7W2Fa!l^>jm zb5x{tZ1ISlZ0_k|5BTCQp0(9%w?5FQe%Uins;lUeFr&!2{f&OmAVufVUD!|Z{U)yw zbeG;RFz7M=s8;~eooR|4d&SJtpBC55o^JwhlaE^)kQ=-p*P#-#@+!STPp6Gui$Oe^ zrQ;+0fE!Ceh25p2dM9-IBH$rCkncgls{&iP0l|6gYGVUXl0P}x18K_=c*u~ao@WH1 zrdTz_OCRI?Np>EGPv1>?D9yfCQMBuUk+Llx>no#l?2#hGZ*WxVUcFq^R!+qy_j%;W zNNk~>quU+{@ht@X3$sY7m)}#uL5dZvges=&fS^MFJ?YEv%lD#adio8tW9FL1gKDnQ zi-2EH+&S6rwev_O4TrNy8HlwVm^I;=qLyp?Cz&pwN{IrUS`E4MU_yh}1wW1g>Fer{ zoiEo`|D-syJv;MT_!0tLW^5+n|FLlXvdKom50;lc$38pQ@B2hz6!^Q&FuWw~*+xj; zq2X^u@rC1HvgL)Ylz=T6 zW>Vffpk(z&8ZC?w+hf^=JY(H=R7K5ulH$8UBUJp0=F&NYTe0UWp>j(VV@Kz{k!>!b zw|N~L)kzP;x#FT4PB14HMPA}_WCI&%*quE$Ww*OFCmA#+>C3MLAg;uD8Gga;o%gT$ z&qSqCoS`~5_tW#GQKI5?($UX*D>EHTCw1h6RC0m}Ria-Fccb5r1b^CClg-1%?K4r|bJG};hLpx_ zy|Ej6)CC&}joz z;PPJf`9Q+!`05^|V^1UaHgiQo+L}1~!g4E)hvWyZ0&hY$HZ}71$qnC9)n`3!)BBJP z+)1{PKru-?WYbaumiTy$X}npvDjXj#!RP1Z_9xDb^soLNSaqJ}1Ns(;oAA=2p7|jmbgsk=XeW z?($iZC;g?=fEkZ}zf_5TU&DhitT*+s({j=ujth&Csp-6vDH)RDe5hIdUUx&uqz=Rv zJ?)vhGPFh+crZ@2uy90Czt8HE4zL=s#AkupQeWuTc4?9WU$)qfOW(Fy-*bp=GFOCq zJPXO2q}khO(VtgpcC?Q#DqR)N|K@F*pcQVJh~@nze2@^9GE{kIbLj6_{Lckn(@>}V&~53L_RiVAsk ziR9iWevDTbBT%-wf0`u9-wFL>TJam(u$FMyT+5AaU`Sb~ywzhC=%|ZcUgV4&Y1e48 zzC2TVtX5mc(XqR`dl}PJJ^!-sO_s=z(fj=wdGQpn#EwEQIbTi9km7ka2+NXe_8imV^_;4u7_3*sa;;0_}8 z$c^sRG##OKkO$M1bwk4X?fDo#@G)T(nfOX0yfGh?R2+APxHyiJepXYzaI)LV7&)iB zOV+M-|EW*ON2^RxC2E7~&mZaQ|F~^rB<3MKJI(VQdG6Zxm~idMlmIEoeu?cX;@~dQ z;rB$FuEg0(OUR=?kYDJpmFam(ydO3*#}0_5?@>*)rVl{0jjA^l)G$#48i;ieUP2TJ zN*Bu7cX{=+H>NvlbUNK!RLA^hn{mSv&DxUmR@lS7|J}n*%K-{kXxsDGiO!E}1jV;A z(~k;jaM-nA{P~7He&vt_%sAS+h$ftf`2)E31og-P?bEKWLG)pxT`4sep4gwSV-#iT z81#j60tK*JIvCIbCb0IrjXv;cpGai%vAk->W9H?^Xwqf+T_mwjBJ#A)B$nWV-`MvI zkGv3w90?_LT0Tc))I0U}j7efsGnV?VPBYe)ss!+tMT>3!POKzzXabLVnHLmW=)o0W zpxSP8H7?CE$a_-9-d-uDVc9{ATzHeFuO)W~w_(&5zEj1}AyY}B_sOL0P0*0kEieaF zf-qFUQdcW}bxinPO`#yeM7TM~?`53%oBZhw4ANbC{hFrvzl_+;xyY^D4J{RQ%GWmD zvE&*)leqrOP()%awJZ?HXL=kP*GiSneWxuk5BuLDv^>YXacBp+^F-Sq&Sm0bjr5Vz zC4+B-v2GlMa=di@p*71%{C!(UExTurs3f(O$xmmlm&tI9MI$*PrU--3H}imstW+|C zL8>(Zg&_=iQ#rgR6F;Q=BsOseG6Iansjo3U?!n;_e(;{1x~$_psu1FaNywKjdWVC6 zZZywH>0i*ko8b%f7L0O?eKw7_TS-+9ex~ENdw@6mh7F}mDio2e#VnbWs`oe589KvV z-xc{wia5|j%;}sRWnpKE2n#%Q6!Fhadh-JlIIT2+`jG&~g_H$WQYN@@;e`#iVuiEj zH0zl(%R)A`!Ay+6n;d{~2e#yk*w|Ta&35d@FvYQ=mUwXdy%nmW@7MU0AFLM+t9wQ0OSj>S?7e3rIFHq2#sp)h80>aKzja z@3SGr)=0%sakl3#j}k;s0>S5?<1J$BIteMG^Q3fPgButb6(ln1U)uG_h0fHE6{Rf} z;XHpy(P6_#D&54T0Q8TaCa3=5SM8^UtUO}PhtSocr2Htq$?$y?VPDx3@CJA&h{FJ@ zWn?%P;Px@A0FoHa6W$*VuF0+DYN~nUbo(?3cW690=rJa&Lg|C(%G{fc9(o-1;Wbhn zYWHY&CIAA1QD$f7)t!9flcGECJer7R?l%+0Pcn2N2JRgUT~;+4vRBG=G`mk3QZDs{ zg*Q*Zk)2~_V-wa)*Nv|tLb1fUzP|6@-}hpE9KI-N9e8UqM;NeW5$HZ^(5ac9j$su*#3B zWe&Vz=hL6wo`HuoN`k^uOxKAAK48o^IpkG~>1sA1)lOd5y+G#`OK*j{m7FVk0UhgF z62J_}q=Q+yA!*JMS$SAj5rl&Apy?SFz1WB9a~m9gNaM27m89f5RA+~~Xd*fpY@tZ0 zF!^$=s7y^@nO_$E)aHX%4ttt0^kNtWzpxlIOy|e5yy`JV*~+4@>M~kyNz7RY$R5DJ zeSYhy()RJ!Z)M4pvi#^R8n-rDrQLcNk6qObjmE$?!UV?TzdWuvvg?E zzESm);B1FvB@Qu57#@#(O<9&TKT!~r zY?(AgM(Cs3;V9tB6n0|zn4Ks>&VP?T+D`Dp#oj&Ob5Fo)K(d3k)Bp(fhh9oyiKif` zCkv^hJOK@HSylwpnGoGArbac<>Rn7(Di__6m_4NL9J2HrtzvT$@#7$ zl)1&Er~a@LBtudoJqY?9fGXiXec;l*M&G_G@-)=1ig?h~7L!!MDNN^-KE#o@vZurq zbeVmZvq%G{UUqLB&%nuL7jOAeWwrCSfOl;R>*?s;h6QAK=?u1<`St5R$k+Do&O|{B z!9^91W&PUm7*4DH#h_%ngN_`xL=P?otYM>jeR~u0fjhqn+Rjew+JYWY`g1yDj6IR+ zP6{v{`2DY8b@h2rxaT35yCn^+-k|9tq%4x+d1kmdE|{H7#v-XI4)(Tq&rP=u{N)Ru zEW(L(WM8$mm9@1lUj0nM)cxoDz|8zWsuCJP5#tdqz}nK1s?G)GV{|!VYrB^sl*Gq}N4vW`a(Xc*#O}Y~u z>@xWr-DN>j%m32(S{AQ}YVp1TpS*4yPOni$w=~8K@LlM1sh;dHtcW+@(}B*Y%xW{N zBqpy#(T4^}Q>EIX{qBk`RC}VE-shKAeMWp9Cy6TA?MF+sxT0ACT*hg7F5141)sefv?)9m`Lr-k!Nq62xH6} z${)BIDoYn9{>ExO6jsnhWhBD)`P+8Lm-;+NN@*@r9T0@=RiQVOC0f5>*Bun?Z7$Sf zqlINJn-Bo^pN60q<2~rR7gf|Vn7-L!$4$h$1vcdb%GETASGP|38#gfFpQ7Y8toq&V zFN^!K{b1Mk2<;vyNLm|>d51sWWr!vI!=HWUfZ^s5mtia0Cb1XuR0LYe_D~%ZThh1na_47h&pEM7j8?lO^0P{k^&9;59I;9m2<)e{N=hB z{-jgs?dv&6k)wAUq2^14t3UajO{TJNM|!Zul{ve7B$j4yH$S;I7SSt&=asWh%9Q3Z z1`A60zo1c?fB0B1!CggM}r&;T?#5{&*+mpU=2en!EvEfs8lii$DLmuGcDPv z!E>k6`@YoZ9fqJRQ{gN44uYawwF1r9UK(R6JdhE)@YG_#>v(IwQab)hyyP18d z-AptaDaDX7IzKaGd>!w)k>0(!{4&^27pcCC!K^fwV0H|nBVPWg-}_keC3~aHPS+QoJ6am<5{rt+- z&fFS43T)Xfa5{u9A#W)_MCYr@UL{<$8fyfBmflY$T2Bk!434}2)towX)XgR)CWv&} z_;-fDCHZ;U2R-Hf$Q4Gj0jF~H$bxeW>mCWuOJS+wO>derPge=T!XlG2J=4GdtXwxj zj^Z(US?CjibPf_AgNN7YFPmPI61b%q%wfOvCO%il#J<+WD9EsWJ=DaR@Z-#G6#%t+PEYd8 z@fq0V8ksmG$pU}86*2;j7s{~3H^>9Ai=~wG@2`BeF3W%Yh<xy(6jZL5Z!Q)??c&cFBpWyBm z^kij7vC~=6bc8GRim}~or;)+;&x7RbMO#;!%?(!lP5UFJ31 z?y25wOD#jZV%+`1=d(6c0WcM5mzLxqO4RyrDs%MF`pVsIp||BGM&RgPn8<~m_L36x z@2a!G>6+4JQWb92`+h9MGjrsEcayjlhzi`UHs`(8;%@9twQCadmjN|&Tj&zpz#bn9V zPA)OEZ@#~Og+*UKx1qgRsw~Edon1E%TNZpB?S~D=+l7`mvU2IR%4^T!vaO_6?A^vZ#edOu>oy+4NdeBpa!}U2D)lO3l zaNx?)w6>{W9QuU}d`em@-IZ1eP?I_L?lwnS@ z788-7V_pl2ip-~`W|(OfPnXp^t1bC1Xp~im=I;)MS0fUdhp~5=q$>aYz0;gOOOwCI zm^Gsel{tjRC+^U*ztMIsWq6mS+87$0G7fEgPkAD_9V;Lf5k#V~1(gOot!VpId>k22 zMHu2A7gbVh_j~&AFnLYlAB(mQfAQPVehl?~MTrF}o-0#eBE$zbp{}u(ra@F|E>(Zl z=cvHEkVp$;p^Xe|Gyff$3iz4-PdhN;inq{K0gQw`>Ek{Z4;Yc?VLrdzFe2GK$F|o- zKK|K6kiYvE;`vXEln!|bFCPUuDfHGLjgGaZqVZ=TeANYc6VdQC&P3*C6!bqTBrC%U zobQ$d6N#KYBwRmSqb#TATR**f9Y5}SvhfR^!t}E>TWsjLiEg^7`uOd$x~I(VqR+?52qn{T29>k*&P#h6*kJ;nzuUJpGMyf4|hR8WcxZE_K5=v-27xOMcjrzTOI)kLa zAnz5b8_S_-Oc8npT6D4O7XrNfEMLXfOVBf!ShD4K0I%?O^BS?!N1N~|a$|YXfwa?9 z_w+u3`egm-*_n-u$Y8p5O|9a(3|@f)IAiVAPRetmRkE-&4wu^aNswUa>?v)&h8Up7UxM zQJfSlEN|^a%;kcXFfmHuPr<0rr7o7^+Hz#+=kBhj8zuMgo8V0qnegRxsgq6J&-bNM zKBf0=6e}w#?!F;Di&VQLhUV}qv;#(@=7dB@X}JtjT~Vl9@!!(Z!^g3y zn1rzzb>R}v$L@Srf=f_ojq_7a;*Nnq-oZ1J9%QRAVN(X+MV+B=1XwkeDaR(WYChGOJDdE||OFw5cyWp%dsflhyF3R(inwuB=IA62y zPOCv`;GbBEIgJ;>y~Jx!B|&qT3NRzrft$4ndiH#9R|4_8?)i&sJlmL*XEdJv&x))w zeF62*43)K>P|r<%@|-dg7w<=iAr!*;JQ4GqH60$ZELkq&8&~1%BZujqAZxJ=n;E(m z_zF=3;WSuc{7B#SiSzt};dr`HY_uMHVbk;I0Q*&(@?A;#K(EtsKUS(01on16h^Z1_ z8JR>#WFyp3oBhWJkr*Eot7MGeOT3LBU@6EIC$5YZj1e@KhP<+1pP5s+eXZPCVrZuU z057Z&ybE!AzF*cPV5WMAEdKBFO;+N&NfXM@CU&M-ZN(hdx3 ze7arkehZAR#%h$Bfdl^c)XY3)X^JNO$w}awJ#ky~?6-He8>`1fxpyw3;&cC2PszZk z{J7I?ev@0PmnzYih*dKlINLAFaG%nQ^j63k;jVs%;(s?ugh#ju7cVVbh#!~q5PvAs z14#*T01fe3coEZ?wj;#HE~tn?RyP0l`4^?TfDKFBEDj-##pdbptu=1IueX`{@DQ8Dxl2Y3NAHW~%-1PpZ`d{0)K@W??Y38SG=mC2soS6co_X)VAX)&Ri za{7%N>tP43UpMqn-4@~Xy^aQ4nUsyhLI|4T=msoB?%1)IU-79DW)`cJNu)Y)h#K~B zYP#(0K=UX71OpiAGcT_Z3DyG8Q(}kzpPq5tR3_J=78OhiFMay!Ko^1t1(#Bd zi+-Wwk>vi`TkotFKP&kcF7!i6eiNoy0rlxTz+;B!K!UY9c`b!I3UeX{xfWIQgOaal zV<#g$eZQlEBCJSFO>59W9x!9^zLmr4imLUj171;ovTt_Cc2X|Yup8rUlTOpzqhDyi zjJ&J~+S|Gr`NWIdn@y8IVXxLm_2Bfuj|;1nIZSq2bcmXoCl@%|jWX)c)n8avUe-0? z4mZAqBd^5T8to0p6u$&2rkfmObgq5*8-n`nP*CwcSXO-R7gefQ6YjC2Ww_|?(-}oQ z)*V`5pZ&M%MT$`6l4l7uU7t>q@a;d=~3=d*rkYA#qFtt2iaWVRc4-WfXiO8 zLA<*&6&cc~gx5NPwEHd(;1h}mlN7Y#>2LVTkaizvQ3Lkj{ zKmE2n-oZ(G)hyRGG7>uw`Lo;?##P^&EUYh$8)_Zj!FU|E5!u@pY?35Tr}?+T)kR)E z(_R(+T?cW14uky!u;l+h+BmjP^{&S73sfN6FY14dpMq;!J_Lo|@x+v$i)mi{mEwdc zD56cx^U2?Jy;1Og{+1UR{- z2lCj!n<77%e)6u37&pD3t8yOVlFN6G_hVCBMO@EVOAC$qR3WF+tBSZag?)-|i^m4b z4I8w+_oISF%%Ss!_{cH2*hQuAa98rLUCmk5z`f<$$LIf$0 zv6dsbSf_@sebfmhx0jL!HfsV;aUlycvN2esc>Nw*9EbQNu~$$vI)LW(k~;iKh-tNo z`l<~w9;A8WyTSF;@8%yn1QY<Q}OFto^)|KV^mYk%rn~Gi*VBhju)0b z=SK)sMa?r8l?D>?#E~Yj8PVC+PP{lXiSvAc4@UfodF&6cf*d|t#X1du5_m!4dBcb# zJQ$o!7yvg$6CaR6o(OXa*LjAK7zQULx8Omb!l3+PMQfGPD1Q;5jKSVE%yyofAY;Wv zC5BTk>^%W-m0{OmJr?rr9%0606W+O0XIn9KPwe;eM^k^zH2*VrxU8a>{KUq_<`c1k zoDRhN#HUL7Gp}PGb1bT*YwNOOED1VeIsy-{U*45Yp{@ zlHW5P?2ZX+c{(rin;?z?@|oR=_gG#zHEm=8K^_7c(&TyMnL|IJ|NUVFHgH7aCP*eX z4YnSy9XVQT<0`Y!dSu?B8fxBD0Y(478)QeX`yh% zH86n^qnz8yIvP>!sRvxB)^ckU833M55VR#(@A1-|h+-94h)&?io71Dv1RoS|P9@&P zil2Vl58wqXfMffVYRU}gc!Uw%R<)L!@*CHyf4Jb>puY2+O#1z+c{s2GIGd7qaj+!& z-^j{a61rwI^f55#h(Ge8&+llM*t4lo5+K`yOp7LPsIA{8_&5&nLuXp_r^nXLSKPrg z8{WcVhm@C=-vf6iZ*t~aTlv5^xtv}wGT!;j78vnJxI?y!cF9f_%F`(ic>ua0g)cl; zUPc8U9*!!teGKM~AwVPBJ^2)%w-@aa%$`VqDrpw%_w=*2zZ+DMI&1GvAAF5B8uB)7 z@fDPmjAGklrtbN1qw_!y13ZD+kYPLg$A`-d8)3R zIQ1}3<(OFSN!jEGq>dW})&rcUgqDhavZpQY@xtly)>sd+i; zy~XvHubIYR0>8PO5gnWhrm2~4aE%kw)W$GGvr4hbS7Hjz7ULv2GTx0;=?PUxCh@Co zXYYq_6nTz6q45`+OO-78dk+isWsfrpGl|Nwvp;m^#$;e%(0d6Akulo%ix&=& z@HB}tpdjiQu;kLUj7fy^8;wk7s6lLHrtXch7r%v2vtUW9JyIT|(yyg*)DRA^*yA=E zEm2o(Eqd%;KgOvcDAvj_^We_-fnfQ|JW9dQ^vt#y?YfYJyBLp4u16z4_VeHPiG*R* zBPo8Rxrr#@GJl}pjAeGdXLNL>fPK80aaAT5!^B=_^Q7tHM@JX$S*&>+yhY&;JJgh> zJYcmavTH`}1Ec>z;q$SuG4!586Ap`Wy~GiAU<5Lhia60}@B$fe1<;-$A7>|As?!q1 ziNtS{Trk4C;XH0fe##JQa`|`GBl2{KVnI!rMB&tQ9XIAlq)qQxv;+%lPB&MEbNE;l zo0xhWcQUw*l*`vHZ{8CZ(VqS9&a1ku_@DQSvJ~1$!EO)Rcu?B2A{eI`oAWMOvF$k; zc_vGOMgQDaY;Gn?zxS^{<@Z%M3_Uxk?PCcn*{M^Md_AMs-z^bC5zG2G&%0FHj{|yN zpvaPPu=@nkwhvKo2b|uT@g!ZLwJI>ceA2UW))^E@ewB7#I~;?t^ntIg{~;)Tcq5hG zupPIUstlS1|0(s&$Tg8nnFb_HP9VbP^abQJVo-E_M{tcy_S^KzFb{@Z5QB>_0do2P zelri7+XFu);9kh0)e7M|9wewLXn0;oU?U5r^uF^jipiKg=UWBf@!}Euv+-p%7G)d% zi{}l|@a0Ah8-LbTo^9RJ)px?^pIg>=^#g!6S8QdK|Eq@^n7;6Iir64M|HswOP1df$ zJhFs~Cr#4tW6e_tI(=`v;^Wm3936ZELJIyxU0Ac;gB)h_U$J2nZ^Z}K{Q#pQOLINZ zfb8e#emBWa*zmF>yh&JfG6y3Y2-^4+b7gtC2}S2^>b|-HegP#a3-M)jNdRMF!bzB& zW6~ctn49ycw4-dcijG3?;T3MdgML7dHhYt zjD{b9Mk)`D+cD7&BpT-Sbr5qmsGM0kA3j6RG}auJSqNzzD_e*8{vFYEZ}_jCiOCS`%vI0r1J-V`DJEJwIBLB}TxB7%2Xz5oxtp5`!%L z!h7^YJ}N9<3sPlDT4HXNXRXo;gtfIlR|h4C``#AIe-5Nt!xeAkeWSSeU{64q{R@DZzLfDU3I51Emfl?U zXv|-IM@ZwpS&ZQh!V^?ajORTc!3Pg2#6_1HqX@vZIy1!i7EsBpB>@z*GSNen1!2#4 zCDCd6(8dY=Yp29u(EoxrHXZc3Q?8< zBz|20q>Hx65B#`F^K&7SZEwtJ(i1+qvD#a948t`Lg$19Iv{OwRNA?gywU66q3*s)! zYLqUC2Ira0nZIJ!+r6m8V-W;xLrrQIHdbmQqJcGg+=!3{${D&v-FPCnMVr1MgrXLs zdV3mQWDO;ICz}Ba{QIAl8ZXUj&9qXsIas^5_xQ*lYJQliO=?7MqndI2><665z9i{# zCwP2y&iEnnFU3uD*3>~Rck@$YU!2C5Bv`B)U{jsz_j+&yOI^S;TR8t`J_2Y_`Zf(aW6T)}8jxg5$ zoRQ~|ToMv>PM&92c@I>>mlMq2tZQwb+}Qp7-CoB?A)=9I4^;w(s0f_rVO;?6OZY#e zraT<|1Ov34Fh_qrhezWBsrR`GV(c!2SI>(-EC6kxUYz@#YHZ7$>O2FtP6lwl7Y~2F ziQXEeLXrL!5zf9Js&n>yv;(d&ud7b|7GbY*R5f;b8rWxlPAoJV~wuYPY2Nmk~ z-a-OP-*eDd{X?%*bp}1wMPk6BR#xD^k2PVerSth0vW*o&Spp1i6wP=E@_kxzXody# z#$zMpx%1Pej(&Z#LHTXq+kOSm9;_l)6cEOfe(4VpZK}`bAa1Ccu=}1`m&*=A4{;H|pc6&xh_j_n3n(esbyONrPn z2@KMZ{W}FiW-(_hg55evjzT9~3(?IGN6%n}Tb9dY0jTbj&cnXN_-?2dVwa~255_zQ zoi?C@wM!48(8<6T!)@Tr9^WAzds(XpJxc6&%Okcwt$H0UG0aD#I%dOdRx{wM^Y6O> zc_yfiX2l4u&f-uq@aKut@gpGHXMsV}bd9ECuO%B^pZ^&avXL}`_Ff(X|XH+XpxL~j)LH>P#4zGtP5W6Tj?J2g zwO_{!oX--_$Vhsc^nDab#rzsJkLL0O^8*~Z_3`?YoCUTit(##33G#7)-Vt(^GeMeo3KS%JZto%t z@*&dV%wNA4C5#ip9^C~%k40k>qP=g{+{BAwa@<-Z50be{s*=|03xuGwn;y^HszI65 z6gP@QlUG$Q_f^9#jZ+Oq4EO}El6ZRBZ8)sujAPyJSz-{+Q70zf>A=nO-w_-7ah1@e*l1yH&1=cZ%97ZN8eHrY5`()As7WuBoC#+I~ZviJTsI9C{|FzdkB_BQ&R6XDgi>Q0^S0L7vF73X$9><<&# zqB~S+TD_jcYd7IUngv*9yP}5p$Ex|0@$uk?ce9*j2Tr(+Ez)WyT8$Br2 zKRG!G^|-2gK#=lq3pw`w0{TQ8-#;w@0Q2I66=p)i#8#>KTV7_PuGXgD z8DDSjeAh!3zq|+L@}#Yo&|FE|c^bFDEpVRb^gj+&(a}~{ zi|x!#KAJAGi61-i2EZ6Gh}X0Topvz0n}s*ctz+@ts=At>i&gSqQFH|{0b(x9jx9(6 zzfM}*gxeb_{F-|7|8aEPflxmF|G9IHv-jR3WR|_>M`X5;Y!!*jvN@aVWM)gqj*P5B zX4!k6P1Y&nth?Xy{r&Hc$2srk{eI0r%ET&5RJ?t;yKlE!c0uj$;{h_Pq78oMERnB~frW!jru`1>W@0rA&;&@uja<6Vvt2+;f zP{0|}+QU6#;cJVbL2}A1M27l%2`Q3(>l-Ila!O^i@8Se|S;OXSG*?WNNNj?h!Wm3z zbdb&>Ji9MGux<^A|LQ;&@O!*{yZB{BFMo=LcgG@Ep=G|h=G!;t=f{etffXX6fiH4D zjAYdE@n@uN`D;p+a>psYf8B|fC$KR^ESfYR|D?h?fgL({I-k*OS&thDF$1W`kF{N> zppkL8?ELy!wE~`?xlu+ch~GryT_ke(23)bz9R(A&xIeNP<6}*We`Lcv21_ddL+9Q{ z7F(A#a{vRp$PFT4S!=T~8CC{D)O)DYl8rzr&9!3p1CdbAB$mMhYU8&tp?*G(9B=Wd z>x~=e{)aiU+gQp>*!aau?e9*-V#S7Ze7G@ZMXWkU5BWrz&rXGSktxoXd^@*leSf5o zMW?eu3}C+sdCAN5SOQ|^gp|{VKjr<=@S?eUPOtYFY<^ZwiTll`XTe{pt#Nbz+1lIV zMHDjoq&JzfA5lhD5w>AMd+_NGAJAA zpCix~*=$ba00RO=0-c{H!5AqXCT_8x=P}2P#q@rwsG=S%)ct8cjXUg?ws-gKaa>%M zX6y)PP1RJDg~(kWRT1Dv$dCfx;V6?gz_r&4_I4#n&OFZCIM%D))yw5EB`C5OP->T> zCIa^oA)UafK~$;p*iYjv9`SJ?^Q! zZEku)c?(5421KQ!I}846s(lR?tK^JG(S!egBbQ)G$!_uYDa>p#EZJdqioOex*JX4>H~hN+TdIouWMg-nw^qV2pCz=CG>Fr})*_zb(Hm6ZUm|$~Gr=_5xrLD& zl(l&M<-c)_5>xe}Cn$8WX15OSUE1!^51W_&7H=G-jAFMWaiSCJ;Tpj(T;;4t$5XJ_ zn)veH!@L-m@;i`Od(nq1Jn5j(3xVpw*RAm;e`1SC%e>S2C-`wGwF+F8394-CG~b4rb%FT*C6`+`L+=C@Nl8$R%`IpC1^jfcYkB^^!gsUL%VV*dzJg9Ljn?B1&|#+ z1x<*zkVz~kCzuZU@1hJsmOLBrJChq-L4SO1dnEi}Uj6esszOL>wr@Ik*8RnP*v^!RgnAI$df5wWuld|HMg>Uant%~?eSar4XTlvAu0AO2ljJMRp|GcUOZILVrycg4I?u5ooHTxOf6_(Vi!_x3zZ ziR6EPX2#;=`Os248~!02RlhS$Ud;k0w$gY-$e$G^!4CGy{D^^wyb_Jn??iRp}0PSpq-4_b!i!?Dd zFbua-)9e@4M1KI)Ts$3IP0t%5G_@6Hx86k>T!qve&T^Vq!clf;M=7&omdBjdQHNVD zIwP$FeFm(2v9;QKu38I4`!Wc15OD2S2WTeeZ{q zu)Lkn{O(QSMQhjybD8luMMz-|r9~LM5(z2>wIcL!iXeYo>0?6Rtuz{{TdNCZ_mOgD zWV%gk@3q)(BIlhH9~j(6o<2KuxW3%XdrC5!!1p#a@Xe%ur(SuKiC9SJlT!x_nEJ*@ zecdwZVoDtqY?>^(VMqO#L?OQ?VUa26#}5rrQ?<$@&3%1Fd1x@>J?@RXDMpFyYPNc; zr)TrQE4P`M-rhsuGaO6vbvb#F;`;dCJ@$EVB|&Dfz`B(FPJ44L0fyfc zd}Q!k< z3h}P^oC&vAH#%(3CXFP3m)<>x@|Nyy?nYqHyX6?`J(IJow}|Cz%lAW)?`v)Sh$=GY z8HBAxQ5CC0qkI}f!NEdtw+Q1PB-o6P60le3|IXXGr7-cb7(u|EMvnj!VeJQ8*FmY1 zY(uS`fPkHIP#(u$50hdA4!IR_DbRoJ3urwP@N#C1Cro)}Gq}T6KSYV23i!5Q5!{4Z zU;3%@E)C{%q=x>Lc_qmER?P6;$X!3HJy__e zTPR*FTpFRFb+H6qnCekgHW6fXhuL4E2}jp^(#DG4s2PY>H$Gh5i&TS#N?eL@pIGW6I*CC*P6vEm#(#L`oAdL>ARe zhIc-o*4QS6QpsFZ%Vs_Tpo;|_6B-4NHP_1`z+f&5Ln^z89c6=Ds@R@9^Rf2(_=mnX zwpS~4^^*!q_z(;^2qSv7`45?Zu4*a7?lUX5K*Xz!4+C=L4Fs*X&rv&*0xqze3t3PSzE@x$`#c;s9J=K|n%9PPs&OId_Rv zz~P+$_9*g^WOy`Ex#(BT3mwIZqnyOA3Gx}wvO=0)Fq;{tMTDzWSO2DE2?p+ z@v?{5L9Y0R8rfgNzIhUpv6A|df;BOdlYra;tBU_GbaOHJq~wPJCMt5@{{$_}$bnR* z1eFjsU2&wnIk)paKh&4!#4L|bw8J`iZEyZOHyh3-kA3B7Bkd;P+-np%^!Zf{ha6j4 z54&yhM*>p3jhUm8Z2`D3*p$h3eW+Y=JlLev)8rCSzP8=uOn@iH+t_2m;-h5uKazlv zgQ3U|TCV-1VfhurQGRCjrP@-Fe$Q!Pk2ks3+o+>$U-rfr5-ZFxbC>);d3}b4_{X9< z8kGaAMxt=VOr?Hs_31_0D#%?cQj~mn!XB|gd(oy_{F5%}$e~Av0)gVLK=hDBED!ezZTDCKB=vD zt_izgC-NVoq*ZJT@F;L%$|;RnTPLSIUf-0(oXo%RJnmq0z=N8yEEb@8y-#@Wc!(dm z-RQ9Tk2eLok3ZmDcia963-En+S4BmMVZD(|0}pPxsmuV#r+I;eaExgMj_!o>L!#RM zxaIqIKOiSTZ;Ffz7tc8P16wJxbGQFi#^u;77uZ|M6>Mkh#=8t>!Mf@HmVAhiq^wq5 zSFUkg4vN-2+e8klonsN;1X$65$o=KH7GGazm;2jz3w6UwdOX)K(A0GJg6-L2VhKb7 z)J`vo$<;IwC5RlwcMJQiqP~Gn>=L$5C5*PplE9bx?!UT~wb!ZBJEI~@K`J8TYMtOU zN@ycdw(9b*bK-OOooU*3gvxhN(E>%60k0q!y|b`8%fv@!NAsW+(dJI9RiBeD zpPEU4&kMMxOTfBN%%N~#G?b-XRKZU=;u-_K!{6hkzE(j{^U$>IqGxv`fo~5UsM+M@ z^%ivSsm9!cxbf!Gmq`$&9!!jdp*y}wQ12pO*JC&so;zAUhVMTx4rDZ(N?o@AhF?{J zqVj+_Dm22CQ#mGqRh&H!jAT99uGCD~0X9Bs^WgEd-W+HH%U3M#j?(y_iG59b{`A{o zIT!-ewoW3`>qVoXK_0%`0-4a`Lh!+e`A)(OHEw;%HP&=3NRdIT?(3OoqtHJ)Eu6-*!5y zJCc$mMFKCDqW1B5@vd*iFB7|hqns9fF`i$F6Vig?5NKx!h+}$iW}B_o$`LaFr&Zg- zes&x{4vxwqqxm7Tc>5hnHChPGv%kT!?jDU{VIQu8ouE`+T3oNG1d(dpQM?g&0TVnY zD`5Eu2(sdV;|Fl}`I6Qp9t&$XrNf#Fa&yLl8!lIR0LM5|)W5k08Ct_{^|DB6?Ef0G zSxOU?EH5NPHC8d{BVAiSFMtDd@sgbuWdj?%3xq*NUqKgt=zAsa&>Uvti5V$A?B#j) zuKqLV#^64@Y*j2~Y3Y4z(}(eJ4r-vQrm?YJsRqQ)g@69Ki9H_7zw69tnaJx2M|YoX zlifnq$<;a%Cx|os1YcpzV3zVbYqs3E_x4~vQCnGH&1Qs?Gm}~P6H(vaK*pn#_k_<^ zR7Fo5x&zL?28U@5nv}m?D2qu||G*W&7h_Sk>8mlu2FxM3qTx{*Qi61ATWZm-1Goo` zJO2|1r}ecS^Fn@#qFtQq%Co5N`lMlWPws-Y)PP3QtSrLGg*qVNG|&Qy3F!o8mw>71 z+d2#{P`;%cU1?mHZ_2j2zoWk2C$Mt5xD4)|3`OUPRA+nM9r>`O8?wuIFoV zOy>vWMax4HZ(c>XAGJ$VxrDp>(8VqOl<;^LMs3Uf5^79y9Mp3d-I~F2B z%Typ+Kh!dWr)oY9G^qek4-3NR)r^v`M+LGL=H2Ma0KSx$Zz#r9d^igFuGAZ=IhKk1 zs87S+7>TwnSB1Xx=T~Y-RaX&aE(GNqE~g>97dZ+(^55u#tt8~9HOnAqk|-ThOwkgV z2gKSaVU9}-ftpFSH|cX2g6&@Q|Ni~=;dy3<|J9N6*~XA(L~Be?63Kr_3N17>jA}Z| z8yfR-c}A-%G#W&Tauf4GtfViYIu--!q8pz1t}gd*@l-U7jQu@!rTrmme*}>^^kMis zGT}x^oCCw5ey`U@7+HBgcK7E8Moed+E!N`(7I40MYZxY1cVk+PSFM}ER~j(^=c<+o z&jc9IgPlS!Tpy@l81Fo83Ua1tUzUX1TeHWh@4@rW$6rc~!%&6Vll41iPuL&#kf5U9+7?uAqX0^_8G zK`w++Q7Y_28O`h}0g0}UVeu$1dec|7O1%joWJfUZIS2txK>xKIEh?t9<9B>TGEGTm zYgx0IoG54e@_0++OQdECE1ACUL}fNaL!*JA&5L6V`q%%-7!Y%cv0oM53IAI$$pGi z&u}AA!GaL)ujrp#um?K=B=@-+5!Y9=*z@Vv1IJ(Z(BffHB_F45^gfFv>1MB1rt->k zfy;6HOg; zeuVkJDbFZj*(&E=A`-NcP-D(x{zi(;M`Z#=tN;toh#V&<;?rc-7847547+{;ekD8< zwnn&O45txzyJn^=D*mqVR*s&Rm$=fz(@+aBTzN#ql)_&JGKtIcin@bk-0@J?;;dkm zhMo6$$7{e?nyM$pc~!sf;^x6Er0s3sHSsLuvg0n0Ykm`aUn#!8muqgq3bObSfZ~<( zW@l5j4c|;8hf>f$@!!OF+>C|*l>@91Y9&UANT4SL4je$xgn7l+6}ifCs*f5 zqOyQhN)UDGU5ccTCO)1kib%`pAg*%#4Sb`qdBc_Ze4k8+{)~ zRrTHVm<7V5GPC_Xr;N$TLi*xhf(*qP?R?~idXo8OspLIBlmx8@qSiK*`b+pV6a>i% zX+*Oh(Yd`(3FYL0u4n@HvNUv))Xb_voP1RR63z}RF3#nr^K@IP1zy7htxbV+YHGJ# zPH0d8MH7JKO;)!JKNS~x6RmJHW7#Tu%0fVnhZ(8m$6%2UO$a9$PNkC)o*MU z)Aw0F*;p7uc`M=CVlW(ggoKAjWU>y$M7|DFv%k9#U=By?UO}-aEmpFL=*JmE;dOM# zh=+u%0vxjBC{1GZ21Yi|R<4S_QNJWt^}h~e>L_E#LMfy)HIdehjSS2Fd-)4<1m;kD z?!q9LrYuCKcb6;3ka7kBajTjM<=iL9rIh~?mW?9yT%!RVRJrX)0CuI>^0ZvDN$~s$ zXsb_6edEPg5>)U2N4&F)8xxI)pQ+ole7CAdI|@(Y%@0&1~+`jo#cw>Ku@9PKR&aOppHOWsG1rUl!il zcU-A19NXYY9hB$SnH z&fud=vhbF&Bu^e{Zmdk~th8+5U0vEuOs0>puats>3}UoL3ZryN)*r&Ze3d#W8_=?UMRPX=u}|xGUWCbG>C#%qd!4FEWD1Hh zsb_W)b787UCr}f8>>PAB<>$sgSjk-Qow{OL%FwHRxU7 zcHS)}y;rqkIp;gOSKB)K+%(saTS#;*!p3OTV(94G{1J8!1`r12&_3h$!u*+K{akb> zh?}hyA(zxwm_p?2n+^WtSwM*N;-XJdGbwuO5V$8#NpaU-jGn78Oif)8_m3-J5a#AL z2vB+N5~z_Q6CNVDjATtnlIZenih*J{0kSLj#Yaj%0l2NPwp{M7gs%Q;vp8`>)L=XP zth6T|g?L_qQDb#qabn^cZpu|IKiDVg?LYjgHxh3ujAt)`90gzfoT+C78~}^EOaS9C zX5pU}qubG6#-_{FUrjzf)M9KF(UL7+)+XXd)*YWozUz2AbP1_AGFnyTEPv)PM}qs4 z7ErNg8Ye0~iN?eQi9pm&JG(k_5Wv^&y322Ts9O0OGa*zO7%o*>Wt3*ew2}+8l1tI^Obag~7I zcdEge*n)Wz_|%z4sZ6@s_X1!rbuI}6J0$spUMT!#eOE|w5#mzBXzHYGgXh9#>J^ZIjW6^!YyNswu4+=+Y6 z!t|Q>dM`8+VY5a{F_FQR5!L%G8TlKaQtpdB2|NYu<$iPAf5sVIoUJS=WMe0LJH zl3-ri_>p?2+6HsuiL zML93~Bi8L(qkZ``RI^TX{v`1hu#?LI37c}abRdapg z4In<4p8Jbe_3Vu**-_}(X9fav}&T9#P;l>iKMs%{W=!(P}iUv9Zt$GH?|Fm4>@Wc86xJ$W!nlr+E zYbn5Wgm+Z65%FyMv}^jJt>%Tg(KLb0&52V5D8!kf)vNWeLzox|X?FZ^+fia)-E@!u zyu_T@^2Zkl4>uaRtjV5~(s3l;=b@i`@R$R`hpvwK0#{3?Q>$TnNP=sJ({ibim=+8F zHgM)jZ$i&;BQhlUDc@8XHj=+_cyK;;wQVMdS8eTba&USnW4N~ECoFlF>8(5>F>6-~ zAi>33{sK6vuN&{u7kXQA_?bK}Y?q6Oy_&$PM&Rv8@VjKVz56N2sbBB;)N_{qqtqqc zMCZxi^oX^LX)I3#FnJ82Y98E`q*EFPFOb1T%#Uy1d3KRbb3wCX5JPTr=lX*)^n}@R zb!Bu_Rl2Y)p`&g>mGGuMdU#PF4|fP zZT$yM=_(IhuTNa_AV^NyOtksS#FPAsa--|Vl8ydbSG=lBa%}Og8_B69cWzf;!lwh- zwzn$D>5{x13sf9m7U&LMiz*( zR{rMtLm;9%1&*5d1HGa0Z zUJZ26z25LvILz+(LCA>aj7Gl=87EDm4G{Ov}@?I$BlBfgP&MeNz21L1<(Z`-2ec z+y@V6b0rF8_O^kdr8E8UA$+mZP zf7*6G8r*KWOeb&hs?Tv05@Rz5hj7XI#Edq2w3We`-6|ygYRmq~ky3@@VCVangiz6kJ%MAPq7?-NU=y1hn(zx!lMgSsM+ zqeZ(3*SD}{Lh_fN5}cp%SM*vL?@_)kX06cTnbj`oy4A)YL(toG82@fogoCpDV%_%6 zHh+duF!h(4Pd0b+32$j$cKT2~cug9&W^eQPVV91Ujr9&0ZwT-27x&Gmn@V&6-eQVg z6+b5bs4g>B;*@-|j9c`bBDd+c%vH^rgl*S#@jlKjZBgth4@2Z(~_xh5&nWTx4LkV%J$p@#=Y?LM;7-?8Dyzv3E1 z_lTX@(T)z_e(Eq9t zPl3(5?r?UU^ge-^NmraPIzh9|q{sxUKgH!4zUdv=Ubd^n4^QDe7l~1vBdvpE$SCWI zt{d^R)k6VTTH**QRWrry0^?($B1N$cw)cge-KwwJ{Y8d^gCJEHDtM|;;p0$+76P*Q zVY@E*32j0KjQqsUdm7AiS&iQI>p|zxE7yLn49Nr=Bsa*A-livg0-x@E15Fd&V3J+u zMK&nn<%NtcGjAT5%{dI=$VP+z$*$sc36PSIw3_5l({u5ka|e%(2YTBj7@`XXRlRn$*3=n#l`7yn|>{Gx`z>$+=To@xg zpmiYPyY{^V?(ZLUSGhwodU3^7mZh(?y7zaG6D{e^YZ&L352h{r@%65Af7s*_8o;n!V6=2p;lmA zd%t?|4_?`|6(nFn@6OWRhhFE9tZDs%(0Q={5DIGF0Pce`@plmqg`=!L!)u=gC4TUP zazsSFE^uS)?(Kakd(raZn$w`z%eABS($((yXZHq)z=U4>F1CaCUinQ`+815~W+Jj1 z|AZtwE90G=aNY5fyDdaUB@jnzq@(P!G*41cN3`_!U=mjsc-wbWO6mz-xuiC&hNvz|9M?hP!u;JlCmmfj4Vtcv)Nt5R;8Ap(R zM96jGB(aa%6k zF|MCf&0&4I1@|-OfBuK{-?o(x!571p(;u7;a<2%Z(rl;Xq`uSlIh;GdQQT16B;e!v zQkY_7H>$|B+TiTuDU0eRNwEwz;yX*(GnT7FBlMBM{ z5y}U5WRq^1L$42**|3iYYz)L=Z-lLeLp<&g`emEH&y-!(?9i(&!h9+glsEEvbLX$o zkoKi%3ibJ%V>pLX#K@;qW6_~VM;)eY;Wo62DB&_u*6LMIFg8d6SdO|>t1F`T)96?8 z3dmL5rPB_k@$3hqRSQn+r)T@3+;*2z^)|5)0N781r z-XRtMkbth1`r|AUL|v0b#ucnvgNGMA5*1H7Lp;iD0_lUYXWtJ%FAC5lw1wrfc81Eo5W)X6h;u*>@QrnD$alh8My!Pgc{zIc%`(_S=2?gA(kI zFSisSSGeX!Qns}vlo7RNlGuwifs_U64J;+kHi4=N+v9hWIsrdVpGx|Fzgo}tzw(!j zw@tl{M5Ph6$Fqk7&2O&!pgr?_e&p!zOCRF@_j}uS`fS8Wi^2~o1h)rI{`M_y4A=u% z4W7KTcrx)MrNnKsn6UVzoS8o9br7F-w;PbiUQi%V%_|snb;Nle3K5_;6qK$#=s5zK z+0Hv0`-W)i+)sDtEaWxFk+r`8M_$ab_Y=+&JFo=RiE&~Iukg5Gs?gbl{=PtZ;q%90 z-~RAWu~tV|Rr7HPhnWxbp(6$NrI>(cuSjfcjhwA#e=-BEaj5iX);}YZC)^Lvp#ro3 zQIHEDfm%6dIs^6S*mycrORU?$Qbbd$H%I%j0yX~lj}F_@Q?li!YOGKh`>X3)&Y3f` zpSEStQ_Rx8VP>+GH01)RcKp;X#2I-N5s8hY!UV?t^4;CP2=D*6JQ^BUGSw18^TYlw zfkelBAMLUX2uQ3{ka112KZIV>Kyfr-5H9;jB;C7r6g77mHQ%LiYA4A8T7Y^0qjgXktIX&d|7^bv7@_=e<4J6{rVL&pO3li z_5{=QBU&z1VUjTfH?aXlL@vrtu33(v2$jbc&c#E5>twbi=4))u3id8lB45HGV0tg! zEDoxM1kWoaRb4Ws^ojiTA;C>FzrlM2SnK+c-Iug8PGkP{IGH|*#7|L~q4-s;pl&?w zi3Yln94WEE@41e5Xe;b`!uSRxi_1zgpHAAm!UObuH~b>Y1KCCH0NwiQ}}4{A->TGGytKA+hrNAKpO3<+8d)G*gR}>*apC0rPKwuYQ(j9LU2;S z{NJFD`?>o}-*6>&kUR~#|Jm=?K;Y-m*FD6%=j8k(Cp6r~!WtQd8fa@Upj5v6szh6( z-mte2-wwmQ`oV?jrsrm%zVc;}w|ZrS{NrdX#Sbfxze61OA@mNHG}*{YZ3$W%CVA7g z#~+aw@r1K7r-a$FO=Q-G^U;z-4eN_z%1v%-$`-f{Cb3{YHgMm4?{7LxjqK=6g)3oC zXHlHFf<)M}0XiTAe?(qL4gpiOZbZgjDK)uMc#8*x3UgM0qqNw*-0iskzJ**p+cu?0 z&#t8>2KRpZc&neIf)05LNR!?!%-LV?-?R}LyTtX(O8-`ZF-ioWV$J>Z$Z{3zH%SHlnB4HpD@zjJeLx8?p zNdlVY;ceC;*QM>)rw`;>!PQkD=XS2dpES63n29$%bp==CX$oAYHIJPjkE`kLlv#_1 zZ143rpISG|P#)^laeYc5J8p7pIwKF&E27N)I)#oJwF00RC?WW9#(F?hAHagLV4?a# z$#F|teLp^2efSq5F7GOcXcRiIwSD!kuC{jW@Gvn9+=G|i?+*0!jvwA#na@>IjR7b%C{P0<>H_W0gua_jtEv0O&51NjBDUmy=Ml2_gzWodj*jkYoGUXr_)p$z`jO{6 zfmRwS`00g5m+!Iw#^v0wypFkf1YY04x{uPq$`+3Dwyx~$t~U8bhpJ56TAi;gYw~yw z72{-!jlI&g8)#KHc{UxM`>P42HnisV`1{nI)S)u%-4l`+R=(UFcI~)+DG!AdpydNY>6YK;;XF}BC0fk$}pBXyGe<$!8etq4Q^l{@frSl-5 z_=@Uq8HbKfP-5fuaBt6~;Rxq=dYqUg>^U060x0V#nBHVUjIF~}-V*Lurs&zI(vlYs zh~TWBeTdeE-UK?;ft1<%!bLN_&wr?sIUY959@N3iv1mTN}FalN1HEH6UX#JM_f0xlJ@N&_Rx8j~Wp5xVEb5{;%*YROK| z-BP2``}@!`4OpH8eOF3bat1B(a~y!BO>#%e2e>#nX|sm^c-P_5(ukk_9-5r|vvcwD zZsP}_UfxCpvaiO-DoFgC6#t(#aDYG!0=V+6;7B^K=_c3ehH~RfiJ$YGp$tgRy{QV& zqOLIlks&0_+(yPA>6w;#4Lm}fWrN6%Cy}kr7st_m_J}*D>hGh`qe8Q8l`K^7XT$f# z@frW&K}On$9QZD*q4Zxg<^$K*2s`t}>=60t7lMykJI3@qnUI_QX1i!^goKD94e!6A zV;cE;hULRQyV4$3a4v^>Z^d=S82oZO>lXuuu%IN=F%MaumxrqKv|huV#$pdCAbuw2 z!Fxv%&>trRO`fSec%f_6)^{xD)j2#0VJ+LLU7NJx>*EicpcS1xyyfnznA_Q^P0;ND z>6!F}FZLt9+rjWes$b05Z9Cl&XOS;&Z^)niCZ3i0%;w)Kv$ix~Fsod^xXdww^tN*P zxnRFndlBJO;Wz|-Y2)!DuKhnNvZN*jU|r+mTLqb!oAQ6pXs?+QARzXjB^?s{Bv-&I zg%*8muJWApAyfSi@1Ho+?Yl{*iw`2BCuo^>(v=qz*P{HB&e818msUdS{i}ITmv8Z{ z_|xlZ#hhDfj^D)V1l3RrQCewswSABNQA<@IAb|3BFxpu@AUv`c#mH;Z0@B89=I}%p zWixAFrTd19gPHUS#$U0-W_z$n{t3&|q@)TRPq{*4rXS9_WD~W>GIsmTJl4X#J_l>biB3b@-`t9W-hk}%1g$oQ77g_Dlw3meYiP0xb#L;31R^0!*NjI0pI@g` zBV=ngRe~};s(6rgnul?=X|B7shvRG`%QR_^u*8Ft_>(4=BU$(r%17!jGdiPkD5-KN z(jyS^aqq7gC+xKRKjXG+O8$$b=0*o~8Cm)dy6$eQY$WO0)^ew#HCxe2M+q@Nf+ZOs zgk`=<{4IK%A3gC{t(2B609#R3l41^01|7J$*>e9Y$>3S$KX{i)=Oek<+0Ny8xDqP~ z9(GbGn!!elC3W8Y(?MP#T4|$qxc+D7H!9DN%vf(zi^PxSDlP2pM1$%kO-PKcqU@j1 zi(Y?E_-gl=E!J&U!XmJdyu$+h13z(z&l`Tzl?bZ+PVcrWHnXe*w$V_wTSO{yila`? zOV$R*5F!w_O_YvEo@s3Rzr9&v)FrRlBy&BuVgmC_n1-8!V9^pv&RA7UP&cXGQU@jy}C!H5mN3>wTN8ipWxfr?-*+8`xt+Ve5CUG9MM2c) zUhEL5{Q?S=@)I7bGgsLR0g8`+_O(7;;IE=5jeK|4Px$R-;T!DB!AEo8(tSRaL5ghCJ9R7th${_^gE%}1vr4itWtL!^AR8ePyRyJ z@vGrI(&qk3F+(+vmwbiMJOlr^@ij9|)1oO2ib?)+{J~N1bhUyLX)OiW0Hi0)y-TO+ zS2^WnKJ)1CRbj>kll9epND0uS`rZ*aGg<`^W8uMQ5c0wQ-8UlP4Gj(2ry zlJP^{TIRDX7ntvK5o7lTR5TV|0X}0Y0Gt3NoKS_^Ll>Nf-`)_ymY_NJJOAKcYj)ggiW5q;|Ex&KVdOe)Z?+E!-r4$^{|dt_(@Q4^Fk2 zc7Xq`zgE+{hCqGf;ur}91wOPFIXu0ng%r>SI>9*k4i})wEfCmoR1@%M>n%ABzWrJb z;Y)n#rCC_bR<_|Ycnf3Aq=8z@U$YS<36t)pEYwD33H>sPc+TnlbNo2~2{KK99KBv2$I2wZi22`V;)lDRPvyH(TjlqFC*6PDA-nxf48c?VQdsMN0pboK}d*GuY zz*6+r{?6^hea|9^NJonxvM*`;_U?K@4f;V8oX!@Jb@#ki2TS_o1K+X98U_yDhjA>n z{^Tdf&4povY0+>=fMfZyGBE63j-N4F?fjn76ny&nC2a9xOVa{p!=4V!zl9o`YVyfo zfmraM7h7W8*Ea9?*gqFFkpic%y$pl&OWQkRp_lr-UgT0Gu*o&Sa;^ra{DM(jAc zT`otx{OUd1OF+`>uj0j zC-rP%OC!bc`3w!lTC<+z*xQu%?CkE(#W(kMc55+sN2=Du#;&UymC^mOC?|VnrRCD_ zqvW8`JT}tA)E=sjKHcWGkkT&wj5!n~K_hCHQ!2zp&V;TDG?=sMu!A#x3C_nvbz4pu z6uX2ewt>-bR8zA+oL!;K#x?=3t1Hv1w-OIu*-VX7hLjAWT1#29S7Ri`Xp2oz6&0Mn zNj}-+J|c}Rl```i!!M9G*l{>7`P7)EtV>K0BuoWSHH2%7GQrZfjO!1xB3ms-)W6+M zxvuiae7yG;U0XmkDDAuN-A4ob8|TWUBbu@GYdYaed{9iN`is3)joW7#T#2K>YtRY! ze81BuJtR*kj7t+5#dn9z5i|u418yJXaj9RL2Uf(tU6C!f-Q+Mfy!79R>FZ4EL$3_a zzyI&rrBcM!{)M5VrM?SiJeD zh9#PCJ7t3W1MS5J7{Q8XW>H@THXZq>tnZ;Z`as={$43J(4J&&(8k&0I5^#4RbNb6| z`DiD$ael8hVlj^ec*aOIFavg`aPeqp@vS4+$z&5{&b?e=8Y4fiGfh}pb&q*0Y*y)$pm6$9FqX% zPy)!#gm9fxC&&8k+JkvH00%3OD?*r$flcAJ*M6ZhmP=FrQ zJA@b>5sH6vAQ5;!UW-+&#Lx6zscF6`?*`xN0*}?5!j$q!wmy?>{lWEkEpmngo0>A3 zoO4o@sas@;kJk}!@bg`E>g`eZGu+4)NPe$uS*coDP^~jTzp(f7NH+c-wHvQ3dv6&U21hyE(o8O zs#acXqgPH5SW4dW0&VpV9nj{D#V0zr#6c!&sax=Zi0pOqf#yO^c_ZbNflhqQzGDMt zE^XKY-#bh>jK5;CC$uMyl07$e_KEdH-gg&n**Sl@R8pD$LBXi15WQ!8LnzyhqYUsr z^IUB9Avv$MMtL_@twpuS2D?B@`+(~3vZ%YFA0qo^nEjO2b{Hl7qA1I4?5?mdY{8G?U*?$$J!icM4A z?&-CCGJ6uhFQfD*a_T0wrrwAHoXEY4KfHePp65Ky4e$NTC8s!ReaXp|ej_U@={Z5> zTSc_tYhIfET%%ou@f)GnqP0TEw7wXm<}T6T_lwc}uSi@h;{!hj$%k*MG&Vpi=1o2K z<@Cd!i%)gY!SrK)#LOd_{DrB#)13&{4n;Jt58i26e~L(|j_Tg-#$gl|$qw56e4NFi zwpllcu{OkO1NM;tSS2m-pQtno2Xnoi8bmy#;~VuFfvcL=Dlzt`DykbNjb`^HoR-WB z^9@A&hD&#yT$p6Uu>mO$Mo>-P1>)-N+R!ml7Ja5;+D=Cawh$lZ1x9{&RAQTDNmhgv z$(U9qt^3+3A$~yc?^@fe_e+;Tk_`7pl=cSjj7L#E7k5e&bVz1pHQL=Q4H#~kV>~~i|7&*tp8}C; zm>HlDdMNjK0G(vW4-wA<17t95ShVndzkK+4TXXa2`G%3>av;gkGA?)MeQ!eP>kYO1 z<>7gjcP1vV>q;A!R}`;>X-(j$x-U1tzODT$a$(ZH>JHmLu^F6_#|Vl~Q0gOEBqoV9 z>bFd+A!wE`QYp>+VHyUKRgGs(o zDhGEE50>bC{u!Ny0UBS6KtttU!v$?$0AEYU0CQ-5fe=!V|0+{sBom;!EQ5@4D{!lQ zrtY53B2v`jShJI^skIeCTKBI=*I&7TSOscmY;iH5UE`K-2J6Trkl%cpG?4Xuv>ZV` z0nUGBtFZYVgC1avaTO_v$A1`moEhr$_pP5Tl*hBMV1)Rd4`^h%?Wg!jPykxM><7CA z>q@s!nlSe>5+@7^mfwJdF8v&KOK(v(607<*u8Fw5SHveta)WfG8GveEZwq1j}6w_P=V9ti%9 zB!SksKOLRGDD8hf?))IPWMhvH7;rx#ACVxB#jCmiHFU@h5|4N?F*{R}b8-F-0?Qf_ zTX%)e&k1>W6^RQrRuttC!=JLU+SG7{Zec%JMpx%@J03{?uIZ` z$eS|MAL~aH=;t>+w^6R09qAL*a)6fz5q$Tdye|B=JB$JmJ>hm z%s3wsgq8}lY&Rq`-v_CN3f>p6=Y{+maMxvpQ1EY;mOa_cc=9RU_tY13AjDiqKh1cQ z6C$)J#ANz^EPZ8IQ~&?>*%)1;yAedXyFln^8(6eOetWQ24{ zBVB^h-P`~C?(2TC2Ya%e>pJIs-k(=e>#r!MGXO;dm&rq$=ew>YX6J3GlO%m_&@gZ8 zImURl#Yb+Wt)0z}@OAaTioYP&NPeLr@elTVb+*-+fPv84Yfe0&skp23G+LY0+>`)4^<8091 zj@xYeR+G=eLhK@*MJQ6rLs}d7>1~MIpNV6X(v_Kbb!J)QqUD&jCDL84h0S>RRAeLV zr08qn@H2H~)GfB2T<+r_g<&q=6HHE1&-S?s{$&a*;= zXEVVAUJ7+q4QX}PH^;Wtz(pI=Ino&cKU2nhWW8#6CguKDjn2hQ?beB;?s*+Jc26xb zk0~BK3by1K=sWq&sMLc_8|guc<9@`ah38=#p7X11&5&EDuvvd(^*I?TL<^E*+NkP{ z5y@%)O^m6LMuV{({%jsmo0+tk7v)iNCtpQa#0hwW$)fvpMmzmyRp=WVI-8oM6PSWJ z%F39@sCbJgRAzhg&=t$tnRN-_&Wo=^s^|&g3oWaYbRr)+iBuTd&c?FHP^t99sOQM% ze2Cz1BMh@M61hCXAlN9A-z;*i))&wpZ~C~XNiAf&;sNG`N5gChC4na#Ssw@*MGXnZ}NRYjGD~tOuFvjT?cCtBrk~ zDX%YxA$>u1Mz$Gc{g~@M5C)h03k`tj-b21O_%CVmDG#E^6V1VGLD`;e2k zKdZ+-nn8$yI>!tPU3wu01pU5Q+iO^w{ZUP)!{_$FIKtHN939PI>>r?oD>d|`yPM-P z$izvQ4KM(58N36)hQ06wl{y1Ygjl#MUfI80ToqD)#+68W5LzaiKh{z^tNh}Q?#3W) z*7BclSnUw56zw@;jc}!y0_mxp>$anm)6%GnsFe^Eb*7P%eW6E2uJXd8v#8|T>BEqJ z#It?vv{0-r9!|b=^X#6cP$1KTCu7}nPT$!*s}rx}il;@yW% zq=`&8W%x?@Ovj-9V^FO&mDcqUC7gK2PrVT?KT9S1ndAOooZ5dT+z>1QHN|^-FhD{+ z8WqI+pbV121Wu1IbTIy$ zZdbRyqSOS#@aKYXU0Hjvpl?9V1I7+P9>A2P2+?U@F|N6h$nWGP>Z?_e7W^?9Je-FI zP}9#$5}}V^nt_~BQ*?8ET1?bVXs6f zaTa88z|xQ|u})D=={HkrHok*I~v4;5Qe03?l?%@eI%bYdDg5 ztMj%6d4v4y@xDCURbJ8$duL7a#;#RFgo}hfJHC27N^6&GnJvbV>ab1|a!-MuI3JBQ=K=Ou4j1>zH!!7M2jdwURt!Tx;Enh~+a=%r+q*pRmu^Hi{h-i#uefqCWvUIy_s800lKB&skdAh>p39n< z)OE@!L8LlVt5XR<1EM#?pYMUp8F3WVN9Y*!&^U1W9J!rwq0%Y;HAQ$7ghcP0u`noB z;(C-M?4AWwMNW}$EzS!OU`bwzXC?FJ%W8@czVN_%eq4fAc*4^(WYm{w_Ym5t)r!J; z-Hf>7Ac{zcrBgqsH(V?|{2v!b{pZiL@-s8D5LZukS0Gp?LN^Ok*?2l?2I0)s92ljk z?DIrtgj;-yds(-Sg>0EInqsrt&h4*%e-&{55fq@SsFy-@8MmqKh56`wd2}ild~wFu zaE(3W4#OJp_l3@ZLzW&ClgrED^;#ap=Z-oQdOW}9k_j=0CyIa=DD+wbLjsz5?lNzw z>SCw)^U2?KnDT45BrxwdX4vf%2D;^%#?KHw^~`+{0}^UDE2l|EGL5ccLc1UP3$GT4 z?w}s^p~8@JMU9p?U&DH@-*eN>P>bI+sK0CHS524G3KssZLP9^<(1_(I0Y!xSGKdPK zgT>Y><4dwlO^!TD%eS2TIJ1ovY`%>b9Z8yxEA%`5G{5#wRG2Y!G_kuIdf=969Cm&b zrA^@XP$QPa(o$$a0<7ebc@+X$;a1j(URF~-YRkz21PI~9_I7|XA&Mtj3im0)0OTE_ z)Ch80oC8_87jDKI-u)2vIT@x`2~vQuIguM{%O!T{9wrwYi*0v?*)=s@;cXumZvv5m z55(=p$^{Z7Z(IxTR1_rv(2%w%A~|D#!ydr^D1L?*8LI<`WN8LD`7($?9{38%WH1GH-y8dZZaHx z1tJ-5l5J9v4advIcx4Af80>q93YPRS)!1K%J|hqq0f8qBb+glAlao0O^x0Kb`NB%8 zDCJy$$Ura9Do{89*oF|?-iSLFh2-;G7^dC?!i=^r>{mujusBZ$e@m4P5=3!p0H;)HV;o3ME8cy~6Z}I9_h-Vu4=zc-ZROt@N+gls zKZy6Iw{{im15E1TXRt3tN47QsJ+wbXv+>M$zT$p*Q+Tpy-9zA4 z=B>YArC~>Pw(E=OyYW8N5)N~C>IK<#Kd+f{TSuyk635I!+`1s8xd$( z-(Gy)+DMc>V(YfI>Ac@}nmoS?X!5rgoQUFbjWwz9MtLr|_RfWz%+YTuP6XP$UgmTF zhAQ-a>bd|acTbNQL@H%ii~0@%9vKrk%)GS5yPBguzWcl(ZVS5#bq@yK{w*`ASy6g1 zEGa6g?9v_h1T*ShLhBF^{`6kAB*vg}G|V5g!_*pOI#HtDLj<^h7CG_{FN_a^+G##- zZK+|0H6laAAvSb8T)X2>H7v7ZGR^lu5vU_B-C6sfCRX;+DlD=E%-=}?86ElfR74O( zp^(1X?B7)a*)wRc-k1^~IkvwawxXY_-Z>SZ-PTO~_hOp!cKsK^gD~R#0-=d5AxtwM zrL~RdSlCZB7+iFJERlD7R)U}z5@DKS;^~UjqTFUvBIpq&i9D*sv0i8- zPY9CiDDz`G^xcbQlLVBojJ|2VZN^b!c@u@}Rz!!pQ=1 z5zN#*xqY!q2;C1b>sH( zN%+zR!}To-3$w?5?gSlgx?+5?32E09PVJE*F1E@PAy>~#{=@PO2qknUQcWPPw*8Me zL}*QulX^1Ni?nk8pt+8DDPr@Zmd>4q}(>-TaNWeMrdhtS0#wO#=S7E+Z51G!hQ zTRNXGq{k+9e4hH8aN9FG!n0wB=R=g|QqIrwt)-ke@hbh^nJT@W=C8GgfGub`bCcQx zaMMJI;t$%Y?QL%YRR`h-hZ}BY^Amw{;hp4=!E4*CwIpg4oE_Z5-$O2L;9@-V$OO+I zXFpK{DGI&QFmRQ{QF)n(2bR`-Q3>-Wx24<8#p zTNprwu+DAK{|~H4iObzkOV+{$8FLp@azmOoI_1PZYTa_tA5L5%>5ZdvgM~>t{_8kQ zK93O6ApY7=anCPPgPZN=^T67^9_h*F2}GQ(c8<{G;;RHk<+EIoN^`iId3nrGBuQ`Ga|X<#px|wWOvNM^;Omd*#k}&rEt>0tl zm}rgIzmuQhuE zj{fB==yEzS+Y9~H&iq*ww$Rl~b1gavupcTX_TDU0DlWngdBh=3;%NMt zQP3zla;1;R-roN?8mH8?_X^p;QfTg|xAN~{)vNzdNn)rXJe(D{Aii0g=WH1|K;~-t zY4A~xS!?^LtQ*S&>byijx14)4!-?{WncgZr_SeS6iLMDOmn#ofICc4GV}M%szJAZ_ zTmNZ%c6p5m5n;jr@}o)yl+a(~vC2w0v!7fsABQ_>*iCsee3%CTZhVCd|G`IfqTCGS zaLj%V;*Ra_L9pw0@YjI~;rhv1+jCw7iWih>qxzAUV-k%;H+2C)oTfGsuf}-_KR?;E zzh9K2ut6})fsiCUzQ(5w!A1@_Bz$Cxtm`Nn^nYDK&l{Cu&SE?} zgOBcK{+MLru>T`W%m5ZrKr+7)~=$e=|vdQ z>mzJvsEA$PN1ESdAii4$ zKEYzMcO8;OpYYJF655|T#Q0c+x;j@Ug$a^gE5SDctIOI$KJoiQ^j2^wqX;|Veg0^8 z-W=IfmEduZn@IWAK~|C%OON;W*yf1-{@2sF@Q>%kTqF0Pr?ZwODewwAy$Z?Lo(xAP+7@q1U-3h2D94xMrqrKxeE9rAah6izdZqTU23(%)t@ zPUYKMNO1Nz?@7>0kx{!atvh_Q$(;cOCFl=S$uy^_8eW2y>^5qT`qFW2mubSwVL~Ej?(&_K zm)za&r@=q=?*)Gk6!;P9E;iCG$&}&iovcoUn{hGJTda73@VaozS(arfUH*`eY{`-o z!H;K){T4dgQb!|CD^(+gn%SECf1=R+>*u@v@Z~|*b z8*+Y~?0E~=fIs5@59->ithuLg+4CRk%HWf5mHlVABPfuHY?CKN2}t~kMs9Rg(HV{& zYrNai2HK381K^$0qMwL2;y}m$Z=oYu*H8U9mEsX2Z1uA%IBp$L7xYUhT&w8;h<@S)L0c3qqGk* zL~+;!hp2}6RQ*Mj8SO~$&>GO0H2x<9btTpg$v#8nqn+VBZbOy-b*+#nKI&>UR2wmT zS*Nd3M)yW-`xFp-)9)^4oG;4Is=95$YMC3tHRu@eYynlhGSu z3u~`S?05(YDAV2>9nO8v(q$9QizTN^=)|wh?W*aI@bb6dCrjQ-aHOM4#lo~KerW9bqv8cPRiD&#IGJU(K8#yF4A5c&*d|1;$|dE&#S zBmsA(d#~eb{u};^2WAh6N6e*zH(ol2!<#GyTVH1J{-Gh?-OM>XvD*F%(<%44Btu~I69r4#qg}=`*)W8aF;MTi}=(-^G9J){N6E++U(bCRezu=E!BkWzEpTLkc zi!7YQrJh5jMch!+>&}Dc%9o4u)-Z@V9O20w&h}X2^5j`;@R4L`MlHqJ7cHyW_t@>3 zT6!QhK$faT!%&}>^Kb-!E&L;I&kk9AzDV@pV4z@m28P+V=vMfU5XoDcavDgnW;qIW zv{0Ev_uJTd693R5>sXmi$uq;5``89olp`yBSZa;!VwhEEBO3Huj=)|s4~3R#b?vnL zS~<6oXhJfRvgWEq9E|37Ou0zN)Z#lhez9qeKDC=cf4Y#!Y+%Ey{dO)wOca(inQDGl z3ZUm0Y3(gtKNf_!%Uh8Fb!QPTUU|;G59+M!V|hzvbNKuT!PZ=Vimra7{d3Npm$h#> zva?A3o^s3Ri$PIJs?`VE#4V5XXK9^m(kf8Kbp+|uz*snHUn4h1U@`7W+N|r5GsOHO zY2QM|AFS0EmT}kl<#D1iXE9095Iy2suRnP>0MFTD8ygq0+&Bgtz=4O<+SLXk`}Ouf zSEwnvHP4wKg4;{<$_RC^%pkFyu5yI?6PH6;tXBs`dmL4 zQGpg&n3soNT#%zL@bSU$U#0DNY0`ifMg~$1u@Ha}Vd^ItUqWqaY$|yc{iIce| zRW1_$3BVrFSWXa{n?%1X90x&3c576z8ojAsAE?>cnRcT?xtimxPdB7CT`Zafx8LyN z0cEO=*SYhYy|T(zm%o}jXdB~d=R zz4MMG?a-Q66uV4$(!S2WFeimKBSqHRY<%Zs>#V<G^+1?M%DIiEurKpIM)A-2_-~!L> zV5sy=q4djAoT`boI|QXUNiM6i8HG zzrFvd6vn~b!4^7s%8Sp%E*qPLROVdP01YnqRU*&NtneeUiR1*Eh2D+$xXSkxbHc{M zE%?IjbENf!*NJ#!w@(^Smmr^CZ8hA8|G_dnR>Fsr{pBsm^}x+!jIu4-Za`T`pbsFx zamcfr`?~p2fVf>EKX#*D?1W9n4>)uL&@<*Zi6%tvEy)CNf$mA90OsKi5ZTlzIgV4= zeQV_0Wl_K}>UvvmKqU%a>D{~=tQXU!p(Nn;nOBB<+EDPPtfgdFPnx98v#K43BLCy= z(cDpcg$-CvZP&5?s4V-mq2X>q%H>ne<=GCcznP>(HgALf_43#2nM^E?mgJo$#xrw_ zxdC~Q1YjemA?D_+yL*BeftocWFWpfCESTb_>CqFLko|D9tWNhPVMt8Tgw|Yfo-!$+`U(#t(ggqsY*_2 zPbu_vU`>UwvCyz^K#T{kxxmu|Mq5AJF;J;FJ6pw^jc06q5lJRf>m(!En})Ev;ar$& z#9L-tie%HUXvBQBLNoVqPC=yC|G``#kU-;TzV_We4lLM zLfbYdvVX-zI4-*_TzfpI^kj%1+=)qRUT4oS|4rWO=+~8G_})ypnvkb)NFzDHz=xwM z?gK{8Uci%aFR>Ml^St}g+FFnM1Ng&YwBw9mV6dY})346y+mPY5E&VK#8v=H1uvkFm zUFH;QY7-9jJdHUR zRwaQ(Dttgymm0w_!E&6rqbis2f3+T~Zw&s84SAfPj00#?Ik2Dqd>XmH6pos|TY0$g zx`x=o*I1>kh`Ms>D}}G8ge{x?%g;bu6&=UhTZ`c}PBWNHS9flvHyvSQ+k zQ*cFj{EqTLgns~OgRm!hZPPfjy`8MKeIfj>@P+m9jJeb0>H}R%i^#ueIwB#j=y<@!8eJjJC?S!qA(xHdCXdIr%+upioUP)(AaqaWj^8r$i6=DO(Q7>F=SF-&( z8irV;qCBdF&!TNDDD7*FVvqFMwFI5L7tB zW*=9fGoU%~D8-PWA5eikh8(7K^cus2rGrRzXd{NLq+gc*mYS zI0(Nj`t&sHormqX-(wz!kBr!wraMy6bEep76Hx%2g&hUZ557F8v>I0Y(O}ChB*^fF zI6h|OcC7>KwT15pSJ6jjGnFHPPRtg5E8s~>C3Y6qt0R10D(5_#%P59|FTa+px~>KW z!NcK=9y7^G68@g|A_OWB^kmqx!)fAtR5np@b9FZ>jmXMC&-SE&dvVrF1 zSB^4wER$g8yWaWr664#qR7{Z$&0b{!`kFf>e=82Hbe`X}3or~nq5`8*2H%>!vybNB z86gj?`EmF-p99tuO=UXufm&pq$Ir7J}|czolYiXLD71Zcea z35aj|q6+#Fh&2KwOmCC-0k9GjH53VSYx<)n)N$YI5hZ3r1Hqa$7~sQ;V+;4O*%#Q& z`+!uh!>{W(L?#MH0Z)Yt0?Yg8IU*8D6#KRtkWiVp$g#HXin*LmcGQzr6V>HGfZ;JB-kW%0Y5UyU{{x=#!0)VYcUMej~s zcb2!Ybhs%zHIYTbSRvrjOknKyyR4uf`Bx1CqZ=w4_7HQ(Ulv)w+I29dC<51>QXa;{ z9eY#)s3Z=F;QTJWw6XS(!P|OhYi2{DmEN;j-qWA?-_RM<_FIMzfA4W_V)Yk4s*1l8 zFgvG6BMad9czBrM4=3i;D6Lh?`($3~s`>mMH2m${0yw8H9{fzQ8Lsx!y+`(VCt=XM z6l_M1@<-S*vF6Rkmu8Ty&b@b0X!j+l^2qJkk*7O6U()0pUsg<(ZX8{mI!p5pbP(P@ zuuLo;FZk(Q3cq?eU4c2^(q}dU<$^--^U2E-8K2Ou#-^@a)e;wX|a@^P{ zH9cRCF=9%f0D2YyGLVvNZfbMn$$(bBW)`Yq3L`GZ1B2=zGD?l|;#lGqT03KGPo~Z_ z=IWOd)xpD&JYgeT2C7%#XFcBu_qESvILFn)2sjIiDv1VpWEKPp00jk-f802J8qTumy@BsE7<+U98hs41@f=%hHhuJ z0xi{9haO*jDviSG+PK;fW{okBfkn~`>R4x|w{z`d%}(me8DHN|#S5-KUpd?*lWDGI zVr6BH@SAa1+idRl_wkYNKuQBMjTam^p;ilXGvxaEBI{_o>`o4h7vWfC~-cp zZV7Yhy`e9t`RnwFeM6#_MIGyE#{<|+KZyH8w@j10Fpsoe-z^cy3*9WUtza-u@^q~0 zo|9}tygX4^n3W^(`|;J*8MtV_A@XZX>~eRRZ2v3<1za$3KP0ePUC382r##uwiN-}< zudfI!EaVcL?vDs_@E})Ja&q+(Folq&I`8|H6)Z_Qu6?ig@z;ik$bg*ZznEfZeLHex z>)5Sb-AbGRE6L6`qW8>{(ic{E-r3q1bEvg`Ob^2Ko2`iSJ@Yi z;xy}kpx_>K03IX(P@yZ0lAFdA^VVHkCrQ;KNFAWCjZ)-(RAhgiGQeWv>a4Cb*xJ}r z_|Dy>>frZz``A;`$GU&`KCNBwQG_~upo$ncrhY1=r%pU>w7&e#>KZ!SAHp{@V z7{)0x5R(ueBAcd z>_{08pln(MIRF0pQBL$oOmz)F{o?}041fK@uI`I;2X?~ON!6S1<^QaeN{E zh(VS99a~sI)GzvHlray)d>?z{h6S(?)zq2Gnw&Ymd5!aYExY4AXt|>_P8>I2U_(jS zlaz7WsSJWKr_lSb`((cAEs-iiuGxtnyRz+;FQsH;3KT~Kn4+^={;cg6O!@l+^0MYF zMwQZ?uU~C)`3Ky|SS~6=N&AgZoOr?@7s6|c7a50`4w_*0!rr`(i!tWQLp^iO-PRL@ z;dQYqXcH1x#g5sK3R*ynHd!#CDT=_f2r7OXS>O_^AlC2yy@A(_Fz59AQ+Nib#7cOzsXtI`S>M+lI$U_-WS1>8KPi44Kv;4XPOrc52qK>;U`Rs+7& z)F5)x@HXEtZ~MLLy3@Ybs`nZ-+B|aDJchfJ@x9~b5xKwB9&X-F$ckSO0rVhQW$c2B z;@XL%GgnV#w)Q_ZnmcbsQB3!(I3Pkrq2I%?t*3msTmt0dTO>C`p0{}80TS~3D}MFD zoU92Chl==Ok+O70;F2AFOVZU~Qa$Vw^?8;|Aq&SX`~`c}KiFB~VoGZ(LGR3rHTGO; zH#8JxZhP&1#42?ex9w=Q_Av8BdlcTfX_3uLzsO%1A_u{n2rDzfPz%P(P)iXbxiH>F ze5*a+m6%^6!Y@231D;MHX2x4)ZLX_}w6nzwDp(tB3;?LdmHav1Bk4`CR81^2u}+LY z6m(>Ql7p3nwDboDVw<54g7RIecK?Gn@2%)2_Ov>ID&oMM_(un&0^KV!CqV|FI(44W z&wBmtsrg-d!yU!M{3RD4@&`LHh9rVqZpe&AhNGgZH%>Ub5#dkS3qJkD`D*aUv=cKm zqSY37MmK&^@IEeg|Kl{{!#_UgsHwK2wOv@Nf-<2pGecCi{PpU;Y0IV`MRXnq`w_jp z*LLf-J=#LVsy4|I)JX#mIV7tPTkz&as^ONCUNh4frPXd}Ogh1o4YrXKSra_x#EO(AN)W zA&8(w(9tczdLi`~efO9uj%O9q6W8=G9;n>eD? zcJ$|~5HD|4s~js)dODN0*|TpTGPQ-uhE_S2zwmoAUVR4YXwgXw_F^KRMNN_fe;$9~ z6kvN1S^O!P%s_>+EU9KmZ@yUDf^JYa-LxGyXf12pwd;mFH+a@cVppqJl}n zNo1&h3G>V+AOC@OVeBt`wemOi62kwftl!c<-Owy}W+U)Cqc^RWLOZ`4Ywx|Q&J!|u ziO-FX23;?_@b$cv(FfQYP`I)9kocpXo^Ct!2&H#OAB^DiwJPmZ?plIKN1ThaM0H1=&F}&^7HBXB>UMj0% z{NWqk1M|%xV+(1Tvn*ckK(L)O*5tp4;SwZgr< zam}jAgT?QCK-V)_+riSrO_O$s8-bYiIY)j>9ut<+_MAB35BAljAz!~;vErkRhO(6T zY9G{c1W+u-ukALB35x>aoNQE&#fLv*;!mMW=B(mZlI$ogoZ0ayq#Y5U_(z~FtX(fs zTi8WxN}GJTP-L9tF;&PfE_s+bQK3koOgaSRmH3tcmbqL2=MR(uGuQ;Hy|i83SbmY2 zM>lq@jC0rVXtk?*6a41I6{R1GOt8DxvF}9vCkiuX2-2ApqS!rz(-Zus`a22b<~-}? zKYoJiHZg179hv^fUS}=w&Ef5_O>3(j7esGOFbcR3T4BKjKi3okZgUkdhldYBgMFwD z+S|iROa0cTrC%XD{#fVGPvA~PjE%Lft}5?@6B0bNT#bpd&ifoq zC0Y<(34xyyMq49f@F7mzXpzDiQTV8Kv|A|Nr0a?GWdn2c-Q!iuMWWo&`Hq`lUVkfz zaFouA)sTALV9&A6P#g+>KLWMTGPT*XBQ{l)?)d)L0LjE+pu6=$(l(tD+}~3~2Xd&e z47uhS&R;ZA9YQip&g-lOmeGWJkg84=#l;4Qu^d%78KUpShAJ{CIo_zv%0e9;Kp5rb zP`tGf>RJRF#L;TL0rK6W%}zjzw6x95xl)DYLd?~BVv!eZxI7_oN1pNtQMV_Iez?j- zB)6GQ57pH=xGtn~YgsOZ^h9RlJ3Gw*9VCT7ux2$;Mu(gl*^Y#u+oJ_*Bi$inC1g6F z8@;u?IyRm+rFRJf)|4P9K0-JtX^auMEvDs~0fHjm{g9ex^d;)`4@TOoCx>^tXd?>! zlGTW+M(b5IO=IT(bqVmDd^S{I3;5~he!~;A$Sdy~Arh*gY@JwuKI|T5P zO6m%EKIA!1t+1d(n*8Hq7;npup7@ZH!!$tX5@?TS%2Xkc=I9-K= znUcU#-LRai*O46&I6z)07Os2vfpWr1kEiXWedk=o{dDGJP0K(6wf;}D z^5bdrp~{!MSK?Q{-eWbCeTSr{@hw$75U*#d$B>_E2`Fn&Q5as$pdys6HPN_Q9E4m; zD$8jiHyj1E#l$~p*M?}{spVy1^xxR_wBOI7zoC9EjRp}*B^tmUEOhz@*lT%x#^>Yc zOE`J>2t-MQ#YN%$qDlm(TxrIN&7rTwnhb!IuVG8e1VDJ~75S^EuvX-QkW8k!4!kDV zbR;ItbzXT6H&KMO`DA3I!SQspt6@1Wfw1=>N#LJvDNdfNTUBfTBRoI?KJ#_S4BTR(Kv}Ze! zTUsc^X3Ts!y6*96Z4RM5*w5wtlShwq!L+w)Ct&Z5TlFL>Tl6L;dw$zuGxhvgPm}gc z10Cn3i12yJ%gns+0SChJ=2-|zRP%^_;0;Wx5UC{-_|~h|$O8Ub)89sS!h(6Z4$79R zjJ8@*>S}RZUf)Y=@jvN$+}aw#s4v8VPUDX`+BoJ=P-tVhAQ$dkY!gQ~&QOa9=S1$z z_td@z|A;U++&$)0ax5q5c(*RPJNQ^?%FIQzOu22WRRtzc;ZCO`iQSnF&Y6=u_$(9Z z46r`JNv^pW+#@BIZi<&NDWXsQ!Kgwb+K}li1c`?2E4|t)DO=D|sU?KV0kLWoyAYAJ z0nAV)0@5i8Qk;d&yZvC=UD#l>+I9n-dV4u@bj0J8(29EsdiBv;e?g>Wf;QK2zUxGd z_tIhy(#{k@;qM3!XCryIZO2F|!fK=6!7_JIpS(abjm0a%BrxosA{WQuOa1Hplog|t zM98`DkAG{^)dh2|ftJyAy4O3Y0efB^#^eezBGlw$WF7TiLl7@t`B^Of#*y|r@43SX znKMDj;$pP#6RL+EkZkA+s4hv60UN{j)mJOT>|Z}t32tTLP)NTe)HvBtGw zCRIb=%KP5#sv26s{36`lD4U{oF_8w^dOWORu`B_TmLlsKehjYLW&c5%S^^Y8XJu*h zeMdQYkYtvu7O~R3>FbOA#{S4a(qGT@N=?@Hj%fT}JBhOHkz<8{XXyi;U)dI~LLf6edsK2g3k{RYq-C zIzk$bvwrUu3J@q21K?m2LQNWxFg(TuDa`&Skaq@A4+_YPY9+v|AzGpCTi3Tf2HZ{@ z@y5smDEz@Lhdmsn1xZ<&qkU4WxM3gOBfhS@`42LQEg8vss#4l;H;4gjIaji$4Sn0yZrEg##6Bh}N})c$&$E{HPwg+U3RiAiWD~_GO$9a@HF?BLvi$e0Hw(#W`c*A_h zK~XcB;`%6o*SM2UETO{YW<7;Ho4kz)Qem@4rPE^V3Jb7|_xmpTV&_T$l?rw$g912b z9K8ptOQhy^F1~*Jt7jd$1@_-|x3>@LR3oB``t#H*Z=5UKu~ZHhQ9pt!RarcExnjP* z{?~N)Z)VW+*$2Tlw9ght(&w?a_kcdB2UZ?8{87MTq$4jdw~PZ+C=VVrO0Vm-PZFhz z@tgHmBz{{{0RnQ>!bfdTUn!t6v(M;*Udd1rG7A)>%yvHHS1ZeYHwDoqMW}j|L4F$U zm&Kl`5sR^s4#juU69Et2iq`!1fQOPwKk+spJntidw_6z?uZBZ5-0SP>s7{`&f(#uLpt8!#)5}J3rM4I zw0?h{XgZU$GIdtu|7u-kX-O{X!f#}ytL@|x0ouEkIGy;)Ii-ySiU(s ztSv&8K!iO(75L5tJjQ`1C&zdP%1y?9%eTzJ8IBHiYNSzbEKk6J@IFW1`P^F=Z4mt; zxG-98CxX85HobgtK#2Ulx%?3X%IDd_F7P-`V+=L8R{e^|E%Z&)kaf7HQ^N)FV_=gJ zx)AVvr&?RYd>tW3;crJ^n>VVm5dREx?k5!w6UK`)oMt9;%!3 zXQu3QL=I6seodJf@EtugL)>a@d#WDZL4JzAJcAQVF6dwBGVY4@GYzYvMO*9v#EC2d z7O_5LB!Jm=`rfbjm0 z*J5s#xUropI{1~o#qU|t4C&WhXDo_dL4KYf&W)3(1BKJCN9T<6_punoE_{ADbZbNt z{35!-@;_~DA9edlUI4zr!I2g$>X10pc@0*MXhG0@wr(HCsd>|1cU(=id3imyvUsKp zpOGf}Ih@$_j0nB=cmwbIOXko^560Ysyoi~HbW}y{M9QFlCvU_ZoxIiFq0d&IdZs+S z?l>b(e|S8`sjwhL+BlQkTMt6tFMlE|o-4ikyZbh*j7PfapR6Lnfk6~Im`DK(2Bytu zcvKAbz0zs1S-w4=RVu=r)_04XS|6wme#()a%zYsL9RD+#(j$Zs)$&g16C0vZt*N8QqyHvSj(SMw6Z5y7Ir(-|7hsW~RKY7@N8GOab064v4 zOEh^|bHATZ-9M670s3N9ljlR-N*>$rU9vO?qNG*z+f~7(ZGDZ$zQd^mXgZ&*X;*@o zo0WNBRDbKFwS8)wkCdSY<%=uc9%Zh#n}3YDta2IR-|U)6jKn=$U(k>k(GhtNXQapZ z;M-b1HgS_A^f}3!Cxr$n)M4S>2x^{~A{oi!#ud~)vjGn9t%(5TcHF`TXcx~L|GcTa zkJ=U?_YeG1Fx{U&KDe@05}8yY2K!e~WRAscQDggu$C5Snum8rr8OsJi;XM*teeayu zjCFA&DCTT9%X=aig+$TT)a3S!kf<115OK%;Nn>Tv6?EOQ!-#lD8MQ+iz z+bn)J4CG&m_G#XeAGw`JJ|#0O=uDr2T`GJ6jFZC|98x<0G9%yHILY4q}& zTQ~kF(yZHggyNN=2{nm<3cJKsAvED9zH?tYy5mh+o8*qBo{53Z-fB4wN1t)Hfi#0{ z+q*uJ=>m~XnwP)2>w5hQXc&sNJpih||Bz`Cy3XlI&cos&ADtZHb%#I_@taWbtnLuj z&rZ%}edQ5}ke)^c2x)-ffiEkR2hSogV%T)lXb?tbjLm0wpPi#P(i z@<>7HL@@W81gg#7>o2>dr6PFPmYi@clm`bK|8Re#S)Pf2^=U1(SqV2Cp0wB zC!&}@L9UL%G(D+z?k^4^@DVcS!z_O9m+#gGs7Dol&E9-YoDliKo>UB*R6*_ccWhI$ zp#~88)55G{6w7%_$$3_aJvUp*D`#Cy{(*Z0p!AAjujkH=$;)-d%@)JE(vvRQ^gWcD zPO!O7nfOLoww+EKJ0;#?J$fl+Hd{|X^`Y2CL^iLj|1Ru{z6W*S+Z*tT4e)TH-}4r} zcm%gqcz-w%m%3J^sTzsD@YGgf<<1$%PeOiUOz-!Wq25^m?;s~em1K5;KwR}PX;^re z4LoV10ry=(T*PiUH`r;VE-Fnr5XE31G#u{oQfP9AXyscy{ddL9u{}?Xp+KtbFWG8- zg$$>>=4ixsnuU?4op%;Y{yCn+$;5jrdVv=wdn>PsiCcyJI7aJZcH&IN*gS~#I(iUu z=8$2J4@3qd>?ju<(Wmo|Rsz28cd{j^pVm6ZhREW3RsG>QKjZ9feL;f7H{QTXMA_xt zH{*fZRnZ^-)DXk)JKu`3yw8(KH_tbL+;~8tjUX5&wKLcFW=rR5)|IsB96CpdXQs6{ zhDsC*B?I8=o-{&HuQQpak6cD>sn+$mfQpINyER4!aP5*FP`GK!@j+W6%*h|dEPvDW z<83C!WU1O!J@5l`>^GIvOF6SYsW&gu#V`MI9d%U z-`}4FFq+XIIi$O!VRVWhN(j=@($d1{E>S{hFc2heLXd8dmM-b8fpqP+@ALcz+qG-w zocAmLqY?PA6Yac*SIq^`V;x)nXl3WbsYXbLyFXEAAKwr11W7hV(cac}ZCBXaVbZRa zE+4?qD?~JK^yapR?2-g&vd?f=Ge3og&4GiNxjYd~I*FYl5N-FSd(2pf)%wkJ8inkQ-{r!lFa`{5|fjB>yupFpCMP>O1N`4&q(7 z_$p4Eun%UGs1z`OV5M7Ne`+c@{tK|RXub7AN!fJtaaP`2#*l>qyC<{e6viLAq>13D9Vw;aFIu z0PA(Qy|*l;bH=_jkUt?roVZJqkGnfC&vB(1rk;=f;Rj;JrpG2RWCVa&0Wo`zf(F)g zS&LN%zPKDwhcqaH8hWxoK&%#+QyA;;S3LTH)Tjq>YyNFbUyr(dkxda7W9bWv)UBY$ z(gL}+#J07}opa}$;uO`_Z@jF#rW9kRcV|SneA~}ZHU^E$=q_DJ*#^k4 z0AoyJAoVh<@B}6H&tHi*BFMB{_`f%vI2%x}4*`-^7Jsbyh3rAcG@HH(EkE)Px_O8P zKFsNDY_vzOE-)?pmBib!C+*DQzVq-@5@cXh-Q>A5wR*E9GU${WIi`wF`<`Nm1&NIX zIn^Lh-0EVfi9c2^)$={&?Df@Uj-rvkUi9(m*mL`}Y_lgV=}2%q-dEq{^ZN}VOS7dD zs&ZOTTbAlw=9NOvph6b&Eg=QJ%a0HlonrUkWLgmoO|H9t3U&6ufD3(ecsXXjI?)(0dU_X2NW-mx^j-v zNLte&>ZF)3ujhQlHnAm)G$VDm?}v55f_$*1>$s~O6*|4a0hEg!eew9y|5X57{bAse zphVui#y2}RLi(0*6McQrcBaEypW{5FQh>Vgx4s{#TLIcq?bb1mq6S*j+-K)w&OXXf z>5X@wOydh?o6Ol<0t4x^wp_v7IQeRpNhS9& z%0GoNNCdOK!w|c}+4Euz5UrK-dxp!2CQcHXp6N7mB=oYr91>S?UC(R>ZQ2Gqv(_Ov zvdu!)GoNP?8K!y)fLYYeJT{i3KWT$1b*I`241oFPiaI(9iGU?wX+{KvD6fp>mfzoy zkGn+xl(;qLVXrA5eE;4rZ%Kz|ARKwIkiY$l zR$Rc{6!<9a0&6M3&(2X165mjeFf?>KcJmJ4>+gOO*>Xf}qIi@nfW^7v=T|TP)JfJA z^Xu}tMOW`hul`9Nu5WI9pmwGk(fE^rJCQAAQh}nuKs!~YnG(xWrYKYs%|gag-fzZk z)AAcZvGYohyD66Y@DC4k?`yhEe~K(M4tl8GlOgkEtPPb>rb0xn!!gSWw%gZI2acYa1n_M2NZH|qU10ur}RxSRpb?=8LQp* zSAPH9ILqGp&>yCxLSV$*S3DXK6q|1e-BEe1~cqCxMBGIjC{!4Mp?xFQ8F%QImw2J2_~tH zcW88}`nOLS5c*o1IkqcUP~RVogrX=<-e7~CZ{N62@>-3ij5Ixi#zt)355Q@5LigXZ z7#`%6-`n@#vC2r%M%s3~$Yo6IX*hOxk)lBqOn&v2yBITw#$;%z6Cwzp^cxQ=pJ5kc zN(Nb6$2tsKzn3#`w>20tK?4UA%eI;EfZG(xfelRKcCnrlyWY;{Q9rJNvq=%4tplS> zGzxbNmjv?hM@9ct9KQ+u^OBe@F+fj7`MYNnk|(N21J=+%XWl}uq8i8|AxgFpS%68+ zfD;M&67%u%k4%>uRg?|4PLPPz9^_d)&bMm*C0s?m$7w=feV_RI;qTOW*1XKnpax}2V+sIo)~P~J80^WoqNqz2c}zhDka7x-@Pu} zd@`3w#6=)xDeC3pw|Wv{Y}41MY>fndZQBwc?bBx)p0QKvtjt*v z!fIZxsv2$Xc`D1^ZzRT|`BJzU4-1|Lv1rAn4wDM8448(yF!Rr`<60U$cV@_1po`}4 zQ8}y8t#7g-I%GC$R|RD+CEC}Jw0*ww^S@#-e<_zRjfFxE&YYS)lPzy<0jP1jxwN&T z#F6GAeXy_Y+Sw$VUu7VUfM8iiR>>XKcz4fwP+9BiRd)Cyso}#Ft--rN7C`)_d4~kV z-4&DOQKxLi@BSe329!{$Po}t@gEn`zvKC zfpU7KO`W$MK_udsMGwCKdxp#jrg=57-Y|hkKCq>+rtI~WDz<>QOC2^EpKbb4dQ3nH z_SyhE_HY=_F%;Jpudy&8;fEMbev9MXMo1J@KBmv6yHeArv!H`2sS71tcNS%^1xSu@ z0UrsFs%)TZEcHLk78A=zH}sm=Se5uS!~D3p2s`LqNo?_xhjtR6!irVakI2*K48kp9 zMDqCWc1lu)hfqN#B=7eK^Jn$J2Y)@cNyJ0%9Ykq$Ya;eawCZ!e*^;%L`DqJKEnAK! z3n8n&!Y3N(tGIyfC@^-GE7jIQcMo2Y_^TDmGQ&vV`vv#arU1vHQEwsWIWjTEbbv8ZrQCCf!Og$&N6y z8=lysAxJF_kLd3w@6e4I-R4puy6-} zWX1({KQ;ZB1y|w%XdNBPSFR*@4_x#5ug@M=q`IwOKIIhB{#pZ#4BmEjg!<2j7IFJL zaf^Ff{b{XjAzkuU4f)sUy3WbhjOeo%zIuPHRAYv)!Cc3_oM&;_B@6&prb*mB>yAeM zshUeRNr9pk6b^Z?$`)SnDMiO!t}5UuJ~hd3_bRBtSm8g~z^@X$D^jmLtgY;`P5%-a zO%b)75i7gNo9HC%?|00!TKXXAFiSFJm%IC^VKU1`}#@Pr1k-KmQ@2mr%DRlEg~2QSTH1;dpRL z>cxm6a57`i@f2hW62S%5SyfhexC+Jf9&YD9+|1KTEesbk!>@|p#(Dv;N9SWaEVbLU zE-oo;GImWBBCG}`DmQo_Z8m@3(t{mF!FZ;o^Yb-imOj~nClnBUB!}mQ)QW>Xd3eX5 z9`tfIU;LXCK;~w4_7w-niiX%5)aqWd7~Dl;AsF!O(SnZ zfJCsF(HZ1gME=-0+v8b!AK9Omg~4Efef{dNXJWs#EM-9J(<-21`ky3&G1jH`HJ8kI zpu!pI2r-;c5bEPChD*>d4Zr0nTj*2%&==_MF;D2V$(|6{n zkywBkb`pk?gH*^_iEwe0l!!Dm(ATwGoa@skVKElmE_%GLT0dqTJ3LOF``%l7fDP7} z$rRhp<*B`C=()A0{lNZHHEEFA-}3?GfJ^>$U_5pu06(rR4Dgn1E-^>3^zTO4K-v6O ztU~q*oqy&iN$P@N`$MeWm9{b{v2QG`Z~&{8jR;^iS};9ZCET{9dXcN+f`271u0X6 zSq6G>cFfneQa!A7du18&rapjB%4yQ8GyAUfEwAaB$dn)ZLi_@PX>zghBtAw<1@o8k zCrA8-%wrj=3503F&%edT{bZ=17N>cV$UdoivwR7` zGymJ1piXnKc7Oc1-ph}_JVXXBLqfOhb1j>@oks}6-7mb-+b8jugS+qikBFQS{BsCs z0b28SDA3i|_NNE2e;eT2IgIUpK)+r^6}^7S@*?%P#v_4LB#fvp9*u<4nX-dTC!CEd zc1P;-;8}4+DwRWeoh>CY`@D%jz5x&qUS22t>KfYf4aI^b#QwY6b4GwA$&iBwGsYY* zIFXWvqHk5P4|!{bh&1e|&4!KD*v8m@Q52DY{MS9JS2h?Km+4RZgB_XB5=x5|6*ze} zQ5n&q-9_v7or%OF0U51=IkPSVA*J&_7K=2(o!@+tf&&rWjvTgLq6L{B@G~}EjUF8U z)Bl?DnpfM>kDZ>8xBt|zpl+SeIuA)n%=FQ-P5@2tIF5B%Wn;D$9D$aL$ck`WO` z8{}C^p2ARXX{_&MDBhe!zr?c;Ajogv+&2yE{E`aVlzNJ;?h?{=k8n(2)R7x%A4gl3 zV~p`EUmlEN|JVTVZN8fpgr2LhA_jy&6$NyIkB2Os9dQgO?nT#j9ZN$-yq<-KU{`2W z=Qx(F4H5lLYud`w`O|>6(%F!L!EBVg*QloB1m7Qxh>{l&B-_bJOOdIfl`UzQKkkBP8Z5KDwu1fnN2E63f>)d(wjDf$RTMZR=*z><1dK%)Ub-e)lMw|?yBUPV-2Luzn= zmvjBIu z4zCvxf?{vO-fJyW^d1>5PA5m)gMDRJ62oSY zWO0*)BwHeuIjAVV%Of9@%)J1U54imvt% z^NF~>yLk@e_z%%Z;A;J8q^ly?84=bnB=#`PfaPNv$yn1f*cXmAM;$SSsEGD*brzS8 zfo;-hnU_%O?KP^dJ_^--D@HZmdu>Z9jdiw&&+Q;;CmCaheXAY*h&MH1re|NZ^gNKL zzJkOfb%2GQ@eCjE{1{+Zu96~y$J^2Ly@ z)*Z+HzKoIbQLzkN^ga(isq}G>f0W4IQK$Lp(#OtbKW7R1vZq3fT7>p_TNKwNsro#Z z_x$1ku=r}hJ)`VcYPrbp`^#fur&#zjLM@r;z;X{`2r{gdmYxmnW<^OYKCLRW5NKhv z2z@*LV!1E-T(Y@X1_J#2nbcF=S&iPk3~G|EN`U~JiNNydcR`@->m(*m(4}XDMxr`5 z95Ca-Zbr!}a7U+vCQ(A9Pyl>}ACjTe4@_8Y7n-K%98mFsNZliAw{v z?cml?7|DZm@E~`GKZE<^wQ= )2BE|u>EmX1Kcw*)d|Zeh3=iUIMN0(!Cp##&B_ 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 RMjMgV{4Rx{^F@hoe)c2S$6>sP;s_^_$qZ& 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π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%0D4C*X|+5 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 W|HxJ8%smT$e)`(RTIHIU$o~VWnz?cS literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c981446 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sat Sep 02 17:00:25 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..4453cce --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..f955316 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..f046d2b --- /dev/null +++ b/settings.gradle @@ -0,0 +1,5 @@ +rootProject.name = 'dragonbones' + +include( + 'dragonbones-core', +)

    r-#hoEk$tAIa&XM3dmvl;pe69x6_ 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 kyuQ#zi zA!S(j`N;ElLJ3eB=->zFd2MI9c}UNVejk7C+btCHJ{~Y5(li;w@d{a&oI<$B!r7}x zb6MJF4^@tIog(~vmP;_1{p*Wsdfm1&N^;~1#y6MH?$@S`*idO`B9TCYqI-i>g z-YY!(bGV4z8gSsAwu&RrEb5j~X!mWItz>h@;06nm&--+XcK0JUnmOS4WoQqeTa4rI zlRLVGZi$`o_Ms)>?s62yK?Hkohksy%;e&%^kTKTCfV|(4S=X8jPO{;%@nVd*ctU@s;g2wF&DZMi_{|vJM zx($w`6S;cb*)bBm?ediB21Xx)*D2NcZ}KT)ZORxLYhka(!TnYK+d%N7{DaunQt1vr zqTrbspC)&SYYFjq1F_aHmVpp*{l$6-rX$luZ}-D+kH?mfPNjQXxCsGZ(v%GKSvLOe z-MzRokb2f;-i!4<7;bp?ZjO)dvqvlQk!2uQ_oaq}4IrYM&lMi~nHd>-dvk3;xO>6e zcPHo5wWa`ne|ZIs5anb(zCJsVn@RfDRgePE$k;{Ehp?t=QaKDK;wKd&>%G}KSX($h zL!Lf6#bl!$Gb9G5@J=}t7vN4q|Apkg?=&XYlZm9=&@KeSBZ!hx^{-Ban;={$y>)<= zHnyt^!-wyK-BEOm5Y6%5qH4Uny6PzC4J{oYf%)^oGKn+x^k10fILkH4(6DBo-338Z zvBUX9B4yEa$io79R0Tx%F~bZ5r4~x6=ST#G+9buASB+GVF#)>+lNJg=jQ+LcAX6Yu z8BpLOeGAcVA}?LwEr|MI|E(YX!`w6Z`$O+X>m?r}S4EcIQp~>mk>0F!{$VWVUB~cQ z%~B!0E*5;Ed1O5OapzK*Pn)13ar2MH#ucALy3<=xz=R9c0_4?dA{&f}N7fvw!2l>G zTC*Cw2cqL?5J&#X<4Gcf^cHn9vFIW-NZccq5kOkXKPs@4>gNyk*IA?t{5nq|{6|%e zF?G?m;!{9=8>{O1`D?#u^&aPxh||L`N>LEzg9-ZR8WpCS`NACcu8N)J@~A(vzmGF? zrmA)hzCIW9oF%b}D{?AxCUG$GV`RmVuXM=rRuPycUwMT1X{b7atg^H3 zFHR)glN#!!uTK4p2&>q)10ak;l~b&TJRaBa*ElL+XNH$yJ1m$l$jwE*qoiUe@i}qN z>t4Xgvu!%>ux&#Y?Kx{z^JeKc{Piv_9X2h%s5LAPKsjrKusb(Q6BHk!dfy16A6Cf@EJc)rL0$xRb6gVeo@F$zbq|RyjCCEEhUzgsXQb!ta%y z#y3^1_JU_Mf0~|~cY63|YXTo=QTJb!olzBalmiC`zbs~u9q(26f+|ymct5)&*$-=B zGIdyG#g{_B3A^n6@8BOx*TsKbQ%$d25>bSto89QF#a{6lWj+2Sq=pcINdER&ce`j` z_Ae?SKuhCzmtM4}YH%~3h4D{y$55#^Izoc$4ty&QcoT36+KBZfdLhpW6n4N0ra&rC z)W>J~usufNVQ!$lI@rs9h{+L%Prl?pyeU7@C_!EO(tv$Y%J@wE z;cK=VZ`w?|;OK{CQa66%Oj5SOZ)|Okz)^v(r8s@VrHignI=}355<(C(+zUs$b|pyYZ2^+bd~~bM&Uox z93vbQ)u`d0zZwzIrav^Gg-!J8slaPJ<^e{cDq#c|!t-iENxwS| z7*c9kC?}AetP7&_(mLnt!o)x^t3?hL`_K>lvC(umS(90B}<(YhZ?y zKf2uZuQn}<4OdHUd_uzap+Y~1^6U>6lvm`p^LwqIrK8KhS3LP>O#)vP!T8hxX7BOG zh)_TJ70?ATN@_K~_`?>Qp{N%4C~%oG{@|iYar8e;U(&o2c&O z=Z@(ClZqdiTSU?p6K4H<@ZrnYwS*Aj;Ru7n?zf!Ugw&h+=uvR~Jx=N(`=Dbu!>XeB zQ_!r+A2CZO_p@z6S0&cz9Tx(ujK{SsE!R|L;W|`J5+Co_dcvLN|h)Jd;YE%B!>BL^JuP<*@iza7bUF)mJ|4S7J4uM( z8WStKhkC>U3y>aq^i6|j&FEKg(v&7b`1v-;rFxGU2!90Sn@k6ZpvwC@&6CSX63cp^ z@*y~&Zi~E?Ye}f$$%@>Lb`1~&zi_Z0BD-S1?;OwzHV;t2NcI={C8cLpei^7~L?}H1 zPiq#jN23l||E!W6PZtMDXw=r$lvdhQDKGZpHM&}sQv!?V3O;=jXi|i!orc0IiiOa8 zLT@hwYkH%Zz)?35?B!JF#9$NyI;c15HX@Dz41>v49i`v=WuLYd{*M|tE_=&`G*49) zc>bQSBk!*$MxUUl=Jtb1`-$Fd#MKykk1jF=El3#B%6D_n>6B<;mBJ8k$8#N?Xr}*&=fQy@Ym9Z0Ye4h5=(BaWmmIS z4FeX|sXw+z;9j?l9(VbVgLOP9I$I3w9b}GI<@7J}CN zBv85XuBC@Z0JX>Gl|P&&{9YU(MJ}DhP_Eq|7X#)9vPBvAuw$0OWXu{EZ6I->dJmZ6 zKQV-#X7@4tTAq67OKFk_kW$F|`;wRh0rjK@c_??P0Ymz3h^(`zp$G7m$0P&C#fJJA zL&*r0DKxz+i1D{|hyr}cn2XK0P`8hmB1-{gcm^vEe+5Zd@h(e$(x83}!6$ z^Pt9^4sY`f-ti7sRlJ2xreVcW{sF(omutRnkn$khMTluT>PVCa}1RO#^(>K22IASTYQ-t!I!M_uY5QZrdB(4tYboCx2g;5$@VwFwpVD0u}}IPtOj>H&~(f& zw~{Kh;yWt2zvxsE%U)NXrtwFs+=?O~nrA&MslRC+X55!-+2oh;W``tkt*nE8r>_Pzq*bh5GFE1SV&nVZ0 zQIXu*+V6^#m?1?8cJ@p()Gv2^lnAcvY#g`qekrk+^WRX8pRi}HLlUwf!jXXvSC|8C zN3X@KpohH%zyu~)qV9cuC3`gTo1h0|^y-2zBSKXUcS2Pnb$_(f>9>D3IYft!)y|5< zS91A6!_Kc29N_f^&}hLo0po&o#_VB4?W2qe^&*XL=?6a9ysLqf7asRKs;YyfRpm4N zf=76UgNWUs)Ln0#$F<})ez%&YuSWAWL)?bx)QLAm$=^je(np@NMCGxyRHQMSLsl8s z%~>M5sGWnpIXgWOjQXP`yCh|G6;zGCjP*y?5++t*{PxSC<0!>9_kvSoB)K+QKBN#B z5rmeP0wFpGvxdKj$M+=O{GEUk!><8{bcNd8uf9T65?Wgy%p%^Bb^o4*@Dhx?-_%Gs z*F!c=2PK(pbB6}da^2_m5l?gZ0oZ;Os&kI<#r{B;le&;?6s#-1i%Oo9GM^MB1X@gG zcZ0e_98T$jsd>K{@bv_oe-IVF@yN`pBQ;f4#KJ!wH%)v(qP4ZPZv{L!bo~>{(V7q+ zub?zJ1tPjfxW2`vl;|gUiWQ#VR&@7ZC5{ozt`Fbw1LLcQ(kQ{zw(k_3pI|N&!ISIF+rkTtg23!G82ztfR`2}Kfes58|LDF(Ak^^Vd*x0OdPtpG zXc#@}K66jdMJLW0fcgz2aOG5(lacb`Fem5%&@b7@x>p_lnL z#NekF0>Q9_gUj3T`)M)XC9Y@8MZ+-9#5vw2Jov4D*!@#K%XW-QVGbGJl55wi5_M(Y z9vVI08qQ^zxPYJas}2h05IKqCD?egNvG1#H^-}7u9mXm^JHzb0cTC!RklP*}{Zu1e z*3myQw3J@8{{3+37Kf_i3Rq}rg!L|>9;rFLW8s*9(izlI^?x&BNOO`|vhnGT``1$) z8-gaBnkK$VY5HG}h5NUD9LF;O5X#F2+&#Gi1E`poZd?D?Gu4;K^ni#zYPAD5X}zv~ z{F+dBX>eP<*yE#KJ~HcpB9WO7V{#Cho0n(h+snd8*}ado5lLU1yO0Zpb|&qs^wqRyp9%KFsf%@nPc+Dk zzRQASl0q=WG+EZ+EuSoxhfD7_`T3H1=32eB>1R7mK`ZFOZYw3Ff?WR{q1E}p366`7 zS79lHdzv_o;a~nYDsu&okh~K{vPWpATkS8NOVd`AXc}nIF9m4}oUgWvUOLE7R^8Pe zvv(ETAG$gEb8xK}S$z%YIt`6+T0z#lNdaZ-H9vmsk{ac-%V9lmwSQee!jr-v;ab$2 zo$|_9`!ZxycAhW9KtsCd26y2W;%2@pb@6Fp&*xXMJA)cB#V1CcMRq>HcWQ(o&L5m^ z)~b>%PkMwuDKH(0LEn2NZG8F34$O%Z2=3*Z!pnB2=_a0P`p(0IDoRj4z8LDxPLY(3 zoS^>6Cg{%g4S;`@guKesw!XR-eHJknc=$m0jb)m^^ZVD$ESM3m^vR%aW)?XXVD(5u zmJuWD>@^BsIHdccjj!9jR2yrj2EeE6BNy6M59V#Clm1-y=Hj7ER|~DKI>g8!u)!<# z>s#o`Rt;dlJKX%S!6rEW<#@l}6K!NU+`*!8dU{H3ZEcO-+gPCvx^pFObH`?KauVOu z+xrxGrB7dYM|1WmH8u4kD{Jdn+9Q7*M<-a2q1(S7#JPqtRnX*THb9XT-}ra+@Gi!J z;omz+uZyWx3#nZD;>Y&Qc-DhpS^zhOhPuKtuNGl6H!JmK4vWg z$JaaLiMn%R7iBGYyn^PuaQzm92h#xQsL&$_rLy?qD!~PU8UT{(M8JDkzDBTrx?8*- zvi7ku$r{Xdv=a$`R^7-C#GkMXfTBpN6N{eDKUf~6QUCEwE>fg`0{20UT?Yn7I=w7J z0Ia0vL2~X=+>f99<14U2Nd*}GM#0T?SH`PWRv1Q+$n-Y1&(> zsp#5YQk^5w*^4rJ=!XaHTuMir<}jGI?HMx@*J}CpPrXD4(7QA=4z2=`acMO12@#{nt?&t+>3MOz z^Szg{9FVKn#FUxui(SP&axj74MF`$#JN@q2ip^_(0m9QGzLCz+BoP$;aCIuH5 zAHs+pJKFQ%O2-jB50Y~4^>NCx)Ucniq_GAVEsrnLl*sMMR9$GgEyaAu|e_FiM z6U3Px<`SPhX8%CJ%4}vauwQ#A`$3!Z6BFe(`q1R+0%Ef-6}|N4d`*zy`9@6a>dPm< zxwykSefc~u=ql+jQ4An+6joU-tY>#|D5j$-nwjBMgKp9rqH2@Pz~H4li68xsF(O~i zk$r+W;XQt-##@)tBK}8bl-|_jEk*LoYpXSb%~mRsPDc0RLmL_ zs<)r(77TK+AKKeQ)+N;IKD@dnC9Zi?B;I?Pr19c0eOL*I9HpQ{-Wdqtad7rZ91XoG z3O;5iNV+8$Y%JVuSE{}-rysFXuDKxg@gSrW*a|#MPM{3;Lvun(qT~=)t)zMP_R%eP zq%kDZiYi{7Qw35i;p_;Iq)Am|G%(kfKS)x=P1clr?tJsEq-OhQLp4VC$1j0UO$<~$jGwIfO3Y6b$T zTPv^N%66NmZaFzQH6-EDZ@=CvP;u{?17;s0#}ee~OaAKAku z*`PLTzBq!uo+#_AM;4Syb1%OXa&q5iK5Nd23M7%OeqqJ>H({`!O7=!gfQ1~PHUPpK zjF;a-`*0A83KLz&D{{IjyRLuY93IiZDra8F~%;58yW!dSO4BU1~fb zb5o{SQF4MXA@!+wsn9eL>lRP_i7Y7pM)zi}yNyA~(;|=JsLRynI{J--Q3GRRG*=4r zp7ZbA9r4c&PHqEY_>OgeKLC^R4ws6+sJXk7iD(ms42Sk9V8lx>o?oX*KzA)OX+a(_ zCg)>&@^?Zw{r~?Al}|Ym=o%8f=@93cbt%LC1Vo(A`A^Q^^FCH0x9ZOe(^Ujk0PJ3Z zhcfd4;oH!zVCU>Tq8yBMpHXh*o}iOtfdSftj;Th#@?2tNVw2!C;z2~Lu8@VLYcn0y zDYK0h^uTS4FS#9z0Y(!2yQy)+dIF`*IYZk%!LvODHHi#KZnqD9#YGz@BD;i4nI=@_ zaz~HQQTN6jADP_y2FEvvuh{2A9Z9j~Z-hSzQwwmyS~V`3`JgAMmd-}3l%r?IT4awKJ#XVR{TCb zz~LBMYd>=by?c8&I70NsP{j=%{(4QR+|fjR99`@OanSD&ihq*Wv#=$4;@q422CoMz z8D<U0@^Mp9`a>W9tx>oj)Se8{?Ys<)! zQbpa}k7`c^t}@@W(KDA~Ec0Y-C)1T|>J?pf;xcD`vo)K{S2Ikh0)E zS*47ShIN=FVl4F++GNRpl-~5_VSs+JKu)q=SKM4*0ev9+mb7;$!Q(H{vF1l{2bbeq zPlOp?<8$)h zf_exM6GnhJ=Jf_K@L@{0;ApmIiiIT4f3Cb3=1R<7#wN^7V`rq;*>gIt?18d z(|F9?pPRX%k>OvepK8kgjsM*clqzQcvL%Mxz9W*{zAb?`-$d_MrIIX= z>_M@Me|4~%bFQ}3*ri_vFZ`W`&_aOt<_h38L_x3$C{xucunEAYrQFyYIcIHNY%?9U zvfexr{X4ssYj)3X(m<$M{^ms|swya9PnXDv5J>tuJF#W?`I{qa*NUrUQoVhNWr%p+;KeZyFiT`@u7ohsTPQ`Bh8I>>G zjm8pv6{$ozseg#+nEg@XIgV-tz2&@uhW5O$McyP!Z~Wu>X#9n*4#q`>y#OsE^v2=v|Y% zYrm;fj_}gS4B%l~!ObTq=)1(b{e7{DlXB&7DXHuI<>lqx&om@7cxWq2`^u@K75*&u zCSK#7o+D{VPjjAq8~iytD@m)cR=P$Gg5WH;8Ka4z)W4w9pws?0D7qu1oe&|87K%60 z!Ij+VH5^gHnQ?AgCPWPV(Vel2E82bDddb((0IeA`NUr|OT$(VZ>k@%{qoS%=7=_M= zXL!YRw)%saQtEmb3C|+a0yW!5xvZ?8roMGjzf`#rl3fkxYg?!Vq|y-BRbN<}ZQm}K zv;A9ukBuUIvCI4E(VC|H6L5WcCXs+vy_C`-i!GOnANtAr8V}ZdO`m6CQv@ugZ!YaS z?CWlBjh}baP3Jc5gYyzU?hZ)H$#rbxzd=Z;Qa_*iV1GkaE*_^{D6SFyQu~cf*_S3@ zRNWJ!q&=|xJtsHG!ovXdkd^%YiOmzruU{cK=FMJo`cP-&AW3;*^!!`9C0yDYa;dt>dh?lIt-YWLh|0f zAev=+=}~GhQAScs*jxCDNOS@Jb@pZoHD&tbZXmTVvIcYLICpSphAMux_y?^ZTu(BP zcXW?(1^GdsJJl6Bs*56Rd9e8@OkX0p`&;SIpD_x?(p5I1LpWhJBIVuJQ}PF_WG{Qj zN{T$3@7xE|Yeu^2vo8sj(NhjI)4z6)d$&OLGQ!|1F@VSf9MM8hzlnh2*<+$?J8y?S zZ)ApH9K>{WftW@%ZCqO1N{3Z7!RExYtDxhKIN4W?U-mS5<=ks+tMMl-U3KZy#fCEe z4fWSBzRS&cnv+^yPOQ_?QWF46T` zy3=u!`e&|tn1p4j!=o(sEW0^kn)7~A=6>7j{mS~-qcNn+Vh3U?&}r#umJaPw{S%G!&%vi zC^H!iA(`1^gzOcv_ul(Hzt8UoxFJ8I3Hm}=*wv_rJDyQ61)Jb-K$+a`t@8(Cb-`xe14>kepX#xte zNvPk7kh@6w?6BNCO88EW;r#i3^X=VeY!aQHy<dw*0W5D2hnzNkp!TWfZidAo7{#mG;@&u9NaK5s&_ioW4oFO)#+-ie&c;i?riq`m~BV;}|iO*8aA zItGSN1GMGDf#G%8x8vjcLnWl7o=+Mw(4LBF$~T6@b}UNk>%VvB_?^yI8>KNNin z(@2ety^s$qWTvS7((}sw%kOxN``V-e5>l@G2K1NUF9VE9!?0)!FxqQ80*h&RZH+;| z{E$d>wc=zH8*NFW&FIPLElyiZC+t+9*NYF_;o!rJ;}8CaTHi*jPea?y06IEng-Ko4 z&R1a5l^FGiYe0q)3sej1t_#3_aHs4{e`4h@b0y?ogueR@X_8DE-hj1p>>`#2dQ96~ zTSob9vG^tVJXfl9&_$|AEowy=S{v|oD;}BX1h*=W;{670(>Cex-&mNW(4cnz7CocW z#?uoLQn6q2`?Py}-7a!v&v3M-Q)hj!2?lrz3T->y*b3eQBTHG!a092*UqG*6v@p=E zNCXh;ca(hGzpJ0WE(DZ7?zv+8k4>y_j8=)XP@5;m(B%Fx`bZs?Dqsl_8f_m$xo=)t zh`IYZe6$@WH*0zt`9#z*qvD32yX8YOUti@^-L1XucCeO&!=M{pPF|&>8$yfrIN~zXq`amS_g)`RmXBf*cG5o0KXuQ?4lvZmI+! z58Ix1=%fg6-QBIa5UrT&1Dh}QZfe_3%!(Wlgns;$+E%e~sahJU_{e0WHh=oHE+K4LF<$KjuLzqeWov zHDPv*RyVf4dcYb6EJt1}OPC(|?#h6dL_E9rf=0dz0r+Sp~d3Q9Ujs&naF~a$l)c!LqJtq^iPndyi0> zF|6FUBBYP3hF%HY=Mm+>Vkt`QEpD+!TbA?$gRY{Ux}ax9;-?~|9rX*z>gbU1q6{^YF2LjQMXRky zprcGsXXc%R=0J~*j~Yjtlp9v;ke!lq?HQV+j%sG=ZQZh%{2|kYXsqc64m~2nWD<{^ zKC1M+ghT7sl-0%5t%|Rxu5F0IpGh`Yy=qauy+4~xG4@riTN~T<90hFu9xeZqLb7a2 z3)J4I+HQjbsqJm;^v>0P571F-0ireNI-c#9LKcv2HTEI-c9FZ&C0JQ zLR40**r=n~t0n@c4e^q`m=(@o$0JB>{bC58<3phgbN^U4Fldv>SqpR30~m;ZaNivM z+PY|_gSk!Jj6H7%pHnXdoHCQD@XDt@{}_Q0|1_YdL;$`l`KPD#a1nE)7bZX|?c;|g z{`-tH8SfzxQH(qQF{ytNA?nh6x$}dR;5%ddJR!^nT25rS*lkk$*!=D|3aw{0ViNWd z_zb8w>~|fm^N3Eu-xgczFarsM$H}eAeRw$)D*I5A^>Mg>F8*zKpv05Ir2jOfU1Q<2 z+p-kX2f>HFzHPE+mu>;YYwX^4`p5z)EUd#ngJzR!omocX;GZ<`gjCS=I5$b!x%_1p zzh;~0*54!5&t`j|TpfnUj~e(&*~JRb`#5}@OKD9f0jMD`@!~0TA^X7hZ~z};u9&eV zahSV@{4bM4=!F2sdc%S0FS#2No|ptSYiHkn+_cLovh zLvS@J^c?%L`2yE@b-u7l7{8A0-WQKHxhd|=McOUrK7g$sQUt303Y1mtAPj!%aF($+ zw~UuelP7sGK@3P~`}jOR7p<2({d8Z3)T_Qd&)OKQk$G7#(g4nNf9!vgf~L`M5CIrB zw+=X3_(*_o6lx6Z9{c7J*Gv}^+3Gb*bz>_m`HVDhsNzkAerSlZJ@>yk1$y+93OT!~ zBrJC~Cvhv9{=g9;8NBE3z5KrIPIRr|8w@V;YLEBem($B83AIa$0DVgx;Fq^9OTBMh z7PcDweNG^guYBFBon})Gux!NN({W;g!~*meoO(vr)W|>o@3|=;C&?~r+~1n;x>D|9 zEfy>;K59|rg195Ywx8416;JQ6y?dMfVR^=U^xwazs9;5tKo@4WJx{HbD(P-z$y-AX zsg&jmamkmcuxnWaXVa^fR7NS>9oEFQkwk4%49VeEvOm%hb_PkheYYr+=n5puJ)r5&|v zHU#!e7ZdSDYR4Z*JA{5~Y+p)rcz&bBVxBt1%$bChFv;%^9BL$Mms|%&%2kS*JC|F& z=aT8ekF0Q`eKN}L#Gh#TLF@sMVIIj>A;T0gDf&z_>njc}Q1KPzv4?ngj;QuL$*+C% zr;H@f%;;6v*1pjV_~5F!8dQbYZAOn&o5#Bz`2K|Y6`(D;Vz=;guWHCkL4OU+0S_>i zl9p~V7%C~*c@sN}O`UIugL0>0o7ihuMdVOURy5F|Q3 zT#W1`~^NQ`*TLrnV(BvvV0BVu&>L-mo*kQn_A6 z#sW%66Gb`{L7?_|qkZE7)f(OzBYO^hOOI-VfE8I}Gqpe=^Yz$o9km=cs9)>G-oxWr z{Ec_`Q)m{fM~*hWFB-SF92l}cK}RLgr6Zo+x`1H0zz|V+j^|r~NxPgHY2G`EU%>*W zyE%9$dhi(x#Y+sl!42%bFR^=@c2D=-e+#X;&G9K{J_5zhI6=)Tbn#}hRL3p)Z5Qi~ zNmQyA#gUSZ_B5g&pPiWt`YA=jw)vp4N?6^TxnD-2eXWM#qslD?29tDB)n; z#M}C>wYF<-TNV}7dG>Qd`|(xV`QRwM;$%kzlN4yw#t`g$V1n|4&nW&(OgSb~XGimKV$Ke7=eoaKIUY5i zZgN5P=)(ava7AD8V5L`b%G2NHX#H+TaA+e6R|k}brQB3yLD?QP;npC87Jg7e&bePZ zl_b7L$2K!^ze1BBy4#)>abl_}; z*z6^`il2s~7dl=I*(vb3>!^6(KT>G&l+4<7R;AO5^JSgjqi)#%WL@LB?jQS01k1GN zMSa7FEH~3^DiFa&@1jH^y1oN1Qn~Y_G`bOaYhQy6fReoor9le>|1um=#W3i9P>mUu z8kI~P@P}z0mf=$%`;6Uk$xXDL19iS7eX&|hiUhwlhWI%dP!cJi&ob}Rc!WU`5p^d_ z`-(G?leYtJcUPiTKof@AAWlnSZup?QK(~i?CdVG6`CN@|UBnSeIY#D%&x|D40LUXh zH0}DQsDgra)dT|riVD!M7Fs79gj7Er)IE0l0(n%F(C#^hbEY@NrK~cVllF!srFP(% z<5jQlbPs4Hs~`W`x|#%-!HLrJH1h)ncdhKhhl%eC=+}Nh5JKiPnb9jz+32+3=$pA= z+aI9L-xjVO`cxr8&R@-`Dc1_J857ht9Gp`1>ceqVFST*EOTBE6^NGN-pZ6ODbE)m5 ze^bavYH+g7lN|}U=6pJT(CNLaO zQ#*rbe+z@?pO&}5&fnKE`**FocW~wx=zRrw*tmbMY8fuqIx%?7a(+5a&}VPaZ$`OU zvjmr$(=KM+VeojA{p6aRIhw3}c+lNmqE*m=J1qmuZeOB98gCTZsFXG4AcZuQGJ^XNfw&d#mh@|@`aN% zUkP+3WEPK$oNXqJIv|YjPZ??Xi0xG~3u9suIa!x2MN-RLq67M;DRzCDlVh&R$6eG|~}mEUf;nNd9c+Fj<2AB-bJ7ap=SyFhm*I!PPGclxXEo>Ta_ ztEG8SP`*+RjnjW@{Ex59%SB0@AVU8&Gm3~k(7N{XR};U_d|c$?T&~bysAhm(X1|UL zp=66_p1ts~O+{RE`^Zs{Vl^81Jp5>ztH3zO8khLq4y>ucLaEm;#eqTVGvbj_FgmUX z?~NW$D#cBsIe$-#`a>@dYo{oJw5f`CB|g9RXm`)*dAMu0w~k-}kz-BOsAJp?08IvI zBG~inEWnr=POL?Xq#+QfCkB-N1NaSf{O{o7trBMf*`L85FKqzV+vPXw7s0RPOw%GB z(WzUbG)#%zj#A|}(5aM=Qgf6T#f@+uHAmYPsFJ>}5aH$*Tad#WFh|%GXe?LiuqrN)LwN zfg`N_4n-3jmR0-NQsFwfdXU0G7`ou1x)NY`HibW|z+mNykD-?(c!oB%%$N|DDxZFF zNA98~hZ6bzNo)D7Rgzv>KBH@4Jf;l_yZxG|$Xq%em2{u|?`m#e2|r8X4RNc|MtuGt zUaiBGPTt=cRyQX1^8?>Mn>j*n&-LiQYSNB0*6qsBHQf+j4|(pRTpvg^44gr!v*@ck z?Jnn;VI(k3T=PxVlFK{N!5%6|B^lvvxxb6En3OD}A4n4D(09-;f2>PRUsH7O8=P6? zG1yDN;0hOF;_kI*KRIxheF#*0-K_PZxWt8gQty+#t+O_+@|R+_cW_adyz4gF+l>-c z3k(X_0{vE~ImKk8nx5FZ!p-nX@#bww0D}1I_vJU+LZ0ZNuB|O*bZ3tK2WX(IakUUb z#)6AG$_EQF`E>J@vm^T_P4cy&RzA>rQF$wH;F}W`-N=vdpnZKUyMGX7zS3Nu`vCX> zZwY9+*-Xo1 zgJ?@}DodsdwC@9zcP?oTqh)L2*c7l{)RGHa3DwPdlNeKPhh@0nYUpEMNP{82*q4xN zx;EG|=xYe;Aasfy}X?F);2&DH`9s$ z0|YXjpI$w*le-8JB;RpuYt2?J4|K z#oV`!ca6$0EFAoLM_bpQHbhz=NV_Nhl}}jdTl|>@9)3O3f;-a`W1k+C7@aMuqn?Cw z0B`t8OfyTg!?cMq<7h*Bh-sU~7+QboQ8q|J!Bb(1ag^sCRM)wJ*n!GAlm7UK>3tKq zv!m#jX^I}-(ZyghW;RD?5)`&6ee9?X!*m8teR9eVe!4LZE;)TJE}q~@)APn&27eHG zcvPYy`>mAAEW%A2%N+Nbsbau!S)nElXi?)r1uJ4O|7;N5bi>!Vnm8iqhh-x;<=&pA z++RItOOrS?kzCTjn(S+az;_CRR5IOKk$=Na*Psnc6O*&DVUMz-&Ltic0hW0KdI;w^ z_)tbl0^jXT-cj}cqtQjg%nJih(@@6ODAHs{!y4$h^?KMdKsLW3iR$C)o5 zZYl6_XG%(D_TArlbXI?{4C3PFnQ6j}yKlT%0J1T#H9&tBSgwDNDNbFeZPFW`0abEz z;r>H@ycD}PND63-6WDDFV@*r$#J3sRy|II}2k0{{r|i8|XXXXgX%@@o{t-kKzPYAZ zoExIoUa@Di=&`dY#rVnwGfpU|4^9((;Pj$A^$*L_BwykeL?RCulGpxwY_K4NNr@0A z-AS{CXPBOj>rUTa}{TI2#tA-g1^Cy42+|kx2>p$sV)V zDic|EzOip_G5ETb8&)Vylrbp|zafDqGZpZ3xvD)<)L75lni;yLa~}s!uZFudYveWx zwk72BLbH))>i<&hkkQVr}xV_Qr067pF15Yf{iOS>GC-fpAmiN4k24Ib}KKy`8b zNfxLMoZ@L!0P@p>n)N2&I(BJ`1WGdjj!{`{YvJtZhC(^pqX)QYP0WUe0;ceym&QMM z;mZod9;}$$`_ffNk0Vv(iK?PO`}OM5LDT)(nx~7?aGa#59XB9Nk^zi~O^)GYZ156^e01;U`y47NMlk^Z@(izB7da*c(| zMjpFSOYeWqPp-PLOj#wo+){Wv@R#_j?E~!X*OL1~Gah~KvckpOZi>UuRr&jS>_p8& z2m86%1Zefk8={M|+-%}Abz}Y~ZOzS$GHlM20>^ngd=gr*dT(z3{2+HP_Su2n8y*F2 z(QryGJzP62_F6ER`5P*}3{g~ciTr%5HdCB^|76bLK5;KFkHAQk+$(O~XbkF(LbOzm z)1;>fWUNl!7y)Ac(ff~~-N3W&m~Wq`G!u*FvlKi}-Bm2!oiGSL-WvCeip74|!)vfH z$)Gj2&7eGvs>Y+ejV~#veEX8+z}pWV;FjAK6N*1aY|@(CZAijzz@>|GU;yZV^{0_P z9t?25t=T>5Xnv#9^_3B>pddz+O;qPi3*7Pt-hIcHvuvGCvS{tZ@2r?JOJ$2({DI_! zi^-zyLit$51hm7wW^z;*1&-Q#fa*uBbB?rC0Q)J0@q>0q9^o2%KXBzcaGg!HY8Vq) z5Kjcm$f20&3D)zfBOJ=96T|dY5hmxu6&PZECA#vnYCda4UB~5T)Z*8(*_0c5r@W&R z_!6-@WeN%kgx1v_OrI`}LI|7ptbh0jR7;2Sr-DQm>`Ou&ELHziZZ;Fq-#y%O=oA}h zN0?b~#pf4*JXt5rVb^A)*M=u(4rAOMg5>Gb3K>mtPVfNHbXOz8WLR`4+T<$*Y>MHx zD>DYhx!Ng4E)nL-$O(!&i|JKhA16wa5(gd5{Yg(j-`urkq(1bv5(&$DK>oNC4$XMl%XxfG+_YSpxliQ&N4 zOC2rweXN#rjUwG)Ok|o}s(9|9lK4lYeNF$fZw@iAH@4Uo-RSG<#BRegJ$_-J`wMu>9EUBJ={N5nI27iy$?du^1BlWbB&S86<*TQvcN|V4^677Z}iVR3w`dJ zA&W2Wlryud{kc%**xAItA10Y)woOINsTGrC(OC2QICDnb8}H`ZSi_rlC(S%>OQX#0 z<`oxoNdP4zd7fLWOPik+oR^v_o#1TS?~HVD9=vc9li>lM46n6?9^6#lrm-+6J7EU1L$vpkar?MP zavm!3$`Ig8d%+Qnk%Q%VS|xd@NGg!vaKHlW@=F6Fpzw_eJ9XUEI>RgDR+L#o(!>;J^)^0AGnC0QU1WCdAr6cJ^AK#a@A&rrgSH=Vjn}1qs zD}s?;JFKs!uc8sCiciOr~JCLYbBc;PlPLo{pE6N{BQvj-b|(sEU$%!%F` zuehNEZyyJ~Z5y*Fx=O$D7iw%Wp;nlzcP0q(SGNba0i1ICye!YHCT{zAMR}@FlHmnK zVWw|WUfAni#tT`98}0OC4GMZ+@bWux;hk^TbHxIURAN>$WVchKxRC)=He908nghC?0YI$;jDwE+sDN{45AVI#Zuxp1_DK<|=7Aw}$qN-& z09Bx3hWbPwQs&>iYXoMT-Bsl-G;KuOg-fgbONE3t3*bsaoVPzVafp|z$g0F7uZq1{ z`IY~w9{4Mb1U_XUTmAy6wL@VIz#u=ImgmNItXV9Q5A2!I1nP~e$;@DSk`9atht_UO zdl^h|zZ-bc3HKGL@*WG>;r(-yo%e_N)y?T^VNO3$@fY2I9yWIEA2F07{9=*Buq+LZ zB%5?Pc8o!&0LrbFfd=MEjj`uuw!u|E-+We`4e4; z@;ElD0eQ>K*uPh|#dg)3UcZo2pPV8Ohg&mhy>IU}MmSJBSXhfy;l4uX!THqBcZe2h zB(W)3(S3k6wNboS^;l$Bq|C=e-tIVmjkiLo$K4bta1oNU6>y>8)$zSuu@`CB>%d=; zPP0Ct_o0^C2|R}MGv4)B_i4U`pFdspw*mwAk9xNdvinD}vT~*vVpxAS_+`zK$W;aC z$2))Lge*S@3xISP9J*(=|5W1m-X_ftw^~es|6IQ^Sw`NzIT})wCA}mda2+Y?r$0Xo`MRH^znwBo;uA3;nv9MS z5ga?ac>hHbI%XP~ME;j|S{e4`J-)e-bF)=!0KMBI^ZrYAQFVekRwK628Sw zL*494y6g2G8y)OiuBYlw#1Zr&*&i{u^BS-6z-PjIW>$f|MkcW>;VCyVYN<17p|Lhg?`NOiYx%F)Q=HDcBCYBT@k=0R2*{w|WFI>oBCUxR3ywq}gO#&I?J8e02tiD0MbVkBut!rOiEVliH@+)I0!O{p{&n~f<8A+C! zvy`>++LS96-eVHLtd8sikEkN)& zfPw$U$tUjyO&%ro#;u*Nn||l+L!yO1HKN>vJkUrp028b2;t z6ZwqRPNSHQhFbfx=E$Vm*z4xAYGA(M-6^Pp8t!EtANv8$Q59_*Y7=5gOo91r@B@;0 z{XSDWN(igeksb*AxK(l?_hj7m#k-LYk(G&wf9@%MV!T78g5`;B>M=%YtJxzJ9JQtK z;q=YIaC3S-Uk5xA>N$GgmJJYj2aSC3@OE=4$MmZPP3H^I{*QNXL+iSzGbRaplXNY% z+*d#d8)}U@d=Yw}BTNc(#b7?rqKRpXqK{xa{8=!lB22AyhYEWxD+hB$au9miqecd# zXj6;`x?>KtZ;|1Vo_f$i=O0Jg+xG;N%L~Y~f;YVo2h#==p33;#?ag2AQT2zPE2u5( z0KsU#`xxreCh}ytZaY5ucH@;8tcf@6$EfkOWCtJrr$L4~h-#0XncxTDu^B78l77au zta@*s@YkKW&i#od>@~$g7p~tz7Meqw;9Yig9PDbISvYRfMw)_IUa*neuRt7b9kZFwG!}e@%2T zP#ML^2@+_TL&=UZV*FI?C4UpAt|G^Xkw+dJNSVifU}3`<7N<;av^~DsaWA~R)dC?W zZfmy1)xiky$OMsi;iq=4g%K##JM}A-Xm#fxMF%VqY|+uYrL@0|2pXT9!parnvJ4qCQ0-R9YeEKg@=9pRsJ4dQG!633FxObktd8M(Rrf`lPV*l6Ww$N0CXL-X; zMLdLm33Bp=v6 zAt=Yt0u2}6xD}W|XF;RnzU!O;FGA^`Y8)jf&qDsEbE$E}cklH9c0Z{t;iO&u>zDS@ z1T4QdYeIA|-$GCR6KL=l@v0`ZM>INIv@}QMpmVO-dCsP!kzK1*e0=?(G1fCwpS}oC zLdWsr#x|;dvhe)Ic1k^bj7S)gV|lKuks%~bX<^og3=EOQURbx!8BxGa>tjx6^Cj-b zX3iGu;|8U^GQE!2k<|0CQ@fogy7kJ~GF5b68rp+js9)DWt!Av)<2|N?;H$1h75VC` z{$5(OvVn1=HFs}Ba1imP@Qr{lo*y4y1&Clnwx_?w!BoI9b#t74q3?h zh&98ICgQM|=`9W08Tx;m)U<^^^M%^URyMw|49h|Bt7DP!FoC-pO~k(r{7+t@u?2S%jiIdA$A z7#?WxGE76wyW>Bk;m!zt(9${E0EL-o9GMP(Z4RpP8v5>30>uk3eA82up)Y^wW~IzZ zqU(7S(DA6at;6{_@T5fGzomzOHwoa8>kQlHLajiZ#FJC8oDN(VVP>)tpOhB)ZX%;r0V5y}dgdv~ z=weE`h_>mRnQ?j%KY6Z@hbh^NG2h!VCJG}D_D`NYcgXYJclvU#)a}8wzrR`u;51#7 zFmC7Rxl^@V_spxc|049vJaks3*L@lLLlG&aey1aV;@jff;8pWvaVCI5?SN))MscEc z_t1LhTgU@;Ba{{<3J0o$oaElSi9Td>b;mv$*IxJZL>l|Eu4g>aaQs9jAb&giRa{Tw4FD| zTa0bipxG!!%ne4VQ$&q7htW}xs9*O~Fuku{;TVeU`$ekt9~+|yOFZXo&JsZ~jfY)g z@f>+vEuR#R}v z647lvKOp+gC34kb{44k#C~r^$2A>p=?Tr6TfTOq{+@-?c&B_jrYfM+y&rwTUN?y=? zduMqds`UEF)c2?+TkXrJxxHM|2*EE=i%>4Sum2MN%#;ip#WUky?aCwXu>dc8a2yao z8g$+4(D(-T^545ChO&<8AJ^73CECcq&jQUDS{#))m%*VhqS~5ZsomXMJ)JkE(_jQ% z)=us{+}JNQOU=3sm0Y0h-kai=8E5rJ|*T}Rz<3Q?0HYf1iun8bIONAo;NN}A#+3#|)8q!dX;Ed@)o4hPBexC3Y`dGM&Q?y@mQ{p=#7 zA#Lq1!1For@wSnlA$d!2(z1eARa;v|kh`-R-)=2f;qFQFcY^XzRgAuMR%5|>g)rAB zbf4?vTwF4GK*GCZxSQx%c~&y|jwbO-#+a&kR$eXg=OTsBxJvfaieeTRnKemSjXIQK zSViQGfkwxd=6_fRIqye~isAS5lg(T1CaiO(nTQ%iydZ)SI7)!>RDXcql1Kd!19JM7 zu~qsPyL1=hm?l!*Sn8M{80Igyv93DeNEDxCn9nVNeHl)B@054$2#)EjD7cUA8s=U8 z67lKNx>NFl$W!b&17EZRRo=rF2zUHEZkXcGCYp#3fHF%hoxFJgF&=TMybl$_xrd6J zm`dVtuFk3SSp7A)IL&WYt*%OU|XZrIhNA01lnI=Z4% zoCdi3%a}j@7g=5OcTjR7>JuFwU`2h`%doqSiE~dKO{E#em7)1gJ^3+ok3xmd35MH? zBeEUEcD*PH{JtChz)*S8`EZ@NbKq!=ek=}5U;Y9ahCyqq!}39=GnyE(ywe|AYozSF z0O=0pZ%xdC0Rq|8@tLtfRtzt==vhn8RGOSbDe2G7G`l%0HOu=)P?2Z-{FkH`OADE4 zkVt>)>+N|bJL2o80(av|62>z-=rG+dZXKFE(yy<^Ci(-3Oj6 zadEP<5=;$3xaqRJD4N1U;dzV1FSga3^kn}2e3SdAO%L)|1D^u?wUA+<{!4!t%2ucB zKOm12-4ET;$G`~c3C`rTD#z~j3!a}fx`?ZM-YffhE8P7HvklimMK7MNE-W`W?7OPETotE*ii*)of5`nV9;sj6 zA4Bsnp9P}lOhOLS=>BcdMg9mS>Q<0K4i%(Q{*z=`xcR_%L9s;>Hu$X-;$x%Hk)k1r zge}Ew6tGMYtySk7!=I+NmG@`iZjyIeQHWowb( zMYQcEX{F60K$okFN~aqQ#hanf;|wJE-olUtf|yItLE!I=E)HuToy*mK`93{4x$Frw zvpY{@5S0X*sciVG(Zz$|M^C0|2(k<|9v z72XP8Orbf#l>E$&x%q68s(2NWVbsd-fax`qZW) zw~L$1v}6`P!0jBIE`E4USMQ~qbr=6q?fqtej|s>(2~rUgL;e@rldR`t{Gi55dFvsy zQhe0|vd?cA$Ign!&@PPJ;z>O0Y+Ol}xR{Z8w<*naA7^>D7vVAfWU74CJXlw^GMB*({@C>X0;=-i;-~bk zEC2ul{HLjAe!b<_k=xRe)nZO~sqV>0{Nu5HjG}8>(TOzJ#wijyFBKQtF7zjz?Y~O~C(J3& zPj7|hpRWpp;#P@Uovx2liGjDsrj9Rb3)GQblg_o>u%{Nyj7JoCJ`~LM*eoai2 z=@pS_`NoQ2OatFGA6BhS47R%^xlnhTd2=Tc*(d`a8d&2x|I6=3p3$R?nl?haU#i8|apYTx7)2a$+=GI)KtNYowN_TCYZl$k(r3GQE6B0t&FI!#*4kOnk&EcFX z^#UTl>M<5Y*xu|;d0mg+Rx`{VwjqM_msTsuhPAOAQ!R<0o_;14jB>I&(tL1I){?n0 zd$3X;R$K9s_W4X~5ULXCYTcH?6!gN8e(Dd8b$9`yOI}G)oMgZ#W#Lz(d;_8dDqc<^=+OMNqiTn1N9WKkN+!&#!c*k!kd{A7up-D^}8@cwhFV>+N zy$N5pN&S=m@D}$$7Bcx5VgR5zu1{G&%TGXoZeIjr za&rZt%7C9mYcGO_YK;XX2(2gUdh$qpu#(xtlpQ1h_Sj4fVroZO^Y(qiOKnJXJ|Rq( z18aI?)!+UO7#*k0s~2Ekx|8B_Pat%7Y;0By>3=T{{m05y_|`L5N5=qOAt{z@K}Bw9 zc`|xu`Z>2JPlVkL66IjwhR3_d=8TogAdyHvR0ndM`xdGH>1OUNH%RM0tCg|H<9G@x zOihoW|ANLxz~uoqEc(9$@o*cNySy#@;ZzMMvG^I@_TPX4ujgaE?rLF9&>rrtKH1-Z z5Ido3#S#NUtCYMCP;cys)I>OOk%%4s4l$#0Ooc4j$J2v>0}gT-qM z`>*Ds`E2K}qI1P%TVw-`moEAXf?nKkv~nsneP^#3@a$Z15cJvD_X}zA7a5;vYG)yFqca6w6V1427-?(R_wm-P^-{Ty1>GP+}d;1bG~Fz6yBxW#ei#*x&^ z^Mf#;;o~4o2M{c*7ID^AW7spRqYkx*3uiiYxCR6-MJDIIOtINCy z+}HZ8Gp0K|iNElY3qn=wD5}`~up#6QO=Jt(s-&(riC?u&~qX|3@;xE zs{`$Mi3rJ0=QoRk;R0D#B^2B^ic{mxf{2m*^FdO$-l@wH6RTm62YC*AZuA=8>f*(J z-)F;H-Yu6tyrUt-DMYJ^R+KSk$LWHQv-*nw>HwBD`$r|$MF3! zk$;As#VDE(?K#~yk(C3|KbFe?H57Lj4o!(!Tr|}mY>~YekhQAz$39Q|0HNS9kmt{( zcRE)j%Ja`Q_}fw5Pv=6z+IsKl*7#q`2ZNy={SevYUFA9U*@BAG@$97y>yQX^>n5el zGKz1KO4YNCvq~nC z3lrz>z1?N|1`Jb;SDu2YfOW?oYrVkA z-feG4*3`n-8Fvu+KE_B9VyXe`hzwv%Si z3(nj=apNit1~!6R>gQTks~RJq{NOQ|De&NCZ5#Z0DC$lPlrZNtXOMseSKJ>v8MQ>% zxtCB{0543Sys>6B%&z+fh4^zYg+`87^f! za5)8i%#b$m903xJ*xc6EQ7La9j)DbXE*^GUJ zkNbMt&fqx@uep}Pg9)p?jT}s*^6Ly_dAW;3`l(*)U$y&_;-7)&;y3eKbT1E<5|mp8 z0)wdL1@QcV!A(&A!43F|2q?>W*pf8x$3N%=o2ruhKo!1HUMq%gfBA2yQd2#9lE_|r zwrKVIWoA_$6>1u9)&!9QRiH{XRkWmvgwM?)6i$HgBV_ zwQmA)B6{H-A;=Eya1J&$(&_xxa<+NGFT|F}Co(7u<0in&i|DrLdvsqvp_%?wz}p&+ zsWy!xuj>gCz*A+B1t0+L02_e6D>R~R8m%?ves*xw?0qZE zzYnzg_%9(LB8vR%nW6m{E}Cqz*WpZaW?F@yrh1SPB><2@AjL4k=jye>pVNVE)r*I@ zq#dQKS%43EPRwR{n1pYY_OY7<<=sw4&ZBuiGr<70oX4n1dC0C-o$@-BN}P*{^W_J* zLt{#9UEeqF@3eLIpyW8g6g|9U!s*3`d?vYua!I4X6lM3zr9UFKWaQG4(K+YryjUFn z?dzk1#SVCb(tkc~RITda_(8sIDvxq_CvtOoV*wXun!dIpW0(1hsSWJ4@$HQG;#{Ma zB}s?<`BB{&RcV$pBeM3LB|M1IsRoW)R=8(YY>H!P@ zU9gc76@i!O&Y4*UyfWi5c|(hPFN2|^9@EvrFLTDxBL^E(%s*x=ZcBe=U*~VJdT?{*_8BL7 zyzm*+hn_wGOvL=X{pY(e;?J^fnvFUw&hBiU@2hSC^L{Ys$9&+@C zmUL*^b_Qrr5s+#TsAY1;dGH=BVqCvxZ}VYHKR9@zs;0} zxaV>Wk&MO5wmma?z-^X}IMJ*wUyS}R7i-An)o31iPSF`=4QYC;E*i|%E$ExBJE?Ehv{ zs&8O86Y=WW8IWBVcVQ-ynZNuWM`sxq)#G&WyUPMgmvlE0f`F3J9fBZ|(kUI%uq)jm z64D`}Ke|J@ySqz5x_kH8|MTv?zxU4P%$e`Z8JKBk@FKFt=YcWv@i&dtL#FLoi4kI) zUijJ8MLn;KE4V$_c0YOYX=t~L&kfi^runL_;2*^8SiLvj-(Z7KlY2!aS zxa1#waOOY0*&Ec_>z~NmxgJK(z}M!xf0_I>#Zl@y?MX7XfS#$Pl<+4XYTQF;hTqhG zUft~`gV5kPiL2)F+vx0j8rX8#Mxqcn4g9g*Ddv!IdS(cch4GP{TxjFc{4GRSy)wZR zWSsduoV;jvv!|#U%bIAoJGy%6EE8oes`pk`lbmg9pFe2C_XbZfyWC9kEsM_PkORIO zgA)eJ;`-4~2aAlAS>#N;HVlX-R3>Nm#~Gts4*bxIZ99kf=~#YsPr4trb`Dgr&XL~b8h#P_ggq01 zmC`jiNjRbEPE=Qn`>!$Nc8pyw4L80g6IibkC;g8gDVKr{;;O5mr`zBHmP!fIc^DxU z2DN{~0*KQT7G%aIDXib_L{R@ySlE-YbrTajpfxDrRJEB9!Io9_ zWud;(oq3Urv#}*zeBdkstfJ!IJ^)Hj+V6LYa+%nPtQO8V>`|aTIe^(@lBillYEH|ME zrb{|_2Py=5DX6(%xVYyt5tGZhu;0b#!%%K0H&)5}ohvfp4ivXn`cOCCAcwSvz>`PN zfvneUsLZV^6ActdrT)@!3bndex@v3O=%t`}D6=MMh%@EP>pxB~CqWlPP5sZsW{F~X zNj~Y3{VNaSQ;6xB4Mnuyl48<<;`+`GW6a~)JRdM8gx4O+6YOHab?0*cEHA#TuwXbo zr0aHZ@`T`Ez$!{z&zMpbW`tt_5Sty6;jST#UDV_~2{`@#^3^$2y>+%XY`bg&27Fc(?_I&| ziP;UlC1fV_|0(REF8o|ZOK(PD%Z&^Ndx>fM!aBPd_6qh(!TE-Y^!i*0uWf;{X~{-p zsS%Rd#UJ`>y!T)T$tFb7(fUs$q^oM2 zXy^Mj4zvEX7)WZ{2J2%Y(KAMK%eWiaKYtlNLcrCU_*$N~OQ9gzN9Gm}g?TUXc~bv1__?HS7?8IX=f7*aA1SoYky zP63_GiB!j-+nO3|;BNFL#@@A19JEVRayyW%A~ydHBsKa6_=VQ4+zA01qj9kb{AMxM z)r!#M2<4ijDR+7yC?r$!R=D#6WAOYSh8d!agI8VVCf(noI3IQEeD9s1%s5DXyY~Fd zEr6L2yKM4Q;XL~eftgLC1!~td(S?QgPe0rF@IkYm^r}on*ZY_FLDpf`0T1f#r6qUn zTljNW?YP;`72i*-wPpccViqwUUR@#F8Mbr6kUs9)uteVQ@1rs?I#5)Qf&J`~q}C`F z(8XfJVJds|KMwN;teKV(2}$Y?Ozwt)xg66-h@I@6A(frbS$v3!h29@5(^9g|DDkq= z94r=uCABq%J3XUXPZM9_f$X^EQPGc_ut(*~wX%C5;y}8(d-YtMKrEB9A~}=ML>QV| ztLeIw)F>q`EuNXu_5SC>YuGl2?G6TCNVq3?Np||_{`qN0M6~JVR z{nG>NT%;9t`MiVj@$}Z+7!d9Y76rXn4_72VT?uyg_Pl@|n=B3(fSj^F#-rT#jlnb0 z+xvdZ29NCkBUBrSHk1V0_<6yXs9ufe7?O9q4*jUBA#?keFEW`w!rX_5L4K4$g=yFQ z?rnkwZurH+^V8)O5W?hAW;i-jsh5nUZ6U%^=J7eIc!hs6nPuAFjZajPz9tELqL>&< zWjNi0Hk3LO^xV2AeQGf^EDdWYChtzBt3VxOVhR#(O??&OL`L|F+cclwhEO;|dfWEA zcTo#@k-}pzZ?{?ts{zLEW$(unf7#%oQ9*tc%J##kZBg^F8Os}EN&_>PWW-)iRv zgYbPnfnOho4~p$Ew(b}68fvXrj*lr6Bao1~mOmD_9k$CWZ>1G6W;b?HP%L+10`ls~ zHGsLpI*8}V#e$j@iRO~AKAJ7v(9nbvH`?FBA@gag&x-M350HyjRp=hqlR<0|iSc48 zQx6i=mq7DSF1!bUG=PU>?iN;KmHAQdQijww!fmo|vg3C{LmmBS`F=F-9De6t^)45i zIY`_i{boNhdMji)hk*sj5^oJ|7jnh|qSMge|8rY2An-A3Lba}ou_8jX&Z)89t&O4r zSL85sSybZJ1OoO~iC|e`2Ccf6ovC4%KJvs%Zc{NC`i~xcOwGpI(#1vngUo+*L8S%H zOZp>Ie-9HH2NM6VY0CT2O+9neLV0(xGC}YphMrHpaPsajSfVhHV)50pu1}pWYYaK= zQ_*uZFeNY9Qs>AX^0iy3u4|BzU8KtFf4Xd>F{Z1r&Wh49An~CCE+(B=z~EhF!pv=Z z-6Y-z)@^$4R91(hI5@i;f^`@JyXY#@ol8$MRA?Qcm1}rfAWoq z`)g}!bq84Ml%lcad_JfJJWNAt#$qftPgkOPir3?b>EAVeM@#p^6%)v?swb}l3% zWkpAdA}`@_=njM+b03#dV46`gF}1SSkHeGu5QCaUYJwO-8J@o%sRA}1f8(?#TY*A+o^R|r5h(h- z6vBgBfe3}8L@?pSneF(V+1HvFf22tNDy-x0+7dW1Nl67m*CB>t&wqTFjllJgwbIA_ zWFIwN%Sk^&Dzdj)NbzcAan6f-q%=MfE7<78la7h*4aHsO^Pig|u<N>x+1@GJv3V@tE%pMy1OC0y`9dBH4{_{PUT2l+RW6-HatwOzp#@Z*w($Tl3_r3%fvSIP@WLm7{{bX+S2={pNY6|t zUnql#ImDup&H=iRLb%CWDP%4KkDa7={Q^Ayb&IH2KEWrN;Y#RBY&q0g>rDiUFW(12 z{U_>3*u{TH!)}v!=F`oeQIf$WlpF&^_&_L#9S|lGrtXlEA63_}EN00Kg1_N~3X)T& zM}nBB(Ha`{m{_NYvZh-2YFH>N2D@J7X|u5D$h-1@W?rT(@Zewgv6vE(0{1^RnNetA z?DNjJ3Hf2t=FL6G>-t-I2#2ILI>@}mQ7S(ZWQP@hEiUuOFC^NGKx;^sHs=s@A&aoM^n z3wm{sb8j{GpVilZGBj?SEQTnuE|#za7zUQy8NbXU)*btRG%^EJ>ox?8t6@pg-|8(Hy{@wiAQ;%-AWWc53K z`I}cRnc0AyiKLR>z0~3o{bt!}#ei-HlM24Jq&@TvH>1m|@RuT9f}XE}85azE(>kP` zE_I4ic)q23o#s3TDxL!}0TwA}xpN;d9SvS#0Y+Cjp~;W=g@sQ)LajsQ|1{+9``KDC zJsx*r2Dn~X$Q%mIY>cuC61s3RK88HP_@fFR*Pbj{8vTWxoN1#nGO&nNQF3kes;l-Y zz%{^v-e^rO;%rBvp|OSD>4Yv~h}z!O&57~DWxTW-y2!gXqEO`%Qh_1Z_8z2rWI$%} z-i^iax7>FBGswicqzoc}>ye0pn{|6FLLV8ty_mMl3N}gXYijr@xq#pMccjZTm}cu~ zCF$&z;pi?WdRLKrv*)ZQ7FFf&x^vi(>gGTyx|BO$oatl>N()Z4vDxZbK&d)yB2!Ug ze+kmDF;v&-j*@MM6w6{FF$u`PhQM#lZxwwvt_QN`8>=WP<&7h9*6;_4iwUcL(Kf42 z)7*`Dg!%o%zTR$}7yT}MXbUEZ1U=()?`G$G_x>8N=_3`@h9 zN>HDFP|tviA1~$GsRD-5_g$#-Gtb02m{4>JU*Qal6Ch0MiyFZC3I$g}^RkS_T|GIp z7XQG@`QO_~yhy*o=Sd&WwsUas9vbVSEVLuKvf6*gO_0kil$~(!t$q>Uq^<@K(C4ua z?*UU=<11d<`Ja_f=gTbLYM!7%!;;THdSp^&21!G? zFZmK^1U`edC#BjsYEh9G-%C0tKMnFKNO z;AO(U8th;WqW?TY{%G|ofZb5A7U8%ut_Ufxd_-~BLbE}WAEa7CZDcN<8>J&lxq*QR zLmfqYtLZJ$@qz8j^dR=jyzIT@=V-Mn(eFMc$Nx8IIZ^=bBzZYZ>CLfPi~iT6(9PrGc}B)kkMu-S&Z1B6Gt5YLdi( zF{Z@l5b(yH(eX3?QSk7)48a8?*1nSqnETSMlRFu@mCpXZ zKnX!qi*d{FKd<<&A_4`?b66wE&4aR_N!~=J;5!j52Ouv?!U1a|^$ZM8^S4rApMm=prZA9ShW?;QP z36^S|%LKFxM}|)(kU*X_N9URi0=!^hk@T-)v2QrFrYSU^MNC+krOiiLgXJne!1Y(m zU$(ubi}qzRw>z=qK1mI`>bh`sbJfT+nnznwB)1r<5O<(UkJV7H+L)iDS{81NNkrt# zbF`0rhn^m_Y~9910w$+mU<9K<>6A6l|D2TsY`iQQ_lNxT*8RRtgRehp8Ql}1Zd^e7 z>CBg&Q}^n&u>i?>=#)R}BXjB(spkz=`uRZ|DTD}$m*KWS9521}o1f)dim(HxZ-FUp zzj^hjpnF?V5>RtIYOk3*faqexoTb$`UQXtbB+#HM5vg08aJ!|bbZdsb*=F*k;Y32} zu%15QC_Lg}Lsm{gA84Bj&NIkF|3j2lK~0Kr_sd1e_pVEHEHqPSv63h#Uy2&~RKjps z8`K{C_O=54yI$l@9E+~TafSa_5|z?y{p1V*62B1k`YMdGKNz6a$i|W7D<8@ke_3Yk zkopPr^vsqn1uCo+)E0=X5B>)VnJ4HdEoHuolB`9ogtx^K!_tZPYAWwxj!th*v@XkBdY z(UD+<3x76E<_HcDoeqIpzkp*f!s{T-!pctWZYX0dE!+k*!(12;@%D_u0X@2dOu=+n ztnpqBgk|){Lz75nnuAc@8=ZoH@4WeJmdt;*KCzUP$?fe~et5FM2V@XBmDdRk1~UIF zF>o4Ra$AN}gfB3%kI`Du222!A$Lk=%JqfnB5up+k^UqO{$nV}Ty=<~!QMiifJT2Rx zcuyI_IFm=ANfhxVD>xw~HzYO->ucRNW)DX(?=hvYxf)AvHI0x5+#r$2Q@u3EoRzW* z4GD&8Bz4J>NLPM45t+y}pN2Cb;C-%9zwvs!oOi< z@p71uYG2T*d^O4Zq?t(iaV9jk>1CL%CE z@COl;8%BD!eY5T22&jL7`?E=j3bDeQ0M3DsMK6b6aOlStxv{$7-ucb`g?yF)1FKUz$ipRj>--=m^h~`rn)j|IL-+v+b z-#dWMni4ewF%9`KfRIFCk^CfpoF!Mci<=)S8nP>u?yttmYQX$!CIXW( zx)@CMl+DGseKp*9kvfWuFiVSz3hqM+lbEfOq>Jz_)zioOz{k@)ZU38fLDU`(@tPze zlNmV;I{jvi?%%Vq&+3od6VD)Yd056UV*7zSPyE~9dx>Tw)(X~*d(qc>_q2C&!R1Eh zC3W%n)G1RNiM$(H+^hfoNoN}}<$*4jSVwbKl=}c-t0XSNL(RK>L+l<=e4XWilt3Q- zdzqGUu<-*I;i*2o+;UE2TB<71!;_oLDb~Jo`wcz+`PeB><8j6f;e$D)xk;&wCd5aEG!*leOlFx9v4`7zd&XwAeH-M!a9JPJK876@n8J5e z2UoE=H_|QEal#o<>VSm+6`90nB(m=cP@Kk73K#eJ+q3yl&>I(7$ zk6~=Vi3MtNUpH0qU%b6N=0@*Nvj+7DZCNU z6?sZD0R0ay6qd^1oqEs2pc!K;gXlWMOE_}=5^%wFHghlCeAI?N=W`CT5gU1)%ZzQa zF(56o6Hn*{^LS}Y$83qb{i?tSj{=Xy^K@1h;6Qh__A48`eLe8AX}-s@_w@(Fk9AKa z37kFRW}yHTKpg2H%82yGY2V#CJ00d&7I~SbgDj`t5BNOpa#=dMRc$xkvUgZb**A!}DYQ=z&w1n}XyiTzNkI{ZZ z*ua9hI+c`{odSusLyc`U;14B`h7r|}p-DLo49w0tDfD806jA^IqCM_TAixyBwUNz}Sm$p_x}9aruHVo4!Dhl zjxXbBejAKs;#S%*1PQYPBQJ8lgK4YH$0goGxr0!XhtSArtadAKg=YJ$l%@Ow^P8`A zVDIYRz_Ol{6Q@*+BrV=AnTk}BWtzfa5JT-28i=$mVJX_I=$p(2TX?5-$NJs@F1gJ8 zN>a;u`airm7J6Yt-_F%|Y+$tF=3Qr0f>~uD>n798-r{#r5cWi^Hpm_`S4K+xGvg5Y zp0Re&awbc|uW#jecvoX}pH`ZLdq~K%%XurzgdkBK4v+ zxRzC9f)vXnS}xz0grwS}|45SQruyCs8^8|}CAZ+geL1cSUvSnz`kYPyWZte10?AA< zRs%?NaJ$lnr(G$AR3^At$0VLnFh2&&^>?kfW5nyi@x{>I~a;J6;tpm{n(wop5gt?3Du1`0)LS1y1 zw?6v*MPX)M)&p1}NavZx6iTxFD4~?2EXJscFC2p@Xsif`wdIgb z^F*Q5D}XDpo|kr)qlQSchDSJ(9F5S$j1b&L5wXr2&UpDxm<>a&O)o}I<+?4P4GV7@ zDbl0WEx}yxQwMpueSZ4jp1V3h`c{D040Uxk>iby&9zl4+JYEVGc3R(8i^!DDkaj^e z+$5KmB7rYsWJ}F;{bY?zG}_ zy6!=i@$<_7w~ALVUpp%kBYj!F2h1(D(p%@hsA$vJ;C`#jzsP@m0nodXNY&y`XEXm% z`PVjKq|Q#S58fLXtu5k^>w5K8iumY>2$N0tWcSZc;ru=rA`)Q(O=xQ;G*rFO^874& zzUmaApEf6aJyt(Rzqsf^zYkGT~cJXUUprYWcOYNNtF#x1K!IE zZ)LHI))B{c-Zfri*>nc*T}863o(WcQvaN;0P;Xyv2?T+kGiY^sr432I^+9=(?RS0R zYsY`b$LcH5a}}FqJu1(S`5YY7(#~TXg>mVr`OPX`TH<<9s!?7d+9Y$_wXnyo=WiA+ zEauvFn~o1M*@}vk)3-C{p6aOmQog3F_pbK%YXRZN797`rHSqGhB!LkAaL#r<{H(L9N1l5-z%8oa+oa7vSq@w!gXT9TVv24_6m87MalX|^GkbR#6Mp2`ic)`v(7#W zy#glRy-QO#5X8SatmCXCZ$C)}L-Q@3QH4kVch4b+0rh(T%2~8DUpc>axH6BciRykS z^4flb7%V}jkq`|_Fti0{5L;`UhyC3!*c1=+9g8qnYnCEGbq^;Y=UG%{2!mx0grQ&n zr6LI!hN;i;E@`O`;}|sXYB<4OHip8H81U-FFQ#v8p})@FM}7xh`18YUs(73E(KeLN z2cba{tEo2NhL8mCN?t{McvkEyVvEP|Kb$zh_sPVM+M24agEdKB7U zS=A(-FC!}?wOq+TZYtHWu)jpka+lLPmHR*G-ta}tfxh_ zq(Z>nANHB=sUCywSgp#-kX(B){qAD(`ZEG{|MbJ7&o1H6_-nQiM$*c&3Q-U zFMApz8u{s6g|c^v5Ftxkjl|!bC~H;V$P5qqsUw|;mTGLoAB=WKGfpFN%G{6UaBC-G zng@(dw&*f}sr||yzw?v|`;t}W(picv*_}-FLKfN=HR1p-Rcpw$5H$#A0mM2V)Sizlxyw<`xF(l(>30aM&ED^cc}tVJllEPSe<7-RL?2syLUh_{ zB70B?K@>nA!?&iXx&KK(whyse<+@u3LdC9bD}aA>89lzZNzlg&w~1G( z@wbig9Ltip$`{pylFWF&d6Ste-08FLbDCPgFO#MSUvm&k2S5>6QL>%13F}T@l+-bC z2QNBpobh`mgcLW6>wDLyee;fy%e{8O^>(78&Y54LGi){{XMGx~96@DA48PWDp9y)9 zoSyj7&3U~*W$i@M+0V%sEvb*Uh1-G3PFRmJ!tEb+))y74U7y;ymxYCKgb1eYq0~qr z+PS#tvolyK{_OfDyM^oBxYD6jAr5Jt60DJ(e@=(_DN7>4#0UbLy)tn?>=Km+4fbJN zzxYs5gu}~)seOyNz{opC@}>zgj_wLoz>DbJHbea&>ePu5l+0gW2BiJk7)X05j(*jp z)j-Mj*_MgzI=-VDRJk|D4EYqxifjLe@w1^bWNbvL-2v^EbDNK=|M=tot_Di zWFO-Qee%vn}NFyikHX#yl~Q zi%S(z-NMu2dHuE`g^Mvs1q)G#SE2#`{(a$$jK`q+k&+;)tWvaiL^QwNASkr8ifsf5 zy?>(10Mu0Xc11)foi}Y95JJW!NE-|(TGb01>-H%Oc#TqU0FBaGRsCTRlPb z+|u(XPxJHkY568U`Syzq1$eD2W`C`9!ar^XGbu+TZzpUj4A#rhraILWh?C|^b@jfq zt?wiaaMDm_S3uU9FTf|DeCa^1G3do6hxAfhLPF;Lo#MS%zW9hCALyQ19nRteZsuQx z*Z1zM2P^vsS5?uY!dmSU(1vVVXzC?kXhISu;m)r|`?BQ&DjUlLUXO8fU8B#;w>a=! zxAEa(8q-BvWbBFlJt)0BTO@}(6*UI7dOnjh77w8xJ?^*)F5lRrPIA4>67_%TaG(hc z;P>RA9-QHo{FhDP;%Dfep;v1=;nwu~cTZM+XJ-bTZ@j?IpF8ZRt8BGt$2iUsj*nw0 zo=4p3tH~3)?VSskVUeK&T#%cUJnbh%^~rTXHb|5|xst^pLoA8>QWb?Y zAe?a6fW@HUy1iaLJSUS_6q-p1P;x41XE78$2u6P;^7)LvdGccS4e<521>XHotjx=_ zaf}nuR!w|XpF%RvyNeFjcl=iLyMShVn9-qsY1voz6+(V=pauEgw5H$k-*+eH|Bgdt(~ZO;Zp z*izWHx)<|=?|Pv@h>6>4XN$9=KLxJ;jy61&2s6F2)?r6dK`<~f)o+7h|8{Zp_P+E} z5E3EW@E@0iu~x(aighsf7ytOCE8))Ct9!19(MO(<|Mj&(@6M{y+5{%nP&DC7ZnBP< zJm@iP6r6^j+gqQhcjlS?7dHpv_hGzibRBr`@-@2fsT1|y1w8Gum0sV>CE+YVH1gLY zorOH^u099;MhkVC)BZ*~>3t(#R1J4ewZ053*|pKuAQEca@yia=W9|K{xBeMVwtjD@ zgJF~fsNMgdo5P>o`j_{+!OeyE1-<12@~q)VgxSYVXuDYw8uocc$+uDr ztiL50%+-u1>do@s29-k}HFCk8C(naFJorPw@HC#qI~e2n z*gEWb?|qrRh3%Ut!LN0SKg{nVo=xLvC>)K;8L;QN#|at9(!8s1X4qUi3}XmFw(Dcu zj;Vb)iLtyLHfIAq8jZaT@e9CxZzWN|>k;e->X6LRbZ|pQld^LO<5!PB3~e3mgVnIP zl36z&yz>q+p)m&Eq2+*K0f=z=QTcy*Gjzu2(_*cCeUEn0&i-i$rRmKfMi*IYF+~h-cDJ1a(H0^{@zU9Nbf{kGtS2sTu0wKX6%T~=gP!>h>cv)eMo*C0p7-dcHC z$c-J1!D8kL%cC(}$bHuQnv>+9ch|IQ+n>hAjKPUUFN~U=w{PZ2)#WLP^cGQk9@KYi!ctO5$CrvGc0`C^nVjb+U@y zDk$EK>D)YST9B}2`7nO<@ag))Cy9W^cq2gm&zoULLc$MUgCx=Uda=dcl9A01M+ULx z`A2_=O@`=8qd%I>^1JnqJVO# zd5`muR~cjpyc8hpui{B`Cg}ntdM99CeB!3r)XA&L;N{Cc6qYJz^Br-83uGu_yK|*g z@n-Kr&~iU6UDwMAxk+DeU8OdJ9ShDZq01SDGk%Hwy(LJ0J)MvK+5n zx18{?d_T0Hn9KFDP=&^135R{Ptk=eVu+sS*v|Ri(M?zfq1+|SE+WICN_>t!#-L?#ha7T9(_=Nw$DJM31$@=Tht5~Xsx|#xomXJOuFYWm}SO^eTI)>i3eksqO zDx*>q{(ZRdi>w-yhPA!}O%4}$FVX1%#J1rqTQsjHk$}sMtid6Zo)qH5Pd?9q1DxD* z_fV}PsGp6PG5&bD4I75;Zh@El3*VF}_e1G&`5WBJ(&4V$f0JR1!A-B<-yB4BcD{$) z?$hh5u$oLE-Clq3nsi6@Q7s}nC!6G>Q$&9L{E5l^_grxpsQ5NOT~hK)vp-prGi|%# z1E-n21y124m7BzKsq6m1uP+>|QtAy+2R#@&& z%+BJc5G&nI$R@TGt<^ zI-E3E>ufg7!JqFpknstp5zFOZ9Xsfjw4n+1yey!ZroPRaRx*1j($B_gV;M0ce7-1r zXuM4RhfLR<#PsC6WB!jh6u*Qn%%VKLZ@{Z)b2yChHm=Nl)G0l-d@VhQ7bSbUiWN8e zqnS_t7F)R7hML`)8i*KE>I1P^o0-!xZZkte2mdO^2=X_IxV&$>UWwn|kp(se(6LMS zWBq;ysz)bj-%i>MiKH1B%4t&?7W{d`Qg->>)I0~z%Z%r95_D44jM51Wz2i?N!@}3k zckx6UlAU3yWOg`1P~sJ9QXVQ0Hx5H`*+v>x0#6DsUdOG9YL|*fMH|`-WBREth}_+Y zHl29oA8CUg|3DtRbg>V_xahl(rB*>829e zBr81DUhu^B`XXCiXPvFxUe?9@h!9n5g|7zz8ox%#RwM0L3*M_vatJb~l(TOlmGgAw zpylkZee!(U4+?r-p6-S!DTo&y%PoD_uuv0YU>qpyvsM4Hacm4vOCrL|gr$U2=62i` za)qbR4|loU^<@|widt`DZekO)K&sB%9*&sFTq3hvg=+(eTc4z25YFDXNb=XCI~eUf zBksz$h}~$mc7G=@s+C2i)=dR2S-YaGch>C-*N4W{`|!7}2!d?trq_pOsWMmI1)q3M z_|6GuuDrppxrysV$!*uWq(nXAoXC)LwQVQLxRM);_KMbY8@}6a5u(T94bq|@#c#|; zL5JS|+R#37Jl_u*ROXTntfPA~6vX!n_N*75eVslj=6iusmo}fh9{)~^>8ZxLBqttD zFI5G+9cHGEL8dm`*&O*jO{@dH@M=FzU;@5RGDSqQ2TvP#-e17G84>CO&9;*oj}e3n zD}A9C02;6oAY=F5d%dBuGb_~itWFiY)2<}#FLZGXMWtQP7?LT0xC-nV1x2o=G@MG= z)ewenBe9*Ax|3-j7xhQ(2O*eRda8}b{&3JE=d|W(u}+ zsT6&{F2K@E=oPz8{abi$D`8me@qqoBG?xgG!w=|vYn9_*B)6b!bLA?HMvg?VoxML-n-U0#)3j}3m$K#N__3bTiVK1HMThEC2 zYuV3M7#LSWvN`|JTyl>oSb6y#HT^8`(kJ`Rk90gBi_cqA_kHp%BQq;8o$paOapbn` z!E9;KBy#qo5$W|R|0m@1X@vFblv`u7be`#YIm4bV;iX}hf*D?+(WrBEUEPL0z|GY@ zsMR|N(CHft(7(KZ$8BA$;Wqa#dbOMCM(Q2#wo5JjX>qqnE!))tQ;amcOM zeI)lk-cIEE2_TK(H8NxV2O_5sS&edzyK&(nKNj+_`1F{+)VeFq6VVh?KK@C+NQa>( zrL5=3i()x(3tD&fx2@6Mutx=kcfF22eo#i$G^F+flARym&W0d9$@Xx|JRhAQ+y zN-c}m5DVd#b5T9#-clgwO*Fey9iBOt%onoJZr>uLIZYs)GCV3@8&eVOl5 zz%HW;9&&ZyzFB3(?#KpRHOOxW;^zePQ#^)8N7aPJ%vQPBx9%ta0-&#Z zRB=}x`3It0)La0@} zwa@6%P1U2ZIRP*VWy>Gj~ucH z$3nv$h3MxicHqMhjtN=)?a{*ixeiWkG}R`AB_2L&>xVstBY^7ypFG?CSm!LY0^nRA zkC5SPGv}&Rc$jr;1hu2qEl!V-N3Adnn#Y~LCa*mVVC{&Ut)`x>+jN95fX9wFPsbYUC!kB*$9HJPK#>gQxt)v9yvwT4;@~ z7;{D!jGjW`F#KC=a>VzqY(EeLxUw!Mgpe>XrnkJ(C9BVh*(^6M>ccjsgu=Fj4<3;( zK=%*YE}mP0{`K#EJ;A_;Mv!R;?49B6MHR~7JJkXVOqSUckoBYOcRZgVNbS?3-bmq= z-xx(g@m>2o7OvLRc6}87f7}IISKeT+9W&la3RA%hjbknoe?ySW3DvGpej!{r2S*J5 zq*teAr}X7PHZjcc2r(Z{GYxVzl-#L0iHP9CY?{C7g9j#3yka7n>MJx4RHur+9AjP2 z5&GH=Qxn~Zf4h4Sy2UU2$eTZB#yIuEfjcuZ^sct%V@_;h@aFo4b9fE8YGQ3IZ|ANh zvt<)V`pOPkqVYwtLy{LQEgLdscQzi28~k4}IgRSdhUSmpfG_x-9x@d}nq6!k(e15) z3N`@=l{5qWcIE-Bo?1qZ4ARIu`~4xKq6TIvV09$tE6RucsE5{QE1*3UAKbDs!7MC*#bS7QQk7X_~(J3KA6TZta&yV??dYM|OKTa(!{ z=IoG4Z|`?x|FUH zm_rc1;&YXv!#9GCKu!#u-2#mJ;>Q4Q{ z0o%Tmk{)TJIPRb-$z|s#Z`zfQ6n`>dr2^Fb0E#|9l<-z8dLN-)fKWhdzady(<7nwQ z`Eic~-J(|2+W)#*w8v2qzX^}~FD_mYN1}z73n#bFNwwTUIbZB&N}nksHQu}=<&ckd zyWn97Z%4L%R)xoYQxj6yN|bjdu?v-dfzRJ zH=-4Jm3G@Wt9NYFZn-41Bi5rGAZ~cAJ~m8mn_tnHw7d(p@Su->ET@Xg!ujvaP2G#T zoI3Jj#@trN6BjB8%eLW$hi>IfY}muv*;TON+Iq*4b_488J9D`e*Q8C7dPSh1ja(gG zzSqKPFA@8AM<<1ufgj$0)h=bis{(;JVeGLO5ff1U$eRrUjYFUEJ4@~YCJBiJ!1)el z161Iu2;ZMkMaYXiSQ%NBzg8TM!@X~pg*$o3$IP()ApxS#RR+iW?JkhA1(tmcv&wnwj(A`K0mDG+-DDP!l-|9GBc#knQhqKWtidi zy@@(4wkt{PIUO+cxRN~uNw2=jIp58TS61_Xei7z~n?zvgFhY-rg1!bYo9Zp0Kj*?p zXes5bs=M5=Ku&ty$Zn<+hv3D@xS+m6yx0&}Han9)X@tu@JbS_Ec5enDT;s_n0dr?L zd4%0RDc`0PBAiQ*0jQ4%&2*`m?Nm~c52zbuxh?PW%J_tZVBfgx#S(6G6@TkQ6`hpP zw>~{PAzU5sY}8+A@fC5Z1YK}Tc`_qRiK$AGB1)X>X^kJE9Id+U?817hd$!kRlPPfd zE^ZuSv17D{IL>3kYRdt{9*eGW@n)~{HEvgUPl2a+2NDwWh=svz{ti(Yq&J;I3E=b+ z-^P!1=BINz0o>_nu{}vum9|=BWNM?GoBJYr#)ky)-aJ)n#d7yzq|lu2&nbW@2pWT_ zFZQGLPx044Sh&ng4^A9w5NJK2JUAeZ?Aqh&{~Q7NX67vTHlMD_y2j1tG6LDZB^=!T zuh6gyw|8GVF0K^RM^xQuPd1Aeo0yDM#tpGKnz(rB6bQ3o2VkZ9ZLV z;LI8L?fjr+9U8=p@n{eh;T}f(H^AE((#8A+YD~#^I*J=+qXl>nl|0W)KTa&H&I^od9vNgH>)z}ek~3FE zyw|S>PYmi`>&x!`(z=%vLlCTKe@x6+ez^>?$0Kf|&#h~eV(QFBSQk(Mqlfe5&MWV*1nl{05-pIxm zref2Sj`v|QHSWr?FlEQ1DF>qS&c@(X;=f9V^rJ+Lgv~M>VU+~$6HXf5(#WD=s}^nN zmD^FZnBP0vFuEM;UV^-j%55Ya)!);?vC|67*LOs-j>7NGu`9#b|SEI+_qMy0Cy$Qz2er z`NVg)9B|7nFD7f~8(rvaM$i677ooT9oZj8WXu$8Te-bzxHjBl;w$}>i8tiiV(XhbRgLdec-tV7JETaVd* zsNDX)#RpGhWCx6lZN0)9RR0)?jRL9HDrMjWo@EN!B${OkiqVp9GwOayj@vyQbO062 z^|pCZ#LK!$u7@mP5A&38FN8Y7h^cS5VC<5+uZN61XL-@oq|z4jos*|(qlXHed*o+2 z5hEe9S&!#}r+ww;vE&Hl&%tQ8TiZG9u%o9c)adT#C#Qx#MshL7VA}YwDSo<%C5Qvt zwV+@t7OE9ne%XHB3k1KvasmmmL4`~)=_5D8`@z(|bXX)|#|LXVuBS|A`gY{bhilo4ORH$BRt#`bCm+kN@XG5r}>hOHUn8xLTB^<>eBO zHB~vjM$uEPRr8tcP2_h5*=nbI!Wr~qlDVm`gjQr5ndxwnoQ@qId=cj>WEbxG3}0)U z9RB+VtB!Mq84YP$MN)_7;!_*GE55efO2lqvBa3I`f~>@dO2|miH7saz8`S_E?Sj3X zYwUoR&+tqq-wg4o<lKW?cOAA)r@nuG(r#lp zr`Wm9oe(D{If``{FMUu}^IYLa^X6Txjoau)gZI|_8G^4`?1_*h=u{Z55fQ{-7m2W+ z*LaegwUD$=&5~;3TJwY=gFE<-b>SE{hJsDs+1-CT7QM#FziwV$gY#NL-*Yb5j4XAa zqA-l6i=o7Yu2NhBTP*ox8*1Rq0Ucg0t6%pmTF%IX8pSmKH>}-$!?b`Hweup+CGw zt~y5-+9b*RZpe+dp#Rw??`IxZVe+;5aV3#qDZbDmY*)(>oX*JOYT09eT_F$v6~buUZ}eh)+QaZc=SadWZ=5WH`-Nn^kX{N?*MtS0posnyc*0x zLDNyVWB-^&swC`zSB9u!kfYUYxr|ejt^}RQ>gP@*GqESVv$ACr3Nz`LF+&~Sqe+%K zRhWxH`Ns2Jjz-jTj_{@y8VwsYP37qPN>uXVo*lqV0Oas5OEO>T(O|J9D!B7YL)?ja z=aqLLT5pkI!%nX|#T<(z+?K=p(BU@8vD@-me-VxP&ACh2fQH>Ay~|l;r;GQr!+ty+ z^3>Fhp>oce^6CFjsUd0LoQ(5#6`pw!id3B+_WA19nU90*^VuY9g?Z^#uYJ5?OeGeJ zzH+nvF+Gex-qrpgLu8Q;DDbChT4n4}x_u&_ctoWLh$qbR?ytg1-0u2>s*$RPhVtQh zT%&Vyjha%uK-T25cM48cm&~ zi5qamv4rrccCe>4C4ZK{_C(adu?Ox^8$EJFA~Q3XVN!=J4UWqOH760nmm$$Hz ztiVl+TbJT_?~>eBCTW?M6R~{K1AoRS4h+fZZ1W?=n&hIViupfF+!lq~w*p&lmel0A zn_!&~nxMkTjxGsWrX3WhG9Ico-I+h_wLA*$@w@#h{bhe)y*T&#cV}N;24<0ZnmmW(BdlY| z?u)AfV4>~hCd3M#)_$WI^XR}-!W_~>cw5)HW?!L#P}>`Le9md)kZyz_ zgC-bg3}luV0prMx*#Lu%#cbf1b2E6eh4J%`!`|a~R#gpNGD#}K{_T%42U|#Zz448% zJ+|Cxx2Mw7?W&ZDDdl}90+7nJL~>=i<{56O%N8H7E7b{>;Lg|X;{CQ+!&|T9!&^hi zY4*ZmV-d$Rs1~E9u9+0%=>bM!lbSvJ`)xET>Q({B0KdAfy$bdly7F$2%EGf?9mm~5 zsuu)n)fRuKdwQpThG)1}#Jz82_e*-Ulx+LRh35FBc=fs2VTq(nta`X2*Oq|2#tljZ zD0U-W7+vD7OBVJ-3Gd!x1PFT(S@>ZyUo8u37Gx23{DAR$;%WiQNVt>RNa|N<^xRYZ zqdF*$EvBW1>r|k-;L=)MbwTpwekD2Lg)%Llh^_$sSn1aLFItUv7ym0dLC{;9gp^M* z&_0h3a8T85V^6@WIMN2WBJuU7k&Cfmv_3&dq7=#)uphqEP(srZ_)rVfV%d1;tfO+B zZY%qsNJ+^g;pJ7ey+zEIW;ORbM=d7 zWm7a!k6m8WMt@;Y4{u|juG)#bGK{YdysQ2N`1ha?K}a9?v%vFGv57zQzBeD--Ua2f z!;P-xYNb`lv45s7*rnUc>!itwUzv(K&ET6JqLiFr!HnfZ`EHyP;x6WW5#SpnVOt5G z&#(mkB{h=uB}7>^R!6V_{vb60QZ3lcjZ94eSusaBB`e~c;3f?#-lS)cN*?zF-U;@N zE7kZi{^!B{ioyEj%5gHCQoS4R%ZGY=j(6DNX^gZ9$#?aO*SUTVvV^}9TR2%vn9d^` z8S7VyA4d_tm%I1b#<|*GM!>Y;HdsoV$dwUy$ML>2>Yi{Xiu&R7+Uvt=KXL|7labyD zUrP&R1&&c!oFY5GfPmY-as|Y5GZNC^4oe(6anVfyPGAL*w7(y%`cHKAmoLa{F?K+l zq9BhAxP#4OC$)LTJ5`+LBjFc&KaJx(MS#zUe}sQM$*G%|g)E$Rn0f6vy~Xyb{{DW# zSGF|PdS2>h--zJ_&O_5xiYR61Z1uuzP`N)RJDZ#OU!`Ml2cP@_zW0Hrl8hfV znfN<0S&EN-UvMu^0qR|ndQvciE2u}J*(9Z#YC@yWM>ZZVfXnn3@{fv`ALY%{JBG$> z$*?ZGV11HAbDeS=kcuM#46jU<9iD+qy@SU}vj-Dyc5s#`F#cXA!d?y5wAS}g>BehC zqTzTlP2EHd%JFb$$c9AcOEF7LQM@W=(S)q>M1Sdw;|~M%8mp)a)g_P~0pzDbm}=FnHW*$k4SoY6gMgUg1*8Qd? zM1(+=!2(pihgpEhEr~0M`**Y$M`<^1S1-OX8y8}lH)JrK79tBPm2m|hnWb~2K8{1@ z$9CD!Vg5seXt-q8G7kYhC3^PoOtMSE9k95ryT^t% z@t0u-m_I+WzXn2^V^Wko0QGdj(RT(IX+OcM9jO}R^*(=quRiCpUlE@I|Il?@KcOG6 z43qWD`8IN{3rF7uZGMLHT!3Q$u9Yr)&4Ij)O_8zj9XkNNA}hFD7X~s785l6vR?yBw z8?EUZnJcl`4{9ug-vN>-`u(My*Mb6HDAZ3gIjl_abA~%3DtW?TGt}*I9D24;+t0QS z_*Weta7BTCal{Ip`8nGcZoaa!+$Eg3VE?p!!|f7os*dtm=Jui&5lwGCBvpV>1+>Hlw*M1?4qmy@t)n#k0T&RLR*M=deelN{ zI{J`eOC&vucAJ`#6QYNHIJqtuL>;*gR&y}`Wm4|?W+_Yg&T#!lvp7w%l;okraZqy{ zu(t$;0sADPxgIovR6mIXa7TzffmtwZ*-uW=NNgW1)l|r;Hav?Nt(3uqO;Kp&Q)vzy z6e886-^&pdE+%Tv4vrT|7u7_zu^FBv@nLzAQXN0i;{PF`WO2%fe5wdAf`GNPBdMy( zUHVo*9)4L0b$=?hXzY-Uaxsmy&#*Q1vW<-xL_T>)qzHR2e7nobl-HZ~^MHR8{|uAg zbhXrdsv%cvi|+=Hz3z<8*Y2wP+|O|FzbieqKij$UA?h!8MI)?(9jO0b!o#2KQTY-| zkeCXcQAdd@rHV*-J~sGt=q-^)*^Q25w%fC6C9I+AOpc3q{vA8BXt<$abu0$#c>SV0 zFEx7g?j6xtd4%Qm^|TW$rmqWC%U?iC1jyEW$+x*%iR5939fRa%99&W85p^V0jZU<+ zp4pRa?D#g^2Yb?~RPQCHb#d!Ob4>=OJ&yxe^t8ulv_cPm7g&6Q6360aGv5}s{W~_n zH*ALf(W3G1I#%=N!|NyDj)nL~G}q-SDJ7xbAC8H31zyy-DgEcgF|vg6cqS)Pviflq zW42n!fo|kGK>inaTT{%2w!{^aEBJ}ff3s8V2kbXstwe__vq8W+EFE8#2i(x5O786$ z|B_|v*fDW!j`P%<4%cpKSj9FuMO6O&ZLIT(A9TtRP_q+w+U3ZAPKSx-=EeSi!Up0W z3Osu(Av5z_Z#Yr>)>N@TxdKz+Uj&4Uj0_`LWPuP;ZJT92Rv^a9NBGO(qow!7G4LTk zKOmZafaHk+z0!rHfOim3`sCK*sV+ofRT2Xg`r*$Li=RWX;K}WY$=f@^t^duNzGaRP zBU^VgUfJriOA~o&r((E+OL)eEj?*$) zD!@@8qF_~+MDr{5%y2?!>TE|a@l00tGV~Q4XlnzV=gg%GT(EZU7J2~vRWT81c!3KG z9OQcZ(+J2Q)9l|DkK3J86G=`%48Njbqy!>S)1>HENyHxSk+iE3I6%!o|8BU~Bf275 zNpr-Or5(WZmksA`>96^k!n0Wg0*!9=r9}Qbl$x@l(BmepYTu;_H|0ILuR|QFIp#lv)4cE z*YhLI8QT5R5L)a!lu_(p-?hWzM2uZSmA}6wk(r;A9IxYdkNmIAJdfqzDwRQGsI}vf zhOZd9Ya(8cP$BNzLWw>hs%A1oSTLjOCN9$MeesZzmDji>GKU2*t)5=c;VXq%*wcH8 z9wUimpadLuA;SiciZA-?|HcPy|JoIh60nCPr%5DeS0W?l>irIWu(s-dBiH9Ow6A#} zc!z+`3`?ljO59@>!Wi#gFd6621$e^Hs&? zJD?5&M&l<*P$^FbgP-(O_YTZI#3+LBob?`U^qg8YS!yE7%OVGPx84G$7Fh)f>k?)M z9Zx>>U^k^o&PT7@^`E>%lwnUQ4JqofsF%xy3mhP`rIV8C>?`nQN<8ZKE5Qg0tv zGIyAmBMIJdSX8VgSXmIOJMKy2O>wcCF~$RF(aPm8>awtrrOfSqU%w*$T(C z;pK}d4qzqCJAo<`;oKmv{P&j}PIyXPwvSCF>}S1)QfoSqbFoShw~YSOFu+^$DZ;}6 z-ONbObG;KlR)=^1)#88xAFq`tJoVE}`7VuZIPcFuy03u2CcDpF)xT!}F*AF6*o9wQ z>dm3F<(Zw{C?=w0Gl7kv2&A$CYiEBfKdx*ENeDqy=<%=O^btH9T4yvmV=Ovk1ky9T^o1w3;u7AP+uv^v1oG*U|#dj-%&r$9`qP+-u*mVA*F(RL%&-t;Vu|hp2{71?E{%)pkIIHT(P0=TPxHQslRC^^oe>N`jXkI>FkzVzx z6B;EQN)xPJz>8L2!T&tCk|oty(Sz`1Q&l;t;%1Sq>dzGX31PIaw;~ISxbTxU7|%pP zKgBr8CQI$TTDs4)LE#eC8zw1f7;x>huP1HrGgoHvIm5T=7x4fHxkl*m?Plia%nb*7 zXJd(sl%Jh`R{jj=X(L^@eN7D=rj~QHXmcrNFL^kmst)bqRaTP{McNHlZcKl78<{z+Dg{;rj_EPh^nc}?=#TR=6hr29-%|LFv2 z$1JUsv3>=FyXOu(o&t+c8l*paTM>1Z6MBEu86~H|X<*65UIXbml_a#w&gr)LpqGp6ifI%dvmLzsZtKqMOIvua9 zf~ge19|m~}qH290lfebAbPoj?Ux*-Li*D#EfG39YzRm{PK9FGwBl2yjXd(k|cvEj6 zMJfcQ%B2fj5sk5-hulCOB|aNA=1NrUi3%#h9n>lGQPeMpSt$R}-u(^82QfX0m0*3jMRthZ3(gtmtF4o2qz4D034W$I4XGM{eGvy1Mu$Z}xzFEPGF} z2*E35I#V#Ntp2s8F4(EetZQU}dkau(6hde+tr8Oc+6Fg;^`Ck-c+H2HB{1J`*t~K$ zP{Ho&V>SAQhw<)`-urrUbKe6zbfQLjbM^4Mp1Y0Zy~?OE;WU&m+1b{Plda+1&1F385(lJ1%zjiCwsoTb zYhO3?MEk1!Bkh$7-6a?g!#JF>9@d%YZRa=byD?xErHKeS44MYiHvj zzFca+l5uhVwF_WTO$jI#N*DCZ+>-(lvw=>NQ&?(|l2#WbT9vAZ*y=TfQ;f0&Q*&q2 z1Vd@@9qjBRRa?GU*V#uu+@8R$(C!yB*qMjKf8dEsrV_;P7_n=!$3uApv^W}Fj0>C$ zPs)q&K_NKHUxIpJn1%)xu8$%uXJ(yO|M(lHgmn}(;1_329Y@{dL0;Em``0SRZj44g ze<&m8a1(u0BszOWfi|Y$5jC`M)KnBbB4*G`+oR+N@iMr`bDOFBIkBcV^sNC(ood?s zRqv_tweuW($ zM~WZm=@$v`&l}&(!l37?j(gJ@Vwbj09DPIJ2?P_m3GgO<6oW;1bsKS?xQr9FRWg@P z+tM2^$0-^^?dA8vTi6#-hx~0C$Mk!s3z;yFv_gSJ|AL<7z%Dv-l=A^USL;fsEu(u+0+QQ_N#+ZL)y-H#F z07^uNUwD(H>k=iEF^Z+LeGu4@D)JVDEc`B0PWGEcoG=0z-tPVD6nO-}eJj5DQ$6kV zzV*lFxJTumAOB!TM3=|_8PjX_Bhi#Sw?5NN4boUjX7D?^(S6vKX@t?L3o#YmzlVTp zio-D^9X%F}4@i9Anl|OJrTR3_(o|}Rl|TF21d*UU-@}WZUJrPit;Mp79$C>DcMp*h zzG2+={@ksP8^~AqA6d}eF_DMyY^l)pl@$=q0#t3qVbCS(un&ThTMmwaSAqef^6bEY zi4$O!&dNS{njN%-N@G1&EH#ya;SM;c(1^Q~vu_{~rW2uoZHfYuFQIR=gz7?Iq`+B# z_8vI5Vu1Poee4TCt+`0!@&B+xCqn-pBrS3l=|l{eQ2sjsJs9nu&N>Rkh6qT{!Ve<2 zc(lEPr`<;%r8UhyuliE&k^$&dA)lUoAil+Y$y zL?Mh;Pa4ekI*T=bB6S>)?-)nzSE05eM;(Ve)4uaq5E`VqkHZmuWXJyg+NK5#&-NJ; z_HtKDAJHc73~Snob$lgu1z&pEtZ<)frcaNxr@)+T962U78wmtu*SZlZF&9#$(j5-D zh`lkFmvTW&w>qv1P*zGW(4?2*e3 z%N&s}qLw`NDM_vMT;EUm1o%YWbNjhXxQSPk237-d>h8$_J3E%g`9llSdGe(A3Z2Vj zj{Hl-^-6}s8}e?GgmG8JBU15Ss6y6rXut3$yI7Yxr!Nmhl5_~xKvu7bMMnI0P9g2p z#Rcs|yoLfGoInEn$#({fg2@SU(ZKUR7Oz{2ZVc;_tJKh-%Wis{FsC+KW7(f{0=ze$ zMQ0CbNCSkJTCk7t3UwQ#V$i&#F#={5WvQY!frnNUJ-3w{gWQm7r?2{#!(X)sqO)O8 zTKmQ-uuv5TCs`={zDf9zTlcqGFj?Y#2&aT>99`*b+j`SuPf zG^xg;E^m$MZ~#)>taCubz^7DVdvUn^(`bV59~v)mAxL}D$j=Ha<`*}ctaL48`q=+N zdgT5h<=7G{tTT@{hFSmTsa}l#Zm1Ia&3CJ?&?lP_e$^!2NVoxi_l)H8qGHFvPeF?m z>S*UiF2UczBWH^HqD}CcPfH~1`ux~YJvs6`8<-){R^oym3b-@_Lr1!8G0B_)TT1D z)Y?pLD|j{&Uzkfvv-|ee#=~{3_QLDOf110)Y@{Epy|M&k=?n6>Nn@7^t8chC61CdT z&%uAt2SR`SY3=MCq>A0m)q3Xk3B!M5c(34k=BDYVq48~^+^kgS=^NG>w0iNw-r>Q7 z*M{7e;LX8ejW#WjQbiJxrQOGa78=S_9Kx*CZt*Z{GUdRZga2$mjrX|`5v@9D^`+Mj z>#2BgRkx-u$oWoC<|rqRed6wsg*dy6l!3?N$ZeMRF<2p1go`Tr{5WvwTODq5 z_7CnHr}9XH3&o)kcETL4L{Q!fJD``?&x@LbjEJTn%As5I{j403o(5|oi_7XqsY!V8 zQ4=q!+ea|jK#NsvWXwY?^6UIkenpf?6La33r%hweUaBMzV*lvu_I?2AKkGkzO<{uw z5W{NE&&o}u$YM9Z_(Ac*{FKb66iUbKMp)3mM%woMBXs)8(XD?Dy@)5ks#+SX;~h+* zY^Zzn@f{?kpQh8k)N0Et*`1?9+WYRBQ*Y&>O+NHLg+w}%Xt!(F{C9}`cdU)+mpazV zcQE^%#f6d{Cy}#$-_i-aMV(H{&Bno zPt5GEd@ZT^t>wHC^_kA?a8T`og~@B~Z2h=Da0}zHH>5)e$8{j=5u2K1C*Xw*RIZkr*+RX6X1uR!OLAIp^V^8ek{dnj~VU z0?y1(uO(F}VOYMbvk{tDg-%ifMG=devmM>{6O4XW`MU`k81koPvc&)WYYLslgn+bx z0m@q;?|3LT!)s4(zwD&BIj1!+Lapof6{X{v)z;Z>P7xT$B*!kI^u4rzdc0exv#K*G zc{iJD8e>PVvu&zGy2bvsews!(V59mQLx4R&gK9J*+=J9eV-jj6L{5d;xmxMt+z+N$ChGUazUav88{Vf3jNgjWlhWq=?C z&2=yel52sN>{p;!rSUXWLWVh{F+wk@Bp>X%8bM8O{Coy6X}LNi zEdHB$m{Y=N5AKZ2-d!Z)5c&7m+LQZqcsssZlDcco^9Xx22Ps}5k~n0apA@vaEe*$X z(qtZ><%#i|?A}P+#(IvnY)45Fn)Cx17Lx(xVk`jVE*&Y_Y#kp%UG6L{5$3LNhd-@$ zvaFMCoTwdmdEVS%%*c#>vT!3r9%`DODo!$XNjWOj>Krplj@z+(p!5L+^zFg}(h8UxH%ew|@J z9|9Wx9lzfVA@2B;qv+8T+W9Gw+wO}>`4JRR;AYR@O+y;eCKF6Lo%7+r(Vu_W@vIFC z18ssHH!8G1wyav2^R{3F#xBIyb@J1db>Cg*_wu90J|Vu~w_M39ld7RbIUmfyVtDXCu8Tt>fTj#+!#oEXs#V{d+zJ+(=jb2g)T}oay4fySB~% zL4+q&Fii~j!?VcxV5O{KIo8~(^Q>y8w_$X@BbKI|krI6+euW~jZ3`sdn_GzdH|cL` z`}Eda2J_o_RrbvaYQglarE)pmLW2~X-wpBJr>y?zQbExh?ZS5>Sv^G=OL+?k`CcKf zcb2l$q#4TAnI8Xqq41B#@Ty7>Th+Da{A>2x2NK1~a-m;K7cmcJZ&uN(teHEkM~dxO zm|b&%4R7Cov-W)>t+cd!HE82jJzI=5`gv%O zUsDb3$hlfqn9h)spqobGW<%KBPfW+j9zOgWEh@wgOVh%pAfxL{W2l=%6Kyv8e!C|~ z`DZluUxwN)oK0?66DTsIJ`~5KJ$_uGHWF0J5FLp99W049w~OncNIQ8%S@q-MBg}M3 z9$+n+Ih$T)!G^q0pSDT0Ct9^pYHQfnY*w@ZTe8SZbuKO88VjB6nxE&q?Q`)IjnPJE z?FBg6yX@ncRZce*y58W4QEI7L0A(SKrpPw2spPGTP%3og5ecyCJ^XRTUKpn4^+QX? zm)&5(gY&{)znsk8_VugjqyYyA%aAw;Z!FczFleF{5c)|oeAoVi$KEAw)`~%>u&6CD#PZ1^od7WeI#PNfcY7fwX% z(_f!2G7tzxMH~lEJavCPKARQ4wIyiwR^&t5@0c|b#nS7qO*O~z?d)&cYN>ub5+C@X z(7h|&mHi?1XJM3(Emf{MiF6J5fW^lyLAZnLuxZJ=LIe5J4ZjMh4B?5av2Jz--T0n% z1djOq@ySV;gp$%~tyv{{!9IG>iSVE}{z~3J@caQM8*z*gELWGb!iqHe)(?)Wn3$J# zQot;$u43shfTUT+NEWY4Z@91l4tLE=Y6aPsmeM>7I&zO~sM>q>Yv1HXG3dm;x9Yxs zr4v*EhIsz~m8*h|7b(E&=~@=X*tUD&bhtMUzYVBI;Wj8pI$n5_0HMQQi84Z{fQ*ZF zqXRvhiyAQ7=Ic>f33LMX&Oq9D8|~m7>2T!Ta{*J|8pv^UbOpAMVNmP@M^N&T2=8_c z4f42)5;me6vR^q0fq9)(Sg~#@1Dj4Jtg|^X^sz)$e#QP zmg4qApPWkww#bktoA-5`{|FLnS0KAqWvu(7>`fYe86l{yL7nW<-*G^xw*KXAwZ={Q z)Bff(tObk5FhXg9d}!(60&X;*oZ+IGqtGe?-uu=}^iwh4lV{Xse<%tct;+)sgI%pj zir(bXHuSv_k7K7x`TQS64;4w=hFZdp2dPE3wJK?}d_M2{XP*4jJ(;n*IOFkQYF4^U zqW7M|$5MlmedFl+j6CPBvrW9Y1pjo8^wi>hY?<|&nr|vh&AQDsf%k;H^7CR;pagx0 zk!XxX9{~|-i4vrKioXh8EV{m3oa1u>R6Fj0{U26+6yteV$wrgK_%1YFqnob7pnbpS zyP*EmML|x-MYc)_CcW9^Xh1b5FGU`7#ExzeM!UhZpW3VWC3tWFXe7K~?g%vbb_}ZF z_U3Gqj)tj}j>J7f2_!Gh=si)d>RYSf`5MoO7t|Zk9Dp}xRz&P+Vo%=nr&6dFB!>wB zqRo{IG3E-q!C7>79_T7<8CU;er!)T&^<9wplWGR6;}ao4xBLNRodQBE60|UuGBdE7 znp|vnq9q**CI#GWe^NtxzWA+N7Y#nBn{9654mF=%A&DexuRmB0VXv|tphSy#Go$SR z4{J>;Rmwl+4;_N)s4^Id{npn$tZrF3RftA}`obodPuYRs7D`^c#E*e#-EMRtg<^%6wBL=GhL>zoc^nqi~gju5XQeR(gZP;h{;f3+?8=ihhgl zKYxO7I$D1wzZxt+=<>DLLb>Qv7W6$zbbWF~>UTFMKN9bxaFtJH`ClZ8UJ~ZRN=Bf1 zRLHTc3`X`F?&3=!|0(H{8Zhbb;=DqgvhE~Gi z*IQmhQ`15pzsiuE)NQ(cTK_dwR1kg2G=4yCNS|uwdi%d{)d?A6AHnU%ukLHP$3?ss zOfu)|`{InDc~(j$U2B*2S<46t|4IL#Q4;VJmGtS1i;tO4P>_<2F3nUlU5d?E?a4@AFHShBq3mlT0l-B`?@71BB-A#Z#9!AT4a(<;^34m_6b~A>82F8LwVKmB&yx@HPIC|k8U`t&< zp>6e!^UXGw#qYfM^jtTK`Ltvv&o8s;d>nzJ5?!6aF-md`$XMpL%d^nr{aVi~^3Z$< zS8AZnb+jEQ(N|)!7%9u69`Ox2nGMI<3SjQzyC{K)s=o-@L^QX;4PHqqtTt%E(y8H2 zG{8=lM`r+xgdI_bpI>mj4?a`MYj=ZDSMBz7rVHrXSZI{4n)BojwX?|$tQ%g4DPKrP zg5P^*XhU*69ua-$pXJTXLCn1~8>rNeUEVSpXmHkU>P_0HaHFky&fju7*1iPM>AQsd z`kFHhx%CrT3aJf5{teKYeL8*utG)+NX_wX_-DPG`!=3 z*t-hm<$KDRBD&g@G{yeUI!cax&riY}3G{5hRc3X<{c6;Jc{v#dqoux3TR8OcBup7h zH{9rmP|v@lKDcte30tpE7Tn>?j+|eas1Eca@yf}2rSimODUbN(to#iwrujk9mO2XO zhPsbCmCxUDv%i`k?JGDQ(0|Lhsk=m=Zp>WkmWN&~0y{qSR!ia&yxrU+CDWwVWN+=7 zy%iQ(yt!jh4?lu?VM9S%ASvlgkN}t?S#$+5;8?x_S*}nH>x)aq%}w`%UD+a+s!qjG zul`M!`sIZFs*X@S=7UYpw$)qgblr&&hvFa7~B{|IN|_cv-5?bVFiEN>qV@kd@3LooMI z+{I#TX>vDs!=2sdsFY;K@=>=j+6DnCO2N_7RW_!t+?gNRtGIDYE|YuMSVc@c;#&UZ zcvpYSuH_4TUhnMzUYv<_YV6yX@A|g4_Je&T-VXx>T(>3Sr1ZYVAWQD%~4~-8d#MkMC`alO<>D09@htO70?~{o-F-QS;yab>>{F zh(iyNCJXZL;?#J_fU(i<`g1Q-QZ6!ssn9YI5*iOBIejGGwF6OfI4*qP*8$Z3#x90t zEdO7+9;@X=c-7Od8@Qq-&dQOCmV~$6zwYXdeq68pg~Tk5n00fX{pkJ~acbrLP*d#- zABRm65iU?}Od2Pe1wWoEX@HC|D=1{z7vnf}PzFK9U1nKzU^*AFw`f>mAk=S(Cdd zo!J*m^`8gNdS@XtaqFv*dMu1fgy7pj_IGY}qL}_Guk3u4{y?eCftB0xe$;v;S4;y< zdFPk){f=y!yso*bMdo4jeoGiE{Foh9l=m&4OqMt(hDSq(#+}grgx3BiqCJeKJ-j;v zkb+}8@yESoO2Gjt$)2n+-R^o0i--U1SWidP2;I>*r{uoqF3?i9vlBM@HrIf6Vb1?7 zF*LU^{!m|k-2Z)??K{fNc*X&RVx8yC%0(QLw5<{L!Jabwy4iHgX#z@jheH8GaU5OG z2e1{=I}?ef`ZH)|Q56I#YjW}Hrh4m>2Q(AlrohO6oB_Xd-%XV9)^J+I~{_U)C7|e&79NL~>z!8TY%KvI2{Y zq>XD5`oh9mGU{{_me)+j!ag~qa~!502PXMz{-uZdELA_~{^8w=i)x%h-2Dh!R=&{_ z>^H!`Pv=Of^H#jk1=~Tm5oVVSUKPKGMefsrXLF3`Od9S(=%wm&7A6O#4`E<%l6Hk4 zY^wi}!OzC0LHzZB$~FE0FsQ_@}Y2aS{i-qIab#9NW}+ zJQh2al*jXf;+IAHXGU{cyf?p3`;$BJ&m{%0c6TuCrQC{DUc5N(o(lJOK0{l&J2nqf zI5MaF1ng%%uYYGh?Exp6L84K!>0(_p+q_q7>$h{03O}zbvJPNPpRzKL&GZbeR)JyT1OJvBS2xTp!pid z4JJ3yXV$^L+i6c`pkHbB1Yh%KZ5M98Ee}9)s*EBn@@s=dZ375ecKB21`dc>!_1;{M z?Q_$7DBViZd>H%eI@~sJh^jqKP=pNIp zlTfkOzHa;W7+hBIbXs35sxHj0tfs|=P7=)h;T`Ts3*gMrlxwi?p1TVFLs-uoVO{jiF^JlWRxXx9!4{7SiGh)X`Z zu}}>DgC7bBkfEXI`%)F^*K^eR%*u4FN^BE#5(5fFT21Oqu)EprhEsvKR`C&-bv zd`dSVCMXl>_r|XXDRvJ@1si&R{9-ClYY-K;q#NfVqWM*j?eH05DMvMK?k(}Z^f^;c zN%V8`Ym|!SU4DA-An21Oq6Bd5b<9mUrF5Z=#Bcv3@a6n_>EyvbnEW}7EG{n#Ik#*!U|!4@ zLUN_{^MJN)d{KRZ+&9ydp7*Kr_;YxVd`;Ykc0+C+>YMX{dJ{J#lzPto4P6)z5zJYB z7HH{&7r*I_jf6=Z!$V#q*Oy(YzXK=Un1Y=qRG+}^n?kxCyu1tAQZI}f7-mxL^hpr? zXq}v>_IDsJ&7n^Xw4pHY^3a-FeED%zbA}iv!oKK zsUyoex!G8?o1fHh`fUT$=DuQi2UhgN#!fFy3UK&t%`&UEE-I$fd_t*!eE6d$Xih>X z6;MTnovMS-0S3HA0-7(EiEL(>ly{T%XF%8Hu>05zPk|b57lx-pRH7WY$@zzaxa%BDI53ur#<+y5%dGw53k#RH$Fj;F!v-Yy1v6_df8Z1xKI)L+yDbH5?2k>c z$JBK87z0rDix{6w!e-wMpfjGf$b4HmJe%WE~~_uM~|jhPCQ90r9y*oDE4|CEOI zQo=(djefO$@HCQVvvm&XvBcsk^+)ACwg{6^{rvLT+ephY9iAQITkXPXZ#>SIXTQi=wRWH0AW^W4+^>ZFu*gD` zQ%;!n_$;0c@D<5{8g&5Kua#yQSuy@4fej`2%LooafnlueCqR z_LP2f9d@J?kKE>0eGm{EPNV^FiXQ7hQh5H$e`vfdpeIM^{^n8{X`l-n;2`?Z>*+NZ z6^Mw%x4;?i$r!lT4WJ;`V*BV`;uG0GU-=grTnyM>E=bP_PipVo3}`(eyZ)m2)Tj%f z>{6eopNxrZe^-Xr`dFRhLSRX{{E(JiZ+Qz;!a}_8Y05~eGTi4CYNTzyI48jIvwVJis<$9JVT^dW`gpPD)8SPAcIUqMOEme5_dbrXq2fwIrp+xf7N{Wvs^251%Db7ho#{# zX_Vd0gux1`SgRJ|B@)k_%4ncE*|8Kd$mx#B`>xR8SPx7nDZc0A1gC8LEaM?|nItA@`UHdv1QWbmM@Ep5EkbIIAO+lv*r&*Kk#WO4ad$Tou7M&n`UB;JgxH|R)>7>VWoAY zd@GhFS1(PGGNl@Ap@~#ZmT-=y&V}!0X{p#qGE%$9S&=+0=emdf*<`TLghbIWI?SEv z0QH)RJIDNkxP_Qy7e;PYliH8>7o6|!(~o>SmQY8Zew!3;&k)NAm@4$mx z7u9TX^N>YaKrhxCPt?h!$iB}%T z=!?^dHssE?UF4`&OFvtW$e)lte41&s#z7U#$Pr;uv6-I-xe6C&*H36rPp95L@ywO!bW9%TH;x{)@4|F+OS`&;lz zOLdaEKKmS@hp*8+@uKf#7rt2SWhipr2LB0WwCG`SC?Ev580thF z?C4qU1a<>0=^!bG%MTrK?A?^Pkc|Cpw_-nD1d3df4etwQ2y50f zOb_845vuppWBp*Nhj*um?D-~t7fcm2Vj4&_-GzjYClyR;>k!A;@%a>|mfeypc#<%@ zp;WEzl|p%FaK7wVw>H6JwyPQ4N*cF80Z(rtvw-hdi2NYBhef`xKX;17a=R-3!^v%; z%iCBr*nF4E&>Y_@zRI^NH8^kOQRm9;=342FvvGPNU3={SIi)(i$%Z)pu$ZXcU)F{t z>hXGg*3}8%r7f05rNyK3C!i|l{!qj(f=~4U731Ej0iBZ^&-K9vl$FwKewpw?^f}?r z)5XxN8c-Hm()fRJ5suiRC&`W9K{DU+ZyWl}2L(YYk+y8IDB6$n8EmpfgcEqc`$D|P zVMTrF8MBkYC{L&7DFb*4fyEf#-oEIuP)r&uHf#KvoM);0#82Z9Wsq!W6~erTX_QTu zu821aJ)81>UbK)|5XzIh#qeA8P@ubOwlsY7D{&F>&~L>F@;o3x1f3{_BOE=7(U>Rn zEoYP=El#{4j%F3QA&TF-IJL~_M9q@{8x%}Dk~<)2K|%~r9EB2+Dolt`;!c)Z7|1|Y zFl1SXANO~5ZtS{(AC2X=hh^Hy2^K`W>L&EKF)t0!5o(@#vLTBlB(rx7$%JYaG7sqUAbB6OS#Qe*y8b&$N8`UW z)iRVF;EunH;uHtWpPqK`02xhGf@?T35&32) z4~)}KGD&!+WnTajl7e~6X!FDf=im~+|C!1FHrpB)TT#cBL<5)$t2HuCW-+Zbs;_$t zCaGCirif441Z(Z7i5pRg`Q5+Y z@NJgWu52YEO|`n>^Sgp$UxIreZg*oCr~gs|&c+{&+#ZI{T43+kuQjTB-n~a_adDy| zo}DJ>U=8^mz+6i%szA8-zn-5S&*SXClUl0mIL|0HO4n!eBGpxvgxOlIyGux@@`Tu1 zb>wf6Xi#GL81T9>M0Nr9Y!s?ER*ypk@q8A_SeI6il?9Aom1nTaHzJhHYUSJvg+rI2 zPcF5PBwnRg^`R5kgc<;?pa!Vc*A3o%RvZ*fbUL`-oQSJEz#uWEQgx39?$)8PV!v7t! z?S9Z>{IJ7cUdtDC{>Nfa&q_{EH0G%WYI4H2AI(m*n;56SvTPZpcR)0xgOua}8}+Dp zs9oViv0T`oFcuT8>9_iCC=%m&v0A?NCO9*bv_jlOx&z-w5cxTBy=o~Y|MDF? z6hU(r8SSzBddLT>8s2cnkFmX7j&Z2trQ%jQeGEhVq#|BA{>KSJzW0bgy2qVda6odg zi!=ah1t+j>iG^Kx4ek=TFaxbTB*(?P(D4Uxe5uEkyfbw3tsjhD$+BIQ+E zBc>lt>{?cCRNU`Yw}~+&>SfXvUvdPeNsHGQC1v2KDG2(zx8e*PA*+JQ@Wj zWhy65swUVLCbki)nwuP<|BltfB!=Hi>2Aw&$J6%eOub9~NJM78`%L+(#!Cu0KZ+MV zin&pVxzNYlM(HBP*t8g;tE^p%DSyM0svBRWgC+`FfN+px(r2<+vDA@;Au%)An-u$2J{_GGC_-3R!HqpdyoamNz`c(1+tyN}vt=?9iYH-il#= zoaZ)w#a&?W1)!#~u&|D9atvpK^X%ulM${m%6$Bu#EZR0=39-Ke$s6`BApKnIqj-CD z%{JXD?=g2W1s5dF3&vw#Dmn?vf3Z+>ESWU?R9AYCl&OB2ZyC<{4ue%LDD5?Reaskb zH9QS&qINp*lFcZNa8ElrL`n(uixGie5&D!e+N0$2lFJja7>DR4kMOg>U~v{fPK#gl z9k{ZZz{EGmtboJHvgtEUa%xCq1kMaHqV5<;6pfp>bzh_ys*fsH+>Keh5>07n2vjA4(|v>CpAyW$+|n` z`GL8iu=?aVv2Sefl}H%wlP&SXM8df;5|#nt*Bwzt6Uc?b=3d4=24}M4?HaIjfjc1C zvI8FBP+2+^w}TU(P6An1J^;Bgi(I7wI-PLaKZ{{*eQZyo(f*tpp5FVHwSDY~M;nn~z`|kgo*4e-q7Qw)&xuR|y|iCQ zFETN|t4|$}4)EZUe(p|d(rPJ^P(vHCXrpV%{YXCl{jbGM2{t9!>m?{9KVs*-=r>%m zFsc3c_YFDzc?+Uw+Ag$F86Px%_HsvVPK~{(4>+S-c=tLVhYf+~&A770K#o|~+3ik8 z+tA9j;V1L@N4JeeXS;yg276TjU3wSKmVhK4W?pw$;nm1Va|agy+5q}Y2{^UEi5IIH zG=q~!r$SkL`5>m0MYc_VRzS~I!5d78fnha5k#{+jAcTZ@a&V&cZzmuVkpW&bWOqQxL(MQG=iFJQ#Ql?Wj5d}+)T;nFwOK$ zCB!X?a{X*Qx-n(cJo;^vJSnZl&N2forMMeKQ20{@*5kW7lqn?YNWs%12JKBYP;eEs z;L~zq`Oj4ZKzFi0CVu+xT=$n@UFXopv7-;hFVy$}n_pDPtNV&8?|yOoc^8!uu=xCz zLg==uD|R+!iN-NmbQN_zoTa5-B1w2SVU~;e+k1-zk+6EFKnX266ZrR=37OS@$gL+b z`OU6k8mz4!nn=3U_4rfdfBVPl(9#Pzr2xRgR=fGTSej<(72WFB_+|AZo;M^)Fzelon4 zTmO*xNyH;I}Lz7vux@6N{4#e zpcmRi!mL9{LQH6^u{g<+?DPgg9!Ua1G{?`MtK{Uw&ib{g7$l910KOnPmSE!tI=p6z zDHFJ|*`)?eR;X4L9^e{jAU$4Q_a3c=)G5CdduXiT}9_k5)rhR@=VhMT2sSN9BXf=K2YE?^?0SdEE-6^A(Y$A$dX_EL2CM!W^1%MpP9`5zW{X5?^N~ zmE2^C`s20OLhq07G-{HssCHcn>W9K!YmEJ-RHdF8#0|rx`|DckSsbtQv_~mL17GWk zNm$g+`ndh|EpBb$z&p-zPA$dc9Bb6wWV??MxodfH!C&9S3cFIlN4DdiziV zBr{?`ph}sImFJGK?`yaqV1vTZC}?Mlo;e(j4wnc8+kuKc{Gcq_KSjQFpyyC=r@})L zw~4b(xYgW#NHH+rze8pm^P|BCt^wR+fouk~o-sH_HK~9unp}HI?++F&i2LVf7JvE~ z^5wuRHaFrrl7*M-{BLAqC{bW|KWgfw(f*`B@gIr9KHH)Ul7x@KRbns;V2=1)UEl!(DO`vBz(d23-Mm< z>&6!h{JYElyC5D_(cv+g-Phoi6$|LT89Ys#FKtdKJA-#m5!cqeGy%2(n*jn6GS8J@5{a-(}u_1 zJkjSYjE5DmwSg+a0&1Odn;1Af`657bjh@NQ=7CnR}Xjf+YbU0?Cj)K}d3>d}68_%|#nP<3^W{>}#LeqP;9X_U$aMNyEXAPerx zB6nH^jm{#HUHdQ3EW%E>`%IXoyNe`6315+yco-7eKn6Oe($UtEnaX7u(;!LmTyHU} z=NM8DhTnwIJ{~=PWuh0o@Sb&YSsXWV(ZRg60c|emNJV@S?Y__j%*dgmMBS-(SCJMV z;!M;IIoR7%32fQVFN2Jjf z?laXK`}eCi?hj%#z+)K>I=sqOsT$2OyJ}(9WuSQ~rp2Ko*Tus!S%{tB-{RNT9sxLN z_<2Jq{-KHm8-+&1iQxP zhPSu<1{}F%Y=Fwp+3#M*v)?fyCGT!;`#d_3lky$zNZbw&JHZuSGbY{fAw}JItamsc zlioQi+Js>Zf$!XsyjT&+gXcR3b1h=5DVPFf9M7XnKmGFx9pl!jXJR##1Gzbon=9Ol z&o5WIyrKA}%kj*M${T~fnB9FH#hefN3oDh^R=EGT-G8)M`qoGkkTGj{6H46;=p*_{ z@vHh*yzyE-7?3&Lxh*tUB#TW)Y@q!c%*sQZxa6@)nzprJbp9Y}?CF^#D1$MCO3&tBE@v3l$+RD@vvlbH_R` z{_>x21`%#XSz$!%TG#ZL(nbEp0 zIp!1Ep_N=XHEk#?B1wiHRU#VmP;I@@iPd$?nAg7lT}Voz!gv`;H7-n&qNAyzDcYSY zzmrF5lSZAqDabr;Eicy=V=@q@;~%V=PWI(FR{3bzghiMjF2l3|tPs=9?3@YFGMv)8>gY^SyjkUAT<#vSFZC0X?AdILzwD}E}n zN$a28`stWKg=B3VzPnhrS1UY#rn!``(%B^WOfxoyMtlXom^ET4Q)_1xx6fxA@hS(` z&ya`Z1NuLK=*gGN#x(INsc9|%SrXxz`ZLg|h*hBwV;2guPr?3XC1S-{pVU74>TkAL zxt4sOBl?Dfpt+OVlqe1#QFJp01Bj#Q=VsJZx=;=_H&0IDwjiXb1hYgy%1^}u&({fD z_~0pKcmw#ZVE{2NY}_U^fn-eLdZwiEL=P<&d6OGw+F(ubi> zEfJq|wI8uZ~mzcTQ=hMNBngjW9T)@MD4f5KSD&f@>O8i<7oOIb)% zmKi;cfawIZoYWSLV8C|cx324+G)E6J;YA05ij6bSv*FCoF1g3=zqSZ8bL*o93;`aQ=_VhYT zY~%NP&(lG&YVpoe^h8&O{)WZ&vmWowvz{xGf42__?!sCu`uQLATytZ;XEM5NsRjBv zNlHt&(@Og}5lBk})4u2=uU-Cu@5AfVJvPJT#vFnytqF8G{ttndI_z%tnmM8Npl9TJ zZSPC%qk*!CXFc}>s~-vIJF)Vm-6f?1?(jQ4+;d4acF+ct&Y3&ZqrUgT$05KJ-#cP; z;|m&6xcl!ta%*0u9H#6_F00r;ms}01y@U@FU}~&Wgs-s_Q~Ox-uHeN$%0GO?v8IcD zxVfeTwA~uz0j%*2su&r#A+Nx|hooWs@c9Eqx_scbp;+2H1;Yoi%Ewyx*|mS)>M!iY zPJEWblh8*qvBRjBVB;eEj37a2x_1-w5U`X;36NDRK{L^Aa6FUFh{0%f=FMMdZe5*( z$6^%SSKEQ&CV3xk2VVA^en;Q^pv&~(C!OKZ+8{oQ2B29asdLs~vYDew z7KwAwn9nG-^PyEcK47^$*E*E>Q_Y$P18IQM5xlEd~)LG zZ(MNSNw+y%{PXeANW#rbogLqKujkQ7IjOA`KQ+OL*3Se(%xAskSFig>3i=@!X4(K; z^L+h@7wb?LV9)Df_$JXvOxS#RRDSnux7#PmWSQZJqE^4bylk`yQUbwJ|Fyilh*^V@ z-@jGN*$^n9@o2y6Kw0;V5z6HytlTmBJ|047^re`_nv7k!!FyK<`@=YGB00CVyX-`*po9365TL5#}vmQnl}l*O<>BD{Agb4E#&-NcnhIe zYgw)mRwIrT8LF6hPRqaZ+ibYLXScp5O>U=9gJffgEps}K|C^me&WZGIFmr_nOPEdK zN=3_Jn(>8FqSSY^FRf?g99pupkRVS#V#DEFyGji?TTQMu%-eQqK@}IT*|Or?wXRRI zQ@hF(5FbYc39eY;byb1hafa1$mI`w*f!#zUi_ZWOi=|REUYr>f#;PHKHrhr>*@#{K z)?@J3)T>>)+2Ml5uMw9>kM>vCh_`A7)*tM!Hwwp#J#`?tIcmGln^gJ5z)Gr~k!*XN zieLDPe3oOla0J7PEO@S&3|F3N2uJ!#enEjVwo0zr;G5Z`HjBMh2QYhO$*>$})67mq zIj}uyWLkc}#Y;{v73y6><&n;6784Tw35$|6IxRZF242KbXAd#p1M5?S8j1y}K;!$- z8Dv1&qb0hmqCQ7daC4$HD!&jotaMV7i|wAZ6fi8%DPM3xmBFVwY>4mt{tXsPOXqu% zBqyEE$GRrt3ivivHs;MvIBxxgMA&O z*e?u|+0|SxT^-l*A9`CmH1bUhW}40~8~m?;`xoR%=1Vw6L6}LgBpYU~K!{xmMuGSr z`XaM@oG$>_l|RW*0U*u)*;7#=QUZtJj`$n!-%rfR2a@+{VF;KFw9a`r78l@qxL1P; zpfV?|zz9dsPr2mDFq@=NY{DqCZN^T-~-~wcWR8U)~_#ZXXf&X?5R{ms=A6}YH+(qG9nUQ%%ONWw^Fcd^w)$xqmtK0mu*tE zLsyZd{Y@KHUZKSyY7Hup-@k*HmSb@7<-RSc4hEe-aeGGhcMOG+&k7ZC=;OC_@l+6%LD0D&BA#`pV? zcHwx1JdgPWG9~a8Q!QNii!{vIXeFy$d?uT>v-=DcvrG<@&fIU9c}znly|Cmzd(nM} zW>8I*JxZ5X_^6r?IjFqIn~eE7YT8wxZh&vPYk+SwQMoHmwn7GF_p|sy)arcc&HuYR zK<80%?q^Sp*R~mRnRQ<|^R!kzI9Y%ID^|e)TLxsd1L^Wov;|5q-9OvSCvb7)#)(^D z-&o8zHDxV3DY{R}+Po2NO#flL?KjDV*;l!xN zmfUwodd|`evLe}m$(}fUH}%i=;wj7bYVvJIuoZE_%5-Gav*#cCOBuU*6XN{ax^3-| z&QN48D8`_hlLHd1l)jgyc28xAcqOqP_-jmzdm5;(o$X0*;oMmg?q;6siP!Yt(|h?n zp=XM>_}2Gyn5e}kh~}yJn<_t$K5KcRL#-O1C%jfFg4YuN-yhGm<>+_lj13ZWXqGy! z#knaAQU#NrbE5903MGmD3Txb>Yq7EJ7GcNWyzp523|6BW`ryo~FpCP%1*0HoKptT^ zw|5eo;sq`oVS-vP2jVsw_&sAV0zSOkoXo9$#mTG{PVDq-K#tJldytF2D{ zZ><+!=btD#n=m-vY8CaZ#P2= zxzO6oRVP!tpjUU(R=cse&^hRopJ<LRXZHkPh`5C$jfFTkgb$e{6s z*i2|>m3Z2Y!RusK1@C%VZ|fMl8WnjXXY4j=gKOY`HYwB`4eNBWOY`GAn9>*mU!{9# z`8j*U<~8%U;%RMS$m=qOp9tAv<&po*5*WhdYZ-Ss&41S@(1@ntBcf+lQsdw=O_t_M5_5&2Yg1xE(j`K+&4AY?_)H zd_w1enK3?HuHx;PJ>(O%2&oR5>*>JslS0Q7tPqzW+~+Cd)Bq)%2QcswmV;>|{pwyCr+#qP0;$x-F!~O|oH}Pb(F}$a zd!4E~tU4{r!+M%Oaq!58KstfZe357bFC?v!CO8X?J=aY9s~6O7gOnT|qdJL>4(4YV zaQZo{`TNU5`Lp58FW7*wkAS|xTjYib0NVKf$K-)Vw}kV+)p^lcNSW7GMIio(XSOrs z*XbyOPkjIbnm?IxeyTAIcCkRp%O|Q^c2kyS-W7(@Ree&OO{;Q^8FLp+Y|-X`I&Vc$ zmu%zEsP7uR_lc_m>VOuB8(4jJJ)H8!#M_?UG^~0mtnJWuG84iG@;h%CmM@IMcCJUe zH@!^H7y8MiI$LQ$e1g+TVjx3uF=7 z(u;QNM3>!uqZ?znHJHqJ@CEC_^vq0H!)kDZP<}96C?BR$dm|lBzjj|M-FssSizLum ziX50v>Qr~%2t?`g|(^*t^a(*@8($5!*?>K!KE@n^kTDwjzZhem@#WMxIK$py{(Qhmm37lpnp@$k7mCh;(9aE)44zBs%#YKxOlr&#XRjkyQ2 zCd-c@&+O%;6UAFS3VEM5tQtS4fSV5t>(aFlw*s031?F{eLFyQS1cm8dlB9=0E3mns zt+BOXy88EA#TFgG4MuMZ-J0T0NOG_HxsnNL)yVG$s3%_@OD)h*;mwR)O&(W;-|Z9k zRgHyMsSz_d>^_oKw7L_eRIg$4>M#|lg{hGLtDR!}s)nPAR-G}x)S(zLX-p+Q!-AS$j%}djA$^UkM*Q)ZeP2k1V2bcopbK@)7@o|9TfH z+D#MVjVqptX>RN+)qgE)&y%IPv268Fut)F)wc_Q$@NY35usOi^F^0tF`H68;+rv&^ z3|=4LI0&^`3H@g) z+ptk!vi=e#^LD$!?Y6l$xVmM;}RJ2;Fy`v$5;=E{}d`M1`=aQh$rS&)?Oe@8>^hOahNWyvZ8W7k9n zLjF7`qQKbq&vTzW(NI26U{L`m4`oH4);hr47!fLRQg)g(cZXyROL>W09FHS@atU(| zi}=IC$-mRCoXq&>8ANw1w76Qdmp{~|6*30n;QDq|Ty~q51&jr8B11&#ZWT=x_FeeO zHf&pe%t|+@E{M%oCPj$`X<|vtOKw1VK##r}m+DrnBZoUee;eM~gQfmXkO#VxPK~mV z{Z`*$#;k@NVa<6FPsJ}n$Uom&Sg94&nF4(8QCiE@7$~&-JN1uY5#2JKj9mL!)#c3} zp;47#VdnU>zx4$S>~y`DY9`ZuX?zhSok&`Vj%7op8Uvj}1z`pp<~CG7 z6&6Ex7syVRcy59DWL>W_c!@oT=K(^-gu40Tqqh z(EG?cQo2X6CL1>rhUOl0Kjo@~T+GP$;YMG7xX}i>?HL zzuEC(alhnbN4nMW`-;?;>4+=(2hV9BNdGp%LG$EdNs{?-6?E+v8p92s^G4t(M|8(K3S zFHBU|!_e`b=WtWs{rrgz%rL!BRX?r8>?5@SRKn^Oa*ikVA1O}JVe)^#)NxhCHSKJk z^N8!f*?cjFnvU63y)^`6Qz7#1X_<@&0kUf)C`o?FQI_HN*|9E?!_ix1NEtJjqYCM_zsU+S?;RG56hOV>p55kXjEO zu>E!;#<sb%zd7M*kz$RNoYYyg%s5G@K0x-Tpni2}Jss21fIlz;I9K+KKp<+ejx4 zGvQ^;A2zYtWc*U7Ad3T=dyedzS&r=Md(NAuJqfD5$NN*hcFyd1KfGUb2JR?*zW>YP zAN(T9QwABH-zgb?(sio=z^1?FcP6?@2WP~BxjBJXRL%hewX3a=f%!Oa%EcwX#*Y7< zPN@G=31Yx@@VgUv{m9+62M8_yyN_5lZ*mCNtBBx%Q$dk49aO-3n{aQ+)=V%J4l*T7 z!&KJKT=hP2t%DNUaEBZCh57itfGG0wKgb(`YQ(@x{e2_|o~VrYgN#Mw_af_$ZVv~+bU>L_ zn2`1(GPCTdc3>z#&ou3+>wy6Me-ow+bc7Mc_WBsA=V^aPmha;lZpQ~VYH+|re|q}h{w$Sz38KqN zy^C*mWnyoIE>;VV90%MnCm|@!Ga1Jt+%GpG{#N^5&lN7zS@CN_ywCt`9{RWqFIwUh z(!pvk2AB#;sPpr|oX-)@bmr1{O0>V+1o(?i*9^)1X#!nu!w-QhV`CAu@uS_Cf@BJT zUQ-9G^^{dKbKP2$BV(_8x1vRqn0dHx*UvFYMV<@z*h_E!H`Gf)FmJhdVwn8N{>}gj zpe+w5-<;F8gkK&0cC2C1__k_0SH$znyYRn(*kK+5E>EfQvDlX{sBX~(|HN0F(NX2<6*>~r_n{y>_y{L!9xDi zw)mdvgZ`ea0SbKCR@0mTF{~-A4Q0tRyQDUAvoHK!S;%f#(ZE&6TwLKZ6J*k6W`1th zdMWMi5=x|;!Z?Nb!f2r3KJ&6iVhXTKAu4@~qp_!(DYWNP5bNOB8H?MQA-3rGPCz9I z-{%e667O#}g0Zl65!1;!V5v9Ei{6=FJfb*R!`)k=>himUnm(4il$0Dnib|FoJ&Mv9 z2iJKaKe&AOmOIeuVcBXw7oGJ`0?o;vmB$b*j*HW4SbX=Fj-7~3d7~glqX!3=Q5=Qt zkPfYLG#@R#sW%JD3DY zqURF_Pfd;0VNwPd?;?|PV49t14k>IC8Wdsp5d^g6Iz`;3YkX)09dK% zYuca#!8UKO`V|L)X^4qEPTt9jU2;?9Q|qS6=>J0A${SIV*C)fKE!qKKo2pmf9aTRG zaG{E$DmI95=8Jr0&ms2I(E5+yr<34QQ_7P}#5MkN7OnMb;Um*)zGtRkv#9qlt|OVX z9)7$mm?gAEpx&GE53YHpe0B*zul{?=b8FOs=v^GumIczJZeWgq-+0#g2k>Mrgn+%I zUh^O{yJMGyuTubsS~)w{=8$z+}u!S=h6^7($?|F*Z4?CvZvU3#Cqlpfxvs>)IBS=2Ea zm!k39g)-x#wn=6fpV%sV*(lutnPB8*x5H(Ai5v?6M?w6^8}Eb%p$nLP+@lcSX6E?v z5;->lAmXhaGR$vA)cr2HmibKaftubLP0zuHiJk!?o3&zR=UcZ$C@$58ylxmOS}}3* z@`miWo0xI2F%wV_`%sAQYj~(qkXrgli#iY;h=r23ovL0bTP}y{NCn&zb_5Q%IkkEU zH?PP=!j5*efI4ry8GR>a0nF23i9%en0ou(v`zyPSx;kV5KLYrv9Rwhqymxz?4jeTiM%+d1*Lz!X zpL_BWc9p2NB_yPy(3iC3j_G*6i=%$(ne7!lN1fB42}p%1N@as|-ia zHVyrTXuD#`sDs10>5Tp1d)9X}~!w=&^-#N%?s zVpHGcWX|gTDP5h=*$r(n{ES`4MVFqfm^tzTJgvWD5i*!X6fU5tTM8cb4wlRd0A`Vb z?Tm2>WX$$aF}iQa_9w11QWSk_5&fj4%5Pk)DmK$;kb`vih}^ImH;b;`#Jq zm~Zf`p5oU_>a+kvUkX4nv>;lcP#AlN;|Eno3HM4zd7y>vsz4NP9(N$J^PDJ1b!!Nc z1(W|{6EY(QnGi$?gP>6Mk;+m446=X#8iPC>^QWxhbO4Lk%SizeO=VMjBwree8>U$X zV+ftPH)rzS*OqS0w6WRK^$x!O9aEF^Z8}>oh*x6s8SBN$EC;;64|+)FSC?gn?(#o{ z`sM?rC*vCrH>+!9^qqgLQDlN|@H!o365g01$xOShP^4Eq2&98-1g@RhNo)xMhb^BD z{dN-Q5e9;Hwvx*C1hDuw7(O%peB*SI2-ke+(=TREH$JlP<;#WOK+k;+{Gd8i*Xpd$ zD0bbVYDDZDkEAjM3sZ?U(zP$Ew=IL4=SAq zXF19fp0LN{JMh;oLJlpmGY0LvwR(D@-s+H{Z_Qs0fA~>JDCLEbb>IHV_t1p&voFw{ zN>I3V*~?)EBSo{NQ%KsoEas5<$AF!%8rIS4nB=!cUP9kO#fg#5cvgva8Yql2cf?$1 zkcMafg(z8?lWD1hr8Nn~&Wx2%w{OnKj~Ffor=06c`T`7lMRQFuuw{&Ye}1`4QgTw{ zAmr5~YNwj*aEH$!CO0+>{H|h=jieL}gG*v3C#Wd?VG>Xw{}3{sylV1mIqh4(9y;(s zuK@?_z(ri_>MZwOiDmC1R5`yD-mXZby_gFB##<~2kv-cc;_!E;Jg2Wz+O{BnsjW2p zR)$#BzIgNX>mym!S5fH}FHBg9I|2>@1DpI9PsU+xwi#1Mv6G`Xu3_5 z*x)`CaFUQkb_DimkA&|K18c=NCInTyT5WZra_ebl#PHKh%OmNk$YnU2psUJ@NP6{#1S)aC6+iWyth=Q}}BVy{nu(SFWqh5yzNUf#71i zgW#ozUkRKb9u3QmX=a7;vJl+o_@*JzJd`P!`Fz5w+hl`6d3+>wa4U6cqR>+|fuyDY z!$q(&Z=ck6e|o)IHLQJiyb zXPJ>?SrjWlieKaZki*ZFL(er)Uc}xV^!?`iUz@4x+oW#Y9z^M^Wl>P(P)Rl|b!O&g z>ObEjPgV~tzBlze;>Vx*JLQC+=q9WQxp9~c)t%15izhMksO}dBx8`jT^Jx*c=6=!i zL~tK{fNn0X_IYdunK*{+#R}A=l(x#C1Zh}r#+g+@hlV&~v{@uGTm6R2@K6wBPwr5ZJoJGaOKa*iLPZ3!_5mWK)g#ip$!C?3= zK@-EbyIknOO2ohqs~a&n+4Vl?>X!m#$K9uswbiQw+HbZYBDgrtJ%g~Qf2L;m177ba zZ9W2P{(h9(!}3Fy1PBemr+GJk@Z;1JD&a5ot%3z7XPTqAOH1e?Q^2@M~%J z=bHqG+Lx*Vz?=3GfD)jrzzbtWjFr4mlCBL6|g(`mk?eCpqm^*7}`0|dHzEI7|{q{o@7iDW3}@plmWq5D0TN6 z2F0>vDE9xcdPq6oj(M;3cW1R&z6EX)I1!eq>SwcYYEokD)UM0kya`W7H@C;5?sPZE zkQ?Z35kBVWSXS(-wf2O!zyZ}MZQ_-X_-XHNlEAT?`&{Y%m*P3 zp@Ownaw;S<;w(CAM`6^7kBMD^NMtyYLl9|fNgJKFCV%L~7llH^DiOZJr3g0lz*a|h zo`(T>n!1o50q}d2g@eLMHo#H(vNG1JwJaqAxc#mzdv`FCe19AW^;r(xcszLZ;Slon zb0E~Zj82Iv>t06(tK#;OnPaOT=}!9jeInvF-XJ@geNG5m9vxk4DY2us()YRS-HNr! z?*>dPdQ*%EQyau}l>6kWDf(}HF{U8*=u;IxYFT+@8UJ!T0nKJDOu{#o@)}<-fsakm zSmi_+l_j2?=;;0lc^$FMEBKnZc-hq4+NkA&VS}FUl1fL2{>Bmk!26MxQ}qk%B}i?r zyudH_#dAL%N;4{Jk00428Nb^cxG5B)3OQB}y8UDda1b396D~dkDO?Z#c9GYwt)7g) zXm}itxlat1|7A_>4V`{xWi8fE`h^*p3u&_0A|$^s(&tiXAE(sW@FQdA87sx(YjK zVI5v`h*u@^AIJ;X+ewM8tc31}19m^v9hEIc+NPcXb=2UC_r0d*=o2kIJR>H3@^UqRESf``ulWr?7PC%d9GDakn+o+4B~hJ*^iXAIM4B zj9#Z%C}2^Yd*DNi%ULg06_tJ55V8J(S6`^KtjZRN^7kUc=o%>4dknHrd_K{;xLd9M zj1#DS@hRB%VCYiJ+T-Hn>uK+}#N~`M52w}LUQ^5ZO)BwdUCULSzDQm6TmIBmv6L(^ zhm8WgpR$#4k;+79)jTPEb5oPU_PmLa3C-TvZPjrh%32feCbOG=ebn!?xvBirSpD(u znSXqG3G<%yKQf6on zkbEemI|T)$XXtL}79|u35d|cM25C?PQ5pmRNoi)@`M+Q1n(KTzXYI9r>t6S*tF@DA z8bO5DPDZe0@1m(RJUT;amh)sNp!dH_n1Q!~0de5N_d2Zy4N{StdUA!*%N#}h-C#$4 z*`1rbd_gV${R(pq=~6XUJMYoCDUzTIV&!t(p#XseelTo$0y0xMr0J)wEO0N@)7v`x{J6lC0#ZemaXwvh9QIA0S7U_8_5{pqBT4@@e zF~@#+ey}r*3F|6wrRe2(DED2J8a&d~3@u>7cBS6A%!+fM*x5CxEQNr|fg#A&cfs{n zfs37(H(0BbfV9bydm^;Fgkei%9ADirzZ)=kCn5Tb5MV+GnBI}9m4|YfW_G6Qid6zJ zce1$*7}W|efT{o6Fu|ip=I@uh*}(~?@8M#E=+AFaEt`)(#qdDeEd-dQGMvZm;|>9f zTo@|4uK@C8l*aA0QRpQcTh9lXQy8mJZ_`Z(y=+e-Y4c@ecYU5hv0NglqNLQwWboiE zx~a+I@XyiRU8JjY=e>aQTyB&Fhi?g9#7v|`J?d!{&e%RHa=ZxrX>ah5ocZ+W;OQ}S zX!m*(3?0sK^BCSvxEH6*2HmC4glL_uj81i^O4(rmGjh$8y{4|8c@et5cr%_P4fPi{S75q&#Ez4PXPS||{2fFccH2FN&}iltE{QK0 z`BiQ@Q1G2~e97+WC;pA#=-;>GLHrOywi-cRUC4h)@5?&n36DIlLj}ObHJRJv@hE$1 z$x?i-V}tMITS@fQa!26JkM9+mKTWFTujo7`lw#VX4PI8>5Wn~YABO;0Y!#=f%2n^s zV`OwPHh4N~sH&8>D1@fFi4`V+m>@4{;cSgF=W$$0(O&pWhY{c8#q@eE2i23G!joe# z`N2c6pQ*N!Rie#FbYc??yqTm&Q}Z-$IWU20`Y*uY%SosedQO#m_2{eN=FD^34*FOZ zLjRO!ZmdkO1~qHPh_)V>b4IEfYR-vy51xpJ(yoBv^{653X3C}?{(5^ggRACdx$%n~ zYN`Kr7O+h|o-y7|*wcosIaf7huP>mn5t=oT)vGv0MkHcv86=84!K7 zBN=%9Cf~WBVEKpcm?H@k^}0~U31i!4l#CVMg93|+?hA(-Z1Y_I8dmyn>SN9M z?zg)?+iHR3Hvv;UU9G={jK%{v(IyM!Zzs+o$49=&zCG~U9K`(!7F$mCPc?g1%9Zj9n{_t6PlvqR{nx&PzK5wRPFkm|BEyoXT3(urk5{xvkXM0@Q`;bK|F zNOYX0<>|`0^z%B<-=onBtC{d-mEPeD}l!TYuV zZ>dkr_}iEq3`dFyX^O5W-ho@$lZ+ydEn{+AB{GR&th_J4N#^XcHMHwFtv~6+;_i(~ zymPKQrKay$e$|zug>AjS6)~~wNlLC6Tw`iSZFuV>fJ5p^hfnHe^jucJPm;>c=Rss0 z8X|w=DRFNQ6++d5-Y*51|!*bSXZ1#QI)J00a8cA3FIQ#kIG6+DJpjeG$F z-Awb8Bs#Y0@2Rn30D%IzP*kcrUTfbXz~fiVLO{skeYrGEcj-Yl91mItgXooGEn;#1 zd>-=z%#tqSU^`-#w2Ty_3#n1NCZi&=X?{3twd5YU;|zRp$BJp3F#v4PYQwy;-g8xP zvrn6=;~9{j_Y~p@1?lX=9?IVxuk9W$99(%@%z7|(7}n0VJop%61AjElcd&X&xm3hc zyl!$8_WY8Gvl;&Ux(whfBNMw)&*4#^M+loMr?xP9O-kbewFArRofGo7$d+CCS|obd zx@)j>_M?5kQwkRb!6Q199?h&IFQV+qbMK2T+;fgXCk2u*GrVrQrnye0lIbp{uJ=S$ zYARw#$46b?KYM8=v_!;fWHbo5`vo|0Gl*ru(XYF%uFADpNWr61*Ob+$_zaA8I9 zfB|=4&bAI+k)^>z7_58kjQea-#A&yKx+a8y+x>g_1`a zGX^*6+#1A--0}HYZS5_KTqoHn{t*k;ef#PJ}9Y=V+7fW|k896ntHhH14+( zgplpj&f*lf_akQ%Yw=>2Nq-Y5L}J4f`Sa>l`dwK(VQJ&QwXXA;aHlkVb&c2L&ht-3 zIWpp(m*z!I*c2uGddOgpz4d8%(({(zNlG&hXo*up(PH;)*h2n|>%PRs_0a)ZU9h|G zK{XlkJOTUkmv$`D()9*T2nrvgbFEpx(Iqa{9-KS<=F=@mVckJHIz;QM9^v)V?-0_eZP;sL-|Ep+p-w^V4ewTm;NPIjWSZ68H{?T$+f)nhH4 zhkzV^PL5wA$jLlyGn}o>-M3ED$2xcK9MO(BVaABkNsL8>`0*ZQZzJ?`*f(mNu7|4! zvx1&KS=;}e@!a6Q_jcFJK*%8SQ(`ha|Dp2gQXYi?Uj9NN-yD=fs?W^A;$D{!?cRjm zz*0|gmkrLT@y?X}D_^(QG*Vaoos<3Djz-+Wy>lV+5y~of4JnSwV#)9 z{YtQFBh|3

  • _vJsVb6OxMHsuUdGf3hwyfiuN-m|e=ZS`4 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�usd9=Zux2S}c$W`bMP+>qR zq!RZgd3Z?*eZ18HP(zqc$y^C#Nfj7X?MF}zl&|&5i&5|^$3ajv#7Y$kfz+prci+G; z!l1-j@>;6Q zxKK+XA^d6Mre>i2W-1Hx9*sBvwGGYE(%ObF$!aPTwi*t=eo_wWb{=BEsE3R-T|yHw zWYy-qa0uu`JwVc zMU582JE($$SPJQ{6h?Ld!cST$QUY`PD^Lt|0JMrhdkZKjay6*Ji3gv?Q4FFdy5qAB z&Thy4x&z>vsSbcf=L-EB8~{i6N@enEj$d>8wzf_Sl)R^gA9b=>|88_oxuF_-D?6tk zkk8wZQtX;z(*AA9pAaEwbQEwch>CAEBWNRg}Vt~TuCQJUj zxso?;j^t;dKadzLA*?mYAdoW@rHhH7tS?Dsf^yCvb(u^WZgz6A%wTOvh>bDMMZ}N- zO(Me2v6Lyk;WD1|ULD4LBdNYl_y{W<>|_-NzGAwUbb|1p+gckAK@5S93r<25>)>L3^Dj|h^#nw~BuI!ER4J(gFq`?&f50Fk6>!I$cOrF+ zQ$inrtIxeBJJH^+CYN4HOJQa7XOe55JuhEIj3EW--~`$_734J95KvOB1m$bY*Ai!{ z0DTV8te7xL;mA7QB1Ay|gCiBVy+ zmQ>>k3^*yqR@M~Kja`%^SmQmbA)ZvXd2?80W zc+BGsQjW6zHSerBe{~8}^-s%ZCQg`mtCVJ>Q5|5&0*@LYp@IIAo1GZ~lx>U&`uyr%Q;hmjwHIOLRz}LQK!hho{lMMny_EOe3n%oMOhp5{O165T#0~@uevdhQ0}crb63R_O1qD zQ;oYeMbVmht&J~3tVG30R7I~4DPWD>)%dA;VJS8Ab?Ak6V@#*|1b{TmHBg1^`;JnL zQHo6Q7Fn@+jr3AQux9gaS-*Y1tlhGQ(oE!rsbE-x?D4uCl;zRBdF|Fc(#vDLn|H|y z8a^%GK=lSjya#fgc6{tX^0;dyjYZnJ(0^DZo5|4^RV+dJcZXbi<|fel0izPbOPd?b zUSKfz8xihlrvsufCPQ zS7acVh*}*0tqkzMP)^05DYB`?KM(|P3e0+2NPx;w8lg@AL5T@sIiuJ&W1TaH7Z4Nd zEprniC2MA!WG2T+)~tA$5#}%69&QpH25D8(b)gUr32@?>?~%cQl=cQmOoW~fmT)}| zrt~i)LbAh%?la9~s&}B6aPNiI7Sd&5DqWUlQfFf!?KYOuVr4F+Zq8E4I@zknT+_yS z+01^swYjugnoB2R4af251X%L^1O2@v4_V-6;6Pkwjhhcrn1B+YB4EjLv!x#-V!mI4 zOdO5=|3cOfMF6%OzQlTf!>na{l>Zfwe@~rPz#2T=Xi@I%?Q4`wMiDe=>M@a&=Pb&o z7tt^+3ueAi4FsP+(+J1UKPn%5{3Rv7U&{L*!2|gCE4Tp2`O;&fk{bTZg{r$!NBK4? zo>T}G0_iVSkuDI0da407ld7DNGLL3Ms~{8N0Du7OLQdTu!eS~V+;bV)1gZk)zW`O& z3fh@3)h@1-FmHgs8x#`#F;nCO1i(XDj{A@G^ZuXxZtk+RvWl|60hkCpH+Bs9esX4J zAOae(_BjBih7N#M0O)x$90G$AfODWc0lh952Vl|sOqo8#UE;$6rLq!Xo-_ona0WCEzHG7-J>n z@x$d<)lk`)KUlWs4x+y|DS+%z;xvg$16aC&OgtqE1~cJ8$h-M^P372MLRfGD$m<1z zLWBgtwhaoD=x~HUfD8j56h(Qt%leI5;0NRxlAL9w#gZHyEY=f7857jP+!UcCB^dIf zr%Ts7qW%Sx5@u7{xPZu7C685sPz7;HF!0(Yc^UlzTqaEg@<$UK54(~kMHNKfRqX4~ zbU-n=yCS#(MMS`bMB3Wv}!Jsc6GnQb3n8OdUV8%v;GogXP^DO7At7nhU#FY_jJkm!XgMN|K=bl-pcZS; zB-kX|AoR7bSckAvK6(9WSzN=Sz-L^%1h|p1C{=h=S>`lQlN1)Mbck5m1SM@jiFAM> zeD=lHH~_ze4EU8%bQlfZ33G)2VQog;Nkfq~7NMxQep_JRZ_>nikYj!YTAHv9Yp(1UON~vQB9#U??cS za2$d0qesYu(I((WjRqo9aW>+->|{;CNHhyPWW?A}5;}3L)Jzy7)oiQSmQEZe#W)0u*+`ykqW5?Kt-=Xf~>~*NiAS~ zg%gx8bFSP42~ZsXN-rf0w6Bo#;o~>ogfM%NdD0--EwvE_zBV>fiS!c0y2@!JrjB$8 ze1aKhs-$MXu}}?_tOCQ3r=z1XcR{hl&B`)*A{0k%CCe zEtMi108Jef(7~|;5~2z*H4z-B1K=MR{<@RXr2VAJcG%myoB#O-_2bU}`8Pmh9;8Nn zBDpa%f{dL0IE?!UlMx2|uPFdE{#rY$2!W;n)bOikt%5)bv3Yv9Q&KZWygesNm`47y zfXIN)BGpSKDmS8eN(FPXko$xH=K(W*>5?h~1;{6Lpiy*M$}G?WYq7=yo(z}3d#VS9 z-^cK>!vp;!iu;5GY8rt2zdwf9XR0y6Q1l7~F^CSuW5;2L3lBn@J4_N|A|yGEG(vO) z_5ZPwnKDz{+&m>Gc)0Aq_-~v)NY-E9#do$st z(7tslQHD2*i=OxQo^GTh0&pmT{k$b9nr?s7r${&s!1Cp*=<=5%6_r&|g#!@4cQJDK zAcF&-+=mn#fE0v&G}@VmC!Y&3Q8f=#)_5UXZP=rYdn$bN&^BL(7pj3=S_0&TmFuIy-C z?CeInV|WgZc2b06(L$82hP#R8PU}vsg>0ZVggOtKcLUqwXjD@rqCFJSAw$hWMp{LZX7L>=GdvMzDiPx_o8xqd zo+=`>j0P&7e2SXkcfXZieDt}Yi_i(TKr0WLa5{L;H~_Af|2+pl%k&fh(0sikP`$GF zwUn>VF>p$?v4PMBYv0=1DV)eZ*oHL0zZc!Bv1gvSVEmm-3IF?qhg|Fw&YXbQkoF|t z8Vg8(|J3Sc{sDm>DQQoQzrhP|az^W7AipI?oMNhO$n|RqKplW2P%C<$0=9w zEEV=q4FGi(G<~MOg8-oMNv@FZfZCnOpHGHhr?vlXuC9>&OvQrwe>2ccMc{@H87#w< z6EH;60Yk;we4+$Rb(OHGP7>_t1ZT%d{M>BC&Bjb7J6ao#fTy#a^bK3%*o)Mr9_!;C zI0~N5ROC3>$uxUYX$TrFAye$cWF)-?#*C2pY;zd7j76hNB#V(ccBG^;(r`c`Ehb8= z`FP3T+H4-n)aNjA*q_bXGj`l)akVj(>GT2EOEtwKZcehC^(TjlChZieM9RA<1H=lj zZjY9*fKVwbt(M20c@^gVSt9caO6Ztxt*bGxv{D9HtW=p}2zssPGAw|BpG3+a9feM< z>d7WekcArR9FAva=2JaTOu*5Fw#s~oN}NlnH3L*24xT|Iyqn+Yj7}@LU!IjGczCm;Gf~FZ(}ZQ80+ZxPd!Ke&n^0Y@(wIKo~9Eg{K2U6H`M<6 z;QdiF{87h1Ni#;y9|DaM0@XPfMbxj5ngOlh05}3;&5nGf}P<#;E$=2g#anT}KMy@X|B%Q z!CKrLY>YA4#epr8)ZR**Z7q1rMqJ3LxpKXettI=E*a5rQSy>pzj=*n@z-xX}+zd6a zNLLf-o;z5&W)GCMg#OZ%)L)j(7$oixa3)iB=m|tO+1UXn#6djR>T69RUpIyG9ylh` za0oON;mKt5!SM<8ohkuSAve+iuCAtr&yyqGQ983+#&;^e7D zsz95T6ao3GUb#laIT&yy^eBfw^W-WwtSOf)8WE+Yq=I75U}gGL2@iq=jB}K?XrYvr z6hp!+mnBPT4Kbs7a`|=jjZ(j~Ng5hKBFMY9chX3xXSJ;8-5{$sY?IYAI_g=y&M@}f zt2as&k$D1(lsZpgnnHmyp{bMtN+Wk2I*GVaF0kWNa{9;+D|r#auL4D??5IOE3F_#O z*g&4Y);QlKtt-|WDTi%)kIJ5-XJqfOv$FH>S*i+-Q}TB|O_6A30>N)RoflR6d^=Lf zwJdh4QJ4Jqi;!`kV?gjq5-PKp#z7QJmoN=&`G<8AjRMIOlB5HTsyfnb??)mn^rz5;4gXZq#rw!^ltKKCXHX zo@>icK9IXr-@V*S$BHM$U!NN^VYJLO86tBSsU|}u*<`RJvi6MwNw7D?34mkN0s-;_ z>rgi-#5}5jil~6`4h%Ke|NL4E0(The$4b(17q7lxaBR|YN{t%&3XFdCA|%r>@MWY8 zmk^0BTfWIqK24spfJSSjAZ@i&8o@7s`9C+iM3NxiW*07DpK2r^d2JfB6gXdHe-%|& z3QNDCYqRuhQCV*!(6^sJ2~@z`Ip}t z=s^So-lTLmP{_C&y;tBDEi48Fg|kqls-p0o)>6IW;}?8^dAddgyZ)kq*FWbZ`M>?C z+}!MZVEBKd6GWqXt@BseUxNgQ@z?Xp^dFC5#!)aF09C9Tj0)i3K?4kOjU_NvxWAWZ zq#i_6tgyKXcJxVjx-lUgj9h+PWVpc>umcv)&73PsYteY8{y!}hXgo2ViS8(4m;`40 z@U59pmOx>aOb$CHiY>zic+7zbr~CFyOlyvgbOQqv-V z-tZ_GLF5+$`QL?;^Nav(2?k{e@bLm|@g}n9LtR4rAaVkU2JpE;c&snBapBLs@FPxjqJ7LHa0%d&<|0x#}6o6bN#CBH<_|Je?NbN^{+et zMG3SFFA6OX4@!Jh_{WI&S-0#E|FN^SLQT}hkSkYB04qZbXpB)6puvl(nT{dl>0&un z+^oimi^UjmXWs?&PAk?Bi}9nxlJ&!!t?rwT8)*#PHy&ec(#LfTGGncZuo^6}4s=Kz zNo!~#d|kIJSwC!9v+P(?thmnR*7{=2I;H2V&BuxRxKR=}e6Y*_Elg(28ahB`jxiA{ z2#fZnV^A`*mRYfJ(njjBjxMPkeD+4*f7Nce=iYk_1i*$gN+=Z+%OUfgx_li&ywA`F zQS@*gf<8&9${Rq71&F-{(Vte@9jlc3%sDv_kjqdwR6UU@qWD5c#|4NTr4z+N1VrOt zDV&`SO8VMXX_+nxoU3<`s?!o)v^%H_=p@2dM4_o04$o@JdpU0F-9fd_E>Osg>G$G-?i zr&D=4%AxrS8>xzb|FrYvFFxmg->$2xt1kxsS1ReN243_2N&-}vU-!+ZrB%3p91eh9 zGXdp4bpUko3`Px56#>TpaRp98{&y;*9HL`4ATcEbx-%vbHS4h_x%dF0Pc=4n6Gur( zY?#zmBegjn<-M7xdZ7-eUjB%o17#GGVInY?8E{zN)SW|`Qzn`| zHi7FWvTrOEZWzMZVh#KClg2-}^o(^tn$;{qB|NcB8}w zp&oTA)VXlAgO7lrw`cM?@;o*8HaHlz6Gw{!lh$V97`9`@9i_i%&emc+YN!-tXBmh_ zGM~kl&#HMjtVhy-1*7S5NITS9BLR4ne(1nu=}d}n zWJW`y6DjwJGfI8}!r~-2GC=|;;c+6J5tW$IR|=P$M(I-`B%eHtY(A5j6a*a#>tOUN zIm%k!JE)2+q$7JildB`>3TTNVXo-V5GkiWxy=cVb0ODdqPLyC;@qJ9d8Pi&7ZKFDT zC{o10r&?B}5b79UReekmAuSzsfW$e8QYWp|R%cFSj053MXvF6^&Bu^tu3oCO`%4WY zuLfU@e?8H^b}OtW9ngTmuR&E%TR7Khb%F6Xa3BsstvU@nR*3_lErZMJT8xxJ1?qm< zgF*X3D6#PuAN*3j`}TWz@s&4m01i_cx!$NQ&78hktexU?3d)!?hKrQ-T=_f(S(fEV;ir z0M?9&Mv$Xx7)SuWW36OT18>WkWHWw*SmVg+cI=4ZGJ*cE;h>#V5}2?ynG7L? zFn9oK-+hLh_kjD5^zPqJ`u9i5yZ>EcG4w7Oc<u0#l0k8w*2*uf7PHFGMwCi3=UyV%i__=g94U0xgB|6D4>bV36RpjtnR&0S|bISn$ z{x_PRA^odPK`KaHMBHq{FvrZ8Luqme1{!iQ<%ebPlS(!1NIIbyLh@owDFD~kAPKI` zlj>+jrrRY3M?lpwj^LnMc^2P`9=@;LUb||F7D`k}FIq;y6TZS*7{Z{fx z0Te?7EFoo43TL4Q?v8(OeRF3TQY08ub&wDk7i=ff?TQ7?}S`7Stc0ssUPpJN!9~WJ^7-ATND?x=C6q5MrQt^H4S zo$=Nhe1f?MDXAiw_F#xMN+KhH=wl&DGU8(4WW+$83@5)D0bCzuF747b4*tstJ^Ql??2v+f+0R6w*~)c0-#T!d5&BxlxZz6c>r&q)Ii< zLd0h(S_ImqZ7C4H3J_^opYjCSdNk+1f%e85s51sqT)$mbFjg{p;Q*}LvI|%rMKF## z5f4%#pYjFN38+}w29&u@78R9AE2WIejNZC^kAVPu`^~p<$^_-P6Ns9%l0iuQm2%!$GNw!?~3@Onct|mkCwuE zqKc=LMAp_e2H8)=umXcaafaiJ6o5){tMHc+X9FSMPDN7J5CS64?*}hHy9TOYm;P2m z(G}1N0w>6Tx<-v-{nEh18iJh#<;f}vWT{G=pnMw0=o&Ygb!-ACp_T?JF>nlPhY5yv z4C}>6jPD=}@(_&nK(+(!yXViN-#vHH*W(VxorWB*YVxZb?;ULK`Y96LK=S-A|J5+A zx#JGGn``c6+{6BzJYTo>aoiud?}6NN0QVl!?;aU}LogUeLY)+EUw?@v&t8ns+4_;A zWG%$MP-MgV<7C`}thnCWj&yARe4I|C)gM5{dn2vGGijSXpZfmkz9G!PTu^}d5Rc1f z&%TV#tZS&RN6Bywf=A@w3o!7-5NwMoml}?ABqfDeK=YY2Lz=~F&t$DifxMhS$5m~; z97Avt5*`aG8G~~{>7}-7=bWZARftW~nkvqw2u%qbrEmh7GD?(Rc;#(FsZ$%Tg@9&i z6So|+0181Zb?ECCuq~k9K`G>4tvK=v41dvZ&b5ISx*2@8xBq_Z32^(H_^)nNe1z!! z3X;FSR|7v0vY(~_`hn~P;Qn$C-LtGm4v@*C z@07`-?hudBcZl~mwqx#*3FO{xI}YX`2v+3rG+ki}+F&ylxn%aovp7s(n1L!-aE%S; z+z|V*0I~~*^p`%H$Oa^1Hio^tzSCgeYR~#*z;2i5@bxw<<@YHqd>)z4^}udLs9%*d zuQIx&l{c;s9XZtEmeaT+G zjC}5X1Un8J;zy=9S&l4*0XQ2evk@~%pKEkt%z!MHNhL-Gx(h0|oQ57jCW~wqIti-W zn1<}BN++ub&pfsnG(}2B{VbiH4s#*l&E@%;t5t_<>kcuffU{ouETOFwBEPPXtMRr3f zb~@aNU`jJXdER_j(N)|><&En=5wz3cN(79wOXQk$o8 z_&;kEk+$hor&0TF=6A-Sd zc_0U&)V2H27emR!nzB@6N|6AC{%uGH=+O1d3Uo^=jx5y~0J^tUvLI>9iOly=NnHR&g;2yFE7?nM}jFu6Z)~1sq>+)t2~KRouB1Pq#8tIw}q8# z0QUF5aZvcbA1K2e?Auz9-o&BmSk@-zA9z%@!;#TWrW*093g;w2yt11HBmXv9kO%lGjvPT2?;%iZuQ&vyFD*K}Zj)e6v49L+#1p2j9S-ssk0) zQbk$Scc5OMazY(x@H1E+DB0A~PIUsb+CT}wFTVD!QJqsn#ZuzzOq};BDv#=D*w%pZ zDeE52NeP7JiX~M2)VCOYMf?Ioe`X+aaB);SgL(3oe?O)G{_@-SFYXUuF*`VBl*z|L z{(sU29V+mnD1aF?tqS{V)PMU&u0LumtgjWjUT^LJ(wZG42{6YktcO2J2*d zGl(za#M6GFOtG5)%htxY#>dG_=FgoaDalC^g_Ld}xnxV6hI{aARo`0Kt@qyB4==gz zSesrb+@;5N;cXj@bvV9#%>caMQFze9*n*=9;gqnlik=_H1R1F3b<5DLjsd!*v5v_- zjC=2tes|p={h8qEg%7$lhTw${Wen?gw*lh~VLSLf9k(3~buRjg39#KTq6IZxi5R*? z5c5=&N4w=|2~GhDS}WOJBMN?>6u<{WIyWe3T2V)7AB373+HKZAu31bJpI6l`S>)dW ziSqrz;xX(6$LQ1YWQ&syn{(6;1slyn^WEG1w}Qm?x!GT6iL}7UO&AR za%n4ER8mH{UnTOzl~PJ$rqXg6agg03%tskuDf<=FA6HNsSW2m2 zaRn2V=M_*cxDdgRMa7jsf*hAsL*Rk!%P68lnznr|((7-HGM=xhhRL*V)-H~kuhlZJ zXcP)(q`>G09Y|%d&;~{+=pxLa#A^=Dg*IZDOFBb`rZwi!rBVAjMB_O55b5=i#pr9n zaV&_%Ob`!Ok7^;`#6jKHG^jcd+QQqA5mpf)jCFtJ`v8os z_Vmz*TOZSEB{$%C9j*|Vm5A)_Xlsl~kcgeRpBIXSQ*l_Pf^KTHRJ4}=vCfsiG03C} zA%NG4fv}v512PAvWgM?H1Qb-!3+?%#{YDnoQ6s+$>26AS_t_&bG-!}aVhz;wP}fOy z0LI`<*io^ym^pg->}A6VD5IoT9j!R3E^xYxs6849Vbx(s!XQVZoSB?T002^;Vr1Gq zHH~sTJ=Qs?20cCr#E*`vYSd@2u4&mV%6tR^7c z%~7oa8nUTOvtF+$ybG5ek&~y-GhZ`l>=wnEp!}u;38Ts=l&v;{OW-|giDO(+D$?B< zlrm2~rscPqic`)FbLGds|Bi2fs3m{Ys8Q#E_8$bEJWGWCJjVZb=KMIv!2{4PTH~n( zPzOMXf#Z}c2nwK`=|&P2+nFgWPJSMkT(_DZcZT&kj>$3t-hdiNCkQs`EI4v)QdB5n zKfreo#wHQ{>qJu+ZPXa@cUE-qvUfK2P0g*u!rE5M=_F>xFtxB2Glr>|rLjMH9Hl-? z0MD_Ie})bdH*#cd9Q(5GN19^#t>Mo(FCa8uN@jxC4<2q}Y{R)efaBr)`WX=2JwS5< z8H3b8z^TwNjN{=r3&U{|hO)g6N8xU^I`lpB|Bx}`CsOj3-KWThT3uCXRrj0xeC{*21W*#Q`X5AkU4?b}sp_KuCW+K~dtvMDfMQ z`@;nYK>pJor$9#lPJteKLI{ik4QRmu*tB2Ee@dybwg)ElrtC1)P+8M{2=gdW)aZWx z0*E(^d0HNbHiNcV)>6AdoP)}mr7Sp2Y#WU3jU~u5SJADpo+e1D_pj}njYC%`X}iA9C|_|66J*>&8*U`xwLmKK`==BMyR8) zgos|zfhBMkYLOUjB1O;!tl!#A^u7XFQN)6pI#DNtG? z<5cJI2cB;`aPG;e{~dGqf5<%*?N9_nbGZGT5lG^Dy{1Ax+JsB%_(O>*jj}%@#RN$h z!k?m3+7BX@e0Ug0n(_z~{#V)VNF=;|&xQ^dAa`+m z53R?w{kS>@citMhPTd~bZFJ~h(yF9Y|B&DK|G2lQk%{IZbr@|)!8_Aw_xqNS2GE=uKTe$xDiJ&$ zNK1zj1T{UN9;>~Xl4q_Sr25D)>9ibG309`8`MGgvf2$w7Gm zb7?DJUrJ-b@pdEeR?9IC8$CQ^Clh-+GQ;a&3TH;fN*a3M?Lf<$Aq{PEa+0n3m_`UV zHG_~Q9l`_~$#w#122;jFh8dIIoO5G&k2;2NP8Whfz<1gkLCg0tateulF`Tz*ZngHd zl(L&X0Uva>>$~W-)hYXlbe|Fq(-z zo(RE=eh(JFh18%i=}pCwmaG;GQ%FS4F75`r7XhRii4?NJsTv(AB&u8w{k%g)P;oIS zP%I|-i^+H^895fA6&#<@<5@VY?8VO2Lp*##Y4i~-(?Szyvph$9V&;lZY?=fnWlKQP z0`W{e-j-K$ble^dVp|P{R&&sR$ZSj)MKa|vV|FNQ>_lNop9J2NevZQsr z{QuZ{3-G$GYiqj=nOT;_%*@QpWLuUcS(e4JWLajAnVFr~aU6&3FsGp=#gx)CZPTP_ z%G{>RnEAhB%g*21+uWvj)B9P^v$XcveD>LE%`s`rRojVV-g3g0j2yDX>!_!`YOi&z z++|&>_E_i2z1FdO7d^b_D|XwWWjn2HaMK%$mTdXMvQ0;SKeG46U+%m9zF*vQ{|A5m z*oR;J$$LNa(vP2h>U}>xcHqEmC7GGA|8cX#KjDUDJ>fLOJ~-AB1wKx}HLw>ZzaPl# zuWEa_nDk{@uBmHqsDTwoDoa2U@dN55`~?ui8dynF!J!(O0D)RHF(?WqEW*u{iy)Q7 zNWehALF)>b8}b1OVhvQi5!DVLAllNY@sVFZEfGLL6jlLM?o>?_)hrl~1prr$QwWWq zPKP~JDU1q!B@V=iEl_am3@nD82wivH+i55UARWU@WV2}ASG0Bwm@}~&y5pAg zCD>3w%mKtH$oh}~?}z|M7Muvu%4G^4CKz_h(p7ddE`d!5+;9nb0RUMfSe`L)5{ehc zGnSPBA@_t*xaHOzt?A4YqYtT3qpM+ijkTN>EG(H2%8({m?d}c#o8~k zkO3}I=4c8Omz#JB;}VPPF9QREe-IWP^>wmkUWI7u6_#HP4vl&#I4t7RnC)K(3XS}D zP)PW5K_L+z2nq^&mi}qzv>#{t!$BdD_p^Kt>n=dBbt~Ssn>h9iTK{#>79Ur=4Y6%1 zCg)-;fPcbUc=;4EKT6Qc2RW5N8SCom-ZFFM%(ih8C)Q!5terf5{0J}nm!$Q3d#V&L zJ~DoMcYpxy0^9^M96+F603gJhpg1oVqG$=ep@k7~9~%e~o`qk{Wh#MsOyVHj7=i=+ zNPSVHeMw#>+J6}2920FE17{qjca_9dnvaNRG*HDIu7NMEaM6P*h{z!W!DOfuGi?(E zsI&+9h-LO_#Q)U6{znk9wzd`Q17Z-it7WiQ2b= zb*fU=OOTD+0K0GQOz|=^Z%}G0W`gVss&l}{<@A@}2O#~_jt>7#L zT@}EDSXG#7HHBGLou6Tasj<)_7g~MqdTUs9%qmx&w9=K=SsAT(_=x58@3!3T?N-pc z({egDTUyH++A2$@rOaPpiF21&YSS`HZ(VK4^Ojjs(+W#pwAnH{wpe!0PRm=o-|`0z zTFJ7LR<`CwD_wooDmIQqg0+`7P#O*k+Mc-Ig?az;fG1tYXPto4fX;m2i*gt?Mmo(H1M{KVVg>uD98n z@36)l_t5UQdAlEW+Wb8a+k(9hSm(a`Y~haEZQjPSHh<$eYg&K3%~^fI=B_?&b9n}{ zmmji*;r%ve1wn|cZ(M!S>Xsk1p?!DQy-$DE-uL{MFvot-P9220xT)F}=EPZhR>&K3 z)BQe}7wuEXZ}flp?`i}kE_nYCVjUnr42hXOeabQySN9iP-MoG^cKn1l#9=QjRW82h zn0Tj{&s44RA=xxO$C~HtWrFNBZ zBcPyGsi0J-f-6N*Is>%h4IWTxk}{{ zoq=1xA7PzBN%1*YOGK2Ua>_N1`5)6dN{{o*3iQkba7MXEvT_QrkmS)Qq{h0`bTTe@ zexuJc+lj-;#m_I_e~#n#FXH!r=Y{jg{T2f^$<(PXKgFWeTy zrm}C80dScI;GZyETx2CnRX_#4(58T(kSz%MS6yaN;cup!O+&ybTkURohZC%6TzS#<-Pv@oJ*m3HSLZJ+3SrSoZdCXuz%LAna6nJ&~zguWvC zU0ENFi@=v$TCsCY!I!Qezj(CqD)L?%;m*$`jZB4i8X9JkQkIJ!4SHV&hSGwP5bPPL zsg?yhRvLsM4HW$;0?n6|Qq2pNuream`&d58eyY563+*iazd;bb$^@@qpq->**R2%j zcnp%BJ|>MS%x`U2HWuRMSV+Hsz8wvq8zkM$_wS=$$v*2q+4Ise@n2Ot%w~#yuftp^ zKlL2^YMQ{B7lYq4HH0K{S-U(R>yWP(0iLiQ*4PN<$M)Gf=dZVfENVwEI3P?e#$j#BcgH34dNI z!|h`MOm0v!sQ_PQ>Azo!E~6L7-88l0hSqzd&hl(Mb5g$LOsXAoiL45LI7W= z8$Nc@4CC>M#)o6cK~pE|BMv&}SbnD%fJHQB*XX2Fi%Li&l`-C!C~);eGXaJXG>SC> zD@A}WIoMc|JZBIn%|@$%Um@ z9m*|{;H3C$8XzelE1$mDB2)4$ERH(yu_+e8q(wR)77zTiQDm(|_;U|%K!ico5<~V% zOrXKnV}V#dBC$ZlF)>C#6P>^{5~-*bk7XmdVxA?HH(CPO83|-*Box-Oz24&UYArmi z%o6i!sW(60R<<-)UsblX=Z9HqMu4?u2HAq_pf{ScLqA%X5?cCC7|!q5Q#7>p^vvs6 z{DFBLOFrAwIq>S-w!W|V_y_(hDLwa%X8g>v$$H5rl01ymHqANXF)0Uykn)D$SMc8) z#!@LUBeDh*5p6C;N(G{cM5qD)Ezn{)AQ4Mq5_3xmb6OU2n}A3)L_Z3M z6v#;f(9A)p8G;78kG86pG*>JD18DvJ0sw%ftFg*mc@-8(O#gnwZlzOhSp~-0pwVtb zSrWg30{O)CuV<3aypmTS3ka4Fo@p*)CKq8|P)v1LTAn^%Tn7W6Soqjp<}?KY<^#Mk z0RpPRTFaa#z<_(;w;`dC-yv1+V-o(D?w|ed!aw#_0Kkm^fYXf9wAeVrw0kQzd z5};xmt_Xio;7*@JZtP?l#1_-(r}25RBJ=58E`b928RVBc`L&9;CHgf)ta-4?l@}K} z^ulQb(3Iq(?Lr8W8Xp4%Fns^e0+;4zQx`z>0rH{jh0>FKR0|*zKJK!De9MQ=KPNZa zS_!@xA-{bqx$rv(ywP$UfkeeQS+$MayhjV;)5XoVn8M_=oFYHWSqxf%E#1LgcjjUOcy7q3J|!0aTK*&400|- zD_Me8b3FjyK0wIbfS%*T1xb zKGage@oOUd1H2~U>zqJ#2f~^b%5tdp1S~+~u>_4Xzgc6+k{E}EGTyvh#*(Tz4*%!` z3-FlaG_P3`;B1(LRcJCKP?N9{O`%N%a6%H}M{G#|pAr6k00BRb@w9Q~<31LmC(a81 z@g;-9cjnb(X3)Ei;W}K?mHk|G&CzAg8RG$?T$gL9`2k>pyag_F&y(PP;9j_IeUA|D z@mR6O!X?2(OO{BW+ZEhD6FSX%29x?U^=emh4P6^I(G0b*PV?eA?p!Y=07}yc8Fpv@>O%2uv%YT;M>} z0c&v!I00i9U4n8MR^mF;7;^##Nh=gUNM?M-#sQ`oH&F@*1n8?eX$EdX#RNFQpI}1; z9G2qx%0lVL1ymMb5y$}yNZXgPGai4p2lGJ`06-ZGscDd&A-HwC#=6RervUIZ^H9NkOZZnZKNMfIc1WSg=Lvw1!a5PZw@`p0&%`Vm z3-Oq$j3#1Tj3aP1CO+9wB(zQng%pc8vIg+oJ1q`6^0@d^G6_X|9nVTkxty;lB$%abT}p#KiItj(d2^w z8u-{S6$Y|Qa3q8L(mHLIk4`2#rOs@GRHuV8V}a06ZZ9OBQi|8&wqiDvfW_XH@Y z5AX#r&EeaZC`$2Kr9r9Md@O=)NIbCz$5PdOx3OY{Tln=Rl4L z0yvAv7hg!udMi2PBC%;DN8Q=Zz6)@xwX?0dejaf` za~*e}07N4oKyE{k42gwMQS|~5jY>15sWPYIS_EV$o1~~j!n_=dT8#r9q>0C4R@ZnJ z08l(l5SA*%p(J3%lDi?FF)W8ZGg{%oO3=kHdG^_l6$Y@K9p7`w};}K+K4UcT@F<@L4bQ;58c2yi6FHxSKvOu zsvtMYxG@0h>9`Zzu%HD+SXfLF%3M5(Kn!z1q|L?UVo+XBlCHun8c# zTAHX2L1tdCRH=S|P_uXf6e)itelO+HO2{jP#urV~j~rZ)ZzzLcCYA#yfJTg4G+7bE z#wCk_Shz$2Bvvk0;t1Sm?%Mulo9eK3X}($hIdAbjDe`2MoUU{Fhgwln}s$f)4I6hx!@=Nbx% z!DSHOH|oz*8j>oMDTpo>*FypfdC6$hVlz`qz_%DHGdpQQvk|nz2;B8V125nn^8o=d zSOnZD&ZH8|0$pC1#?`~yKyecQ7!!zklja9`N+|xxXjmNux^iLzaRUTedSrmbhKR~^ zx&s0nVT_QJpqCJp01rd(N?7_i0u^>gFPb-+Ji^n%9cu#?03R>3dY>tdQ1?M7`?8M& zbPzy6&6i{SB#hZd=MF+32Xk%#hhRTlPw&zc=bHYGK!&4%Yv@`IAh;-?1sVdluJ)I3 z_x9wv^tv})PXas`p)J7R=f%F9E6}wmG-K#)^mm1gd(RXti=M+fb zJY^{X)>DyaZN&+;peVr_^Wvx)8U03PeB`h56T@x|2=G*G^Z!$S{$XJu`0DTK?jInp zdxKNvb%+X=%b8f-NwUT+G2$Y&PQmLUAq`eB&UXMutN7~uxVNq4{jp9K(f zF7>00;xWY3wD$`fP)rLFnI;NCHR672K-i0vMk#0xZw0yZiXBpuz!wOZClCNYP`pu9 z9Vxa5`$AlX71XtmCN7Iz8F2!M$*Basxs0;?G1fH}0|~a1DPbZdpwb-A2}}C4g@MzIXwE3i<8jv&R)u z1psJ=yr-KqyCpDuZpQq+V#Z9%rp-X$Uy0yXkgPlD*p3Bel4c_N~4 zr$quZ!m%Dl#3LJ`aY@QTnP3soiMZPmks(+N5@cPF+cKRPCgKdRMr34@sgXkfCN73- zvYql_IxU5OsG5M@IW0W|RSy$8MV*m33w{$C6}w1rIn(^0q{(1%cB;Us5*&?a zPYcCmAd|Dx020by^}&QL5a7*V5qh49!12VCu66RM#h~?ye%8sgg>_5x!cJ2ZEuR$> zD9gZPQU~Q0n2Os#ZTgh)4i%^31(cU7%1vbth>}zLin(hlO(a6%6j0N4F=kzb5APa| zQA*E5`thurL>tfg383 zVgfDz8Cfqx-{}dc5H+zkmIhH0`xED&0LUOxDnpbKgeyY5XnG@IPRzn;QGtb`5^z#M zMnnq1M4EK;>@LMy2xy3(L9Q0@FbHrcKvTd;MNeAcQeQl{)Cqo?#^fNOA4jfoQUZC% zPHhI!sm8L53G`x1#a*Jh4e9i1s=}B}R)&f;72rO}r6OY{Zj}rQuB3BJ99EVL{N}ak zQ3yDQouWLULiWHlfE9w49!YRym@DhtEtkS5&N`N}V%f%iX^|cP2yds)iuSPFI4|4@ zK9-l@YXu2D@I-i8R*a{mM7UXMB*ZDt!iyONyMux#4~f!CxDM#RKg=7=bUVg{%~^ z7+?u_!)?}tH$2=XzTxXJ@sG~7iy$Br01_JldnEUxdx|CgAvTO+F=5b1!+8-C;b)l% zp;nm@`$kbp^e=LfqhCr*h<=#d@f%_yLpojG^)7$IvuQQ>luPL3N4>37zw$Kerj1<>~)M|B10bflQsM*3YnYG1XcB@FUg{$dc4Ylf ziy(n)k^}^NDptBY0*;Ge!z?Ghpt=D7K%7u{RV_6-GSGD0m`9i^5aP-N(74n(W!4bi zNH$F%b77!Nh}Q2XzG{fJmh|Zjv`v73%>?l+ zBXg$_pL=0t1L?h0SQCn@9E-*xo! zrNg!5cHz`fd-}nOaZJ-Z=uC|5N)d86h$qEfil{V2j#VZf>y!%}_2w2-eDS z>wFrY7x1~Ql?ttVZif9+>sl#r)!AdCS68nsTGVOn@Q$>> zM5?}vZSAm;F5p~RH`=$`Le}Y6wGL8qm6F^FFq;byn-3`Kp-g%|L}E*quCNVTcEcgi z3!sSIh}52w(L(rIEyt&3I_FU(|$ zELQ;>KnP$VoCw_nCyhh`SHf8qf=hyW9O*Giw^6{&c$USCB}S}EE`sS7*|}7UU?Rf! zl665TG27R+6U%CarRdeI4LS$ znJM-C6j@wRig}XaJ~>(VUTa|Ms;#v-v#GZ}w-I6$Or;Fy`Oy3}GoYKv)o)a=R3ljw z415JlHITEf6f9Ap#n)eBgp0&@Y@SiqXC^ozKY>WQk{6VgSOK?2+_fPl`AB zS_$Vbj|;HbX<;@mGm`j?P^(S~wz33(NDBT|T18Tjl_dsRNkV|l%Z{*~(gefIZlwwS zRv71J1+ln+Vtg&1`^>_E5rJke3ws$=t-S=dxo%-=7&9 z@^nUQ&{N4#!A~Yd20fJ+75tv0=+OHz<05ZNjt)N_6BV;{npih~A;eH3 zgn}GO`?tWEA%d9&uv99@P0W*Osx~>F)Y^Hii=4Sl^ILvNCG@ln&bfU_dsU`^G-aOs zn@uh+5s8h(H191gea!e0{xZea5D+MrfIch5Snjx)q^Hh+GemJw68>s(2a-93dlZW% z+$3tUawtP5MU_2S&Yd>hit*Fe007!ZYwbb!571U3$k$Jq>a^tmgJHHUA`d@5yU^0` z*=G>Us^VWNv)hXQzn|xFoY<@jfC<$Dr~q(G;M%hE%|sC?BAZ}wX@On0cZc0|(+zfX z&ra)JMA~E>RO^&xuPVr~+M+ybU{0tl;d5cWRbjcPD=)R$QYyI;b5&bXXw?w2X}N}Z zql}_pMZ{bcp%j#5r&|RD!78#+t%mHaIx>XnIA2{M=T$4_+~vhKr>flMR##ec1603U zyRjB#$ND;_pIu#Lb84z-RaRdCMR{2X*Dte5Vzvq?{8T^LJ08n`h<+5EJClh(Z3aNZmFs$_vE2($;ZAd9{WMY(Cvv_C znC*0KffLbnsxXKP%Wh0AXmt<?F3k5C}PgI0ywmDlk$3l2eI| zxI|YxeUg98^gwH(c%wb@D;(EWY=Aa1CB+hGSpBUrSs9fU5l-tMduV(;qgvd%?|th=+5 z)?q!}UDit*=%x`9sxYe5svm?W4y`KN{YWE~ z6(oRliti9XibIkDYh)O#ks%aUQWH&dFhnYW@I?OsemZ|56&mN|C)m2ya_gwbu*4A9;3)JGPThtGA6Gak2xN74|6^ca$j^dhFfg#~e31L#2n$&_KqUZ3gi)Z8i>>qBa@Bm-0n**_MiG44PAUi1@3Y1mc ziZo})U;qczPN1v=Y$>2sRK9um&_(B4NK+7;v~kTD$^=j=tJ1!t@Kx0~nt6FO>1{P| zesH`rb*1--6iQL;qsmPtgi#A|XC^oi^8x^JMXJ{vqd2D24C0>RlQ3aNP&9|^0<06& zjuoMiKsxc;H&_ONxv>PrWg?I>rP(WG4pV$KL4P^icec0$2n5u<<>R*(08z_gdmO&~ z1cZ9!*m2f^^+3YEi>7`FZ3Q4eKwyyNA?B*VsZ(tpF4ZF37rAhjBA-g4?Y=;6!!}2LRTuSP1DZ$g_r2Cc^P}-Zo>Jo%=3FjywW~r3* z#d%j38l=K3stV`U%YU_~il&d)=>WRu32M+QZnuEjM9bUm`Q3MdU<%rz9GT>=4| z&R<@HrGr)h7^y&BRIpqK?Q;e0m=!RPc98uL9i4c90O+~O2>3rcc>a}Ni~%{%$HVR0 ziq;Rn^d5wt*&lzkC&6x$Fh6NvMxwEcK`sosOtldF*wWr*(htNWt=?HC2qpxIP4ar3 zJ{(X%fCgY8oSrIx__tF?ZA$}C6nq`@5Oq^CIq6x_R92{MW6ey1ReWkr~Zun|a*zgw(?(>O-G)9`tMEz{XI-m-8<=vcKJN)TsXENPs@_H3?|otDIel5E8pq){bAGI8WuOGA~d z>}s+bcdxb`!yV53h@w>ms8sRI2bT;L=wK>~e2z?t`y(P^&jSE%cZvc<#vUMrX@`Wr zXn_F&10nE_OYkGq=Sbiq;A@nZ92y!^su)|IiYJR~ZrLYfOz z11nW`<6k+(-y!E7=jA%R-raTDr;M7Ae8mP`dJ z=a3zvSS4xtnqQPVueoLd+IA#S?j`uz(-H8bpjjdA0s#Q|-7huy<8uHMDH#xr;X17$ zra*26t(U*P77mbFf(>Q8s3)MXQvQ1~5fss1SXOQE@OK1;V;S7dk-wBne?uLl6!O+eu$<|hxH=T*#q znrCE{Od;U8v#QW`t{Su(4(+yG>sP_FTIUFGWl}lgTjRW{(yK2nwwxJ)jG9#^Q>tul<;$~N;Wju?7BLeQ(tE)R#sVBYD0rV)k9UA_RXX0qY1wUbab~PRD%C3pEoM)~T2IZ5lo>3G_d0E`Wqf zpJkrYeamzwW-A3M!ZzikIeHWEnnlEG%cLpRIexr#F)8%%JcPuDc}BxLpXIbQfQe;% z?&dl*xImK7GGefJL=d^}q(9<{@aB7X2mqk*k3*0wC||CrMK=|!O|nq(~pc(`0#$Fe@t#IUHMLn2uUqGV|ZT5TZvNn=ipN8n=C zt3goLRFqhCnGkh>Eoz-_U2QE+b;J1$L^c=XVPYip2^3xc$}YI*>lYn!AsKtbgPT{`6StnQ+m7zA?l$-!Fn=bI^PdnNNDKz=%(Q7= zLEC>wC4m6|H$z@>9iI;%HLBbz$lEu^oSoEi*fF;}=K~F`%00NQ%1EbOr^eJkJ zP*$z-K!R;$rVOBdfP$7(JzJ5yNWR(i=IsGoYJnm zdW>B)Zkk;&20$=@==#YsY{C@A`*e+4@rnTQ1@sxaj>-Mvd@yOsbd&>eluV;dp-pxA zNt00$*hj2&0vZZLR#5XKgsmvVHIFG$UQCv14gkR99!*+XIo$JE`6cWhVFd`=GK6=H zDhvVwDrps@)8&#g@1!QOFOIVGIC5M^N3Qd%L_-FK9}Z8i^syN`9mgqxeah7R7qLD z+Nf5;a;?_kR&dsp6j@Cf+xc80B}8*o8ANZabCeN!U8kCDl^kEexb0fhLGiGa;y-zR zDAfQ}t3$74dHLL#bpNNVY5Jc3?7y)L!s2&bIrfvB800AJa@1U{0V;lSOp8NW zBtz28bVzHUUkVsFKwp}W_ti2AjDx?)HW4hB5*D#8cmnf zqg;rIauA;Q=%gLzBP>;&aHy}_BA6WJRFyKwGaNxHp_?V)O3QJY1UtFCXxW#xWhA4u zBkU!FGqLEXiHjkH%!M>GuB^0V+yM$Agr9-+3MMSaFW9?i0RxzUTui(P*UJJNq;oFy z*$93KbX~^*4XhI=5U|ML`U*tMasUMuB*>o9FYc$~RRqTAbqwE4AfgzcF{i$kiKo!o z8*8lxfxmCVGJEQ_lXlm&du>S%!9}wnKmkgunR5rOhi1NdjF$J|G}8$q#iz%yz00i13e8FM=(tQ=~GR<5(ZB z=I0j?$9NO#=Km{ymVEkaQ6MQfc4!K@*^Gb|@^s+Gn~weomc!enAWrVtA<#UkOGcsF_R z((cC~2sJNhE|8$ViWEG}F+6zZ^QC3+*oQ>KQg1`GG;++A=8fd=?0;?a#VrMH(hcAoGIelsuFNSqVo!W6@w)z(VKHeub1xFB0&emB8y#%>1P}s|Y|La3S!~ zN_^4~#mZnp{irH-0?=1$5Y^SSPgQ^U@9jT zhOMZcVauy#*xI@owwl&iL^QSA*f;(Bs+TRWFpfYN4MGi8St7(fCzLPrE_Z}GmIWVD z+Z0tRp89ZvcBFz0MdE>ZPca0Sf)JGt@9^1U8Suxo;Bef7{8Si z^h!bWMXQ&u+Y1+m7r}x~?|hz4ff1t7*~f>^3MBNPfQafU_+l*xCW{~%9)qM0` z;6Mm-Xq6LKPL7Rapknr;;L@_i-B=0StiFt@iwryob`4@Rxdt3FJOetzS&p`p_-F(= zdxYo+&dGJvJy1;AyCme0GUZEEqVzkad%$#aWmynjoR`*)H_8x_xp zEP%4&1w*%;ofK%tyS?m@HE#Cs8h5*I6>X)P-LcfoHaB})A|N>;JlJtJiuWQM>hPje zf7{>gVRx@^v)hJd*|~vPcJtt9zpKT?%HnYWj>p1)(7%HGcnSDxu2D77D;)(y7EJMF zcoOTRG-V&$10vB%gjzcqbGuvs1*%9##Y)u{QKnRBHM{`01;olJ7eGE~d8%`-_<|z* z^U7)vGoE4uL|~L%#CB?QWKgRkJ-5Wta*7EAEQDVr$H-^5_^blr2MTR=K!`QLt5T1E zZzn);39gKJC_A;xjg{z-@ywe{{CT<##QGzBb(>49z&y$=}x?i-c&WE;qn#TjFjHt(s+b zFLSfIhTZJKQU=*#H|r|*frgbRR|tdrX%f(pm{gkz{5VGY&ayk`?^rU+&ND#IGnh|w zyV|_0DQ|*+YsOBXXbj{LRP7U)Ms6NezXJd@d#^q?ACA zLIO|Z-^+z$qpF%9AlSMpDk%_zkS@VbR9RU`tD*o%t<~2zkft&l!kt3CUl^&5bdMkat(VhR)XuXq)>TqWrV_+oHLuMI_#6dI?ZHEb?d}_Iw2gD;S~N&I8k1WT zzP4!M5+V@lp$tMlQUz5CSwQA$To~ig^5x&3jNsRxoI-y!=70QiKc9H@6~9v8UsRx% zLp&7f@8y(4_NN|#lPZXS7XY}ltg2#i3kVD-lR!ak+U@`W*2|9_h(HgAz$lt}3UT2< z^np%`6&VtPTf|8chO!K-9PD*KMioAJ4Z@_Da0YgSGl-K}PGCaNU`?Wrg?!0rOu*_@ zr7@1d9K+`rKF4v+MD}$i5%$+-?WgUrv{VLqdo!heaYN*%##t`D`$Q&_1kR&Ak%>ZO zR5d{eGzb_ZF_{R&jGlWGyl7u-PX<(^(9)PN91uaDj1U*-5ctr9l9Li=!<{WmKv59$ zc-ivKX1j23gWb9h@|5lcWI2%biiuJ&0!2hIPo6UM_W*z!L^mpp9xXjv&C%{jGm-`` z!V!di5J14s(=*x&fgU_<+LYtdr%!%n^3?IqOrAXcnMsqzJ$11?NlzQkXQw?)|1|s1 zk9%UwxGNqVH|~l@#*MrBkuhVgcvOwgPR{^-l=cYiJi)47e|12=19zy4d)L$*t)8>b z^vyhTL*J|yZd&a6t2>ss8q2n*)W>Fe1evFA5OW6BI4p7A_``D({q5$(u6Fm*nRa0a zp^h-WZD6L|*zamBMZV_hrHFbgcg!_D00{LBx&C%`F(81s={(2ixC_iPcQQ|%;aY3! zanYq;JcJBhhx>J{()-L&yzK94)) zm5CE3yhaf7H^+}3^Yt+Z{RwFPZ`X@X*z>v*WF+I^Q-AEVN|{=h*xT z$j1QvNsPb3bU-s>B$l}%0#?*WS`?{+(IJ{cAcCXC5ijHPEGOW)O=O%VYRuCsu15kr zMPpNQhMKc2#1fbT5}0@5HD@?I^FnA4$AvJ@jP9>~^c??JkxPN+kPCUuw3e6W9~! zaQs(Sj}E{p24NM0v04L@UV>c$UCU|$28l{50vt%d*Apx=>K#+3PI_Jqet{oeiSSnyJ`Lil zufF2P?k+ATU8hcdblL<8co5+p2P>ic(0)Xt`(Z^08x@jmPQo98qg5W zwuA@`cnTl^B*JkKC_;a<#Hou@+En-ELzKU+DX=mc$Pqja{0zwC-zYWB#P+v)a`(neIhAa?Mp&yzAMqW3PN;{CFnmi*3Sqw6O_j zWwc5B#^VX-R8uy`M6x<2Pa?Q;BFk)Z8vBnMdlhaX03+)-ui6{5pJO?wq<^cwtNi@p zrg|hN&v+L|WO78rbpNQRSrm=&41*z+gH%;-GCAqQzD}VC-J9R%t&HcBWlhV= zYj?{osrAk;pBGqBF)zHjdVWlOeQQF+>;!_ZEA691k57^R!o5^H7r3dKK@0W-OMk_SzqYny7%?< zlbb$Ziw7v1P3wc`Xn@aJ76V}QoYqm!19%BKY3;BWil3mhbBQg2sHkIL70ia>IS?UmJoO&MT@3_l8@_~=oU3cD1CRMWDg+GiNH|BNtNM0s>;@rE&UbULvvz}^g7zQSn z6T?tWoYefW*Ie}r1^y~+8sV=@r%$DYdPUb~tKw;fE|GDmb&k+y4900Y<5%09W#%1i zkJY?`i!DZgg6&Z-t!kg72<964Ytr)a{K^^|lkFK`w$j*eqc$L|2BJHY(yu69!<%?$4 zHuZbAbSw>R9b6vU*1Iyjt#?Jvg1*(IEgi$@f|%wKCj-ZJRUpu}uOyD;Qx#}>^( z;|gGqDYyYczrXm(q3|{ej7vOsn@3)Ft6k(zl7!V?t@b5tAcXjtVt*5uo`lvx)LMl-y zbjR&|3_6jBP+?EBp=~`>>f>_{)%p5i5$mJ%46U{9C2J_W(Fxhb0(bcrb+JAgGPQ z{5%~X5K1qrf+&!~{fV#+@W$uw%^>%|?ci_2z3l`P&V-mpfp7?Gwneh907Dqd67XpZ zHbvKGDC!;`oqX+z#+MI%)CCZW=8n*n_D*1D45mWu8v)(2fQi6JppPeRB2Sa)zp1{; zVuIiRVA6@!b-2Gs_Kjdt&@sAKO+;GvCV*iAiMX^ceH7a@F-5apzI#nd+EMk^em4bhjw;J;L{5L zOqf7GDC@@~`~?7XjP~QaY61Yi!F|v{|L1>K#S|C2*3E5?Yi#RY+1xR>v2kJl!2FJ( z;uLcIWBgkv%sJt>1ZmXzk92 z21j;1Ik0+Oc@`2ig~}d}Kl2@~83&%RU>8EAYsoQLX&k zpoiV0xn{uKZXOU2aIsyjQ~)LZWrkY-nMc%@_fhQ;<`GIruc-H6-as*7zRomW@2!w|wNO{#Dza9a_Ep{X=VZd}?s@ju)1!+xxktBYVF%JhJbr!z25@JG5cX z&sqN6ip>X2ZFs|88(zQ12G{K1h1q3{Z|h#Z;a9!OHvF-BXzlCWL+gLkxn#|^D5~*& z+K;*JSG$MTf0gxLgc9>BJnI$CzT2ZIVkj#>X^2Brf77?ihw&Tm>g z(^fQi*$npp^I|}X2t(EYS3p2`ur~u*XdZ+O0JsG!fClC*0D+N44=8Q}%*}^^Nr0V9 zbMD?u#;n`b>VfvJ0qi;o9vGN6bDcd4eXI?}rv-hK#a*(>saDrR-vwQzn%KSc*dg3-r#VFi#D|TVtL*Hs7CviZQwJ5mBFj?4-PD`r=EDq-uLV?wtd$=XM%?B z`dbL{LkRwa2@@u`@`g!B{Q2K_%*5SF$#aN>K;`W417A0{aNGpZxB`Ca1L==m{!j*w z%=iKT67If=@JFy;iV5(M=1)_WfUE-A*8vC!{a^xplq(-dwm^^r7+eV)bRFF;5Wz7) z0txJ+>;MH34z@QrlR#1k{#6E{2CwcRg!2hhs9IwZzh8a|@c;}uHD_Rg&{JX%j3ZBaHwH$s2A&7s!qTfT|+mI`rtcLA~jvjVX_(57}H)Gh&93AWK~Yn*j`@a*>^ zsCwB~6uJ_GqTU@?CCXg{7c{$zMZb%{a;SMJ)U$-9>x!Otko_E*UdBp4*VgsXMu^t; zh85D?Zp2l1^AdzUbIy%`fOE_>=LTFc+q>GDIi8LMK!wL-Y1CXZ)7{UZvOb2D;C2MM za~%7g?Z+yB;;?=$pcjTq-+)jD0Qlk(kOeXXtK*Iq<{I|772t3)?Ns*+TUzaEvkCZ| z-#P5e6N_L5Ttwvj!fxh}?g58WzgvKSv^uR*FF~);-74iRhQS_f7bsv}5-Z`{)=u~c z;3*)TS;~eq{^8-}wtU4(Te(tg73s~y*{s{@P!|s&;6-~Z!LRvcc-=OH{&rijarZ?4 zu#>rcr>)++&v7BV_vvTth38+eJ1*Qy7KHm7u(5uovUdKGnugZF(u&!Q;jyuiyc6U8 z?7f&d=ISedCyS&=(*OW}AlBqO`%H=n2|kyOAnmTovK8}+t)r3vK$MPb0DW`-WL%8@ zD8@|$<0wMPf*POdI+9m<-<LZkf0!Fae#ztY||p0`{I584LT+%)YsxU*U;b+-qqE% zkdo<;LA?Q3`xQaA|EnprSCi{`yt!jBFA0SzK#vPWYv~9nOwN>h6?sD|+qFE}_c?4< zqBYd#HocS_+rdjHqJ#DxnTm8S>cN9l9aJjKl>x1F5{}Nx%Qhiey_^nxCfgQrtgf$@ zxxIIYb1${zi~=I~U8p|hZnt5ISJ2EkP`L)>O$g|7_}gxxbzz2^?yA%}9|k3en;^KU zE?!od?un~lCMbR;F#xW1rgw$|0M7Q$w83hn)8R5u5h2WaUbqitGB8u)0_-T}I}Oa6 zK=U^+kk{8wA=k9XX16V+Bra@TuzM}&=mQY&9QZ7zuTe%XNM=~q0@GJpm-9pOJO`|U z!Py0RUr4c!){aZhvY))$R!fC#OSS8p$SdvY>UPX>{TBg%Dps{%ev@$T2Z^i645tZE z6QL$l4bXljGfia6K<7g%H`uy0>(Kt6whz4TSzC+gX#%N6DH(ac$SEj&v950ZgJm^y z?#U}E*#+ZS@}CXLYXAweS?2`*iK3Y0pArD(LO-6os3X%SU-Qc-KM7`;)kn?j^7RV@ zDE04BFrWhp@cH`+99#qgPO2bofdGW;rNBXLzXTSv&Pg8x7^v50?JKK8XCsA02mp%m z5v8u5BbWsmly)f4A%da^?kSbBxSYPeV?3h2>yolsZ3iEXUiS9oL5TNb)PNUz4`xAI!e}NUHNsfYq zQ81+YmqjFq@1*r=+F$z$;HYU5QCehERgtyKt%ne0jO8as+4hb~+uc)V{nZ)dD_2+< zOl3K65|rhnS{Q+7P||)7%gm%d`widf;}yQXvldO7boCoErbEIsP23Zd$(}I*UJ9~g zra{g$6{04K>99qzueQ&iI-r{iL9g`FSwDWdA@Z4$uhr#m#6?Fp zb8%TB{`BvPloSf));9d17Fya`tYuD;bTFY^D`pmwnsHZ048`XBN#4lcr#jOSgyxB@^;~16KmAPE!Qe{3>*;83v z9jD?t;?!4mj;N;>SGd^Gju|KqGwd);{qc_JnDnRHwOs_f6_M8GqEx+EfCf^CRY+zA zKKghs<{B5fzIUdbq(9N=VyAoMs&t`-0!3#~P`s#2>QI(5KTX4xm=xh@+nZh3hwHRY zw^allS3-i*(A?$J1DM~|=`aI|?_Ugo&CENxSEocbWxD6loCfE2)CGfCsxlgz5g{=VAHOK-u0Z;mZko>PK7nYRWQC?N^i#i2~ zXpm_DVzyRa4Lgdu*xr^Ywy$-n?QffI``R!|!-?)nV4f%De+@D>^5bQ$Yc2M%-ED5RYk|9MZ*jA| z3u$dLZTA9*W>UNuz*LGNMK&4s~B$B6#39YC-E;V-&R4Qv4keV)_OY1u^O zir!XM011Dw-7Os&f+!>!P^4lK>i|xe`T$K`0sv?~0$8J(k~AYY#Q_Av4A#b$4%@bQ zi#_wyllH;)KWhU+D{L~k$$2FZWz6s3c+NAp`uAvEKki<#{)_V#4ZN6|nlp6q1-uFq zZVt;rn%|)WMyOsAiV6U91U$V2tpu(F zuPB2hh?NHDJB!q+i$YYrrv$PSFgV&v5MK%;3E&>(@K zgzhwJsxGGV?=(`qyq$A8_b!klAi+5tK*6%}ef9nI-Po>s5`fTW0T}@R^-6&h4}xR) z0H6f1j{_W7uawE$#BiHeT?zoW#?eMr&B?Z{t;M#qCJh?Y9JGJf$_OAV%}jEF9&zOy=Fn2+hwA8Ql{A39p<;L7CX6T>l@qFFTZuxTjVs8Z7_ohl8;qZ z)_tA%^w>K#E&{7WTsi#|I=ZJ0}H*;h?-i8G(Dthr?N zB~ZZmbnILN{5&Y2=Q9Qy8H<`@n(>V{;xBjh<+wUpCG(2{=`{D1p&_gIOF?#$wbrEA z{OV-LpptA(c@ob)iAeNBn^%#*yOQ9PqK$@0)S(kER00nqO#wRp!T9cSD@Dlt+=_!tXq1fis31nLC=9 zTjn({bgKOcxX8z^`xkH-1xHQJTr&p>VrMR;m(XwTL~%n&o6p>%*35h(C8fTpo$|q1 zHos}Ub$53=TIsT-L-d1=i$Vgwe|Rlc1i2HjaMuW#CUKed;29MCV)@kt7(>ucaBFfib)Bvsrg=-+rYnHGiaE0Y2 zmgkGRT?3Ok)^m8dbxsX#2dy)>Wx7hs#`j53T|R{_RCP&x9(k>bip|M~|G6UHN=x!7 z)0yQ|vP!1#g;HZ;DGMB*l4Xrm=}fF@S=LgUiKdlo3+gH9S&;?F1(c6@g$Ut7=znub zhbhAH!1>4ludB?r;(}}1TZwx&!wcO24*Rgp%oPsPN53X+xGSLI)hS#Ke8Gua!h=f1aT*H zu-w`yOG7_se+aW51xY~o>Q!7ssXRNjZnbBge8N5g0BB+GPnfP&Y{Dr=X_oHQwuSI;TVA;vyj2H*eFS1~v^I3>t+3Ihra z7oq1Zp-wL$EWzgpKn8~d{v|;v;vYW=NY~MIeiHsHOR!73*JtM(2z{ML%R0sp)|@|x zeKI28(@%>rAD1bX9**CS0jhm95Opn8Rn)y`TO`{goOK>Qw&_}J+_9VLoulu$HB>q{z8oQNN)XFoN^vcY$nheDz6HTR;BS9L!}QDdI1 z;XIm~6<1Wx9OM8W_8uo1!+Y*3;ExeLYwm0Rw?h z9IN`?A}j}v`x1qvtAEH5SPK9Y?NIp2(z{5t3vfjU7-W+!*xS)=k3I6RJ^#@U+5Q8E zZQR7E%*iEK9u`|K`}9%$ZyAco$hL!a;ejXY-bbIcorlkSpO}JEq)z`r06=Muas~K$ zd6o0dD7Nffke>yXC5QcXMSZp{u1d2xS-AGF?nyXjM_~;J#|O{2lwg(sk45mtqUr0i zgtr3>5bDmd(1xB7LFT7B30HJBsB5w#Opy6RGDRP$7V! zK1_g}F|1l4DWSL+bbYqzT2hQe*RA7Ys0osjKw&v700n^iB|})lFFq5hBq|0=0lM#q zzp;sl85M=a<(o>%s!tS`R(ztQtn!bSgt35tBj7;T((vmUgc9Io6;)Oz6wkob0Bn%C z?&8Z`Bb3cR*1#Gy`HdE1k#_88%b?h~q@YOn&u4IIKfS;j4BB5vcP_$KFS`b&2DJj| z)T(H;^$=DtSPRi?OBqC!RL;`1N5KYynEf@tD)vWL@o;Z?CXEb6-K#UWSgxOgHp6;>mP-?s%$eFp z)(s6_N9Z#dsg$P%^`%mt0u`#mT@9V>eB1yX?F$_fow(~&u2V%q7Em-~0YYDv16dL- znE+cCVMSnl6IKP813Pgwh!|wk`nC4ddmgn9J^QrtJ6$tw0yPto9gE6BToel#&>F}Z zoO=$Pv`3%%pxu7&V>Yt;*zc<5G=D_{lDE=nGp0@bD9dm9@B9er379$UI|&RL2{{Qq z32_NK2{bhcxl003!cIb3+Z_Q)KPvDkxyyPr737hS4!9^>o#H}h-o6NA$HKt&7zS}^ zN`!eM=q2Q17>E+;YX3h7m~2^*eh5;^|1uDrYa+;<>u?TP9WH6^vHB+k;uJ zbA)1{2xFpAQ+$H}fR;7!)MNH^tS6kmIValI&&jfNvtcPqjU*BpVv|Usmzi*M9jZ2d zl0d7ee{BXKFtFRhb?nbnAy8$0y%6@^Ui@zUfENV2N(cL*@e2fa0}%Y!FC+jU=FNKc zcY2m}tdECM)UJe^A=}O!+w;ct2X}sd=a!{0+{2%n{{Px-O^c650V%GyzOby~QEJD3 ztF)~0HySsi7Dto~gu4Wugs!Xs8lSbyD;i@m?K{>&2y0a6>Axx>v)|yD-&fbq`7PT} zY8rpZobd~SbAQR)@*B+|n$vU+l%C(o3Q^0s9pTCxqIscOmPi2+uBACZ)VQSxY0W3) zq~YowWFgf(YC9bNe<&`k`aRW3^&Ni0eDFJ2SIevGe^pgm|69!&(&`0Bq(lgSIDmj& zpg;gY5&fg{-$hpkbIzzWvE5oxAT&1#9L;C`sOPv^zPFx%0}?o=voG7`vu`tnh~}cC z)G|NIGFwtwZslYmm6sMnS6d5p?QGKapu2_YcF}?shqBlyHO#S68Z>7$Q<>9ok+3Yw zt*n~PoXU4@W>&!Wq+A*0HGsj%v&& zaQ*gqa|pD=x-z)@je?2>-%H=~9o6ISotd7VSDK$+(qCL!dbp^x^kbzJRX;1QsQERT z>K|nR5bCT@V^BI8ztAWHLIaL%KW9+YlsH5Gmr&fm{iG=H=6T|po@0Go9T15`IM>s0&S2yjXpjn= z==^Fz_nHVa5w!sbLCK2bji|3T!*15!H=oIVW9>Zy)>$n!r zV^p&s!$8l8Yin}Q_BTJXUf0t1llD@YOf3qQb)AyAkrRCKtm^)S#6jctwgWpqFSkjSSSh1LMbmiq0t<2BQ@6OIESjlxq zxaXC5`6VYP{&OL(pmcwJQN?YgrB$cP%WG~eDX)7_%giL(?%moeNvWGihl#hf`!tj+; z;f|@r`rE*{YY^rFPqUdP)1ebD&(E^6Cn??g$o;l++cpA5$5SPB>eoa4+-{5T^Ew0a@lOE>tOV0m$wgW-{ z8dwUYti%B-Qka7>P*#!w6bXJatrn86W_VeUp}Upp`i~5lf6K9$dp(nqvNCgW@+%4$ zf!W!xu4fgerlsXXD>X1WCB@6bBY6fDvm)f@b93|eg^UCjS3FMcn zS*}mb$Y@H>%9@*#lh>J*pWmNBqAr8CEw8w^6QZ0BOz{gd@(O3?msT`T*SfNxprkk_ zr!bp+6LWIPqcI;+k0j9@auYWqDE*?NqeCg%n-GY*1in>r zjaDXuc@*(k2w_iO4%f-gFIoh^=`JZLZv&m5MWFwFHiKzYh+`FSkTvd&ivx62d#BVV zKLVbSP&@ z@e-GG17#@Hnn3CP1T~68NCR(FRRA-)-h>fA1O9QNh9W36VidBLe+DOv%?jR5CDo$O~Sx zVViB*eb^}$qGBV&U);dUrkw0I|H$?B&x;AXu`n+9)}#QpGvOXHu8;Jcc{<8(*0luW z91ZcBv5UZ)BlznM#07dCiS+kA78&4iYgCZeO{CMEjS2F5gh<_wMhAGmKqT)Ak$#?^ zkMeQ*b-4Geuj8ltW|)`DmxDZ}y@GK6WU%|x4+qVf_H?-WjQ6C6dfl55>UmeB&y4%C z!~Gsf4D`CdG50vl)9n#r5JXJXK?i9s?GlAXZ0Wl7LE9g7CbjhtM32-ic z4(EOZiuiucxkBl+PT(ZM>0Qu1xDLzOCQ#6n9cjyO0dy3?G{%HQJi$j@r%zc%&a?+V zh|)LzM>Aq*u*WKYpUFQA^qopZ0{7>~eflBH0Rb}ehX(OI`0VQ~H-OCl(-8C$_E=6> zr}e=Ie;q$#`WQ%+{B7UHWp@6$18?lxylOjX!ZY7|G5$3RZ)$`WPcN5;+QiY`34)Y` zO6&d_7-E;V^(R1csp-6v6>K@mP2gNlfLPbpK5y%qQmm->ceJK%?l&}#j9NH}6+%mw z<goL{&X4 z7o*V^Q-eeGHl)>;7gO$6Sxn@-AJ{fx_uX-m?bx(IMb5rIZOW82JQuweGUrbsxoY^WtK$Pa3S&KHW`?`C#D~nB85{2BnTka&IyN#eKQT6}G9@mq4kECcl(>kwS@BUF z1RnNfMu%=7m2WsJHgqIACiGBFRLK6Uh`_@L`~v`tt(ml(2%k-q|6UdCGixx?-K8_q zduCgluX}T>&#cO%K+gryEN4Xp*B2)xMKKpo;oCW`j{ov4FMs&=KY{r8_@J_iii21s zel@D?qw#~zWzHYOYAW3s!1#^rC+@rqcMg`}vc#Ih+ToDduB z2>WPQ?Yu~ZOC~=QfeZVa1|$QJ$o3-WB1_<#SBjUYUbUcI6B_ zRhTNFFQyb_G1Racj54*Amy}p-brqEiBds(i-OgQi)E>NWE9G#zi1wcLE%N`Hri>Zm z&l8rw(4?x#YbyVI$)7Do@O~$s-1!A9t+s;t)gxPWJH(QS}>DE4dU-{Irej0B-IDygJT|fYhvUg{pFt$M^4llToZNO*ESyYT2c@`aJp?z- zK9fgt;Aar1GmWTt7oy+Y6cjfL;pYh$@TEu-QSdJCzdPlRsfIX_LP=swR6icR1aT&e z!-T0uYLnBH->h=Vs&b~LcnbMBCqjCn^2*M!+~;Uz#W8P|Rvs<2Jl-k1G*tzfh--+# zsuBwDP&sBwz3jH|4_n*Mpp8Gn&U_{-F~czyb` ziQn^ZpYR87&&d|xGnMqqQK24!a1R3v$QmFJAZHy_~Z@|KNeGLtF$G(b+n&Yxe zl$BLtm8iZ22GNfe7Zv|bJR$j%=`BME5Rn)bR43*^R>)E~LbCDai?vR%C|(GAk7@iy zWNFNrMhpo6SLtoB^f;y0q5@a{&kk}|? z*7=N(S4!g=@m*(J`o4eO`%Rr17aJ0A zASp8FC#uXhv~-27TDJ)zqN3NyN(%q;{r?T0FU^OVWB!@%vd*P*>Q8f*<~hw@|IBM} zy32q6@DuR&_xH^&Drzn)DW8{LRE{~Zv;m7pD`vkY%!=(fIXTVQ+4)P-Qd57Bsp@i6 znMFAfnE(SHJt)6N#dq#$>3pHNb|G%I1QAmvA3VWt)iqoD#@PmaeXo zSqHr{0^iM*Vo^lJyA$2+NwC{Y*9qp0@KaEntIK#NPhL6j69pzFjdjRyVAX@h6yA1- zajw1!fq$h0z53DOEj$yMHs5UTChbXp;41dJiv3_(gm4MaKoh}^K3^jc!Dsd3pl6;; zTHqyOCXq9#O5-SV8eoKS(||j^gX&Sta0*sUq(I9xWBC36nqUOKKSDe-5UT_&B6zgd zce>=;m+4>oNYf7u6aYZu_rnb!cK~hxch~V`08F%=)*3srf6E((x32r>`lY?ae6RoA zDCYm|7w+%B{uEhENx5}b42LYOQBjFuP=!axs)3|81D(^gj?!^9T3olm95!7p|l? zg0Uuz#-5A@ugMMNi=|5$H6iZPEE>y}2eCDBzbPF~>1|4XQ#Osjg)(D2agTWurz0zu zW3j?*B@!zy#!+=l5bZaVkF8_h+iA*VWadxU$zW zGczOq+Oe0nUw#7rswbeyOy)eHG-<~|Y(j2o&NhF4pV_|C#(y&iVKJFW-+js$^PWDI z0Xm*G!TcBu0SFa;@~34gmbqC$CGzpcgTj?2r^b2eR4{QHX zT3ZFHIk~RNWmT{W(XNr0^uigSV$lnSsKQ~Yg2hTKRH1?XPSoj&?iRat?^av9sO59{ z`57gA2Ysi%_BTDkbK0kpA=H^&U19BzhLn_)v~iHko$vTRKR?gziDRz*#?0vxMlkd6>gR*z<~5PFEoD-wz-o6CzH9- z=Hv&LChY|{@Fjpw>pfWZaGQv=U?SE6otMwE_aM!F)Z{O#fc*cwvuqE>8W8AM1ayzw zx5q>P)Kykfl1_QnwQpRvd(%(%tY6;#HnR`j@$bw#^#;jyNsI~d?DN8$9O&-S#W-IH zE8X(QAis@~f&P2Y)_21uxhFEn`&dMv=UGzEZe^aiH{8?p5#E;v{ANwNJKSU1J><0C zi1q0D5RYj`!)Sr7)A!(>+U`DO;u;^9iJJo4C$GgVwcXEa=HVbe_k%D}UK<}0crGC# z@VdBAzk8wmel|AP{~6|l_a%e|z8BJ+m*L^~R7$wdOL4(opZ1zQ>62MuZXax|$ho^F zKPmL>K2Nvl6C=XBrhPh@Kt5S43vzRBrwXMkl$ZZ5KY@4b6SxvKs6$CX9^dttI`Jn6 z{T~LoO!;oetf}7$cANT52HCfR-KPHlB>ufHAD8ckdd>K5sMpk=vhLRkUQ7H3Hq3`Q8nf=lBxvty-j_IF$b#K~!scD-Z`+B&J zp?X@VZ71dL+~FN>?BBThcvEeO=%X+H{cE3q%*S%QiReiHT)mVL0r^X&WfuRYKPfkt z%+WfJTyWDwzl&em8&*j?cjLU|rkgnNT{Ar}is=GN>dvBB&-J$bW8RaKL=H-n*j${g)GPvo+G+ zYeQ6^`+69oRssYz276535auy;qsNr-tNf-sl;&K z(^3AOcMy1YCNHV17)%&gP1Ofl3Ok{Ebg)48=7LVrlpUbe6pw zJN<7w{(o(Ec>EVkpE&l5ZnDH63?*2Vx~8c2pa9%4Xvb4EOUSFqS|F`n z!e0Vkpg_&Zj|WUhYgYiBeB?T(_Sd-t9GnKA(D|HPdjzVFwmHCI6fk%J1m4uTIgb|t z*PC??P(WDAM6ZB6-LnL_fQGCOYPzn3a|p`<2GZ^oq!%Ee4xo`h*EVVMir&|<0{!H_ z7iftHB94G{+TRKElT||d>ND5VcXI#&pJf3E<$NBvJyOX;*s`M65&p-vuD)ZiV_qyj z@ZT$d{@31(%NKq}K7sL|5jXBkbIgB)lJSmwikENdKlTX-@oF-ayFrNj5<*umw}S#y zF8{sFCm`|=A`qKWLp?u|837v?0@RoEH-Bln2t&tYE}@7pm0)&E^ax0S0_DXkKVD64 z09Tsa2BX_XwfO)EVT7Z4ozFQZz(ImLNCMX%A&a0LT}E(U6zBpJ%CW!X0+1g*jQs>2 z!4`f*Yz{%m4a27alzRRfJUIO3I{INPno0pJ}LhFy@+Tkom z(922?!8$F=Vj=5;EDwt8m(Z8MmsP<54}ck26uhyNM3UCDqNl}fJ-X|SQ@b~Qbjwih zWi9P(zKfT4yZi($KY`0n;PMmr_dkKLAdGP_g#R-A$&57~+O;R}g{nB_bb<30< zj_~zETNeOOlRsU)a|v6=b-+3S0e{v>m`g}X087wI_)BY-mVQYymp~81OfSLhXy*<< z7!}At_}>K@M5illTY}e*`%vV)%>FXt>s&g&)~QJt>pU{UOE`yfUAYBh(HIrh>~~S{ zJJJ2@uVVxbLh0o)5D-w*e=z6Qbw&gHM!|%v3;GVS6zDu^68dr-$Q9u0P5c1+w9l&| z=x@^-r}u99;_kIWeTe}9GD%)PhbW<)4V9Zu#%LJ;j*OA z7qX+g{*W93Ri^|vY<4o)OXx}q4nQDF+a5K8kDB_mtS0lktOZW0oMTClsa*RYj4vJ| zp)3tvy#%m&33~+%I&K8^b2NL_%LFfB?ZgsX6w=b@Lum5jOIsh!*&h}7y2miIcL{L` zXaN{UTj$;cOymZT`9Bn(A<%H?yb|C7C5l^+1wwSb4iMm86cZqUKMEo^$HjZsb$tl> zb9K2I(wGE0M$q342e$v@@YdCPnre!0319wuCq99?=H{xSH{9{Zqc>c5)B1}oien^*FGbr+sE+2=V<7-&_~DXJs-2kiBzP}H-iKWT z01DdEwRK(f&S%!?e9GO|xfLL&V8Kw%5yJgmvP1}kC~eQ*u`rAZc7YWE5g!8jJjqb- zCSE|60v)68tM4t#h65f1OgJ_xDcDAqcD-@^{>?u>x^4a0)%_iBJG%S-%!~6M^hI_b zzV5ZNcRXM>-0`5@c%IrGH{E6D?tH{R~x$xzSTz&$VpTPgx6PO%Klygyh@L)|!=$9MQLv40Sz#FquLjF*n8uG{5 zl#t(7CkOtvB+ma2h0#7%o)~B~sUcRK5^Uv30alhc+O%Ai62$fZD~|WG3i=v8*8(i6 zQv$7u?NEPNb#jo^(A3wZg~I3;VRJG=FYXs?W$dGKRdQ?<`;;Y&p06y?pKJMBQJk-p zCirt5e=AAwbFN>)XRWVD);(~oWbTpUE0eiL&QZ>1r#a^q&rn*%19tMp^LFjIJDqmy%sICK7Cf>C`G?f)P1mj>%=_lj+IcP?3Xd~RFc z@%fATx7Rkd_s(tUS~aJ&qpiBGk>ZFQExAy+78F#bz#kARc39YE{rHk^#!bQD5+_F5 zKmFn&Bb&2ui8U@-Vjz(6GHB;NDX#7n14_7Dp@2g1+*jbSnvXA|DR3rv(t4Iqw;UsZR^Ovo1B{_J)+u+Zs~BFU-yizq>9q{Pt>=YttehqJF_+)v1vmtV@r4k@a7! zOAG&gb#mDEYg591+>jRjdz#HjkFfgWkl)jOF()PD_1USR-<+Eg`r4f2ke4~{XXd1Y zezHC(_#>6^!5^+o4*n>B<+gnlu0`qG> zBsf*{4fOLNoZRmmRl1eH=0{ln9y@r;l^55Y3o^~=lSpA z#3(JVIlX4*QCqX~q%9g6v5btIZ2hj6|1Lj)%TM6n^8~KoGSV=VrJ>X%39A_%FX- zLqoly)dD;{gJU_5(}HKEmL+$Q$}v_r^;u~+tJw8yK~;6zP+vOeH&*twJoI1 zNL)!xO-^N9T}onpexPa>K(*&V&bxk-f7ahs&wS)F_Tf)`!9Mco*X)^(d=_%4nSuYT zlmGd7D(dGnY}|XwYUVDW(rMGrn>+fy+cUWG4}HVyC=tHQmW}MPZ3nKiHCqqbF+jo2 zBRAOIYj3q{Z+qCbA30|SuD{E!1t1(fcfTDudpGSK+kO1p_txz=^2zN-Zu1e*KHGgg_kR7|w&U6hwtCMg+kEt9TYumNTea(?E#I`;mQwb7^`6t#zkaVR z-Fny(DfQmgv()lRYb-oA#R9@&ZFc8MTYKOp+j;sv+k3-(w&!}zd**)Id*eg4_v{0J zjrTYJ!hBxjxJG_3!*~Kfj+}O2b)%yN5JFji-8rVlg*X`~7 z%ZE$r>e7pgi=(Qm>x*mZo61^w_PtBj?QB{!cyIrjU4IzbxZl?9xz4toxXlLmJ{5J1 z+iGiPr~a3RclpERCvf=*Tz&%Y)F+^#I^3Jg(sSSH9u=4c(n+Ni(Xs;r1D6B^1y?_Pb>1orZ|Cr^^dwP0*BOx{Gk3|*rHXDI4x3$YU7O%9y)!S@%{VrRx{jee2 zY{lk-wvx7f&$Xk15Dodj^>?y-qisEWqix)K?JsGsui1X=+v|27dv(jf(=U$fIr$Rj zxN~^Jo@;xTu3g->blv*qj=rY(3kTcgcMLQZQp$Aq!IQgQ{_=P2Q?Gp0KJ$fd+KaD# z({hW-4!+g*`$yK#p1-hh-HxM{onQ98w>Xc$r1M9?C@&VK0Qk~*?geP7*?xZBjaXVb zuvYZYZ>4nG>A1M0+mkag9!Sl~`(<8n=_e}c=DgIju=@{fT?5v;Y=dn(a+3hrzwK}7 zmczDu+hIx+Q@J!F%W?~fEjuR{j7h?_MLkO zK=7EIxbqo1df{n1dLA%96F@kG#p3AgPuhul-e=d{_W{lYSUCT*9lP+19lErg&quTm z+m77vlx;eGfpb4>r|eOC@d=8;#0HD)61LM@ne36PculhI3gmVuM3NeycI6|#bFTTHbOHP;tP95H#}^_F4CmRgNG2@Tr^8z7N>8gV)>fn;)>F zH{NU8kKXv({nwrU^_BzIe{s{^Q=i#-=*)8~HXXQY&9)==^e*3g5Rh^&+V+};=C0DV zw%++QP3>j*`DLLgd3jzu6UT?&+S${;3N1E0C;!EN=P%s9VzVt8Sas^(bjcyEF5<|@nJi6-;;L3U60%83y<50TOPDyH{Wl&PTp?Y zkKbau0d|7`za{Io+u}7lY;ePVllDBnYpMB%L|RU9m8GVqTS7`EfFRfA_pG!P+m6`C z{_AlaoU!3;$8F{A)3*7@s5N0H)`iVSZ?WwsIR6R2!Kpj#FxHbp=N`0u0D;3dKWv9@ zdI$mj9y@Xy4WMx14({v1Q+EA*??YfeW7pmF6aWDLp=|(z>i`vp<<>y3??D=J6(hUe&}TG=9}%n)^fpd$d6)mko~0<&vsVA3 zUmPHDBqbyJ_0X`G*WA6lUPkNn`$x}t>3IArGg+3)#`#kvOf+m4J_JskF{3&(G_*H1 zK7O?TO?qbTUMiN~R#;MTE+@a_{+c*f#7sYFHU;6`*4G z@tbV@?i02Tv;E$ax7v2B6Wb4+vDI4+SVD68lNT@fZ|f40Qr0iue3-&u#kv2=i_UH9 zUfR26_c!i%Z6~veb?P=x8D1hz4-aB*$Y@^Ui`w>?e=>gHJ^Y`D=4cm z4{ty7^zpY@o_;+0!}jpAAG3$w_ep!-3tzAgy!b_Xj^t>7T^IOIELUpjs@TVR)KBTp0@*lgM;TDL2Dn?+>ao%Hyyhj z!F?a=AF`deF4iABXIqcohRfj|`r92#hR$`6xQlN{?}c=s&MNg zb}c~T=;+v&LqfuK0szi&egU|D z`nziE*s(rTsq_atB?2fiaCbzEZu;B)qi{@r&wD>~@A>;4IeYlT^&MNb?`_zBjN(uJ$G^%sEx#LFyYu(|<4*tJ#*GKh{dni;`)%#Pn`{f?U?;+GCnosq zjElVp*8TY7cb~r3HXXggmhV1e%XVH*e}mI6*>>8N@4DXB>^Wm|d)L~~mLvG}Z**b< zHsTsMN&LgY-eC(0i?*VQItvbuwwB&i*0p?_oxzfD|9hXeCqMeKJ^%S{*mIxxsy+Y8 zH|*26bzb}SPn`aRFMP{B_tn?!gMfqMw?1fhJ^mqk{?%{TXW8eauYT9Q`u(5VH-Gdi z`||gGX0Lwp$M%J9|CII<`~0_lY_IV7vtRvzJ3(F}>e%0;&;N!o1_&@6jU^;xH7lFTcc&#n!9kR~;Ve9A{vaW&U zfPpo(7$Cs4{?BN4|E%Zs|MGd(Y(4VxEr-t9hP?#&Aow?8j@&>b^G<@H*6zOc5C7@U zCOkU!^^%HOG}sJtbN6%t05kGSt!7TMMMY9~J}K1!0ZGZJcI8!9S!zx(KHTlryJC|K ztl8#hfYJt6;2R#^wBJ_kIEMfCdRx49hs{|uXp5F^vh_T#;jKq(!~W9_ut?1-x76HH zbD8C7T3)f^xD!CN>Cla~89(vBnw{TYvTn~y!&?sjXn17TXIF0C_q9cfSKi&)J#?(S zZ~5j$i8 z=biRj-E!gn17G~+4~b3qn!Wn9@7pV1`HsDW*8J&L(W2>3oVo3#w{g$o7A;w4bK80k zzm0wWu3feqy9posZA9|l%Fe;z&P5#Z@qHYb+&B#amy?yHPE5OC8aqT09yeWTTWa+ zGam&MD*zQM02HhD-e_y~opZp&>U}ra#$)GgyKFnG?4^hN5tb z?L2w2oxS^Ui-<{}^!L<%Oi2h0jacF`)Ag4#XSv%9%yTnb-F`cLhRgRRPoDOvnKRu! zI&0Rf_wd3W!;f|&fjC{H=qy(w7$=zK#d5l;NnK3c5x4#S`rm?{WjA&Vtvj)xduXJn zqISW*`i2(uEj@MY?45S<=6h|=v9q@Q;3rWG0Gx9{& z;EKMs?j;>_TYBcrUC`5!EeIKzW4GYv)da5;w5>#2Z#aC8fGq;K@YNn= z;ysGlbw6g`0P%1C2thgH@$nc^b2&=jR; zzSRY1&78TltiHuGKfTpH|Hyg;@GaeZh@iHEPQ?B)#=%kmoz|^Jh_7e+CP4BQBK^1X zTggW+zr6wh*8>Je0DfzCpCnE0D8Bsb5t6qvrf#y$9J7}3lm!4NuWqo&n0U+N-B7UK zHsS{M@>}mBt6&e-h6BWF?8Uz>-@br`O#Fv1yB{UGUqOBP{SV@gSHRz4nd9%4fB#tm z`<`{SpJ4d_zWx0&|I5D*IM{pkLBIoM{!_$)oT9((9@|JP!O#u>3zmyjd(YW0){LI@ zM{I8YX6qlp4Mb*xG7&ZdPzKlSv?Dj(Wm^uNwk0Ebx#v4=aN{9cvgxpGJ9M3S`vp?J z#N*a~|e|HHw}ix!{i8dzzWS$Q{PW#wH!Q+O~VGw1y^ z^>gm2ZJ77*#^#pyw=U}a`l8;!U#?ug&6cg*Y-?eoI&vCwFMwdvo)dQT%pG=$^ql=5 zyW{8XwbQphL;%q}cIf&GcKGxicI@1J}W=VD9?Em3*{$-mcPMkPXC-?C1 zy7!8!$Jx8D8e>;oGu|dmb+Pf2raAr88Ll>I%Jkn&b#Z%Rx~qq&&2sm8&DF#AwGF;q^No9zko_eDDU_f0_x1Nl3r-zUy!U00{PC z0^P4ki3w@%b$9%6+2;NC4y@X8V9DAYM^|szyQgb#&64Jh!A?@YR#aBjB^KA!#g$h# zre$Ymd#mxR-VxxDI`7L(}05WN%NUFSTb_Jc`rr|-sk|0HM_6F>Hx^N_6`RW?!>2m_?Cz5 zI{g0E-~EJLODw<%1?KTyoWd`Eir?|{-S4&27yAP@%Flm4etLZNcRXRo0Sy9-C)igS zyn^^n5KC~FfWEzFnBQ-Hi0$Gvc*xfAF78G6Zz6zn0I<8~=qX#feZQT(@PPG@=DB1Y z?--Vll~}-()gakS5UT;)&it*<{LTGC!^7`O&d9asnE0=v&3%G^me)X^K5y>uKP(6_ za?DhAxf%rP6%`c~7EcZ_LVJj|kk%g`pSUe0CH-7lM$WAnS-H<;7Ze>UDk?u;R#E%t z{Pv#j&R^K|N=N@P%;dwST-K#T)vg3EjDX}ub{(@V48*+*$bHumFo9X<(3v~=!7pGQ zz1eoNe*dZSPFl~lgJ*s*virohIqt)Kq_3>mvd>m++G{ImtGDduMW6kP+W8AepKP67 zUelCRSY8v)eNRwc@c-}?|LUfmp|u}bNN%YDfBx#uZ?OaZKHn*0#`sT}GRB`A;&Qa6 z*;rF*_#I04fmg@I#;%Eqh}aCUxVgBz=BI;ecA9r+=s$GdZ*ePcxjH&A@!q1+Dl4t3 z=Us`jE3drLN#_a+3tJW#6l`jdQKZ&{M>2U_W8C|l9^T&9^M0H}!}t)NpL21U`Q>TT zU4A|dt!&D)nKm8stO9XlLQTjhv??Z;KBA71aYk^oZNSGx29}M0>^Cz3ZUj88-Fd>c zAT+n^yY6S}cb)vk(vdwc5JmmTRa=jIgbDEs$L}3jwe?ib(E5#y3;P=9w05=4Sjb=ZRa;%oS2yWL`qubr;^jNzF1v9@9WBoE-bD2UE_it$Bk5r z_6vx%ft5sQFJ8?vI!>_I4Lmy{n)jS^p3_dEqPGJkIu@_q_7C3j-+g#^c*G5v1r;{G zz27qON^R2Q$#&%xSJ=8u+bkn1&oZ-fEt#||fq}q~2*BesyXTRo>?1FJ9-;La`}k+S zWS@BXEB3L^yk^gT?n?x9ec3+#xi2ErJ_Y&B?Y4Hy9_VlHwi8g`?mT+h+L%YY5XjL< zxEs9uY%=eeBKGAkU9#yA1Tn{L4e!?g(cxXIccXFbgDmDcOuq<(9pul`ufkfe4y{op zOe#HWyGczq!eLgCcAxk>-v@>6oXLMuzr?fY-!+5Mi+! z%fhZ3?nSf1bj{~|XqP(>F6$6Pds*Io>MkdMZ2NV0Ib=3F(HeK){{VzQd%xbpwp}dm zgy3dB0c6rBci-@UqhTH;jZFFQN(mEb&VidAA;65!?6Ydm_13=uje6U)*0pxOEnZL7 z0^fZD!Dl;39~(Jvjxp$B!B;6=7AWYworYz|vmMzXxsf5P9&2 zIlp}Id-yH~xTd1iyOwR`H=Byk<@qyqD(7`e8T^|puI1%*fzQA46?^7mpF-fjWG{UF z%YcDz;>C~xYbBMnHhJoFyXVoT?Uk>6&tAfZ|G6)J#|bKY?$ci) z!0^lV%*Q`xPki`O1OmQbw_<*O43oTq0#BcR)NaN!fAa&++U<{gz^=cG;6Qxx*8)P; zW3AhTn_?qCax+{D`);@!5I~wBmV_<1@ec7WY=fj|1@DaP^1^M;ia=14*IPBp`lO{aCA%DqqEKPq5 zLNEjY66QT?R^-f?lY^Kf8xXWhFh8#*g=lATa_Uz6hu5X0W!+R%T5)$pP2F>iEepR~ zR9^KJQav8c%*nsMxV-KswR2mn6!XuPeb?Gn0L8AOplVF>hfd!Pz&PVX*`BzGfy2X> z*1d}de&Fqmey}Sa>IA_oVe{r>vtS|WZm||7nZEud29djO?#HE-SN7FKLVxu zZG82A+AdWMjc;@fZ}`PO?Sy~*MB|dP3azMejun(Q*i1JM=RLvg^NE<4xQ}2pvY5C; zi;YV#fByjdxK|q~Rw;k|wEty~@l&QuQOc9!{_ynnJCUAKfR8H?t#KBnF2AQa=U{Mf z=msoO7gAF*ZqLdocri7r=!KH2waR#?QM03)EKp$vd$E z?Eq997&WiUoXCW}3DcnfM*s4SfWv!Kgw07sNrna7iix#h1(Y9#u{N}Eqfy&uU83GlVB_*-p>FK`CHyU-}yqS}I>08d8 z-ITo>&14>IWPrSeOY8s6{!cZ0S;t8IewWwui4!AcPMVa7UvR;!>C;mfGY_mnlg%$K z&;2{E^A8;s8JF}KMgNmd=LBDkfzapO?|!#MM#nhXe|ly%764oT*?Bh8b(USjb{{`K z8#`_+WtnGT9Xkr4&3QX@>%DgVp{MNrCqHD5Jo{055L5Q9!`IsInvHh;{>Sasdmgbn zAAZ7m28YqgQ!Rv)LpKi}^Yjg3|Bpb_^NKzH@)zwBFMZKI^V&C<{J(9le*OFQ;%ncu zFJK~n8UOglU;e6n_%mO$2jBag9lGJXU5CbY)BW$YQ%v#_04LElZy*S3WcM+PBb^Zw zzNK;hGd=umrCc`v(~VdXmhU)aTQE^?#;vo8z_b;xw=Gd%+CJPm`|&d)oR@DqL0rNy z1oM7;%r~%vfa?*D& zZ#k)IC`3D1w+#W`v3v`_<|M+1`3!54EF5wtDR+Dq=IFT{%PcH17GZ({h2U0$#0J6s zFhJmL_PxXTyoKwo*?o#sy2D&kE|LckW|+^FtA4|S<`WohWp(ob2=B3FTaH=foJE#V zSp5UNG~#`@s3882?@&x)VnPqGQ41HZuSi zFJ8G3_s|xUM6~zKdu+@86Ltg(YD?E3se()GF5ZJ1&);w7A9&nux^TbU`Op(KFtprG zpS{`A(=+YHJMM8n#VcR^j(z#tuiKZt^#l9t7r$v=`u2}T!Nd1{Y~TOsuUP(xeeWl~ zvTy(RSN6ddUa@>EQUAlw}Us_2>>{2`B=N)rr=$Cn0Sa=Y!2X)hw8+*APdX>#|QjY8{OR8 z9|;VNz%PpPtn>E&K!Li2HkPoNFbC zLR5|8rHzW6OhV(o2@cl%mp>-;!bO8?t+B2D?0?ztFZvJ=6mmQ&F3Bou=U6oT)alc0 z%-C_}8;NU&dw9%yXoE0aa@1=L(Fa7R#xB4 z1QUkVI0ZkK>v#Xsfp2#mlaYtJ`&b{jG5q{ygmT=Bi0Jt90)|Ogz(OKo-T+)4icd`5 zMat82g~e6Rl~gr+uBLwe*XrhX5S6|LP_PSNvBpW)T1ig!5(r1OAHD%!91}n0J6WSn z-25Q9$q$X@CF6tKqf{=)W+eE@1Gk)_if<`i=I!41KV!f0y7{lHLi_t?oa=8rM|f=F z4=d{C5q({6Zl0s>hU+XhM{wrk7g=U*fsra_$th_lATy1ycfe#keGv1*RaRIz8zHd9 zTDpg=8E~h-yK+qLrL|3#SyYLszsP1|6=`Vcv^lsALJ(@X(X?nx9J(f>8Bk6qPmPhC}wddIO1%mCqfY$lBuYS*7AmaN4 zh=D%-^4IKRFMY*61?YI@6EBlq_F4PDr(U!7zwoMkkct1Md!Mj}hyuS8v-YhIz2DI; zj}d9U2P@|`w8O26524?U5MNJz_+qsB)}>plcijQ&Ub`1d#zE^`1<}p&?M@E6wEo5T zh?DZF9LvU5tU#L%qwoMSq~ULtmP(pga8#0Q*t)}stltcojsVMUEDd{3-;H*97r+6l z1Xi)o=p<)6^Shgy>vU*`ALZWeBh~F;?(4j>ZT0q}fPsggsNG1q-cn1+seo)J_v>=E z^zXaT&SQ%IYGH|eF|Y7f=iycGATRPy-y^JZ1*MKO5C@;2#u} zR9a$crp+Mz<{C`53bfIr7#0?8aaaY=vMmaeZw^9xXd}cIn9PPSpA9HabJIb`k1|X^ z!XQX?XcLTEOf)V1Yph~kC(9>n8N>?mH!b0qtfHzv${!dRpK4R4yI2W9C9S>7t#j$R zkGAzJyQO#e##=jjhIhu^2t-fDO zOpNQLxP?F8hvQOPdzO)Ax6vY^;-HuvZwTgF{(Qf`@>!t9(Zofu>o;RYsIRAIzNhD` z{E!g;PVTWOGBSE3Ha_Vn_kKN~Z|JX_?=No7rszrciY<@zui5^5+u{``TRWD(SHALw zIjudLNsarf=0B0(bS+(vAY5|mU%bG-ZspY>5wTWWS&!>zwt4&bIpcBKw5gc?vn>nZ ze@Xk78(`}68RmxtNtUGW$S9jSZH5(NJ^41loz;p#C0 z_ANX*0pVQ3`x5B@08bwZHUZ#71T&u)frSIBt#fFdb>c%+YnA}uJ(x>20q>x-_AF=J zu+_5MLmDr0ll5RB>O}kOf`h$(<2uy<$5`{h1+eSrnNc48ThTZH4gwSx z9(~sCfBGX#=+8M82+;+9_{CS9^s(n(`MQ1Lb6;}+g0#tR{^*zXmGA$|=_Mpy#VR4~ z@|y^YZ~pLCXp+AmE$zql8d{{ZP%VEBtHmcUoqv*u{ujuN|0qD?#n-+?D%+QwJoqO+ z@{-;A%PcX8w&Z?(u58 z*(ObzXvc2im@^OJ!+xAx{k=A0+7!&-k2=9=t^I4Qi;N7PfH0W$VjVyGVqzRV$TR$Q zUV(k5w89PyZ7{ExxWj+?$`SY&KQPSi+tEu}XuKtm6+%3kVO_LI6DL^jlI1qMYQ%B@sBPSJkk7=IIoq%j?%Hqb@zam&IACkBMl2iI4q(^;P#Ha!$cs85 ziCTnpV?hrJ60fgYir13`%A?j{I! zFV?VQwu6B34aCocz?(6C>@^k~=&#@BuPTjy`n;WGv@`$c_!O&YXtMO|LdTE8M33+A zs53AXotsR+UmAf1`0*?Nq`Ml^=t|5I%P^M`jDkrOKl`?WPCvK?RL18)Os%yHxF!ai z0(kl`!*(pgYy)FaTpB(<{DE>igvTUdDm#hU>_%G$7xM=4KSyZm_TT7`B*>q#6~DUPsw&tj@%)9P_*vC zo@GD7H~7$kMcwNvsv8$qH8iiw%*?GWE~}iYfI$R>KMk3h5W~Z{s;H=}Fe|HQ&3}7n z|D+Z5bLVebMU2AY6&o;TZL&d3TK&t`8{E&DdLCoZOvU?Fo}89gE)=a`rdpw)HEu$%&+Oaq~objQcHq_+%ek z5t!9{c!sjfyq&+lhC$Gxq6hBqC2O~F6wh;Clz_^9DJ-+GL8oM*g~VBC~CW#H(( z-|B>+5fMxJR&7^ogZo?U^Uq!{f*j@a*P)4(RnM`>6DK-KhCm`#EDH$@vnb+5r2Pj5 zg*b5~+=Gp|=IS?vP8i^ah`@!K+X#AD9rfMBc+%GWH z2}F*JO>|-aW)f$jK*0vA1WnMuwg4s;^slsbEIC~W_Jxa?oFP-`CT>U|Ny5H+*$DH- zkhMW6+%dG)I$#3qT|VNNpcf6UaB{CjI~~VKK$(`FPMj?x1Ge&Am6|I_xsMmMu+P`L2tVe@O$O=how$dhpNU7 zTL@5>AA3LX1+pX@g$uu=VWCx&72*qjnqbPa#1E_iFm1N02o8>jO$OkvvxU5`A8Ty2 zuM+F=HMIM=D25YUU0?sxca3>Bv8uM-ii%4uD>Kt@sabwrp5^A`*z~DWt+Kk-7Ik#f zx~vxg-rv92`uqB9{`@9uYiqNG3l~~zOS9F~)L3a*snyrjTI0MXw$HcbmIYRjUjRrL zu_MQ>bzA^pyfa<>OKfoIa@sOmLK^@;EL{%3Shm7e04|0B8^e5FzH*JN-?-J*jBK(^ z+jiQ9_1UU|V*>61o4F?L2sbeTeD@RBYkcwd}VHch=SeCjcFL*>=Dh=eJsAWu=uA7g=Ir zlC^jB+lHOYkt5qICNa$>1IVJH{?6F5kdTPwLdry4TXbT&GvKm_^xuG=TxeX#Jc)^2 zQMx|9ewIc6&vHyTeXDmm+FK_tDn$x-iFaE&nkX8I6A6o!;b``y4GXLnzfH&RD0*&V zpeZ`Hu%f|9n-O|nMsDuv-2{0__~VOL)a^R_WUF_bg4BUjD8PYIaTJWR8DEr4VX`D_ zWO)N-EJe_6AtgjiO7eS&K`AA>#PLaq=_!kA$WONGG(j%-y~NP8TZor*j6L#qVaD1` z?+gM4g8X9}5h$WrT*~CC;EpW}ob4y>_~Xj$$A7wR*Rj{gL;ld}?T0@%ykYNiL+f_k z4qx_dbKAStHn;a}u5M`Tt!rv(ubJJ_ot<5fqiAe_3uLHUTwG4_#h3o79t8ao@|$}R zevNJ2PT>nNR3#up^}`B?saQp0`v7LoVfw{Rq;pM^%%5#ceq}$7Nl5$YR2SDD2$gHc4tE$^j*D(JW?v2e+v9XQ0MHLHh&!qk7pnJQ^n8iy|vWu)7 zGj3iv!CK03WU=8qxVZGNC@HA*6g|N<-V2MUsOQUAQmpP%VPxN z-BmriWh)iOPEe?2OHO`SMRHzIVR$$NcVc5Bs`M2iLJcv6cn*xEO1H_ zROY}&-pw@f<m^uhh=({AAnWwP?>P zzC#Sc8C-dHlvUJiFRg7n>+c^p5{E?zGyO<%a%T10eK-Evekd6+oqbDe>B@CBXZ}KG zjwxim=~=ds7=TzCd-WAI1r2ZNl*u-MfTj{$KAk8FSccHl*P=u$rvcyx*8>t)I$C!+ZG+4-sp!)3LTnVNw9+ zI?TMxE6%pX%nhB)sY4^XnM1c=T3_z~2gS1VEZ+oxSw#iAm6Wv|#FxJmE(A>3MD{oG ztg2i3P{6t^rJ&L|c4%Y=L5~E8G9Gpz+@&lnT z{;0ASc>fi=c$D#?fWJek%%^cdAff_g4{}U!WP;VtZL(uzIIJVCp|xif0Bg1LI}@yI zCvLdSZhZ2C_KD^N_HtUfeG%=vio!m;H{boUcjxLbSRk#xg!}_|rt+%TSkkM;>w1LHo zt*58g28RF(gM&6aywp~%TxF}*uCq;>HrvLHn{3Ux^|p?-mbP-uI$N=Nt*v4E2;0`K z-@y72TfKgxtsNoW2r#mKBMQxW_$xLN%dmN?4X*%fcJ*L+*l6oFZzo80yR88@EN9=< zBU^0khRrsz6^i2($PTO^0>55<{-^%zIlldmVUaO+;@@XLR6BlFj&u;qeeZe3GBUH6 z&`TWOocwf}^oLe$un#={IeYR$@^QT6q-wn91D|w)a_)Nc8T@E6dA$$6$qCYNKv$SE zHW9hq3ouYYjylZSN|}*QZ|sCgmW(T4F;$H;vG=dvhq;(Gvfr6Z``7KoytD_fv5V~x zfB+0eunZ`|avc%QB7#umr!Bn9JK%oaeF~xoq9_NTj7&<;wK@0$BhV~l*4ssZj3RFp zSfgm#-T1f^*rI-yB5wr{t|Qn60I*BjK)E7`Sj~hhA);U#StqtASca%v35e|=;BD8+ zB0+!+fMO@dDmqsJM*S|(vtzm77?D({fW$sXEVdC`vy4H#ax2lf;;Y64r00^DmP_RA zJW`u_Au;K~96bSZ?NYQ?B6o424Dy`hUt6?qKMgI}9)ZHbSD3 zRZ@qUw~6nzj(c9`_;&+BqaDEM;S&gDXMjZ|X5ix_2nfNplwhjml=@tbt7)B5y3mS8 z2&~d?CyLEY1W_qcdn2GxJmC5rMgR=*aVmXlC+~w?S&6(SVxp5fDli-uSNU8lPdD+~ z-9t3>Lrz5XK_BtcfTJO-f=8CuA|x==dWwwcTP(0`CH$UzqCK;#3Kie;>Sem=_d$F_t1?1 z6MuO~ScHwc<|=b_nPF4VWX6xV+OZfZ#cB1f6SkUckCj*mmAa=kyyYkW5Wz{W0JqxK zK8n6DPcVP1Q~R z<%XeK&s+m&j%IccPYH2miv2yFpBMYKw(E#Imz=>5LZI8YWfWH)f^BTuAyb$y7 zBHR&1;Q1lwp20d(_F z8pMa+2FMnl#4ePYt-MQn009c93l57$h%;yL9v(udZzLOGfIvK1A(c6D5M}8A@3%mJ z+yeWQZ9p#`1X&3V-0%Q_niH*qSR{c5O77Z1T)z!1{m$>4$TM2lH*AAwtWOk`*mH@A z_Q^SoR!yA7n6YC%_UG>lnNU9<8%8co%gW9+lqbu}&9$jm0QBBWo;=9`1A1Tl{d|pB zElWvGc3OIBvZbe`u$*L(tPc+hb$~!(e4HgF#4AIK)OBP}Q7LXd7n@08p_HUVEDYIJ zRZ$LjD6q=XVw+u8WA)V)Hm{-97BI5f>^u(tV)&h`cD z)7RN<1HIkW)6s6-w5~-9t%KIv-DLxPWbE|!*kFIJ_4ahzK!2b0_4bT{3|TVz`W;Kg z(BOdev3-71lPy^?WGh!;OKLIwa5%C z#lC<3JpbxvUgEFRHn!oPo9$2}>LC|{czc(wM(YPHlcJMCP*-k#p%Wi~Pu}j9pnvd5 zf*xQu`Y`l~^dElVW&7x-Um;EB^Y&TDCLVv^hwb>8o9*t0pR}hw^t?Ut^at#b_kNh@ z++~(RB)OWdC4b5X01_W~{w4d+3!i7-PubJYeVU+~PZJ&aG5Y}Po+N+uL5f3Mc;x+d z3-pIONc~d^*b$YoBv*ddwM^~@N!ww<*baMCWg`)&c_ofU>Fw+9kaG+%@K^3SO*#){ zB0;Gm2PGWjav;4z!d^i#2nSVzQkh9jn48d|HbWXBOTcyjf>JrQFj31Ap_Cw{Z;U`S zsk+lLGjC?w7J8Mj6q??NFcOH6P}+w;*-Ki;UR)F^_^_2g66N~px=Qg_hE-(<4RQrh z!9vl>)AfNabuG*537}~o+QjpExAV;O++-bC!$h`fCpn_*vl*7EO|-2iDT_%ukD_>Y zoq5QDA`{VI=5oykIR7E5U~_hy<&%gX7*vGzRpM04V9|EGj{M{egb1!_( zPTzF?Vg&cocF$w)vv~_T@Uh0B*_Jrw|EV(|a-j;?4VXXAoPWfwgCF6P@@VxA;E$x- zrX%nb)xQc&XASw?t0Xu82z>wsC%iql?2dEp09)DIL>)yycSJ zux206l;2eXUGKwIz{6%HO<5ZR1_cY;*G#?R$>;oV;Adrbw3}qsf zQ3bDkyc2s_r}VG=OsvW!-;5R|CNiB*z;p|s(gCP^-VIq3T#!fGm z$YF$fQEjs=?Ci2#`>7^}cHS$qI_p>A7Fx@(>kn!SGv4`K1?aZ|#01J^AyU10rvxmi zdIF3p)*_&%-)#@i-?1WMLRW>kmbOKx4j*z{Gk|>jW^UL4WZ*B=r!m zt1&KD)Kb7kHx{s7Tw`)ywJ%w3vjG9Jl9dukUxKTn1dvfCYa8(eB{g#)J8E+*5tY2F zB1kF$U{nDr1TZQHhOEZDLhe5~{9V>aRzeN?7c!400C1ZY;o@T6R*wIERX*e$+ReK+ z8(^dHCE+drAg&3K!0{V8jTj{MzYE^``<%89SL;6B_uW|96eK9%dKl2~?knDng<~7z z@F4)mZmb_03HF@hoI|v`Nm&IJo>ykaQO53zjkUYTmUKuAi6v+T?a%S=zT zqQU~J#^NBWLP=4+l@=9PSxFJrh%(0-QC$w#MO~FO&uyU1ww8Hw01Ndt7ckM-P-FAw z)Y*c0vu#dom9u^x+q68pw$eGKX?BfOmzP?{!Zus9Z~>NyR%>pWXDuzw4xs47BC(Kd za~tZc4xkbh9c>$orWcrjq4(aa zh=2k+bPShNelYD=;uAArW^S)2H@4eSvYwZ|} zs65@>cYl6=ex=)VL;77FCrdK5xk*!}+qXFQ;V}tLy)GJpP6&0maO(fD1OQ@TM^k5$ zMzjo)%v>Vb0&1rsuPM^ZB9PEYsd}nTEDzrx7K~Dun4MO_N!UOQZ3Z>D(5QH^t!==d zp;nJI?vX1nx4HaUyZ+9H>?Ca58}EJ?7OrYrFE|Uuv-mB)jBMh2@Bi4Idg(2@4A$ih zy!PQ|Ux!)yHu}x?Xa?~E*p}}@toflWS-FmS;arEDHjwXpf`$;%ld56F<1c>So`59t z@bhokWAyEQ=sU054fj1|SKjfkU32H7j^^{|^_V&!`Pm8sR{_Ox*|W0X3k_IKi9(s? z0#FJuZ@XAf=Jx{WF~M}LJK*pc)JaN~l*&%^yt+Cm*jP+Zq0i`Kaw`S8TSjoP>Qk30 zMb4dMH9|Nf)rr8iw5+<`nebKj?I4Ri4>t7alRY7Gjsr!jRH2rb4oV?tdLO6+liC&* zj3opPdOh+rqWD{^rg}g$qa8(1o?56uM7iG^Fbw>vQr2#^3Rvno zRuBLkU;(3h7{S2~8j|cH+uy~4rT}3VLxF*Q(+a+?&XX0K+gp#_?$mkn%bP5ts0Mbi z%gUsToV=|3viTu}<<+gTXO}ek`v=Ys3=H8tga6XG@~4l5htJ%xe$!TJquVJbhLSN} zXcu1%sp%+$Gfc4dqTk%`L)7ZV>^+Vz#|Pj97e^ajnS! zNL}8&9H~ij22$nyamvI@LBp81~|NRFcK(RM1f@FW~Es{cDm(cq*zvJBFF@#kA&H5DZ?fw zSZX54d03zY_~3R)nJSsUaom`ZH}D<5`ajwCdU0T~m;iB)0!p0V?2vKeCqU#11%jCk z0ubYvbm;blK+@iRL_@gz&E~>V-MY4=8`(xD?otb_8mOm~NmUxmlq{mph*{L7D{U@t zPfqbXYTV^OPCm~2Cm%!mVRS z_bCQ$B>_km*-TULw4bFUFRuwcAKaPcNO&F}y4r>7(vpco?8yaky?9i|*o4LZ^9fBXx3^CQeB zVCqWh^WxihYSWSGyKnsv7VZxq)I;T9(jrRfjdnb)qdWiVfvKX;o5$Gt}R^}tPRzZ)lwmv>vS(_F{1wMjaJ0YyK zl3g}~MAR?ZV5xKJ%r_$53J4DBxIYgGQ)$Zzo7cGpP4#5QuUi4!OzN2R3)cYoQWNcg zd~y0YgG6-#z4+}9 zKW!!RYMnqaF)i0AOAQ`60w(Y(kgPY*2Yx4MpyI`c=D;^Wa7rd|YwIx9#NZkK0vu zJ!wa-zn_c=GZiLS$*+W9bnv^{SM7Di{Jw20Ko?snL0kR8bxy~xl^{>5-wLW#Nk^LP zA;U-8EqC6<;sdXNtiOqp8OQIlAtNkxBin@$jfh_gEQCDC-gG02)eeG&4vx#f3(tdG zc862iQoX&DI&OGOit{;g-s{^<8&qEZZd#Uo9G__K0)6|X<~;wG&XqrX%-!AVI-0y$ zFCPBtbhiv+ujAL=0bBk?hcSP}&G*yR^-eo^%L8`#P50Ri_dH>DJ^H-eNQ0CI*?$W3 z6|~*UH6?SFI|%@9xa$#Hxn(a>tdn;9x;y#2+wG#uZ?KE6xS6@EjQZ*l0*)=T&5cDe zb-AOX-V9Q>8u_1siWPL%lhrak7M$x&=g0cbHIB3wqs<)Z5bA= z;(M-V(Uzya+zq=an{^U2bV4>IjA!tgroy=eTCS<6lAo%q8(@aTZGr^DeF6#+U zH?sd6yIg{SjeMp&`PU$S)$7-TeyXg1n=6W%)qJ*(^LRf>g+qsrvOxp_p~Hq*8jE-_ z5@EN1FqMC{{^_}*x_qF&AK7+=ET7=XLuI8-0CmQP}k zjT|m9BbV}IjKiS{5oz5w!2E&yrEUwxWpWa0PH1QtPOY;Xsp+6WgB>r5^Um*2nUsYa z^h3xc99p9k@!5Vjy+8g@+kXAdae|3q1Qp{(kF<&7$APS3^fPs`xhnvgHpK}nR00t? zFC`2{VU*AYJocyi^RM0?H_pX#Ci>Z8be08>bA}EZ?$mYV<|gu=^xQKeXF2e{Sl)Wx z!xL$Tn>)3&i5PXbT4_xaV}Y|Ru9|P9)$<7q>Kw_B3|yqg%q^~T4p1`gaZ}wqxhNAI zcw4pU(3vslFPo_?H(M=efckCMxA$6on+Aljj>Vi*3!Oltk(!oV0_%`dlw&d6io~LI z(F*Ef%ORC5b#%g#T14>qMVuJH1R$fvjHhN-L~Xf;tO$lLLu_BQPZZm?kwzo61RM3d zzfmlF;7Boed-3aUq^73qIpmM*a_K~r)boAQd6&ql^?r_HHO?zzZwu81F-|EeKj@s6J$8G)2!;az7 zX`9?mfM@$9*V?h`?*S#a&#t=TQMB97(VFuXJAi%j zGibe^eED6+vF@2ykz^5A3ZW7r@iua;m(hj4`OzPdkd6}skK%%;;f?HrWnU`I{I9*0uj1$$o3QBXWPZs-S2QGDyiXCHTQ9SyE}HU$#63&fY-MH z&A$y2_#WrW6I_4a3W?U=`qF>n$But!DigbxyPF02`BA5xX-SDm79SgDIoWwIwM%Vo zaT!vrHf!SAucdjGp!HU+$Hvx$){EL`5$l(rs(U_I>k{RDPG>(n{z zAO<};CbCiPqa4@)&t~P8gLWsu#2q-g-Nv!H8|3G{r(UJ&+sh96_Y|!8Ctm(O9p2uw zZ{q-`j&HX<{2e~)MuL(19rw38AA5l|vCm*VOIJ1!rOR(bPPclK-HxPe=bpV5K@xM~ z)<-xGAj)wJbnOYX6HLC8g;@L)Awmic)^RNhP3k6CUcxb43OcCFUPeD6uB!W;<4?~u zq4RVN3%K5+BtZO?&G^)><26Dh6zn^Jzmo*8&~whN;e9KB_#03jEZVTwDT}QIITCNG zksw;6&=qiSb{xI}cf^qnGH~g2ci9P&lPhn15EC>wRB$TfSFs24Gg*-zM&5T64)sf-@{4BqWyS zKl>+gtjdUs=UL78>DjQ2a=uJt=!A2$?qB!^Yu9 zF%2T>Xvz@-2Ya)ob|2$F7vWu{%rq!_SiY+B8{Gc`=pmtOAZN@vd4{| z?aZ%ogPKd~yxK-CxE7mRUPCRXAMEV`K)Ev<*k93wGJlaKW_bJX1130(Z(p>TuI`?W zURR9pco?*j=%mu_+Yea_r+dKJVt z<{Z93VK#o^6rkfOOd{4{BC*!gqPGiuXAkVkZWgT$8A~wQ$ox8&ta2XfLDJX>k!B%m z-M;mB8Z2LL3(0AA#x9$K z0Z9){fZ9PSde`n?5$?jdYBQSQBV?zS0(+8OFiEI3r#7%6BMl?iTCEElh*|KOh&yT& zqsNpnYI4!-OzM9lM~{ZZoa@{dsZrLV%J70_#?f3Q&SC5d{;OWl1KQH*$gI}yIAmAd z`)zxSOzLeS;`a#v9;9R8S>q;~i_656&!0a?%d#W5Xr%R55U7)I3Yo(Asa`f@)I=LP z8n5*+lWo}Oi8gwYn@#ZyvT>8$Y#b-(q^Z=@Kw?hydiR5r83?x|0haGuoVQ+CI!bHt!;kU|+35_qt&_ur~W_Gf?sFi%!_SOYqLe zt#R+sYi&1+^G=4`+V&hL3j?0qgBj0uGAm`iVlg|}FZYEM)V1|-yp~&RTAmYBZ6#CQ z3@eWZJ@*{k3@JrWW>B{@aZq6TqpB!# z>dl*2EW`;Bfy-I^2>?U{6XYuxS0w?5#ZA_H02sQLa#1xT%yL-VgNF=mjZ!3M~F9oSPco~Zsq~d*--sA*(SKRtAu7FS5osYd_4?go6NW@E&sn~ZH6G-yD zW%Te+;P4$vPEUgT2no{dXX*C#(mOw;}nr^qH6J0ZL?#!qIt%fb$8AiN5{( z_uzHCW{*EBZr2<3G~)@-%@>v2U~KdV&UH`WmZ&*Z^T8vaG!H%XGKA!LERbDxHVaf? zRjbWgOarGSTkWO9RQoP2kN3e}7&&R`Z!loH=ks&Sr?<~OpEBpj;X}mPFaNHvu%+RR47o9$&joWI)Td^lJmJF)cNo`#Q)GbD^-fj(bUW+A-mL((oc4o2Jd0) zlYe2K{?8A^#>Tc>c@6dVBgZjSI3?QtYsN6(6}^o%Tzd+1h zKm;W9nhvC|R)o_%y&Vs4Z;W8PSoo)~z^g-%A|7{dyy1QP(S^Gh(ljgLVw5~b(9l?P zsKGO5;nI|Z5+TEp=SY&6mN(bQ+!N6HN+KqrRwl4x2Al$w6C@v0(2$L_Xf6;?UTKX3 z1;t1sOaP*u0^ZcH#^NzAX`Li@jh#!-*)MTW1tAM+tk6Kl(a6Nm43eNIQU|RKZP=_MNwyuX|acm)@#3`l$f!yR8~!Eci8s875mb2SFpq=|qG zPJ|(j?q{RCq5D%t@AXXVw`0^ZnqaBj(ebuJnyQ7Ul#+GoJ?qe*-v0Qr_AF|T*I?Yf zgS6)HbzAK$Sktbq!t7%)rXMT#K3jLQzq#bQ`m_MHS)zwA~Aj^9Po7s2al^r3EHs^gxL4+8&Q zdMnxa39BcYC@JQmF0Zh0gZkN&kps3YQVkjiAV%Yj*S ztPk?{_Mf1^49XYPW%u#7#T6-MqE|quz;OkJE$hh!6)Y-aR9Qr5fn#?JgsrSp+HC~` z(t0Zp*g`-s5H61T2&e|#LM^=kbxCGX9Wu}UHUQ#OQ%4Vh%w9W0zM3WC)w6jHKeWsH-U)cGDxFfoRpLg&nRpYsq9 z(Mw~=PTceWiYdxKw><=c_#J|b8{s0oP5aju?2g9?Fz5}h`!7*e{5HYD69f(7vk0Bg z{l|Ik(eJ)(k7FVG;CJ4D+wziwUg&iXJ@=Ml0`w?GL&%byCO8WT2wEvG=2tX1B-g-j z=30C_N?261pBg|+Z@i7Rvp3#px83`Q-Fo*!cIW+%+5M2a?|lRw*0-Ov?|?wP0k`ID zd<8!G>93vf;g2yZ`s9}w=7^kpmc0Yg`3gL&@L0(!bIm_&mV<1xVikNH0Tx_e^t|M{T#&etYQHlY%TD=28H=nH_qZ8yp0frJy zm3mtUNZWc@cUV92SnR7nAQV_A;Akhv64C&IKz+ZVHKv_JR>8(1h`|d$dBm@xbu4rC zG$p&=`R_gX6>cH5=(+OR8|~=jR|4a9ItP-sIgL7kFdT^BqRr<-FTq4%JlVgVJ3U4a zp`X6}`R%v9b+%&A*9I{YD_shy}ugfT4e0o)Fud=QHMS3|IW2wNcvHS=4ojR{H~0QzjY z%{e5;bTqpPB(kU%X~;1wpTHrH0HQ>t4D27vKo{gAe+r2J`r*Q+ZLi}Lr+`5RrkImh zq#7;a@||u{X2F4*kBN^{uAqETMV4R1dn+*2 zFLyFjy}x=vyAz?(#nCC*EC90Y0V(MwAX>%*xPcaxdoRA636OEor8MZc#tt37!tvw2 z=H|QXnw#&mjobHFci$>JxvysdK5mCEy~>W^&%F$t>jK!~vM7xN!8mm6q@xnJi05}6 zJZf8Z9kMl>ciZyyMC_mht2XVl)kNqrQflNFh#4)vf~dqS^M_;L8y*K)F4DY1W|@m; zppBa3Zs+zN_=SBZ7Q7q>UEI9!!-#Y|2>b%67Xs^rVDyqmU@5b#asrAh3`y!6nyjg* z%@#DbJMx_FMaZT$V&nn3w2tqyhahMT_XTNZrlnf(+_?^Vq$VHhDSrr(mp6e_Cdyzm zQLRA9qLPR%@&yE_MJ$rh)IsA2(8@3~si~=R07Y#6mYtJh=>!$2{H>G}dcsqJm>nDI z$ju~oR)8V>c_gfJM=u^3iLA<#{vIAqr?tuaZkZN|*d^Au_KiFXwC&fgACHZ)5g-|o zr@2g=-~<*zEG7|LxJ{j6eqJ8tNpK-FBO)x+0w9A$MTA>QQZj7vB+JXrvb?+ktDoQO zltc=ONj-31$^a|jFl+=7=mJHO3DFYf9$6x9*mKO*u|RDH`B31Zl8ef# z_=;F~R2-7WD7*evT=Zzh^g6-7dz3WapplN|X!Yp$KK!UBQS-#7=G(v_BOvv*f=(Q= zk`0ILKFEn562yIk!Ovc#*=K$09Gh|WIT%;Xq{D1jCHwHRfA>H3^dGOg={CC%WXxxV z7rz&oUvPk<0w}MpvnSzlz5U@QGywW3fAhyQ`T4a|UVZ0>Kd}#f{B!&8C%>>e9(dF) zVNUrzulx8HvfTZ(z4x&Kly{xuB|@G!1dQ3|ARZzP zi+}PE$jI%Kh3qWI4}m$}2p~b?7i|DRI>3D?)0VTJSHr>B&VHAX z(=vL`EM~thhX1li5?96&kfWsxHT{vSvx@+xm21DAl4=8MP9F`uR)9t*m{?6Ybvbj~ zT1u%K_Z|oBMeW3#(G92OLe9gl5nU9bIYM}CzXbQ{|@k4dGuz00yW`FM{dp#~5k zP>w@_|10KITW$S(4!}@HGmR#htecD*@`!x6bJ-@sNS80SvU2~>Xh%~mctYB0`NWT# zG}X?(U;x3u7~6Z%QM>#qh%+Dv=KvEaV9?+FDnquj3M@vAo9NVT)X_<8MfJJTnGb-x zp_awh-wYw>=w&u;qKm@;&OGLPvU#t1j7wIthPt1a-y-8|AgkLzFrW)rnVY0iinK?J znTRj>MyC#~3{bM2ZJ)ApmyrRgoviBV&A`V&VKENzMcHyFi&`xU+>JnO_aJ*&oSJF< z(3Hzf?(^r5yzxuQfcCfmb=-8UYM5}!YH;DIZlE*++qi-9M{74hPY2II-ciVbx^UQjnbLNVmty(xfU8XF)s9E|}g-ojk$(Ks;2lPRq!I|I}lPFoWsn zUFP^H)N!qqa2@3r7FlumJga7&E+81n%E`4%0;zcR<17N2gxJ}Rwp@YI{P_#4v%A;Y z+Peu>m)k1ljm22u?mCF18D7Ii5IddoMHP*lHyAPDBT`h=W&tx3NN|?h$s6x+$_FQJ zxZ7^USx`j6DXyOO;FB-fB`0pM?1Fg&0K-{?pK!>t4?>K7mq7mqe3u^*h%F}}()pI9 zax&yzY_S)A{$#0Z>2$njCL$eH8NinyEYNp`Qv#58g%Dg>~tY~51!5sfBqYL z=SM%s!~eH50Q#BJFi0fv4}bO>f{tIo>%pq|9TaRIKp^J5&wlS+%0urvod+MLj3Pgs zyO6%$`RI30zdb_#3EULd@1&%8wSzuxhpVw2baE@on5}R*Hqs_umcZLVA(l~^kPn3R z=Qucd7_hDW{J#9s+io5n_b21aTr{`Lf`UVx51NmARS6lcYIMO&_9@iUGKsRs0o5-+ z>)C_GS~}fcBFA2`3K@2^!z`80d;1D%F-tdNcexO~IXXrpA#wqn4`aNpYn9DP%Crre zx7pFlPSBRo&k``bsl;fbK^kD5mxN~?EYdP2tWs)@1+r+ZYIa6WaSg%A9LM!)W_&uP zE$AP~@JElEz(PL-GQ|Mr`xnkBv1gut$?m-Oeg|>rPqP~BpuaTwor_Ks81sCH7#9o} z>==0rBB&S)#6241Ky5_zHzwmkH_?Sj%EQ}f`Z1lq?MmrGNQDpzA2LOMAZTAFxWEcG zEZWhPE69*dXdrr81r?#VkcCFanJ?K?I53=SOXJ{AtR+&U*SkZC+e^(_NJk000g;Nf zLm1kM0zgt78FL8!SN67*>~S~n@>a5YF~eo=xdC`r4shxrua>#`%_0&?zEgo}q87dJ zwCSfEqWX{}&SQaZfFM{+mRwEApsumm=94McHNrIkmTv^ctEjHE zq%`0{V8QaLI!E%DMK+_)48nd|cASfst#BsrLiiq)1Q|6;3;Z$D=@-Sddu4UBrjT@TrfciiukM^(7Q5dr)wT1vl&cY;?pSjlSAS(FJN(e z6J`X?Bq)rb4Q{k!05yu*dMsIX8bN9vecqQ5Y-}Q!Tmutcf#NdQ?mAC&Zt1+4-?@V8 zY%ZVa4VMI-$q{;*gFJnNed|vWlkGL?ltcLZcz8ggI9E=eBY$l>VcfXy&5VcuQa=>{ zsD*TYAbQEE0w^b{eROE}Ovgf65WTC*B%9$j)k2UsMFsm>Oc*e5kdKA=d01>jpv?{o zuyFqw7UJt=o~|x73prGHpdZ86WaYgE|_tBWAgGK(UcPe5Lki&I=Wn(b5q1>Kf= zTz+<@<+FGf5L6TwVRVJ&IzN~Dpb2%=%wd&fn7Pzq&{FG|x-`_WZK!w1&#~D)4(;s_0`gaNt;O0 z@S)&z$?%yVSaa$M|x4mx>Ac!Ms)r-OM8cTkJL-y??7Spva$0y6JJ zwoy?rHWA*1pm-XoIs6SF4XaQuErl1Q?biLroy1EB!Cp#cU1YIy2u5{2iKlbzZ4cPV zhn}_`{~0F77mInxgGvYQ+yHo15Ch0d~+v<%2j zr6yw+1q?FLk-3NCm0q)*GHY_uq?MSCYZjn^x6r2i6mdI!g zP**qoy}OsKp{8|*qtP7%6qQ%8z_HU*AR=qgQtISs7@lO#t+CYna)Od<2e}B2j03TV za7Gf^@O<9q1`H~gNPY#Xhkky4eA(@@<&+0vp zHnG%I10icAN8#-s9^TIDoPSKH&&m`knVPJcw1}yyNR{fP3r;~R#IiQVGB^e6sF&{pir;t1Nyp>j#=9T2JD41QPKy zz~_Sp*vMf+kOWO};B?=h2=)(UEXr9kXQ$v#pW$#M)ah(A{1*=3XCpIjjzexc1eak8 z3|)MI!ad!mTM#Ie^wKhMIsKhab3o4P z_btd@!)?OY(T=gy=n+Gmn*DS#WLFZENn=LXq_HEN{pCJ&B9r?-CvY6jxpN_CgX;UP zlgC?t*K~{U_ac}es}AtCnD8Kr3GubW=rD_)8Eo;9A(j>!={%l_<~lPe*0NLLEF&?- zl4g^IC(gF4lmyE}i#>rLBbW;m6lj_d5P7{Bao;l zv%0EsYmze@!9-(iwN+PxCJ=Bm5Mb2RLTYX}Wjk9}Q^jNW-4kdufKKRk1qeoFDwfY7 zxK+-iG!+7(!tV$p5SkehXp!8H3JtJ?m`E&ek-$xxY|}V@CXN|ylSU6^!9UN=`4&bw z?Du|brDxZER`4$CZZ*PkCn@kIsZmRKZvuG*2>tq7zs<62xv3HSqbAI_H8u^#`Gg=QGd$c-j!buk0z+{~8k-5K@aS*tVzCCr=-`@_-EK2Ug&G32kvLS; zu;3FQwRSFIp1{7hsfD?siR5A)=MfwL0*ZkHE^x|2RdtOt0$SrBD@$nX)5EpAm~Agx z1sW=AE?K?NDKoCwvWHS5C?rjQR)7vJrIg*bW{ZPNuAvq2I*8S)H$w{D2#|In$lg@}KquN%^#PDEhx%hL-A1o$IeyU#K%J}P_bzs`{N0z6 z-AcbJ$G#29cp*cn2lhq`dp5uXmz}R*c$F=xI0>eC`SX5cXk8N6!uLljEM!CxJ;MHjUmR~Dvz>}Q{Swhd=87y~nV5`lmplUYD;6vxT$ zGnVe8Nt2&f7MYrwL7i!;^Ii{6>T}9aS^WLk1_JR0lBsG^7i5`AomCL7YMZ%Pna)T~ zh{J9(fyZ%ajE}R~v!ZPV7h`%#5{_DAX28DLWC^O>PMGXM20PaAo=DFGUM-{>T;)6` zGpeZI7(=Gh{Tc!b1r%xqQe7k1wgs7@f)BjBn_IBa?1uc;!306QzO~KT+6WX{T5Z)gWwZwxEw(hw9QM(Vc z;dTOyyB>VPuDaniJ8~)4%`O&j${80OzshdE|8dTbcW`3-0qDhR_Vi0{Lqb~be2$Ef z?tJ(e*v9oX(bd~7zvdR&lp<4on-->bJYYYFkGCJDXV~?iFlR}EbU}XtzksjQh8hIm zE@fR|$hyXoO)3Bo`(HX{P4KSMTp-`Mn5WxxhwL>N)0e5#+jXux{EGw`C`* z>|c8Bew^Fqa*nI5@VRKL`@<#|DR9iF5jJkraEBB)b>cWjY2XF{&~rNI0}HFybQkj= zpa_~V-3cB-d_BzH)765!-EG=b7vTLEkOmI|GURDYz`?$r1QDT@IvbhetT4+-#0Q1o zA%mbIJwD1Z8ELa4EIT=t;3D4gv(ha!ewO8@Cs}R=<&E@Y{Oq{~QWGo>0~jF`g}BNI zr6|lJduGTKM(;_Eg`5~3Xu&g3LU>Gdw!z+R+;%Zv*GWz=6a_L84S_BcbVO|WPaGAw}j+$Mw%s20!+rcKMuye5GR#@D>--7C2uhV=p~Tr`dHMK!iE>| zaU~0#%;A#J-><=wp%&ux97@FEcGZ9o>YAzG8oGtK;2C6nPvYp8iG}iDcwecIz}+B= zj~@L+^O}-5IOokNa(w@#eV+>7!DIR~=NJXfaK{~Qp4D-k>-u)MA>3|kz-qUt=~VfK z`-KICpeK3GTp_z$H4jn}QUa%B7{}cME&X5+0J;C^@s?IH{1)a2w%z#acWWM4)N2cS zmf-Eb)VaTyCP2$*`m<~m>ZBDQ;gk-Su3BxY*W*FMkkQp9N*(JlyIQ$!qpjYw%{Fd> zthf_?7uV{NRcZ)?ojpN?$~em@K`va1YT#2uLv4*0vQM?IHFxyV6iBb{b;c%8hYbWA zTWtvehaPK%eA&d@APM5x=k!Aj%IruBxj{!v&n%7_bnzNX_&iyX8JK z&i6e6lnMFa@n?{IyyV#Ze&?0%BmY1%`(652Kl>`qd~c$A<}n=l)Nx8ZjQ7&~Vg0Vd z^o+jEG3nR`Y$1|FAaM93kOtW~Mv3IcqSr@IAzy#B50(^80YNvimUg5pt+W+xS%G~f zfkHQE!zxTOIw3u%VUTQI<+3K}%QDDQy+Gc}2o8dPmP90y<5MVh!y-MYo8UUJpK-^N z4XgazW!1Wi?KVtRWTLW_`wB8d%-V)2$2t*bU`6k|{7%d~cpd|e%{=eev;w znC`2;fQIzFvTI$BCSR>JPX!OBNPPM{dDg4LR~;lPp%`-G>LP$x0TD#foSW`>3@ha4 zoXPGgYC-Q(KYACKD2w_lN7f-4X}gw-?MKv@KE_wzr_`oC`sr_hkLV{&%g~P)KltR= zPByC7zWF|o6L3;=Vm6CaCm9wKA}5R!0I>L<#qDnqlni7$l8Ms|vnK~W9y#*C(`VC| zF=M_H6cpn4LWm5i5`d&!Vqhx>knc9NJSPwkxki57Q-F7M@hXa!Ov}kq!hoU79qg#}hs0gsPn!Wbc`}W2=AKGhg zV{FCk?|uIR*xNs}cc?$U_t8)7hrorTz`||nB=aIb2$}(M!eXr;!jF*{#o|oR5J71pCe+Vnh4@)g6isX>bHqmkSW;w= zr9_8VVq~yo5Im&L#wiY@A|}+|5_oJjrIA?1EXpKNfio;R*vF#ThI*rp@p7|SEdI&y z5FK&VQ)#r0AhecpK@$j=f=H1uC5vp*XeZe0>>-1Ou*@-Tp_I_dv(ti?jQp&m&xLB)av3!JWlZ6pt!ly=(MAeWOsbb>NytJ2P5=7Oa(`B_G}a>a^O zwr0&*Te)(TtXI_2Hg~T5kk@q$L&?l$*=zphV1uKxu{jkQk3jL zT~V6)c`)7QbMU2imv+%%xs#blim-wMy&0+0&cn#SsPo7i=lHd^F-C^F?Zi9YxE4fos8>+iN>kW#L?^HEsbNIT*a9p-K< zEcbnvBh_M2mfyep`sLlr+mY;ps(2{LzrtF zTUS~7I=cMb$gDscgigqGLk1pd2D1z~)?&GfZK13|V6vJZ;B?;reWv;jY}$X6UhFmiFOj$E3+MdVVgHNYRE3l?ZUKVRpzCIkf;l9LL~Rl}gOnUGa;lYORY zd2;*GDP+z5IxpT;2bX>poH zwym;9V=GD$ygKS2R!Zfu2pQ^z?fdPbV^=xnf-IC}5|njyJ?P{|;v z9f@it@Z=Ra`Suc8>{oGQTbWaMn*D$J^!U>4=+Pr?6I3r7RAv5J{B>ST!1mPx1YjEF z3~`QB3XtA=APea@SoLbwqVrvz{trFzEWhaiyZ)9t?c&R>fRTQOU4nY47`=ZI?t}{{ z|5Q;5s$gHK3^f7wG!Y61az38Td^47^+Zcx29WS@=fBEUfzE&n`#W7VC2>V- zA|jUSGo0&giQf!62&dx`f|3{#&f%a2qxr2aa97-Yd~(@WpZyE;^DGGUaeF+{Z~70t zr%w3DW725KP2QIkDJAX!XY8BQg9VRi3GPiB%q@mIpFXi1L2fV_F;YyB9orTmboE^07HRAL6+=z z=@v?GQBsIHWp1HWmdmR_29M)2QKAG0_yygOmaqPy)$B z@TDf88bO$lA!>0-62VH=zcS&e;`Usz+o@Z~@h=5PLcIhebyJ@@f_^R@3Hvl#8y9gHG?>L{jD^c`2}{aKV|&HUjG1FUxr-S zUcfhAJp`V^w)MsD%eX_XZQrLK0D;Vd&r)Nj@zBlGY%%QEec4Uew?2;7H7;N95>!@@ z-@hFB#Czykx8Le<&nj;tqg$qqW4q}twu263TdlI4@(11gnsIGw?AvMukQzJC#fn6^ zcq1hQ%z@6;>&}Pw2xT(0- zZX^S~BQ(N}pm?}|Nyw9hdm1E1T)93om0(}K;!DOX8_gjs&MF%?I$9QQUo!t0@BqBM zXEa-SwzzV$0WUETzait3L1CiO}M$8 zywNU(t$qBeTOnyZh)>28r;Y7Hl$EZy{!YuvE4N5WRx==owv!E(fkIpkr1~rn?(;Cp zJCN#~%_7R*`O5zY6c6c~kY0Ht$Lf5}Gu}*(_rWau)T%*>rg7Z7+*}=t&}szRLXIWBmDy1(f~UWS0 z4Ls7%YgUB6Pgjtq%Y!pqC-001oY4~I@6{9H>)9C<aN_bSKy#&@+t8YWg`d9O}E0VR4d4<*Kr ze1eR0f{rIKr$x4~JPbC9)WWMnwq3_+m| zd|}6Z)jO`!rvIb?V!~1!kQSjqlo3H6MhMa$wn~?X+gP{U@E|0#^M^Yib#$^|Nn_fE z{6IQU>Dz17zLMHtDY7rsgA%ACWpN@@%EgbUP!_>+u;v{~riJ^Ub8@&tERi&<9OkxK z%!<9Oz(Vg4!&^NDM4G5THlij%S{&u(bjl!MGv8so)A~|1%q}LuRy~jY)sxSSgFH48 z36RWqE;>nvuS58SUvoQ5$|oRTJw`K`?@-dfW1NiV8LU8GCIEPW?D-X-ay|C#7v69> z)`_Y4{!e~OZvfbu7+*;C@h-gpe(;lD+7E!*Km5h-=m+pK$I@5#-zM1j9`AYLMNka| z7X%e*R`c+)uMx1kf`iz19pj*jucp^FPIVVubsKE`ee@S^fTh|_K-KG5A`51eo?Sse z7i5oJ7hP@#j#4gx3?lZY(1In>jc?lP5OP*+p*+F@uyXT$76NQO4_=0%VFWefSUY&> z^?b&9%$MqozVs*?recbL@BX?2b{$B<_h-l3docVjYwU(R=54uj?ep*pRD+W}r_Uql zxP5(mvFP-4YWxZS6bQHj-}=H*mtI!{E|mk+wo?%PBxFqTuy!&TCSV^7qNaP$Dj2!S zcmhGS3zid?GC}?h?No<5$dGQIgGN|Lk&Ir1B&gh=$G^!Tok}5bnoQtz!k_d{1ST1t13`!>JklEek?_&=E;nqS19Y%(iGGWRi5y24` z@%O&;ABvKNx*pZUMM0Ya0F`!PIqxP<80Rehs`n}g(Ee98thUktI8VB=&-1YgR^J9m zN3*eDolT886sOTBEL>yak^g1nK!U8W9Ng1tAciVm!9kp-LXY-yr~ah5+DYd*QXW?Dcm(!0_f1dl)6h(UVtws`hvubq6IDo_qfF zw?QetZ)s`i4sSsLfEIqSu-6NzKq>ObQ_tCbk3MA&Fz!Q^dc*Da+O;>|VaHD5OnK;t z?br_jxPG(49a#b_EL+?d=B!u%mq2>@7VKmWHxvTf;Dh?`=!Q_`BxoUGe& zSL`G(SWKUKb=gaVKd=;zz+3`=9FETnltTKPZ&9}SRzFCc`VHr!Iv`kZVR%D+b|n*s zwf=*@cJjEoPJL=T+4?9J>k-a^J;+IfC^yFbwfFtC=U6N&MiY#TA2AqXD96V_bJmrA z?L7)II3EXU8%EhHI?(fkkEiRBAYaem$Pl0Ms9^8P$NJ`^9~`BXxX`!C}Hrhf=(@nL+B`@hc)aQ{PMh^Hk4Q~n76sR&Y_;b}=> z_#Svk*%IK)C4Qi0e%@ZDj)?MxNX^K`7>hZ_DWyWzbf2bcCG4+#|NrqhvZvQ311GtX zCAlEG2vG)vzE)D1tn_sBuGCMdjWjeMl>icIfnD89t*BjcDq#La=(88&W~51F6Anyr zyV{9vamPX0;U1)086NQKV7IS_xe&wrN|&UdL2f8*x9ZMuu2f*9sXp%K01x zIX*bz&4EC+7kK#ylTA5DfC!plWV%7KlJvSS{YLAr(-UmK)zB zm485Rv>i#{#YBs#O_76o)S>oJb}A1FwcnNAeGZbj65!7~VC`6(0>$N+%VR|)%vWT% zk?<8pQEHk(0H6kDqiOUKkF-thcOp~f5-gOG%@+|+IDrG_T^<(VxpPV#R<&AD=W;(4 zf?PFz7tJuvyBA|83nC&{#0`+Wf`UQVICfJw$3=Vy6&PhzY4 zG6p#>!_)XarI@!N?tVzQg0~Wl448xIjKGj^YXyE5=fxq( zHMQ}YHr9a7Q^5eifu0w~LQ1kFkmAbNw<#ol{`~#ZpK~_Byhx+s9SwzRG?C#w1CRfR zh}thZalE|T9+(DVpdeA_hRzju7C-*7_x-i!NkIFLLLND8DCo$bQ;HLJ_i5>W?LGg9 z=R!|;ubj_fKGxgY+cns8+SS1`Jg)cm!Ri|BgUTP1hJk7gJ>SL*xxfOZyL{Jo+Boxe zbvf}jf4>Ri$G@$Md^!`6$SbPVjvjiUjbg_PxuBm7x&UI!1?Sn2{{3wDg^+dzpKnt} z4R&A?*RjKF>X;$sF>$21u$?|(qc}8+ z&d$zpEKyYp?b1R{RJjmILl3OTg|MU7uz+o#i`y>h{hFB80(o!Ri)TI!K(-ykvK7|9 zx>s$0mA?gD{9d}h?K*;7@DR;mXmruN5~<=USe67Bt8ie_Sj+_3jfLVukPdMfw7_fe zpHC(wJ75v41glC@tFDC2z<%un6$%){w$yXdm@3E+lT*A1$vEWmtmZ{EpcV62s4EwA z+gvpK74th;?7Dai7COj;%w(#Y7UGYMB&7>`;GT6j11?5#73H+cl%28`HGlfjYtbsD zbfN}H(x=LeOGt{0chv7dWtRm6Fq+`Is0;TJglS@5v2Ob*lz=jc*#5CBtZQ+Rs?*=a zM?snHU9?#i&*CAx%imwT)ZS;(_yIPoHE7Q{kt~`C*v$t$`RAfaSlkc$0r3Z8!8(+M zQ?EORtXxc5vAEq??A;jBtZQKv!+Heuenr^gmdFjUhBAkA?$WpyqRXAj?{97@VH4trvmD#>NBp5x_seM?S5P$YSc9+SHE}G( zx-Y<7NIfL9&!huZUkUx4A{GMt>2ZDwmFbZqHB`VLH_AXrHR@F{o$ui7A52-y(+Q^3 zDNI4tVAZIpd#X&KCLaCH{qhV=`|EEV{m(yzkYwf-vT%dK!Nrj=QuX{cC&*byomPab zuFJDY3>lbz(`B&>Po zIL?WZor=A#b5AvMAy7KT*|})^2@X`+Y-oa{$->saqF2viSO@o_8FJ892zdEz9P6BN#*36Lp0@`cdxG(}Jw{nX<&m4P(_Oc5qn!lp&}S@N zxf*^;p_9~A!=TU4FXR~XcL;BF5Z^QxH?u!#>oM(u!9QPo70i$3GinJMYS|z45MJk@ zu#!V#H4@)OUL&+d9I`g{T{h>aJOunf`#2$-p_0gX!$(;lgu^5Pr9!sBGvjrA-S<~d zn!n?dlqSb3o7Yz3@A#*_iH|;)0D2fi>Q7w8(;H*#2pbQ%^qctLv&M}Z^RO>ann<@YZljV`1~qlcN-l(FVD8Aj&xiRLqPocT^2Yd+La6bSgi z+7xL+y3=vgdt62jvB?AsE)1QG$LqEDY<{%(`Z-(#B1ME@F%#3cb1tw>#2X-N)Qqa2oZ6`6t} z+C@k?I*?~AVzKU9L7fyQxit{%G|{P%%o>6MS!He`Xpmi|f{LvNudqG%b?-TblOD1{ zHT+OVto7*gchO`d%bEz4h zPc8UX9K0U4Ye6esK~Mh{#IE<57}Qcz$H(QIZ^6i(_JtD+1mHe*;M-s_K@qp~I++5A zoH7w|lAv)BxV(YK#Q_jxpH2;1sDUR7>5(gMWS}$0J9`J^j3tzm)JQ{aUMYO9N`j?Y zPznW3YLql#l8ZwOn?weuEJgCk{BlfB>f4-F(GAGv8amm}1Xj&J-%TJPZDhD@Gz4h^ zEo#KHqm$1rXM$a{N-1Dz*p z(K6Q&V5s*)oq{~wC-A66=2ye9)aw=8q;h<+gZy~NFME1`%*ikAfITbznK zR3L>Awp5l8e?XrnRe_uVB{7v;Q~`yESG6^GQ?RXp$f=>lt&Smys7RTO3uw}U)O0@E zrj|BGQrg6IUIQ8`GFBAU!J3GjtdtSuX>nD6Oh>${%x)Wmgb{Kq`ksA`!Ew0RKSe zv*qDYj#Fp>*Wo6D?W;iv@1>tY7AA2JCtvx}ljh6|KHCG{Zf^O$Gu(6hy*xJhdrj~8 z?1}%)4J;^6NPeRl!z7|}k*)YVC#qBTKM}cPc`09QMbXOUbm0!fdw4X&4n^5x2o|P| zr@lvH6Zc7D%w-&bfE%n{9&_U{&nd`YCXO;sf`-x5ai&sp9SsaPn2CKHbr`)yfrKCq z1rvU*6WN}+A3%^X1608es6#`a;psB|Q΄uerU(nxckFx;krLTHF2axO!^V+iIK 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

    p`aguwV|rh0qi;=pKP+v{nZ-!ks0`cS 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

    _vJsVb6OxMHsuUdGf3hwyfiuN-m|e=ZS`4 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�usd9=Zux2S}c$W`bMP+>qR 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΄uerU(nxckFx;krLTHF2axO!^V+iIK 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