From af697b6fa06f24eb0af7102abba509ca3967b3de Mon Sep 17 00:00:00 2001 From: Brandon Withrow Date: Thu, 21 Jul 2016 16:49:06 -0700 Subject: [PATCH] Added support for layer in out, updated play mechanics --- LotteAnimator.xcodeproj/project.pbxproj | 12 +++ .../UserInterfaceState.xcuserstate | Bin 53611 -> 57022 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 34 +++++-- LotteAnimator/100_House_AnimateInAndOut.json | 2 +- .../CAAnimationGroup+LAAnimatableGroup.h | 1 + LotteAnimator/InOutAnimation.json | 1 + LotteAnimator/LAAnimatableLayer.h | 23 +++++ LotteAnimator/LAAnimatableLayer.m | 94 ++++++++++++++++++ LotteAnimator/LACompView.h | 8 +- LotteAnimator/LACompView.m | 27 ++++- LotteAnimator/LAComposition.m | 19 +--- LotteAnimator/LAGroupLayerView.h | 4 +- LotteAnimator/LAGroupLayerView.m | 19 ++-- LotteAnimator/LALayer.h | 10 +- LotteAnimator/LALayer.m | 61 +++++++++--- LotteAnimator/LALayerView.h | 6 +- LotteAnimator/LALayerView.m | 56 +++++++---- LotteAnimator/LARectShapeLayer.h | 3 +- LotteAnimator/LARectShapeLayer.m | 1 + LotteAnimator/LAShapeLayerView.h | 3 +- LotteAnimator/LAShapeLayerView.m | 17 +--- LotteAnimator/ViewController.m | 19 +++- 22 files changed, 317 insertions(+), 103 deletions(-) create mode 100644 LotteAnimator/InOutAnimation.json create mode 100644 LotteAnimator/LAAnimatableLayer.h create mode 100644 LotteAnimator/LAAnimatableLayer.m diff --git a/LotteAnimator.xcodeproj/project.pbxproj b/LotteAnimator.xcodeproj/project.pbxproj index 3893337da1..226c611970 100644 --- a/LotteAnimator.xcodeproj/project.pbxproj +++ b/LotteAnimator.xcodeproj/project.pbxproj @@ -83,6 +83,8 @@ 62FE40E81D3FFBB400CA389D /* LARectShapeLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FE40E71D3FFBB400CA389D /* LARectShapeLayer.m */; }; 62FE40EA1D401C0700CA389D /* scaleTest.json in Resources */ = {isa = PBXBuildFile; fileRef = 62FE40E91D401C0700CA389D /* scaleTest.json */; }; 62FE40EC1D402C0200CA389D /* parentTest.json in Resources */ = {isa = PBXBuildFile; fileRef = 62FE40EB1D402C0200CA389D /* parentTest.json */; }; + 62FE41161D41526D00CA389D /* InOutAnimation.json in Resources */ = {isa = PBXBuildFile; fileRef = 62FE41151D41526D00CA389D /* InOutAnimation.json */; }; + 62FE41431D41862200CA389D /* LAAnimatableLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FE41421D41862200CA389D /* LAAnimatableLayer.m */; }; F5B4E946F7B28B4594824641 /* libPods-LotteAnimator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC68632413866F85CEACB7EA /* libPods-LotteAnimator.a */; }; /* End PBXBuildFile section */ @@ -198,6 +200,9 @@ 62FE40E71D3FFBB400CA389D /* LARectShapeLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LARectShapeLayer.m; sourceTree = ""; }; 62FE40E91D401C0700CA389D /* scaleTest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = scaleTest.json; sourceTree = ""; }; 62FE40EB1D402C0200CA389D /* parentTest.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = parentTest.json; sourceTree = ""; }; + 62FE41151D41526D00CA389D /* InOutAnimation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = InOutAnimation.json; sourceTree = ""; }; + 62FE41411D41862200CA389D /* LAAnimatableLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LAAnimatableLayer.h; sourceTree = ""; }; + 62FE41421D41862200CA389D /* LAAnimatableLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LAAnimatableLayer.m; sourceTree = ""; }; AEE1A33E4CE2F6024DE7793E /* Pods-LotteAnimator.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LotteAnimator.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LotteAnimator/Pods-LotteAnimator.debug.xcconfig"; sourceTree = ""; }; BC68632413866F85CEACB7EA /* libPods-LotteAnimator.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LotteAnimator.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -249,6 +254,8 @@ 4804B2FB1C1F55E600DA8AF7 /* AppDelegate.m */, 48372A421C1F84D700AD0293 /* LACompView.h */, 48372A431C1F84D700AD0293 /* LACompView.m */, + 62FE41411D41862200CA389D /* LAAnimatableLayer.h */, + 62FE41421D41862200CA389D /* LAAnimatableLayer.m */, 4804B32A1C1F835F00DA8AF7 /* LALayerView.h */, 4804B32B1C1F835F00DA8AF7 /* LALayerView.m */, 620CD7E31D38180800055AD1 /* LAGroupLayerView.h */, @@ -325,6 +332,7 @@ 48372A651C20B04300AD0293 /* JSONExamples */ = { isa = PBXGroup; children = ( + 62FE41151D41526D00CA389D /* InOutAnimation.json */, 62FE40EB1D402C0200CA389D /* parentTest.json */, 62FE40E91D401C0700CA389D /* scaleTest.json */, 62FE40DA1D3FF0D900CA389D /* Heart58OnOff.json */, @@ -501,6 +509,7 @@ 62FE40D51D3EDC7400CA389D /* 073_AnimaterectangleSizeEasyEase.json in Resources */, 62FE40D21D3EDC7400CA389D /* 063_AnimateTransformPrecomped.json in Resources */, 62FE40C41D3EDC7400CA389D /* 016_GroupedShapes_01.json in Resources */, + 62FE41161D41526D00CA389D /* InOutAnimation.json in Resources */, 62FE40B61D3EDC7400CA389D /* 003_TwoShapeLayerSquares_01.json in Resources */, 62FE40DE1D3FF0D900CA389D /* Heart58TurnOff.json in Resources */, 62FE40CF1D3EDC7400CA389D /* 059_AnimateTransformPositionRoveAcrossTime.json in Resources */, @@ -572,6 +581,7 @@ 4804B31E1C1F757600DA8AF7 /* UIColor+Expanded.m in Sources */, 4804B2FF1C1F55E600DA8AF7 /* ViewController.m in Sources */, 48372A641C20A91C00AD0293 /* LAJSONExplorerViewController.m in Sources */, + 62FE41431D41862200CA389D /* LAAnimatableLayer.m in Sources */, 620A56651D1C81930030EBFB /* LAAnimatableShapeValue.m in Sources */, 4804B3191C1F6DEA00DA8AF7 /* LAComposition.m in Sources */, 4804B2FC1C1F55E600DA8AF7 /* AppDelegate.m in Sources */, @@ -713,6 +723,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; GCC_PREFIX_HEADER = PrefixHeader.pch; INFOPLIST_FILE = LotteAnimator/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "-.LotteAnimator"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -726,6 +737,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; GCC_PREFIX_HEADER = PrefixHeader.pch; INFOPLIST_FILE = LotteAnimator/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "-.LotteAnimator"; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/UserInterfaceState.xcuserstate b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/UserInterfaceState.xcuserstate index 63a8d258bfbfa7d0c9537e4edda44e2b46256f1a..98132bb68dec5528df5bd4f89140a0ec535aab04 100644 GIT binary patch literal 57022 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 MO#j#azwX-fKk|@!MgRZ+ literal 53611 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 diff --git a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index c422eca611..095166b5a1 100644 --- a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -48,15 +48,15 @@ @@ -131,13 +131,29 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "LotteAnimator/LALayerView.m" - timestampString = "490746878.165806" + filePath = "LotteAnimator/LALayer.m" + timestampString = "490825912.611288" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "78" - endingLineNumber = "78" - landmarkName = "-_setupViewFromModelInComposition:" + startingLineNumber = "94" + endingLineNumber = "94" + landmarkName = "-_mapFromJSON:fromComposition:" + landmarkType = "5"> + + + + diff --git a/LotteAnimator/100_House_AnimateInAndOut.json b/LotteAnimator/100_House_AnimateInAndOut.json index cd841fe30e..ab978bacfa 100755 --- a/LotteAnimator/100_House_AnimateInAndOut.json +++ b/LotteAnimator/100_House_AnimateInAndOut.json @@ -1 +1 @@ -{"assets":[],"v":"4.3.1","ddd":0,"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Door","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.201,7.7],[-17,7.7],[-17,34.307],[15.201,34.307]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[{"i":{"x":[0,0],"y":[0,1]},"o":{"x":[0,0],"y":[0,0]},"n":["0_0_0_0","0_1_0_0"],"t":51,"s":[14.2,0.298],"e":[14.2,37.698],"__fnct":[null,null]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":67,"s":[14.2,37.698],"e":[14.2,37.698],"__fnct":[null,null]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[1,1],"y":[1,0]},"n":["0p833_0p833_1_1","0p833_0p833_1_0"],"t":199,"s":[14.2,37.698],"e":[14.2,0.298],"__fnct":[null,null]},{"t":207}]},"p":{"k":[{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":51,"s":[0,1],"e":[0,0],"to":[0,-0.16666667163372],"ti":[0,0.16666667163372]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[0,0],"e":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":199,"s":[0,0],"e":[0,1],"to":[0,0.16666667163372],"ti":[0,-0.16666667163372]},{"t":207}]},"r":{"k":3.7},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,1]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0.25,33.165],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1"}],"bounds":{"l":-14,"t":1,"b":68,"r":14},"ip":51,"op":208,"st":2.5,"bm":0,"sr":1},{"ddd":0,"ind":1,"ty":4,"nm":"Roof","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[41.357,-43.32],[-40.24,-43.32],[-40.203,34.717],[41.393,34.717]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.137,55.428],[30.933,56.565],[27.332,56.565],[-0.015,30.723],[-27.362,56.565],[-30.963,56.565],[-32.166,55.428],[-32.166,52.025],[-1.815,23.345],[1.786,23.345],[32.137,52.025]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}]},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":50,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.861,"y":0},"n":"0p833_0p833_0p861_0","t":191.5,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":207,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.169,68.081],[30.965,69.218],[27.364,69.218],[0.017,43.377],[-27.33,69.218],[-30.931,69.218],[-32.134,68.081],[-32.134,64.678],[-1.783,35.998],[1.818,35.998],[32.169,64.678]]}]},{"t":211}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,1]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1"}],"bounds":{"l":-34,"t":-34,"b":71,"r":34},"ip":48,"op":212.5,"st":0,"bm":0,"sr":1},{"ddd":0,"ind":2,"ty":4,"nm":"House","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49,"s":[{"i":[[0,0],[-1.781,0.009],[-1.434,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.781,-0.009],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-36.602,33.875],[-28.531,33.884],[-21.643,33.78],[21.643,33.78],[31.861,33.83],[36.591,33.687]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}]},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":50,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.861,"y":0},"n":"0p833_0p833_0p861_0","t":191.5,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":207,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}],"e":[{"i":[[0,0],[-1.781,0.009],[-1.434,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.781,-0.009],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-36.602,33.875],[-28.531,33.884],[-21.643,33.78],[21.643,33.78],[31.861,33.83],[36.591,33.687]]}]},{"t":208}]},"nm":"Path 2"},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,1]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0],"ix":2},"a":{"k":[0,0],"ix":1},"s":{"k":[100,100],"ix":3},"r":{"k":0,"ix":6},"o":{"k":100,"ix":7},"sk":{"k":0,"ix":4},"sa":{"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1"},{"ty":"tm","s":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[30],"e":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[13],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":207,"s":[0],"e":[11.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":208,"s":[11.5],"e":[24.6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":209,"s":[24.6],"e":[50]},{"t":211}],"ix":1},"e":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[70.26],"e":[86.3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[86.3],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":207,"s":[100],"e":[88.6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":208,"s":[88.6],"e":[75.06]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":209,"s":[75.06],"e":[50]},{"t":211}],"ix":2},"o":{"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1"}],"bounds":{"l":-38,"t":-4,"b":35,"r":38},"ip":48,"op":212,"st":0,"bm":0,"sr":1}],"ip":0,"op":300,"fr":60,"w":750,"h":1334} \ No newline at end of file +{"assets":[],"v":"4.1.7","ddd":0,"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Door","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[15.201,7.7],[-17,7.7],[-17,34.307],[15.201,34.307]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[{"i":{"x":[0,0],"y":[0,1]},"o":{"x":[0,0],"y":[0,0]},"n":["0_0_0_0","0_1_0_0"],"t":51,"s":[14.2,0.298],"e":[14.2,37.698],"__fnct":[null,null]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"n":["0p833_0p833_0p167_0p167","0p833_0p833_0p167_0p167"],"t":67,"s":[14.2,37.698],"e":[14.2,37.698],"__fnct":[null,null]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[1,1],"y":[1,0]},"n":["0p833_0p833_1_1","0p833_0p833_1_0"],"t":199,"s":[14.2,37.698],"e":[14.2,0.298],"__fnct":[null,null]},{"t":207}]},"p":{"k":[{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":51,"s":[0,1],"e":[0,0],"to":[0,-0.16666667163372],"ti":[0,0.16666667163372]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[0,0],"e":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":1,"y":0},"n":"0p833_0p833_1_0","t":199,"s":[0,0],"e":[0,1],"to":[0,0.16666667163372],"ti":[0,-0.16666667163372]},{"t":207}]},"r":{"k":3.7},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0.25,33.165]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":-14,"t":1,"b":68,"r":14},"ip":51,"op":208,"st":2.5},{"ddd":0,"ind":1,"ty":4,"nm":"Roof","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"hasMask":true,"masksProperties":[{"cl":true,"inv":false,"mode":"a","pt":{"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[41.357,-43.32],[-40.24,-43.32],[-40.203,34.717],[41.393,34.717]]}},"o":{"k":100},"x":{"k":0},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":true,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":48,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.137,55.428],[30.933,56.565],[27.332,56.565],[-0.015,30.723],[-27.362,56.565],[-30.963,56.565],[-32.166,55.428],[-32.166,52.025],[-1.815,23.345],[1.786,23.345],[32.137,52.025]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}]},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":50,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.861,"y":0},"n":"0p833_0p833_0p861_0","t":191.5,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.152,-0.758],[30.948,0.379],[27.347,0.379],[0,-25.462],[-27.347,0.379],[-30.948,0.379],[-32.152,-0.758],[-32.152,-4.161],[-1.801,-32.84],[1.801,-32.84],[32.152,-4.161]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":207,"s":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.079,32.652],[30.876,33.789],[27.275,33.789],[-0.072,7.948],[-27.419,33.789],[-31.02,33.789],[-32.224,32.652],[-32.224,29.249],[-1.873,0.57],[1.728,0.57],[32.079,29.249]]}],"e":[{"i":[[0.994,-0.94],[0,0],[0.994,0.94],[0,0],[0,0],[0.994,0.94],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0]],"o":[[0,0],[-0.994,0.94],[0,0],[0,0],[-0.994,0.94],[0,0],[-0.994,-0.94],[0,0],[0.994,-0.94],[0,0],[0.994,0.94]],"v":[[32.169,68.081],[30.965,69.218],[27.364,69.218],[0.017,43.377],[-27.33,69.218],[-30.931,69.218],[-32.134,68.081],[-32.134,64.678],[-1.783,35.998],[1.818,35.998],[32.169,64.678]]}]},{"t":211}]},"nm":"Path 1"},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Shape 1"}],"bounds":{"l":-34,"t":-34,"b":71,"r":34},"ip":48,"op":212.5,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"House","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","closed":false,"ks":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":49,"s":[{"i":[[0,0],[-1.781,0.009],[-1.434,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.781,-0.009],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-36.602,33.875],[-28.531,33.884],[-21.643,33.78],[21.643,33.78],[31.861,33.83],[36.591,33.687]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}]},{"i":{"x":0,"y":1},"o":{"x":0,"y":0},"n":"0_1_0_0","t":50,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":67,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.861,"y":0},"n":"0p833_0p833_0p861_0","t":191.5,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.531,-2.527],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.174,-2.527]]}],"e":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":207,"s":[{"i":[[0,0],[0,0],[-1.434,0],[0,0],[0,1.434],[0,0]],"o":[[0,0],[0,1.434],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-24.551,31.344],[-24.531,31.384],[-21.643,33.78],[21.643,33.78],[24.174,31.384],[24.154,31.344]]}],"e":[{"i":[[0,0],[-1.781,0.009],[-1.434,0],[0,0],[0,0],[0,0]],"o":[[0,0],[1.781,-0.009],[0,0],[1.434,0],[0,0],[0,0]],"v":[[-36.602,33.875],[-28.531,33.884],[-21.643,33.78],[21.643,33.78],[31.861,33.83],[36.591,33.687]]}]},{"t":208}]},"nm":"Path 2"},{"ty":"st","fillEnabled":true,"c":{"k":[0,0,0,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":2,"nm":"Stroke 1"},{"ty":"tr","p":{"k":[0,0]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Shape 1"},{"ty":"tm","s":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[30],"e":[13]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[13],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[0],"e":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":207,"s":[0],"e":[11.5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":208,"s":[11.5],"e":[24.6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":209,"s":[24.6],"e":[50]},{"t":211}]},"e":{"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":48,"s":[70.26],"e":[86.3]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":49,"s":[86.3],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":50,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":207,"s":[100],"e":[88.6]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":208,"s":[88.6],"e":[75.06]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":209,"s":[75.06],"e":[50]},{"t":211}]},"o":{"k":0},"m":1,"nm":"Trim Paths 1"}],"bounds":{"l":-38,"t":-4,"b":35,"r":38},"ip":48,"op":212,"st":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[375,667,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[1019.074,1544.074]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[26.537,0.037]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":-637,"t":-1288,"b":1288,"r":877},"ip":0,"op":300,"st":0}],"ip":0,"op":300,"fr":60,"w":750,"h":1334} \ No newline at end of file diff --git a/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.h b/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.h index 13c3af6116..d38665d783 100644 --- a/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.h +++ b/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.h @@ -8,6 +8,7 @@ #import #import "LAAnimatableValue.h" +@class LAComposition; @interface CAAnimationGroup (LAAnimatableGroup) diff --git a/LotteAnimator/InOutAnimation.json b/LotteAnimator/InOutAnimation.json new file mode 100644 index 0000000000..c07b2a1800 --- /dev/null +++ b/LotteAnimator/InOutAnimation.json @@ -0,0 +1 @@ +{"assets":[],"v":"4.1.7","ddd":0,"layers":[{"ddd":0,"ind":0,"ty":4,"nm":"Shape Layer 6","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[118.677,264.516,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[69.793,157.939]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[21,255,0,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[86.38,178.163]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":24,"t":74,"b":318,"r":149},"ip":124,"op":180,"st":0},{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 4","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[384,300,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[71.103,123.916]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[21,255,0,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[96.713,149.861]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":36,"t":68,"b":255,"r":157},"ip":0,"op":54,"st":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 3","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[384,300,0]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[68.435,133.468]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[21,255,0,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-90.912,152.218]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":-137,"t":64,"b":240,"r":-45},"ip":0,"op":18,"st":-98},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":0,"s":[427.548,318.548,0],"e":[800.935,318.548,0],"to":[62.2311820983887,0,0],"ti":[14.1129026412964,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"n":"0p833_0p833_0p167_0p167","t":68,"s":[800.935,318.548,0],"e":[342.871,318.548,0],"to":[-14.1129026412964,0,0],"ti":[76.3440856933594,0,0]},{"t":132}]},"a":{"k":[0,0,0]},"s":{"k":[100,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[104.48,110.843]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[0,24,255,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-212.405,-86.514]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":-282,"t":-160,"b":-13,"r":-143},"ip":0,"op":180,"st":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 2","ks":{"o":{"k":100},"r":{"k":0},"p":{"k":[384,300,0]},"a":{"k":[0,0,0]},"s":{"k":[43.845,100,100]}},"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[165.108,64.778]},"p":{"k":[0,0]},"r":{"k":0},"nm":"Rectangle Path 1","closed":true},{"ty":"st","fillEnabled":true,"c":{"k":[255,255,255,255]},"o":{"k":100},"w":{"k":2},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1"},{"ty":"fl","fillEnabled":true,"c":{"k":[255,0,15,255]},"o":{"k":100},"nm":"Fill 1"},{"ty":"tr","p":{"k":[-20.801,-72.45]},"a":{"k":[0,0]},"s":{"k":[100,100]},"r":{"k":0},"o":{"k":100},"sk":{"k":0},"sa":{"k":0}}],"nm":"Rectangle 1"}],"bounds":{"l":-130,"t":-116,"b":-29,"r":88},"ip":30,"op":98,"st":0}],"ip":0,"op":180,"fr":60,"w":768,"h":600} \ No newline at end of file diff --git a/LotteAnimator/LAAnimatableLayer.h b/LotteAnimator/LAAnimatableLayer.h new file mode 100644 index 0000000000..0a9db53ed1 --- /dev/null +++ b/LotteAnimator/LAAnimatableLayer.h @@ -0,0 +1,23 @@ +// +// LAAnimatableLayer.h +// LotteAnimator +// +// Created by brandon_withrow on 7/21/16. +// Copyright © 2016 Brandon Withrow. All rights reserved. +// + +#import + +@interface LAAnimatableLayer : CALayer + +@property (nonatomic, strong) NSArray *animationSublayers; +@property (nonatomic, strong) NSArray *childLayers; + +@property (nonatomic, assign) BOOL loopAnimation; +@property (nonatomic, assign) BOOL autoReverseAnimation; +@property (nonatomic, assign) CGFloat animationProgress; + +- (void)play; +- (void)pause; + +@end diff --git a/LotteAnimator/LAAnimatableLayer.m b/LotteAnimator/LAAnimatableLayer.m new file mode 100644 index 0000000000..1f5cc86e41 --- /dev/null +++ b/LotteAnimator/LAAnimatableLayer.m @@ -0,0 +1,94 @@ +// +// LAAnimatableLayer.m +// LotteAnimator +// +// Created by brandon_withrow on 7/21/16. +// Copyright © 2016 Brandon Withrow. All rights reserved. +// + +#import "LAAnimatableLayer.h" + +@implementation LAAnimatableLayer + +- (void)play { + [self _resumeLayer:self]; + for (CALayer *layer in self.animationSublayers) { + [self _resumeLayer:layer]; + } + + for (LAAnimatableLayer *layer in self.childLayers) { + [layer play]; + } +} + +- (void)pause { + [self _pauseLayer:self]; + for (CALayer *layer in self.animationSublayers) { + [self _pauseLayer:layer]; + } + + for (LAAnimatableLayer *layer in self.childLayers) { + [layer pause]; + } +} + +- (void)setLoopAnimation:(BOOL)loopAnimation { + self.repeatCount = loopAnimation ? HUGE_VALF : 0; + for (CALayer *layer in self.animationSublayers) { + layer.repeatCount = loopAnimation ? HUGE_VALF : 0; + } + + for (LAAnimatableLayer *layer in self.childLayers) { + [layer setLoopAnimation:loopAnimation]; + } +} + +- (void)setAnimationProgress:(CGFloat)animationProgress { + self.speed = 0.0; + self.timeOffset = 0.0; + self.beginTime = 0.0; + self.beginTime = [self convertTime:CACurrentMediaTime() fromLayer:nil]; + self.timeOffset = [self convertTime:CACurrentMediaTime() fromLayer:nil] + animationProgress; + + for (CALayer *layer in self.animationSublayers) { + layer.speed = 0.0; + layer.timeOffset = 0.0; + layer.beginTime = 0.0; + layer.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; + layer.timeOffset = [layer convertTime:CACurrentMediaTime() fromLayer:nil] + animationProgress; + } + + for (LAAnimatableLayer *layer in self.childLayers) { + [layer setAnimationProgress:animationProgress]; + } + +} + +- (void)setAutoReverseAnimation:(BOOL)autoReverseAnimation { + self.autoreverses = autoReverseAnimation; + for (CALayer *layer in self.animationSublayers) { + layer.autoreverses = autoReverseAnimation; + } + + for (LAAnimatableLayer *layer in self.childLayers) { + [layer setAutoReverseAnimation:autoReverseAnimation]; + } +} + +-(void)_pauseLayer:(CALayer*)layer { + CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; + layer.speed = 0.0; + layer.timeOffset = pausedTime; +} + +-(void)_resumeLayer:(CALayer*)layer { + CFTimeInterval pausedTime = [layer timeOffset]; + layer.speed = 1.0; + layer.timeOffset = 0.0; + layer.beginTime = 0.0; + CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; + layer.beginTime = timeSincePause; +} + + +@end diff --git a/LotteAnimator/LACompView.h b/LotteAnimator/LACompView.h index e91273fe0d..c9fe2cfb6d 100644 --- a/LotteAnimator/LACompView.h +++ b/LotteAnimator/LACompView.h @@ -12,10 +12,14 @@ - (instancetype)initWithModel:(LAComposition *)model; -@property (nonatomic, strong) LAComposition *sceneModel; +@property (nonatomic, readonly) LAComposition *sceneModel; @property (nonatomic, assign) BOOL debugModeOn; -@property (nonatomic, assign) BOOL loop; + +@property (nonatomic, assign) BOOL loopAnimation; +@property (nonatomic, assign) BOOL autoReverseAnimation; +@property (nonatomic, assign) CGFloat animationProgress; - (void)play; +- (void)pause; @end diff --git a/LotteAnimator/LACompView.m b/LotteAnimator/LACompView.m index fce533ed43..08f7e2e978 100644 --- a/LotteAnimator/LACompView.m +++ b/LotteAnimator/LACompView.m @@ -26,11 +26,13 @@ - (void)_buildSubviewsFromModel { NSMutableDictionary *layerMap = [NSMutableDictionary dictionary]; - for (LALayer *layer in _sceneModel.layers) { + + NSArray *reversedItems = [[_sceneModel.layers reverseObjectEnumerator] allObjects]; + + for (LALayer *layer in reversedItems) { LALayerView *layerView = [[LALayerView alloc] initWithModel:layer inComposition:_sceneModel]; layerMap[layer.layerID] = layerView; - [self addSubview:layerView]; - [self sendSubviewToBack:layerView]; + [self.layer addSublayer:layerView]; } _layerMap = layerMap; } @@ -44,15 +46,30 @@ for (LALayerView *child in _layerMap.allValues) { if ([child isKindOfClass:[LALayerView class]]) { [child setDebugModeOn:debugModeOn]; - child.alpha = debugModeOn ? 0.5 : 1; + child.opacity = debugModeOn ? 0.5 : 1; } } } - (void)play { + [CATransaction begin]; for (LALayerView *layerView in _layerMap.allValues) { - [layerView startAnimation]; + [layerView play]; + } + [CATransaction commit]; +} + +- (void)pause { + for (LALayerView *layerView in _layerMap.allValues) { + [layerView pause]; } } +- (void)setAnimationProgress:(CGFloat)animationProgress { + for (LALayerView *layerView in _layerMap.allValues) { + [layerView setAnimationProgress:animationProgress]; + } +} + + @end diff --git a/LotteAnimator/LAComposition.m b/LotteAnimator/LAComposition.m index cc85bd2551..1226e0aaff 100644 --- a/LotteAnimator/LAComposition.m +++ b/LotteAnimator/LAComposition.m @@ -43,27 +43,10 @@ NSMutableArray *layers = [NSMutableArray array]; NSMutableDictionary *modelMap = [NSMutableDictionary dictionary]; - NSMutableDictionary *parentToChildrenMap = [NSMutableDictionary dictionary]; - for (NSDictionary *layerJSON in layersJSON) { - LALayer *layer = [[LALayer alloc] initWithJSON:layerJSON frameRate:_framerate compBounds:_compBounds]; + LALayer *layer = [[LALayer alloc] initWithJSON:layerJSON fromComposition:self]; [layers addObject:layer]; modelMap[layer.layerID] = layer; - - if (layer.parentID) { - NSMutableArray *children = parentToChildrenMap[layer.parentID]; - if (!children) { - children = [NSMutableArray array]; - parentToChildrenMap[layer.parentID] = children; - } - [children addObject:[layer.layerID copy]]; - } - } - - for (NSNumber *parent in parentToChildrenMap.allKeys) { - NSArray *children = parentToChildrenMap[parent]; - LALayer *parentLayer = modelMap[parent]; - parentLayer.childrenIDs = children; } _modelMap = modelMap; diff --git a/LotteAnimator/LAGroupLayerView.h b/LotteAnimator/LAGroupLayerView.h index 1c1d2a60b5..bbb5398d38 100644 --- a/LotteAnimator/LAGroupLayerView.h +++ b/LotteAnimator/LAGroupLayerView.h @@ -7,10 +7,12 @@ // #import +#import "LAAnimatableLayer.h" + @class LAShapeGroup; @class LAShapeTransform; -@interface LAGroupLayerView : CALayer +@interface LAGroupLayerView : LAAnimatableLayer - (instancetype)initWithShapeGroup:(LAShapeGroup *)shapeGroup transform:(LAShapeTransform *)transform; diff --git a/LotteAnimator/LAGroupLayerView.m b/LotteAnimator/LAGroupLayerView.m index a7c40d6e17..7a5c7d36aa 100644 --- a/LotteAnimator/LAGroupLayerView.m +++ b/LotteAnimator/LAGroupLayerView.m @@ -81,7 +81,14 @@ } _groupLayers = groupLayers; _shapeLayers = shapeLayers; + + NSMutableArray *childLayers = [NSMutableArray array]; + [childLayers addObjectsFromArray:groupLayers]; + [childLayers addObjectsFromArray:shapeLayers]; + self.childLayers = childLayers; + [self _buildAnimation]; + [self pause]; } - (void)_buildAnimation { @@ -91,20 +98,8 @@ @"anchorPoint" : _shapeTransform.anchor, @"transform" : _shapeTransform.scale, @"sublayerTransform.rotation" : _shapeTransform.rotation}]; - } -} - -- (void)startAnimation { - if (_animation) { [self addAnimation:_animation forKey:@"lotteAnimation"]; } - for (LAGroupLayerView *groupLayer in _groupLayers) { - [groupLayer startAnimation]; - } - - for (LAShapeLayerView *shapeLayer in _shapeLayers) { - [shapeLayer startAnimation]; - } } - (void)setDebugModeOn:(BOOL)debugModeOn { diff --git a/LotteAnimator/LALayer.h b/LotteAnimator/LALayer.h index 600868a07a..b77efd9112 100644 --- a/LotteAnimator/LALayer.h +++ b/LotteAnimator/LALayer.h @@ -16,6 +16,7 @@ @class LAAnimatableNumberValue; @class LAAnimatableRectValue; @class LAAnimatableScaleValue; +@class LAComposition; typedef enum : NSInteger { LALayerTypeNone, @@ -27,16 +28,16 @@ typedef enum : NSInteger { @interface LALayer : NSObject -- (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds; +- (instancetype)initWithJSON:(NSDictionary *)jsonDictionary fromComposition:(LAComposition *)composition; @property (nonatomic, readonly) NSString *layerName; @property (nonatomic, readonly) NSNumber *layerID; @property (nonatomic, readonly) LALayerType layerType; @property (nonatomic, readonly) NSNumber *parentID; -@property (nonatomic, strong) NSArray *childrenIDs; @property (nonatomic, readonly) NSNumber *inFrame; @property (nonatomic, readonly) NSNumber *outFrame; @property (nonatomic, readonly) CGRect compBounds; +@property (nonatomic, readonly) NSNumber *framerate; @property (nonatomic, readonly) NSArray *shapes; @property (nonatomic, readonly) NSArray *masks; @@ -51,4 +52,9 @@ typedef enum : NSInteger { @property (nonatomic, readonly) LAAnimatablePointValue *anchor; @property (nonatomic, readonly) LAAnimatableScaleValue *scale; +@property (nonatomic, readonly) BOOL hasInOutAnimation; +@property (nonatomic, readonly) NSArray *inOutKeyframes; +@property (nonatomic, readonly) NSArray *inOutKeyTimes; +@property (nonatomic, readonly) NSTimeInterval compDuration; + @end diff --git a/LotteAnimator/LALayer.m b/LotteAnimator/LALayer.m index 600e94e7f8..078e534bc6 100644 --- a/LotteAnimator/LALayer.m +++ b/LotteAnimator/LALayer.m @@ -12,21 +12,23 @@ #import "LAAnimatableNumberValue.h" #import "LAAnimatableScaleValue.h" #import "LAShapeGroup.h" +#import "LAComposition.h" @implementation LALayer -- (instancetype)initWithJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds { +- (instancetype)initWithJSON:(NSDictionary *)jsonDictionary fromComposition:(LAComposition *)composition { self = [super init]; if (self) { - [self _mapFromJSON:jsonDictionary frameRate:frameRate compBounds:compBounds]; + [self _mapFromJSON:jsonDictionary fromComposition:composition]; } return self; } -- (void)_mapFromJSON:(NSDictionary *)jsonDictionary frameRate:(NSNumber *)frameRate compBounds:(CGRect)compBounds { +- (void)_mapFromJSON:(NSDictionary *)jsonDictionary fromComposition:(LAComposition *)composition { _layerName = [jsonDictionary[@"nm"] copy]; _layerID = [jsonDictionary[@"ind"] copy]; - _compBounds = compBounds; + _compBounds = composition.compBounds; + _framerate = composition.framerate; NSNumber *layerType = jsonDictionary[@"ty"]; if (layerType.integerValue <= LALayerTypeShape) { @@ -47,13 +49,13 @@ NSDictionary *opacity = ks[@"o"]; if (opacity) { - _opacity = [[LAAnimatableNumberValue alloc] initWithNumberValues:opacity frameRate:frameRate]; + _opacity = [[LAAnimatableNumberValue alloc] initWithNumberValues:opacity frameRate:_framerate]; [_opacity remapValuesFromMin:@0 fromMax:@100 toMin:@0 toMax:@1]; } NSDictionary *rotation = ks[@"r"]; if (rotation) { - _rotation = [[LAAnimatableNumberValue alloc] initWithNumberValues:rotation frameRate:frameRate]; + _rotation = [[LAAnimatableNumberValue alloc] initWithNumberValues:rotation frameRate:_framerate]; [_rotation remapValueWithBlock:^CGFloat(CGFloat inValue) { return DegreesToRadians(inValue); }]; @@ -61,34 +63,69 @@ NSDictionary *position = ks[@"p"]; if (position) { - _position = [[LAAnimatablePointValue alloc] initWithPointValues:position frameRate:frameRate]; + _position = [[LAAnimatablePointValue alloc] initWithPointValues:position frameRate:_framerate]; } NSDictionary *anchor = ks[@"a"]; if (anchor) { - _anchor = [[LAAnimatablePointValue alloc] initWithPointValues:anchor frameRate:frameRate]; - [_anchor remapPointsFromBounds:compBounds toBounds:CGRectMake(0, 0, 1, 1)]; + _anchor = [[LAAnimatablePointValue alloc] initWithPointValues:anchor frameRate:_framerate]; + [_anchor remapPointsFromBounds:_compBounds toBounds:CGRectMake(0, 0, 1, 1)]; _anchor.usePathAnimation = NO; } NSDictionary *scale = ks[@"s"]; if (scale) { - _scale = [[LAAnimatableScaleValue alloc] initWithScaleValues:scale frameRate:frameRate]; + _scale = [[LAAnimatableScaleValue alloc] initWithScaleValues:scale frameRate:_framerate]; } NSMutableArray *masks = [NSMutableArray array]; for (NSDictionary *maskJSON in jsonDictionary[@"masksProperties"]) { - LAMask *mask = [[LAMask alloc] initWithJSON:maskJSON frameRate:frameRate]; + LAMask *mask = [[LAMask alloc] initWithJSON:maskJSON frameRate:_framerate]; [masks addObject:mask]; } _masks = masks; NSMutableArray *shapes = [NSMutableArray array]; for (NSDictionary *shapeJSON in jsonDictionary[@"shapes"]) { - LAShapeGroup *group = [[LAShapeGroup alloc] initWithJSON:shapeJSON frameRate:frameRate compBounds:compBounds]; + LAShapeGroup *group = [[LAShapeGroup alloc] initWithJSON:shapeJSON frameRate:_framerate compBounds:_compBounds]; [shapes addObject:group]; } _shapes = shapes; + + BOOL hasInAnmation = (_inFrame.integerValue > composition.startFrame.integerValue); + BOOL hasOutAnimation = (_outFrame.integerValue < composition.endFrame.integerValue); + _hasInOutAnimation = hasInAnmation || hasOutAnimation; + if (_hasInOutAnimation) { + NSMutableArray *keys = [NSMutableArray array]; + NSMutableArray *keyTimes = [NSMutableArray array]; + CGFloat compLength = composition.endFrame.floatValue - composition.startFrame.floatValue; + + if (hasInAnmation) { + [keys addObject:@1]; + [keyTimes addObject:@0]; + [keys addObject:@0]; + CGFloat inTime = _inFrame.floatValue / compLength; + [keyTimes addObject:@(inTime)]; + } else { + [keys addObject:@0]; + [keyTimes addObject:@0]; + } + + if (hasOutAnimation) { + [keys addObject:@1]; + CGFloat outTime = _outFrame.floatValue / compLength; + [keyTimes addObject:@(outTime)]; + [keys addObject:@1]; + [keyTimes addObject:@1]; + } else { + [keys addObject:@0]; + [keyTimes addObject:@1]; + } + + _compDuration = composition.timeDuration; + _inOutKeyTimes = keyTimes; + _inOutKeyframes = keys; + } } @end diff --git a/LotteAnimator/LALayerView.h b/LotteAnimator/LALayerView.h index f1a91f2415..072203362f 100644 --- a/LotteAnimator/LALayerView.h +++ b/LotteAnimator/LALayerView.h @@ -7,15 +7,15 @@ // #import +#import "LAAnimatableLayer.h" + #import "LAModels.h" -@interface LALayerView : UIView +@interface LALayerView : LAAnimatableLayer - (instancetype)initWithModel:(LALayer *)model inComposition:(LAComposition *)comp; @property (nonatomic, readonly) LALayer *layerModel; @property (nonatomic, assign) BOOL debugModeOn; -- (void)startAnimation; - @end diff --git a/LotteAnimator/LALayerView.m b/LotteAnimator/LALayerView.m index 01ee171da3..810fa3996d 100644 --- a/LotteAnimator/LALayerView.m +++ b/LotteAnimator/LALayerView.m @@ -11,7 +11,7 @@ #import "LAGroupLayerView.h" #import "CAAnimationGroup+LAAnimatableGroup.h" -@interface LAParentLayer : CALayer +@interface LAParentLayer : LAAnimatableLayer - (instancetype)initWithParentModel:(LALayer *)parent compBounds:(CGRect)bounds; - (void)startAnimation; @@ -39,6 +39,7 @@ self.transform = _parentModel.scale.initialScale; self.sublayerTransform = CATransform3DMakeRotation(_parentModel.rotation.initialValue.floatValue, 0, 0, 1); [self _buildAnimations]; + [self pause]; } - (void)_buildAnimations { @@ -46,12 +47,7 @@ @"anchorPoint" : _parentModel.anchor, @"transform" : _parentModel.scale, @"sublayerTransform.rotation" : _parentModel.rotation}]; -} - -- (void)startAnimation { - if (_animation) { - [self addAnimation:_animation forKey:@"lotteAnimation"]; - } + [self addAnimation:_animation forKey:@"lotteAnimation"]; } @end @@ -61,11 +57,12 @@ CALayer *_childContainerLayer; CALayer *_rotationLayer; CAAnimationGroup *_animation; + CAKeyframeAnimation *_inOutAnimation; NSArray *_parentLayers; } - (instancetype)initWithModel:(LALayer *)model inComposition:(LAComposition *)comp { - self = [super initWithFrame:model.compBounds]; + self = [super init]; if (self) { _layerModel = model; [self _setupViewFromModelInComposition:comp]; @@ -74,8 +71,10 @@ } - (void)_setupViewFromModelInComposition:(LAComposition *)comp { + self.bounds = comp.compBounds; + self.anchorPoint = CGPointZero; _childContainerLayer = [CALayer new]; - // Setup Parents + self.animationSublayers = @[_childContainerLayer]; NSNumber *parentID = _layerModel.parentID; CALayer *currentChild = _childContainerLayer; @@ -93,14 +92,14 @@ if (parentLayers.count) { _parentLayers = parentLayers; } - [self.layer addSublayer:currentChild]; + [self addSublayer:currentChild]; - self.alpha = _layerModel.opacity.initialValue.floatValue; + _childContainerLayer.opacity = _layerModel.opacity.initialValue.floatValue; _childContainerLayer.position = _layerModel.position.initialPoint; _childContainerLayer.anchorPoint = _layerModel.anchor.initialPoint; _childContainerLayer.transform = _layerModel.scale.initialScale; _childContainerLayer.sublayerTransform = CATransform3DMakeRotation(_layerModel.rotation.initialValue.floatValue, 0, 0, 1); - self.clipsToBounds = NO; + self.hidden = _layerModel.inFrame.integerValue > comp.startFrame.integerValue; NSArray *groupItems = _layerModel.shapes; NSArray *reversedItems = [[groupItems reverseObjectEnumerator] allObjects]; @@ -119,7 +118,14 @@ } _shapeLayers = shapeLayers; + + NSMutableArray *childLayers = [NSMutableArray array]; + [childLayers addObjectsFromArray:_parentLayers]; + [childLayers addObjectsFromArray:_shapeLayers]; + self.childLayers = childLayers; + [self _buildAnimations]; + [self pause]; } - (void)_buildAnimations { @@ -128,17 +134,23 @@ @"anchorPoint" : _layerModel.anchor, @"transform" : _layerModel.scale, @"sublayerTransform.rotation" : _layerModel.rotation}]; -} + -- (void)startAnimation { if (_animation) { [_childContainerLayer addAnimation:_animation forKey:@"lotteAnimation"]; } - for (LAGroupLayerView *groupLayer in _shapeLayers) { - [groupLayer startAnimation]; - } - for (LAParentLayer *parent in _parentLayers) { - [parent startAnimation]; + + if (_layerModel.hasInOutAnimation) { + CAKeyframeAnimation *inOutAnimation = [CAKeyframeAnimation animationWithKeyPath:@"hidden"]; + inOutAnimation.keyTimes = _layerModel.inOutKeyTimes; + inOutAnimation.values = _layerModel.inOutKeyframes; + inOutAnimation.duration = _layerModel.compDuration; + inOutAnimation.calculationMode = kCAAnimationDiscrete; + inOutAnimation.fillMode = kCAFillModeForwards; + inOutAnimation.removedOnCompletion = NO; + + _inOutAnimation = inOutAnimation; + [self addAnimation:_inOutAnimation forKey:@""]; } } @@ -148,9 +160,9 @@ - (void)setDebugModeOn:(BOOL)debugModeOn { _debugModeOn = debugModeOn; - self.layer.borderColor = debugModeOn ? [UIColor redColor].CGColor : nil; - self.layer.borderWidth = debugModeOn ? 2 : 0; - self.backgroundColor = debugModeOn ? [[UIColor blueColor] colorWithAlphaComponent:0.2] : [UIColor clearColor]; + self.borderColor = debugModeOn ? [UIColor redColor].CGColor : nil; + self.borderWidth = debugModeOn ? 2 : 0; + self.backgroundColor = debugModeOn ? [[UIColor blueColor] colorWithAlphaComponent:0.2].CGColor : [UIColor clearColor].CGColor; for (LAGroupLayerView *group in _shapeLayers) { group.debugModeOn = debugModeOn; diff --git a/LotteAnimator/LARectShapeLayer.h b/LotteAnimator/LARectShapeLayer.h index ff11fcd942..a88c95524b 100644 --- a/LotteAnimator/LARectShapeLayer.h +++ b/LotteAnimator/LARectShapeLayer.h @@ -7,8 +7,9 @@ // #import +#import "LAAnimatableLayer.h" -@interface LARectShapeLayer : CALayer +@interface LARectShapeLayer : LAAnimatableLayer - (instancetype)initWithRectShape:(LAShapeRectangle *)rectShape fill:(LAShapeFill *)fill diff --git a/LotteAnimator/LARectShapeLayer.m b/LotteAnimator/LARectShapeLayer.m index 6c28b3d5c6..6015f21af7 100644 --- a/LotteAnimator/LARectShapeLayer.m +++ b/LotteAnimator/LARectShapeLayer.m @@ -60,6 +60,7 @@ _strokeLayer.backgroundColor = nil; [self addSublayer:_strokeLayer]; [self _buildAnimation]; + [self pause]; } return self; diff --git a/LotteAnimator/LAShapeLayerView.h b/LotteAnimator/LAShapeLayerView.h index caa62872e3..b15eb26e81 100644 --- a/LotteAnimator/LAShapeLayerView.h +++ b/LotteAnimator/LAShapeLayerView.h @@ -7,8 +7,9 @@ // #import +#import "LAAnimatableLayer.h" -@interface LAShapeLayerView : CALayer +@interface LAShapeLayerView : LAAnimatableLayer - (instancetype)initWithShape:(LAShapePath *)shape fill:(LAShapeFill *)fill diff --git a/LotteAnimator/LAShapeLayerView.m b/LotteAnimator/LAShapeLayerView.m index decd5f8e35..48fe753583 100644 --- a/LotteAnimator/LAShapeLayerView.m +++ b/LotteAnimator/LAShapeLayerView.m @@ -56,8 +56,11 @@ _strokeLayer.opacity = _stroke.opacity.initialValue.floatValue; _strokeLayer.lineWidth = _stroke.width.initialValue.floatValue; _strokeLayer.fillColor = nil; + self.animationSublayers = @[_fillLayer, _strokeLayer]; [self addSublayer:_strokeLayer]; [self _buildAnimation]; + [self pause]; + } return self; @@ -70,6 +73,7 @@ @"anchorPoint" : _transform.anchor, @"transform" : _transform.scale, @"sublayerTransform.rotation" : _transform.rotation}]; + [self addAnimation:_animation forKey:@"LotteAnimation"]; } if (_stroke) { @@ -77,24 +81,13 @@ @"opacity" : _stroke.opacity, @"lineWidth" : _stroke.width, @"path" : _path.shapePath}]; + [_strokeLayer addAnimation:_strokeAnimation forKey:@""]; } if (_fill) { _fillAnimation = [CAAnimationGroup animationGroupForAnimatablePropertiesWithKeyPaths:@{@"fillColor" : _fill.color, @"opacity" : _fill.opacity, @"path" : _path.shapePath}]; - } -} - -- (void)startAnimation { - if (_animation) { - [self addAnimation:_animation forKey:@"LotteAnimation"]; - } - if (_strokeAnimation) { - [_strokeLayer addAnimation:_strokeAnimation forKey:@""]; - } - - if (_fillAnimation) { [_fillLayer addAnimation:_fillAnimation forKey:@""]; } } diff --git a/LotteAnimator/ViewController.m b/LotteAnimator/ViewController.m index a32d2f2cd8..56c8c7b74e 100644 --- a/LotteAnimator/ViewController.m +++ b/LotteAnimator/ViewController.m @@ -43,12 +43,12 @@ @property (nonatomic, strong) UIButton *openButton; @property (nonatomic, strong) LAComposition *currentScene; -@property (nonatomic, strong) UIView *currentSceneView; +@property (nonatomic, strong) LACompView *currentSceneView; @property (nonatomic, strong) UIView *logView; @property (nonatomic, strong) UITextView *logTextField; @property (nonatomic, strong) UIButton *openLogButton; @property (nonatomic, strong) UIButton *closeLogButton; - +@property (nonatomic, strong) UISlider *animationSlider; @end @implementation ViewController @@ -104,12 +104,20 @@ [self.openLogButton addTarget:self action:@selector(_openLogButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.openLogButton]; + self.animationSlider = [[UISlider alloc] initWithFrame:CGRectZero]; + + [self.animationSlider addTarget:self action:@selector(_sliderChanged) forControlEvents:UIControlEventValueChanged]; + + [self.view addSubview:self.animationSlider]; + self.closeLogButton = [UIButton buttonWithType:UIButtonTypeCustom]; self.closeLogButton.frame = self.view.bounds; [self.closeLogButton addTarget:self action:@selector(_closeLog) forControlEvents:UIControlEventTouchUpInside]; self.closeLogButton.hidden = YES; [self.view addSubview:self.closeLogButton]; + + self.logView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.bounds.size.height * 0.3, self.view.bounds.size.width, self.view.bounds.size.height * 0.7)]; self.logView.backgroundColor = [UIColor blackColor]; self.logView.transform = CGAffineTransformMakeTranslation(0, self.logView.bounds.size.height); @@ -206,6 +214,12 @@ self.closeLogButton.frame = self.view.bounds; + self.animationSlider.frame = CGRectAttachedRightToRect(self.openLogButton.frame, CGSizeMake(200, 44), 12, YES); + +} + +- (void)_sliderChanged { + self.currentSceneView.animationProgress = self.animationSlider.value; } - (void)_openButtonPressed { @@ -280,5 +294,6 @@ self.currentSceneView = compView; [self.view sendSubviewToBack:self.currentSceneView]; [compView performSelector:@selector(play) withObject:nil afterDelay:1]; + [compView performSelector:@selector(pause) withObject:nil afterDelay:2]; } @end