├── .gitignore ├── ARPowerPanels.playgroundbook ├── Contents │ ├── Chapters │ │ └── Document8.playgroundchapter │ │ │ ├── Manifest.plist │ │ │ └── Pages │ │ │ └── Exercise1.playgroundpage │ │ │ ├── Contents.swift │ │ │ ├── LiveViewOld.swift │ │ │ ├── Manifest.plist │ │ │ └── Sources │ │ │ └── ARKitViewController.swift │ ├── Manifest.plist │ ├── PrivateResources │ │ ├── Images │ │ │ ├── ARPowerPanelsIcon.png │ │ │ ├── LtC2-icon.png │ │ │ └── rose.jpg │ │ ├── art.scnassets │ │ │ ├── camera.scn │ │ │ ├── fox │ │ │ │ ├── jump_dust.scn │ │ │ │ ├── max.scn │ │ │ │ ├── max_AO.png │ │ │ │ ├── max_diffuse.png │ │ │ │ ├── max_diffuseB.png │ │ │ │ ├── max_diffuseC.png │ │ │ │ ├── max_diffuseD.png │ │ │ │ ├── max_idle.scn │ │ │ │ ├── max_jump.scn │ │ │ │ ├── max_roughness.png │ │ │ │ ├── max_specular.png │ │ │ │ ├── max_spin.scn │ │ │ │ ├── max_walk.scn │ │ │ │ └── smoke.png │ │ │ ├── lowPolyTree.dae │ │ │ ├── ship.scn │ │ │ ├── stones_and_treasure.dae │ │ │ ├── texture.png │ │ │ └── wolf │ │ │ │ ├── textures │ │ │ │ ├── Wolf_Body.jpg │ │ │ │ ├── Wolf_Eyes_1.jpg │ │ │ │ ├── Wolf_Eyes_2.jpg │ │ │ │ └── Wolf_Fur.jpg │ │ │ │ └── wolf.dae │ │ ├── checkmarkWhite.png │ │ ├── closeWhite.png │ │ ├── imagesAdventure │ │ │ ├── Arrow.png │ │ │ ├── Barrel_Clo.png │ │ │ ├── Barrel_Open.png │ │ │ ├── Box.png │ │ │ ├── Bullion.png │ │ │ ├── Chest_Clos.png │ │ │ ├── Chest_Open.png │ │ │ ├── Coin.png │ │ │ ├── Crown.png │ │ │ ├── Crystal_1.png │ │ │ ├── Crystal_2.png │ │ │ ├── Crystal_3.png │ │ │ ├── Crystal_4.png │ │ │ ├── Emeraid.png │ │ │ ├── Exlir_Of0.png │ │ │ ├── Exlir_Of_.png │ │ │ ├── Key.png │ │ │ ├── Pick.png │ │ │ ├── Rocks_2.png │ │ │ ├── Rocks_And.png │ │ │ ├── Rocks_And0.png │ │ │ ├── Ruby.png │ │ │ ├── Shield.png │ │ │ ├── Skull.png │ │ │ ├── Stone_1.png │ │ │ ├── Stone_10.png │ │ │ ├── Stone_11.png │ │ │ ├── Stone_12.png │ │ │ ├── Stone_13.png │ │ │ ├── Stone_14.png │ │ │ ├── Stone_15.png │ │ │ ├── Stone_16.png │ │ │ ├── Stone_17.png │ │ │ ├── Stone_18.png │ │ │ ├── Stone_3.png │ │ │ ├── Stone_4.png │ │ │ ├── Stone_5.png │ │ │ ├── Stone_6.png │ │ │ ├── Stone_7.png │ │ │ ├── Stone_8.png │ │ │ ├── Sword.png │ │ │ └── Tree.png │ │ ├── menuAxis.png │ │ ├── menuFox.jpeg │ │ ├── menuLowPolyTree.png │ │ ├── menuShip.png │ │ ├── menuWolf.png │ │ ├── shapeBox.png │ │ ├── shapeCapsule.png │ │ ├── shapeCone.png │ │ ├── shapeCylinder.png │ │ ├── shapePlane.png │ │ ├── shapePyramid.png │ │ ├── shapeSphere.png │ │ ├── shapeTorus.png │ │ └── shapeTube.png │ ├── PublicResources │ │ └── rose.jpg │ └── Sources │ │ ├── Extensions │ │ ├── 2DUtilities │ │ │ ├── FTD Cells │ │ │ │ ├── HierachyCell.swift │ │ │ │ └── LabelCell.swift │ │ │ ├── FTD Helpers │ │ │ │ └── HostCell+StateType.swift │ │ │ ├── FTD Original │ │ │ │ ├── CellActions.swift │ │ │ │ ├── CellConfigType.swift │ │ │ │ ├── CellStyle.swift │ │ │ │ ├── CollectionView │ │ │ │ │ ├── CollectionCell.swift │ │ │ │ │ ├── CollectionItemConfigType.swift │ │ │ │ │ ├── FunctionalCollectionData.swift │ │ │ │ │ └── UICollectionView+Reusable.swift │ │ │ │ ├── HostCell.swift │ │ │ │ ├── Info.plist │ │ │ │ ├── Reusable.swift │ │ │ │ ├── Separator.swift │ │ │ │ ├── TableItemLayout.swift │ │ │ │ ├── TableSection.swift │ │ │ │ ├── TableSectionChangeSet.swift │ │ │ │ ├── TableSectionHeaderFooter.swift │ │ │ │ ├── TableView │ │ │ │ │ ├── FunctionalTableData.swift │ │ │ │ │ ├── TableCell.swift │ │ │ │ │ ├── TableItemConfigType.swift │ │ │ │ │ └── UITableView+Reusable.swift │ │ │ │ ├── UIView+AutoLayout.swift │ │ │ │ └── UIView+Extensions.swift │ │ │ ├── NeatConstraints │ │ │ │ ├── Constrainable.swift │ │ │ │ ├── Constraints+Activation+Priority.swift │ │ │ │ ├── NibView.swift │ │ │ │ └── UIView+Constraints.swift │ │ │ ├── PowerPanelExtensions │ │ │ │ ├── UIColor+Extensions.swift │ │ │ │ └── UIView+BorderedInputBoxes.swift │ │ │ └── UICollection+Extensions.swift │ │ ├── 3DUtilities │ │ │ ├── 3DUtilities.swift │ │ │ ├── ARSCNView+HitTest.swift │ │ │ ├── GlowEffect │ │ │ │ ├── NodeTechnique.plist │ │ │ │ └── SCNScene+Glow.swift │ │ │ └── SCNVector3+Extensions.swift │ │ └── Font+Extensions.swift │ │ ├── Info.plist │ │ ├── Nodes │ │ └── Models │ │ │ ├── Assets.swift │ │ │ ├── NodeCreator.swift │ │ │ └── NodeCreatorType.swift │ │ ├── PowerPanels.h │ │ ├── PowerPanels │ │ ├── ARPowerPanels.swift │ │ ├── HierachyPanel │ │ │ ├── HierachyPanel.swift │ │ │ └── HierarchyIteractor.swift │ │ ├── Left Menu │ │ │ ├── MenuItem.swift │ │ │ ├── MenuStackView.swift │ │ │ └── RoundedButton.swift │ │ ├── ModelCollection │ │ │ ├── ImageCollectionCell.swift │ │ │ ├── ImageCollectionView.swift │ │ │ └── ModelCollectionView.swift │ │ ├── Panel.swift │ │ ├── PanelsPresenter.swift │ │ └── TransformationPanel │ │ │ ├── NodeNames.swift │ │ │ ├── PowerPanelCheckmarkInput.swift │ │ │ ├── PowerPanelTextField.swift │ │ │ ├── Slider Input Views │ │ │ ├── DecimalTextField.swift │ │ │ ├── SliderInputsView.swift │ │ │ ├── SliderTextView.swift │ │ │ ├── SliderVector3View.swift │ │ │ └── SliderVector4View.swift │ │ │ ├── TransformationPanel.swift │ │ │ └── TransformationType.swift │ │ ├── Scene │ │ └── SceneCreator.swift │ │ └── View Controllers │ │ └── GlobalPlayground.swift ├── License.txt └── version.plist ├── ARPowerPanelsFramework ├── ARPowerPanels.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── ARPowerPanelsDemo.xcscheme ├── ARPowerPanels.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── ARPowerPanels │ ├── Extensions │ │ ├── 2DUtilities │ │ │ ├── FTD Cells │ │ │ │ ├── HierachyCell.swift │ │ │ │ └── LabelCell.swift │ │ │ ├── FTD Helpers │ │ │ │ └── HostCell+StateType.swift │ │ │ ├── FTD Original │ │ │ │ ├── CellActions.swift │ │ │ │ ├── CellConfigType.swift │ │ │ │ ├── CellStyle.swift │ │ │ │ ├── CollectionView │ │ │ │ │ ├── CollectionCell.swift │ │ │ │ │ ├── CollectionItemConfigType.swift │ │ │ │ │ ├── FunctionalCollectionData.swift │ │ │ │ │ └── UICollectionView+Reusable.swift │ │ │ │ ├── HostCell.swift │ │ │ │ ├── Info.plist │ │ │ │ ├── Reusable.swift │ │ │ │ ├── Separator.swift │ │ │ │ ├── TableItemLayout.swift │ │ │ │ ├── TableSection.swift │ │ │ │ ├── TableSectionChangeSet.swift │ │ │ │ ├── TableSectionHeaderFooter.swift │ │ │ │ ├── TableView │ │ │ │ │ ├── FunctionalTableData.swift │ │ │ │ │ ├── TableCell.swift │ │ │ │ │ ├── TableItemConfigType.swift │ │ │ │ │ └── UITableView+Reusable.swift │ │ │ │ ├── UIView+AutoLayout.swift │ │ │ │ └── UIView+Extensions.swift │ │ │ ├── NeatConstraints │ │ │ │ ├── Constrainable.swift │ │ │ │ ├── Constraints+Activation+Priority.swift │ │ │ │ ├── NibView.swift │ │ │ │ └── UIView+Constraints.swift │ │ │ ├── PowerPanelExtensions │ │ │ │ ├── UIColor+Extensions.swift │ │ │ │ └── UIView+BorderedInputBoxes.swift │ │ │ └── UICollection+Extensions.swift │ │ ├── 3DUtilities │ │ │ ├── 3DUtilities.swift │ │ │ ├── ARSCNView+HitTest.swift │ │ │ ├── GlowEffect │ │ │ │ ├── NodeTechnique.plist │ │ │ │ └── SCNScene+Glow.swift │ │ │ └── SCNVector3+Extensions.swift │ │ └── Font+Extensions.swift │ ├── Info.plist │ ├── Nodes │ │ └── Models │ │ │ ├── Assets.swift │ │ │ ├── NodeCreator.swift │ │ │ └── NodeCreatorType.swift │ ├── PowerPanels.h │ ├── PowerPanels │ │ ├── ARPowerPanels.swift │ │ ├── HierachyPanel │ │ │ ├── HierachyPanel.swift │ │ │ └── HierarchyIteractor.swift │ │ ├── Left Menu │ │ │ ├── MenuItem.swift │ │ │ ├── MenuStackView.swift │ │ │ └── RoundedButton.swift │ │ ├── ModelCollection │ │ │ ├── ImageCollectionCell.swift │ │ │ ├── ImageCollectionView.swift │ │ │ └── ModelCollectionView.swift │ │ ├── Panel.swift │ │ ├── PanelsPresenter.swift │ │ └── TransformationPanel │ │ │ ├── NodeNames.swift │ │ │ ├── PowerPanelCheckmarkInput.swift │ │ │ ├── PowerPanelTextField.swift │ │ │ ├── Slider Input Views │ │ │ ├── DecimalTextField.swift │ │ │ ├── SliderInputsView.swift │ │ │ ├── SliderTextView.swift │ │ │ ├── SliderVector3View.swift │ │ │ └── SliderVector4View.swift │ │ │ ├── TransformationPanel.swift │ │ │ └── TransformationType.swift │ ├── Resources │ │ ├── ForPlaygroundOnly │ │ │ ├── imagesAdventure │ │ │ │ ├── Arrow.png │ │ │ │ ├── Barrel_Clo.png │ │ │ │ ├── Barrel_Open.png │ │ │ │ ├── Box.png │ │ │ │ ├── Bullion.png │ │ │ │ ├── Chest_Clos.png │ │ │ │ ├── Chest_Open.png │ │ │ │ ├── Coin.png │ │ │ │ ├── Crown.png │ │ │ │ ├── Crystal_1.png │ │ │ │ ├── Crystal_2.png │ │ │ │ ├── Crystal_3.png │ │ │ │ ├── Crystal_4.png │ │ │ │ ├── Emeraid.png │ │ │ │ ├── Exlir_Of0.png │ │ │ │ ├── Exlir_Of_.png │ │ │ │ ├── Key.png │ │ │ │ ├── Pick.png │ │ │ │ ├── Rocks_2.png │ │ │ │ ├── Rocks_And.png │ │ │ │ ├── Rocks_And0.png │ │ │ │ ├── Ruby.png │ │ │ │ ├── Shield.png │ │ │ │ ├── Skull.png │ │ │ │ ├── Stone_1.png │ │ │ │ ├── Stone_10.png │ │ │ │ ├── Stone_11.png │ │ │ │ ├── Stone_12.png │ │ │ │ ├── Stone_13.png │ │ │ │ ├── Stone_14.png │ │ │ │ ├── Stone_15.png │ │ │ │ ├── Stone_16.png │ │ │ │ ├── Stone_17.png │ │ │ │ ├── Stone_18.png │ │ │ │ ├── Stone_3.png │ │ │ │ ├── Stone_4.png │ │ │ │ ├── Stone_5.png │ │ │ │ ├── Stone_6.png │ │ │ │ ├── Stone_7.png │ │ │ │ ├── Stone_8.png │ │ │ │ ├── Sword.png │ │ │ │ └── Tree.png │ │ │ ├── imagesMenu │ │ │ │ ├── checkmarkWhite.png │ │ │ │ ├── closeWhite.png │ │ │ │ ├── menuFox.jpeg │ │ │ │ ├── menuLowPolyTree.png │ │ │ │ ├── menuShip.png │ │ │ │ └── menuWolf.png │ │ │ └── imagesShapes │ │ │ │ ├── shapeBox.png │ │ │ │ ├── shapeCapsule.png │ │ │ │ ├── shapeCone.png │ │ │ │ ├── shapeCylinder.png │ │ │ │ ├── shapePlane.png │ │ │ │ ├── shapePyramid.png │ │ │ │ ├── shapeSphere.png │ │ │ │ ├── shapeTorus.png │ │ │ │ └── shapeTube.png │ │ └── art.scnassets │ │ │ ├── camera.scn │ │ │ ├── fox │ │ │ ├── jump_dust.scn │ │ │ ├── max.scn │ │ │ ├── max_AO.png │ │ │ ├── max_diffuse.png │ │ │ ├── max_diffuseB.png │ │ │ ├── max_diffuseC.png │ │ │ ├── max_diffuseD.png │ │ │ ├── max_idle.scn │ │ │ ├── max_jump.scn │ │ │ ├── max_roughness.png │ │ │ ├── max_specular.png │ │ │ ├── max_spin.scn │ │ │ ├── max_walk.scn │ │ │ └── smoke.png │ │ │ ├── lowPolyTree.dae │ │ │ ├── ship.scn │ │ │ ├── stones_and_treasure.dae │ │ │ ├── texture.png │ │ │ └── wolf │ │ │ ├── textures │ │ │ ├── Wolf_Body.jpg │ │ │ ├── Wolf_Eyes_1.jpg │ │ │ ├── Wolf_Eyes_2.jpg │ │ │ └── Wolf_Fur.jpg │ │ │ └── wolf.dae │ ├── Scene │ │ └── SceneCreator.swift │ └── View Controllers │ │ └── GlobalPlayground.swift ├── ARPowerPanelsDemo │ ├── ARKitViewController.swift │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── Contents.json │ │ │ ├── icon-29.png │ │ │ ├── icon-29@2x.png │ │ │ ├── icon-29@3x.png │ │ │ ├── icon-40.png │ │ │ ├── icon-40@2x.png │ │ │ ├── icon-40@3x.png │ │ │ ├── icon-60@2x.png │ │ │ ├── icon-60@3x.png │ │ │ ├── icon-76.png │ │ │ ├── icon-76@2x.png │ │ │ └── icon-83.5@2x.png │ │ └── Contents.json │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── GlowTechnique │ │ └── NodeRender.metal │ ├── Info.plist │ └── SceneKitViewController.swift ├── Podfile ├── Podfile.lock └── Pods │ ├── Manifest.lock │ ├── Pods.xcodeproj │ └── project.pbxproj │ ├── SwiftyTables │ ├── LICENSE │ ├── README.md │ └── SwiftyTablesProject │ │ └── SwiftyTables │ │ ├── SwiftDeclarativeTables │ │ ├── FTD Helpers │ │ │ ├── CarouselCell │ │ │ │ ├── CarouselCell.swift │ │ │ │ ├── CarouselItemCell.swift │ │ │ │ └── CarouselState.swift │ │ │ ├── HostCell+StateType.swift │ │ │ ├── NibView.swift │ │ │ └── UIView+Helpers.swift │ │ └── FunctionalTableData │ │ │ ├── CellActions.swift │ │ │ ├── CellConfigType.swift │ │ │ ├── CellStyle.swift │ │ │ ├── CollectionView │ │ │ ├── CollectionCell.swift │ │ │ ├── CollectionItemConfigType.swift │ │ │ ├── FunctionalCollectionData.swift │ │ │ └── UICollectionView+Reusable.swift │ │ │ ├── HostCell.swift │ │ │ ├── ObjCExceptionRethrower.swift │ │ │ ├── Reusable.swift │ │ │ ├── Separator.swift │ │ │ ├── TableItemLayout.swift │ │ │ ├── TableSection.swift │ │ │ ├── TableSectionChangeSet.swift │ │ │ ├── TableSectionHeaderFooter.swift │ │ │ ├── TableView │ │ │ ├── FunctionalTableData.swift │ │ │ ├── TableCell.swift │ │ │ ├── TableItemConfigType.swift │ │ │ └── UITableView+Reusable.swift │ │ │ ├── UIView+AutoLayout.swift │ │ │ └── UIView+Extensions.swift │ │ └── SwiftyTables.h │ └── Target Support Files │ ├── Pods-ARPowerPanels │ ├── Info.plist │ ├── Pods-ARPowerPanels-acknowledgements.markdown │ ├── Pods-ARPowerPanels-acknowledgements.plist │ ├── Pods-ARPowerPanels-dummy.m │ ├── Pods-ARPowerPanels-resources.sh │ ├── Pods-ARPowerPanels-umbrella.h │ ├── Pods-ARPowerPanels.debug.xcconfig │ ├── Pods-ARPowerPanels.modulemap │ └── Pods-ARPowerPanels.release.xcconfig │ ├── Pods-ARPowerPanelsDemo │ ├── Info.plist │ ├── Pods-ARPowerPanelsDemo-acknowledgements.markdown │ ├── Pods-ARPowerPanelsDemo-acknowledgements.plist │ ├── Pods-ARPowerPanelsDemo-dummy.m │ ├── Pods-ARPowerPanelsDemo-frameworks.sh │ ├── Pods-ARPowerPanelsDemo-resources.sh │ ├── Pods-ARPowerPanelsDemo-umbrella.h │ ├── Pods-ARPowerPanelsDemo.debug.xcconfig │ ├── Pods-ARPowerPanelsDemo.modulemap │ └── Pods-ARPowerPanelsDemo.release.xcconfig │ └── SwiftyTables │ ├── Info.plist │ ├── SwiftyTables-dummy.m │ ├── SwiftyTables-prefix.pch │ ├── SwiftyTables-umbrella.h │ ├── SwiftyTables.modulemap │ └── SwiftyTables.xcconfig ├── README.md ├── Screenshots ├── ARPowerPanels_1_.PNG ├── ARPowerPanels_2_.PNG ├── ARPowerPanels_3_.PNG ├── ARPowerPanels_4_.PNG ├── ARPowerPanels_5_.PNG └── ARPowerPanels_6_.PNG └── Tests.playground ├── Contents.swift └── contents.xcplayground /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | # Pods/ 49 | 50 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | # Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Chapters/Document8.playgroundchapter/Manifest.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Name 6 | Name 7 | Pages 8 | 9 | Exercise1.playgroundpage 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Chapters/Document8.playgroundchapter/Pages/Exercise1.playgroundpage/LiveViewOld.swift: -------------------------------------------------------------------------------- 1 | //// 2 | //// LiveView.swift 3 | //// 4 | //// Copyright © 2016,2017 Apple Inc. All rights reserved. 5 | //// 6 | // 7 | //// Indicate that this is the LiveView process. 8 | //Process.configureForAlwaysOnLiveView() 9 | // 10 | //// Load the scene and add any additional elements. 11 | //playgroundPrologue() 12 | // 13 | //// Present the LiveView's `SceneController`. 14 | //// (Another world instance will be created for calculating user commands) 15 | //presentWorld() 16 | // 17 | //// Start running the LiveView. 18 | //// Initially only the idle animation will show as this is 19 | //// presented before any user commands are run. 20 | //startPlayback() 21 | 22 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Chapters/Document8.playgroundchapter/Pages/Exercise1.playgroundpage/Manifest.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Description 6 | Description 7 | LiveViewEdgeToEdge 8 | 9 | LiveViewMode 10 | VisibleByDefault 11 | MaximumSupportedExecutionSpeed 12 | Fastest 13 | Name 14 | Name 15 | PlaygroundLoggingMode 16 | Off 17 | PosterReference 18 | LiveViewPoster.png 19 | Version 20 | 1.0 21 | 22 | 23 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Manifest.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Chapters 6 | 7 | Document8.playgroundchapter 8 | 9 | ContentIdentifier 10 | com.apple.playgrounds.learntocode2.edition3 11 | ContentVersion 12 | 3.0.1 13 | DeploymentTarget 14 | ios11.2 15 | DevelopmentRegion 16 | en 17 | ImageReference 18 | Images/ARPowerPanelsIcon.png 19 | Name 20 | Name 21 | SwiftVersion 22 | 4.0 23 | Version 24 | 4.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/ARPowerPanelsIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/ARPowerPanelsIcon.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/LtC2-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/LtC2-icon.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/rose.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/Images/rose.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/camera.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/camera.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/jump_dust.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/jump_dust.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_AO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_AO.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuse.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseB.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseC.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_diffuseD.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_idle.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_idle.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_jump.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_jump.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_roughness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_roughness.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_specular.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_spin.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_spin.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_walk.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/max_walk.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/smoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/fox/smoke.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/ship.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/ship.scn -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/texture.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Body.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Body.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Eyes_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Eyes_1.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Eyes_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Eyes_2.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Fur.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/art.scnassets/wolf/textures/Wolf_Fur.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/checkmarkWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/checkmarkWhite.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/closeWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/closeWhite.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Arrow.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Barrel_Clo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Barrel_Clo.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Barrel_Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Barrel_Open.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Box.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Bullion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Bullion.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Chest_Clos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Chest_Clos.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Chest_Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Chest_Open.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Coin.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crown.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_1.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_2.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_3.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Crystal_4.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Emeraid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Emeraid.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Exlir_Of0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Exlir_Of0.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Exlir_Of_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Exlir_Of_.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Key.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Pick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Pick.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_2.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_And.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_And.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_And0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Rocks_And0.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Ruby.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Shield.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Skull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Skull.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_1.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_10.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_11.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_12.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_13.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_14.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_15.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_16.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_17.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_18.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_3.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_4.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_5.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_6.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_7.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Stone_8.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Sword.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/imagesAdventure/Tree.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/menuAxis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/menuAxis.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/menuFox.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/menuFox.jpeg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/menuLowPolyTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/menuLowPolyTree.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/menuShip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/menuShip.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/menuWolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/menuWolf.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeBox.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCapsule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCapsule.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCone.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCylinder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeCylinder.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapePlane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapePlane.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapePyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapePyramid.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeSphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeSphere.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeTorus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeTorus.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeTube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PrivateResources/shapeTube.png -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/PublicResources/rose.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanels.playgroundbook/Contents/PublicResources/rose.jpg -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Cells/LabelCell.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | public typealias LabelCell = HostCell 4 | 5 | /// A very simple state for a `UILabel` allowing a quick configuration of its text, font, and color values. 6 | public struct LabelState: StateType { 7 | public let text: String 8 | public let font: UIFont 9 | public let color: UIColor 10 | 11 | public init(text: String, font: UIFont = UIFont.systemFont(ofSize: 17), color: UIColor = .black) { 12 | self.text = text 13 | self.font = font 14 | self.color = color 15 | } 16 | 17 | /// Update the view with the contents of the state. 18 | /// 19 | /// - Parameters: 20 | /// - view: `UIView` that responds to this state. 21 | /// - state: data to update the view with. If `nil` the view is being reused by the tableview. 22 | public static func updateView(_ view: UILabel, state: LabelState?) { 23 | guard let state = state else { 24 | view.text = nil 25 | view.font = UIFont.systemFont(ofSize: 17) 26 | view.textColor = .black 27 | return 28 | } 29 | 30 | view.text = state.text 31 | view.font = state.font 32 | view.textColor = state.color 33 | view.numberOfLines = 0 34 | } 35 | } 36 | 37 | extension LabelState: Equatable { 38 | public static func ==(lhs: LabelState, rhs: LabelState) -> Bool { 39 | return lhs.text == rhs.text && lhs.font == rhs.font && lhs.color == rhs.color 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Helpers/HostCell+StateType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StateType.swift 3 | // FunctionalTableDataMyDemo 4 | // 5 | // Created by Paige Sun on 2017-12-19. 6 | // 7 | 8 | import Foundation 9 | 10 | protocol StateType { 11 | associatedtype View 12 | static func updateView(_ view: View, state: Self?) 13 | } 14 | 15 | extension HostCell where State: StateType, State.View == View { 16 | init(key: String, style: CellStyle? = nil, actions: CellActions = CellActions(), state: State) { 17 | self.key = key 18 | self.style = style 19 | self.actions = actions 20 | self.state = state 21 | self.cellUpdater = State.updateView 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/CollectionView/CollectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionCell.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CollectionCell: UICollectionViewCell { 12 | public let view: ViewType 13 | public var prepare: ((_ view: ViewType) -> Void)? 14 | 15 | public override init(frame: CGRect) { 16 | view = ViewType() 17 | super.init(frame: frame) 18 | contentView.addSubviewsForAutolayout(view) 19 | Layout.layoutView(view, inContentView: contentView) 20 | } 21 | 22 | required public init?(coder aDecoder: NSCoder) { 23 | fatalError("init(coder:) has not been implemented") 24 | } 25 | 26 | public override func prepareForReuse() { 27 | super.prepareForReuse() 28 | prepare?(view) 29 | prepare = nil 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/CollectionView/CollectionItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol CollectionItemConfigType { 12 | func register(with collectionView: UICollectionView) 13 | func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell 14 | } 15 | 16 | extension CollectionItemConfigType { 17 | public func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell { 18 | return collectionView.dequeueReusableCell(withReuseIdentifier: UICollectionViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/CollectionView/UICollectionView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollectionView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UICollectionView { 12 | final func registerReusableCell(_ cellType: T.Type) { 13 | register(cellType.self, forCellWithReuseIdentifier: T.reuseIdentifier) 14 | } 15 | 16 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath) -> T { 17 | guard let cell = self.dequeueReusableCell(withReuseIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 18 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 19 | } 20 | return cell 21 | } 22 | } 23 | 24 | extension UICollectionViewCell: Reusable { } 25 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// A type that identifies a dequeueable object. Used by `FunctionalTableData` to increase performance by reusing objects when it needs to, just like `UITableView` and `UICollectionView`. 12 | public protocol Reusable: class { 13 | /// Unique identifier for the object. 14 | static var reuseIdentifier: String { get } 15 | } 16 | 17 | extension Reusable { 18 | public static var reuseIdentifier: String { 19 | return NSStringFromClass(self) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/TableItemLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemLayout.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemLayout { 12 | static func layoutView(_ view: UIView, inContentView contentView: UIView) 13 | } 14 | 15 | // TableItemLayout 16 | 17 | public typealias EdgeBasedTableItemLayout = CombinedLayout 18 | public typealias LayoutMarginsTableItemLayout = CombinedLayout 19 | 20 | public struct ExplicitLayoutMarginsTableItemLayout: TableItemLayout { 21 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 22 | contentView.preservesSuperviewLayoutMargins = false 23 | view.constrainToFillView(contentView, respectingLayoutMargins: true) 24 | } 25 | } 26 | 27 | public enum EdgeLayout { 28 | public struct Horizontal: TableItemLayout { 29 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 30 | view.constrainToFillViewHorizontally(contentView) 31 | } 32 | } 33 | public struct Vertical: TableItemLayout { 34 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 35 | view.constrainToFillViewVertically(contentView) 36 | } 37 | } 38 | } 39 | public enum MarginsLayout { 40 | public struct Horizontal: TableItemLayout { 41 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 42 | view.constrainToFillViewHorizontally(contentView, respectingLayoutMargins: true) 43 | } 44 | } 45 | public struct Vertical: TableItemLayout { 46 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 47 | view.constrainToFillViewVertically(contentView, respectingLayoutMargins: true) 48 | } 49 | } 50 | } 51 | 52 | public struct CombinedLayout: TableItemLayout { 53 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 54 | Horizontal.layoutView(view, inContentView: contentView) 55 | Vertical.layoutView(view, inContentView: contentView) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/TableSectionHeaderFooter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableSectionHeaderFooter.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: Header specific item config 12 | 13 | @available(*, deprecated: 1.0, message: "Use `TableHeaderFooterConfigType` instead.") 14 | public typealias TableHeaderConfigType = TableHeaderFooterConfigType 15 | 16 | public protocol TableHeaderFooterConfigType: TableItemConfigType { 17 | func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? 18 | var height: CGFloat { get } 19 | } 20 | 21 | public protocol TableHeaderFooterStateType { 22 | var insets: UIEdgeInsets { get } 23 | var height: CGFloat { get } 24 | var topSeparatorHidden: Bool { get } 25 | var bottomSeparatorHidden: Bool { get } 26 | } 27 | 28 | public struct TableSectionHeaderFooter: TableHeaderFooterConfigType { 29 | public typealias ViewUpdater = (_ header: TableHeaderFooter, _ state: S) -> Void 30 | public let state: S? 31 | let updateView: ViewUpdater? 32 | 33 | public init(state: S? = nil, updater: ViewUpdater? = nil) { 34 | self.state = state 35 | self.updateView = updater 36 | } 37 | 38 | public func register(with tableView: UITableView) { 39 | tableView.registerReusableHeaderFooterView(TableHeaderFooter.self) 40 | } 41 | 42 | public func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? { 43 | let header = tableView.dequeueReusableHeaderFooterView(TableHeaderFooter.self) 44 | if let updater = updateView, let state = state { 45 | updater(header, state) 46 | } 47 | return header 48 | } 49 | 50 | public var height: CGFloat { 51 | return state?.height ?? 0 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/TableView/TableItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemConfigType { 12 | func register(with tableView: UITableView) 13 | func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell 14 | } 15 | 16 | extension TableItemConfigType { 17 | public func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell { 18 | return tableView.dequeueReusableCell(withIdentifier: UITableViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/TableView/UITableView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UITableView { 12 | // MARK: Headers 13 | 14 | final func registerReusableHeaderFooterView(_ headerType: T.Type) { 15 | register(headerType.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier) 16 | } 17 | 18 | final func dequeueReusableHeaderFooterView(_ headerType: T.Type = T.self) -> T { 19 | guard let header = self.dequeueReusableHeaderFooterView(withIdentifier: headerType.reuseIdentifier) as? T else { 20 | fatalError("Failed to dequeue a header/footer with identifier \(headerType.reuseIdentifier) matching type \(headerType.self)") 21 | } 22 | return header 23 | } 24 | 25 | // MARK: Cells 26 | 27 | final func registerReusableCell(_ cellType: T.Type) { 28 | register(cellType.self, forCellReuseIdentifier: T.reuseIdentifier) 29 | } 30 | 31 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath?) -> T { 32 | if let indexPath = indexPath { 33 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 34 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 35 | } 36 | return cell 37 | } else { 38 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier) as? T else { 39 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 40 | } 41 | return cell 42 | } 43 | } 44 | } 45 | 46 | extension UITableViewCell: Reusable { } 47 | extension UITableViewHeaderFooterView: Reusable { } 48 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/FTD Original/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extensions.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-07-31. 6 | // Copyright © 2017 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | func typedSuperview() -> T? { 13 | var parent = superview 14 | 15 | while parent != nil { 16 | if let view = parent as? T { 17 | return view 18 | } else { 19 | parent = parent?.superview 20 | } 21 | } 22 | 23 | return nil 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/NeatConstraints/Constrainable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | extension UIView: Constrainable { 27 | 28 | @discardableResult 29 | func prepareForAutolayout() -> Self { 30 | translatesAutoresizingMaskIntoConstraints = false 31 | return self 32 | } 33 | } 34 | 35 | extension UILayoutGuide: Constrainable { 36 | 37 | @discardableResult 38 | func prepareForAutolayout() -> Self { return self } 39 | } 40 | 41 | protocol Constrainable { 42 | 43 | var topAnchor: NSLayoutYAxisAnchor { get } 44 | var bottomAnchor: NSLayoutYAxisAnchor { get } 45 | var leftAnchor: NSLayoutXAxisAnchor { get } 46 | var rightAnchor: NSLayoutXAxisAnchor { get } 47 | var leadingAnchor: NSLayoutXAxisAnchor { get } 48 | var trailingAnchor: NSLayoutXAxisAnchor { get } 49 | 50 | var centerXAnchor: NSLayoutXAxisAnchor { get } 51 | var centerYAnchor: NSLayoutYAxisAnchor { get } 52 | 53 | var widthAnchor: NSLayoutDimension { get } 54 | var heightAnchor: NSLayoutDimension { get } 55 | 56 | @discardableResult 57 | func prepareForAutolayout() -> Self 58 | } 59 | 60 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/NeatConstraints/Constraints+Activation+Priority.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | extension Sequence where Element == NSLayoutConstraint { 27 | 28 | func activate() { 29 | if let constraints = self as? [NSLayoutConstraint] { 30 | NSLayoutConstraint.activate(constraints) 31 | } 32 | } 33 | 34 | func deActivate() { 35 | if let constraints = self as? [NSLayoutConstraint] { 36 | NSLayoutConstraint.deactivate(constraints) 37 | } 38 | } 39 | } 40 | 41 | extension NSLayoutConstraint { 42 | 43 | func with(_ p: UILayoutPriority) -> Self { 44 | priority = p 45 | return self 46 | } 47 | 48 | func set(active: Bool) -> Self { 49 | isActive = active 50 | return self 51 | } 52 | } 53 | 54 | extension UIView { 55 | 56 | func setHugging(_ priority: UILayoutPriority, for axis: UILayoutConstraintAxis) { 57 | setContentHuggingPriority(priority, for: axis) 58 | } 59 | 60 | func setCompressionResistance(_ priority: UILayoutPriority, for axis: UILayoutConstraintAxis) { 61 | setContentCompressionResistancePriority(priority, for: axis) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/NeatConstraints/NibView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | protocol NibView {} 27 | 28 | extension NibView where Self: UIView { 29 | static func instanceFromNib() -> Self? { 30 | let nibName = String(describing: self) 31 | let bundle = Bundle(for: ModelCollectionView.self) 32 | return bundle.loadNibNamed(nibName, owner: self, options: nil)?.first as? Self 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/PowerPanelExtensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-24. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | static var xAxisColor: UIColor { 13 | return #colorLiteral(red: 0.9098039269, green: 0.2054645958, blue: 0.4377822972, alpha: 1) 14 | } 15 | 16 | static var yAxisColor: UIColor { 17 | return #colorLiteral(red: 0.506713325, green: 0.8235294223, blue: 0.195811117, alpha: 1) 18 | } 19 | 20 | static var zAxisColor: UIColor { 21 | return #colorLiteral(red: 0.09368573094, green: 0.5884961087, blue: 0.9686274529, alpha: 1) 22 | } 23 | 24 | static var wAxisColor: UIColor { 25 | return #colorLiteral(red: 0.9568627477, green: 0.8079159167, blue: 0.2590701966, alpha: 1) 26 | } 27 | 28 | static var uiControlColor: UIColor { 29 | return #colorLiteral(red: 0.3789054537, green: 1, blue: 0.9100258617, alpha: 1) 30 | } 31 | 32 | static var panelBackgroundColor: UIColor { 33 | return #colorLiteral(red: 0, green: 0.1417405471, blue: 0.2871974469, alpha: 0.4654668328) 34 | } 35 | } 36 | 37 | public extension UIColor { 38 | public static func randomColor() -> UIColor { 39 | let hue = CGFloat(arc4random() % 100) / 100 40 | let saturation = CGFloat(arc4random() % 100) / 100 41 | let brightness = CGFloat(arc4random() % 100) / 100 42 | 43 | return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/PowerPanelExtensions/UIView+BorderedInputBoxes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+BorderedInputBoxes.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-03-31. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | static var cornerRadius: CGFloat = 20.0 13 | 14 | func addCornerRadius() { 15 | self.layer.cornerRadius = UIView.cornerRadius 16 | self.layer.masksToBounds = true 17 | } 18 | 19 | func setupPowerPanelTextField(_ textField: UITextField, tintColor: UIColor) { 20 | setupPowerPanelBorder(tintColor: tintColor) 21 | 22 | textField.tintColor = tintColor 23 | textField.font = UIFont.inputSlider 24 | addSubview(textField) 25 | textField.constrainEdges(to: self, insets: UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6)) 26 | } 27 | 28 | func setupPowerPanelBorder(tintColor: UIColor) { 29 | backgroundColor = .white 30 | layer.borderColor = tintColor.cgColor 31 | layer.borderWidth = 2 32 | layer.cornerRadius = 8 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/2DUtilities/UICollection+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollection+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-25. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol DequeueableCollectionViewCell { 12 | associatedtype CellType 13 | static func register(with collectionView: UICollectionView) 14 | static func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> CellType 15 | } 16 | 17 | extension DequeueableCollectionViewCell where Self: UICollectionViewCell { 18 | static func register(with collectionView: UICollectionView) { 19 | collectionView.register(Self.self, forCellWithReuseIdentifier: Self.reuseId()) 20 | } 21 | 22 | static func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> Self { 23 | return collectionView.dequeueReusableCell(withReuseIdentifier: Self.reuseId(), for: indexPath) as! Self 24 | } 25 | 26 | private static func reuseId() -> String { 27 | return String(describing: self) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/3DUtilities/GlowEffect/SCNScene+Glow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SCNScene+Glow.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-30. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import SceneKit 10 | 11 | extension SCNNode { 12 | func setGlow(_ shouldGlow: Bool) { 13 | enumerateHierarchy({ (node, _) in 14 | node.categoryBitMask = shouldGlow ? 2 : 1 15 | }) 16 | } 17 | } 18 | 19 | extension SCNView { 20 | public func setupGlowTechnique() { 21 | let bundle = Bundle(for: ModelCollectionView.self) 22 | if let path = bundle.path(forResource: "NodeTechnique", ofType: "plist") { 23 | if let dict = NSDictionary(contentsOfFile: path) { 24 | let dict2 = dict as! [String : AnyObject] 25 | let technique = SCNTechnique(dictionary:dict2) 26 | self.technique = technique 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Extensions/Font+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Font+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-23. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIFont { 12 | static var inputSlider = UIFont.boldSystemFont(ofSize: 14) 13 | static var inputSliderHeader = UIFont.boldSystemFont(ofSize: 16) 14 | static var inputSliderAxisLabel = UIFont.boldSystemFont(ofSize: 18) 15 | static var gameModelLabel = UIFont.boldSystemFont(ofSize: 16) 16 | } 17 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels.h: -------------------------------------------------------------------------------- 1 | // 2 | // ARPowerPanels.h 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ARPowerPanels. 12 | FOUNDATION_EXPORT double PowerPanelsVersionNumber; 13 | 14 | //! Project version string for ARPowerPanels. 15 | FOUNDATION_EXPORT const unsigned char PowerPanelsVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/Left Menu/MenuItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuItem.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-27. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | struct MenuItem { 12 | let stackItem: MenuStackItem // For the MenuStack on the left with menu buttons 13 | let panelItem: PanelItem 14 | 15 | init(name: String, panelItem: PanelItem) { 16 | self.stackItem = MenuStackItem(name: name) 17 | self.panelItem = panelItem 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/Left Menu/MenuStackView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuStack.swift 3 | // RoundedButtonMenus 4 | // 5 | // Created by TSD040 on 2018-03-26. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MenuStackItem { 12 | let name: String 13 | var isSelected: Bool = false 14 | 15 | init(name: String) { 16 | self.name = name 17 | } 18 | } 19 | 20 | protocol MenuStackDelegate: class { 21 | func menuStack(_ menuStack: MenuStack, didSelectAtIndex index: Int) 22 | } 23 | 24 | class MenuStack: UIScrollView { 25 | 26 | weak var menuStackDelegate: MenuStackDelegate? 27 | 28 | private let stackView = UIStackView() 29 | 30 | init(axis: UILayoutConstraintAxis) { 31 | super.init(frame: CGRect.zero) 32 | showsHorizontalScrollIndicator = false 33 | showsVerticalScrollIndicator = false 34 | stackView.spacing = 15 35 | stackView.axis = axis 36 | self.addSubview(stackView) 37 | stackView.constrainEdges(to: self) 38 | } 39 | 40 | required init?(coder aDecoder: NSCoder) { 41 | fatalError("init(coder:) has not been implemented") 42 | } 43 | 44 | func configure(menuItems: [MenuStackItem]) { 45 | for arrangeSubview in stackView.arrangedSubviews { 46 | arrangeSubview.removeFromSuperview() 47 | } 48 | 49 | for (index, menuItem) in menuItems.enumerated() { 50 | let button = RoundedButton() 51 | button.tag = index 52 | button.setTitle(menuItem.name) 53 | button.isSelected = menuItem.isSelected 54 | button.delegate = self 55 | stackView.addArrangedSubview(button) 56 | } 57 | } 58 | } 59 | 60 | extension MenuStack: RoundedButtonDelegate { 61 | func roundedButton(didTap button: RoundedButton) { 62 | menuStackDelegate?.menuStack(self, didSelectAtIndex: button.tag) 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/ModelCollection/ImageCollectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageCollectionCell.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ImageCollectionViewCell: UICollectionViewCell { 12 | 13 | let imageView = UIImageView() 14 | 15 | override init(frame: CGRect) { 16 | super.init(frame: frame) 17 | addCornerRadius() 18 | 19 | addSubview(imageView) 20 | imageView.contentMode = .scaleAspectFill 21 | imageView.constrainEdgesHorizontally(to: self) 22 | imageView.constrainTop(to: self) 23 | imageView.constrainBottom(to: self, priority: .defaultHigh) 24 | } 25 | 26 | required init?(coder aDecoder: NSCoder) { 27 | fatalError("init(coder:) has not been implemented") 28 | } 29 | 30 | func config(image: UIImage?) { 31 | imageView.image = image 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/ModelCollection/ModelCollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ModelCollectionView.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol ModelCollectionViewDelegate: class { 12 | func modelCollectionView(_ modelCollectionView: ModelCollectionView, didSelectModel nodeMaker: NodeCreatorType) 13 | } 14 | 15 | class ModelCollectionView: UIView { 16 | 17 | weak var delegate: ModelCollectionViewDelegate? 18 | 19 | private let imageCollectionView: ImageCollectionView 20 | 21 | private let nodeMakers: [NodeCreatorType] 22 | 23 | init(frame: CGRect, nodeMakers: [NodeCreatorType]) { 24 | self.nodeMakers = nodeMakers 25 | 26 | let images = nodeMakers.map { $0.menuImage } 27 | imageCollectionView = ImageCollectionView(images: images, frame: frame) 28 | 29 | super.init(frame: frame) 30 | 31 | let closeButton = UIButton() 32 | let closeButtonImage = ImageAssets.closeWhite.image() 33 | closeButton.setImage(closeButtonImage, for: .normal) 34 | addSubview(closeButton) 35 | closeButton.addTarget(self, action: #selector(closeButtonPressed), for: .touchUpInside) 36 | closeButton.constrainTop(to: self) 37 | closeButton.constrainLeft(to: self) 38 | closeButton.constrainSize(CGSize(width: 40, height: 40)) 39 | 40 | imageCollectionView.imageCollectionDelegate = self 41 | 42 | addSubview(imageCollectionView) 43 | imageCollectionView.constrainTopToBottom(of: closeButton) 44 | imageCollectionView.constrainEdgesHorizontally(to: self) 45 | imageCollectionView.constrainBottom(to: self, priority: .defaultLow) 46 | } 47 | 48 | required init?(coder aDecoder: NSCoder) { 49 | fatalError("init(coder:) has not been implemented") 50 | } 51 | 52 | @objc private func closeButtonPressed() { 53 | removeFromSuperview() 54 | } 55 | } 56 | 57 | extension ModelCollectionView: ImageCollectionViewDelegate { 58 | func imageCollection(didSelectItemAt index: Int) { 59 | delegate?.modelCollectionView(self, didSelectModel: nodeMakers[index]) 60 | removeFromSuperview() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/Panel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Panel.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-27. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Panel { 12 | /// A container for the viewToPresent 13 | let view = UIView() 14 | 15 | /// A priority determined by the user. 16 | /// When presenting a panel with a heigher height priority than the other panel, the height constraint is animated. 17 | /// Otherwise, don't animate the height. 18 | var heightPriority: UILayoutPriority! 19 | 20 | /// The left constraint on the view, so the panel can be animated. 21 | var leftConstraint: NSLayoutConstraint! 22 | var heightConstraint: NSLayoutConstraint 23 | weak var middleConstraint: NSLayoutConstraint? 24 | 25 | init(width: CGFloat) { 26 | view.constrainWidth(width) 27 | 28 | // Constrain the height of all presented containers to be a square, with low priority 29 | // Low priority because we want it to be a square if a height cannot be calculated 30 | heightConstraint = view.constrainHeight(width, relation: .equalOrGreater, priority: .defaultLow) 31 | 32 | setupContainer() 33 | } 34 | 35 | /// Constrain a view to the presentingView 36 | /// 37 | /// - Parameters: 38 | /// - viewToPresent: A UIView with an optional height constraint. 39 | /// - heightPriority: Priority of the height constraint. If a 40 | /// - presentingView: The view containing all the panels (i.e. a viewController.view 41 | func constrainToPresenter(viewToPresent: UIView, heightPriority: UILayoutPriority, presentingView: UIView) { 42 | self.heightPriority = heightPriority 43 | 44 | presentingView.addSubview(view) 45 | leftConstraint = view.constrainLeftToRight(of: presentingView) 46 | 47 | view.addSubview(viewToPresent) 48 | // viewToPresent.constrainEdgesHorizontally(to: view, leftInsets: 20, rightInsets: 20) 49 | // viewToPresent.constrainTop(to: view, offset: 10) 50 | // viewToPresent.constrainBottom(to: view, offset: -20, relation: .equalOrGreater, priority: .init(999)) 51 | 52 | let insets = UIEdgeInsets(top: 10, left: 20, bottom: 20, right: 20) 53 | viewToPresent.constrainEdges(to: view, insets: insets) 54 | } 55 | 56 | private func setupContainer() { 57 | view.addCornerRadius() 58 | view.backgroundColor = UIColor.white // A flash of color when a new panel is presented 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/TransformationPanel/NodeNames.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NodeNames.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-09. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | // Default names I give nodes, so that they can be added and removed later. 10 | enum NodeNames: String { 11 | case boundingBox = "Bounding Box" 12 | 13 | case arWorldOrigin = "AR World Origin 🌎" 14 | case sceneViewWorldOrigin = "SceneView World Origin 🌎" 15 | case worldOrigin = "World Origin" 16 | 17 | case arModeCamera = "AR Camera" 18 | case gameModeCamera = "Game Mode Camera" 19 | 20 | case axis = "Axis" 21 | case localVector = "Parent to Child Vector" 22 | } 23 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/TransformationPanel/PowerPanelCheckmarkInput.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PowerPanelCheckmarkInput.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-03-31. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol PowerPanelCheckmarkInputDelegate: class { 12 | func powerPanelCheckmarkInput(_ checkMarkInput: PowerPanelCheckmarkInput, isCheckedDidChange isChecked: Bool) 13 | } 14 | 15 | class PowerPanelCheckmarkInput: UIStackView { 16 | 17 | var isChecked: Bool { 18 | get { 19 | return button.isSelected 20 | } 21 | set { 22 | button.isSelected = newValue 23 | button.backgroundColor = newValue ? .uiControlColor : .white 24 | } 25 | } 26 | 27 | weak var delegate: PowerPanelCheckmarkInputDelegate? 28 | 29 | private let button = UIButton() 30 | 31 | init(text: String) { 32 | super.init(frame: CGRect.zero) 33 | 34 | self.axis = .horizontal 35 | 36 | let label = UILabel() 37 | label.text = text 38 | label.font = UIFont.inputSliderHeader 39 | label.textColor = .white 40 | addArrangedSubview(label) 41 | 42 | let buttonParent = UIView() 43 | buttonParent.constrainAspectRatio(to: CGSize(width: 1, height: 1)) 44 | addArrangedSubview(buttonParent) 45 | 46 | button.isSelected = isChecked 47 | let checkMarkWhiteImage = ImageAssets.checkmarkWhite.image() 48 | button.setImage(checkMarkWhiteImage, for: .selected) 49 | button.setImage(checkMarkWhiteImage, for: .highlighted) 50 | button.setupPowerPanelBorder(tintColor: .uiControlColor) 51 | buttonParent.addSubview(button) 52 | button.constrainEdges(to: buttonParent, insets: UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)) 53 | 54 | isChecked = false 55 | 56 | button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside) 57 | } 58 | 59 | required init(coder: NSCoder) { 60 | fatalError("init(coder:) has not been implemented") 61 | } 62 | 63 | @objc private func buttonPressed() { 64 | isChecked = !isChecked 65 | button.isSelected = isChecked 66 | delegate?.powerPanelCheckmarkInput(self, isCheckedDidChange: isChecked) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/TransformationPanel/PowerPanelTextField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PowerPanelTextField.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-30. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol PowerPanelTextFieldDelegate: class { 12 | func powerPanelTextField(didChangeText text: String?) 13 | } 14 | 15 | class PowerPanelTextField: UIView { 16 | var text: String? { 17 | get { 18 | return textField.text 19 | } 20 | set { 21 | textField.text = newValue 22 | } 23 | } 24 | 25 | weak var delegate: PowerPanelTextFieldDelegate? 26 | 27 | private let textField = UITextField() 28 | 29 | init() { 30 | super.init(frame: CGRect.zero) 31 | setupPowerPanelTextField(textField, tintColor: .uiControlColor) 32 | textField.delegate = self 33 | } 34 | 35 | required init?(coder aDecoder: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | } 39 | 40 | extension PowerPanelTextField: UITextFieldDelegate { 41 | func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 42 | let editedString = (text! as NSString).replacingCharacters(in: range, with: string) 43 | delegate?.powerPanelTextField(didChangeText: editedString) 44 | return true 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/TransformationPanel/Slider Input Views/SliderVector3View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SliderVector3View.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-19. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SceneKit 11 | 12 | protocol SliderVector3ViewDelegate: class { 13 | func sliderVector3View(_ sliderVector3View: SliderVector3View, didChangeValues vector: SCNVector3) 14 | } 15 | 16 | // A SliderInputsView with 3 values, x, y, and z. 17 | class SliderVector3View: SliderInputsView { 18 | 19 | var vector = SCNVector3() { 20 | didSet { 21 | setValue(vector.x, atIndex: 0) 22 | setValue(vector.y, atIndex: 1) 23 | setValue(vector.z, atIndex: 2) 24 | } 25 | } 26 | 27 | weak var delegate: SliderVector3ViewDelegate? = nil 28 | 29 | init(minValue: Float = -Float.greatestFiniteMagnitude, 30 | maxValue: Float = Float.greatestFiniteMagnitude) { 31 | super.init(axisLabels: ["X:", " Y:", " Z:"], minValue: minValue, maxValue: maxValue) 32 | viewDelegate = self 33 | } 34 | 35 | required init?(coder aDecoder: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | } 39 | 40 | extension SliderVector3View: SliderInputsViewDelegate { 41 | func sliderInputView(didChange value: Float, at index: Int) { 42 | switch index { 43 | case 0: 44 | vector.x = value 45 | case 1: 46 | vector.y = value 47 | default: 48 | vector.z = value 49 | } 50 | delegate?.sliderVector3View(self, didChangeValues: vector) 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/PowerPanels/TransformationPanel/Slider Input Views/SliderVector4View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SliderVector4View.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-23. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SceneKit 11 | 12 | protocol SliderVector4ViewDelegate: class { 13 | func sliderVector4View(_ sliderVector4View: SliderVector4View, didChangeValues vector: SCNVector4) 14 | } 15 | 16 | // A SliderInputsView with 4 values, x, y, z, and w. 17 | class SliderVector4View: SliderInputsView { 18 | 19 | var vector = SCNVector4() { 20 | didSet { 21 | setValue(vector.x, atIndex: 0) 22 | setValue(vector.y, atIndex: 1) 23 | setValue(vector.z, atIndex: 2) 24 | setValue(vector.w, atIndex: 3) 25 | } 26 | } 27 | 28 | weak var delegate: SliderVector4ViewDelegate? = nil 29 | 30 | init(minValue: Float = -Float.greatestFiniteMagnitude, 31 | maxValue: Float = Float.greatestFiniteMagnitude) { 32 | super.init(axisLabels: ["X:", " Y:", " Z:", " W:"], minValue: minValue, maxValue: maxValue) 33 | viewDelegate = self 34 | } 35 | 36 | required init?(coder aDecoder: NSCoder) { 37 | fatalError("init(coder:) has not been implemented") 38 | } 39 | } 40 | 41 | extension SliderVector4View: SliderInputsViewDelegate { 42 | func sliderInputView(didChange value: Float, at index: Int) { 43 | switch index { 44 | case 0: 45 | vector.x = value 46 | case 1: 47 | vector.y = value 48 | case 2: 49 | vector.z = value 50 | default: 51 | vector.w = value 52 | } 53 | delegate?.sliderVector4View(self, didChangeValues: vector) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/Contents/Sources/View Controllers/GlobalPlayground.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlobalPlayground.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | // Global Methods used in the playground 10 | 11 | import UIKit 12 | import ARKit 13 | 14 | func detectedPlane(plane: ARPlaneAnchor) { 15 | //#-copy-source(id1) 16 | //#-editable-code Remember to call the playSound(_:) function here! 17 | 18 | //#-end-editable-code 19 | //#-end-copy-source 20 | 21 | //#-hidden-code 22 | 23 | //#-end-hidden-code 24 | } 25 | -------------------------------------------------------------------------------- /ARPowerPanels.playgroundbook/version.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildVersion 6 | 9 7 | ProductBuildVersion 8 | 2A128 9 | 10 | 11 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Cells/LabelCell.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import SwiftyTables 3 | 4 | public typealias LabelCell = HostCell 5 | 6 | /// A very simple state for a `UILabel` allowing a quick configuration of its text, font, and color values. 7 | public struct LabelState: StateType { 8 | public let text: String 9 | public let font: UIFont 10 | public let color: UIColor 11 | 12 | public init(text: String, font: UIFont = UIFont.systemFont(ofSize: 17), color: UIColor = .black) { 13 | self.text = text 14 | self.font = font 15 | self.color = color 16 | } 17 | 18 | /// Update the view with the contents of the state. 19 | /// 20 | /// - Parameters: 21 | /// - view: `UIView` that responds to this state. 22 | /// - state: data to update the view with. If `nil` the view is being reused by the tableview. 23 | public static func updateView(_ view: UILabel, state: LabelState?) { 24 | guard let state = state else { 25 | view.text = nil 26 | view.font = UIFont.systemFont(ofSize: 17) 27 | view.textColor = .black 28 | return 29 | } 30 | 31 | view.text = state.text 32 | view.font = state.font 33 | view.textColor = state.color 34 | view.numberOfLines = 0 35 | } 36 | } 37 | 38 | extension LabelState: Equatable { 39 | public static func ==(lhs: LabelState, rhs: LabelState) -> Bool { 40 | return lhs.text == rhs.text && lhs.font == rhs.font && lhs.color == rhs.color 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Helpers/HostCell+StateType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StateType.swift 3 | // FunctionalTableDataMyDemo 4 | // 5 | // Created by Paige Sun on 2017-12-19. 6 | // 7 | 8 | import Foundation 9 | import SwiftyTables 10 | 11 | protocol StateType { 12 | associatedtype View 13 | static func updateView(_ view: View, state: Self?) 14 | } 15 | 16 | extension HostCell where State: StateType, State.View == View { 17 | init(key: String, style: CellStyle? = nil, actions: CellActions = CellActions(), state: State) { 18 | self.key = key 19 | self.style = style 20 | self.actions = actions 21 | self.state = state 22 | self.cellUpdater = State.updateView 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/CollectionView/CollectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionCell.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CollectionCell: UICollectionViewCell { 12 | public let view: ViewType 13 | public var prepare: ((_ view: ViewType) -> Void)? 14 | 15 | public override init(frame: CGRect) { 16 | view = ViewType() 17 | super.init(frame: frame) 18 | contentView.addSubviewsForAutolayout(view) 19 | Layout.layoutView(view, inContentView: contentView) 20 | } 21 | 22 | required public init?(coder aDecoder: NSCoder) { 23 | fatalError("init(coder:) has not been implemented") 24 | } 25 | 26 | public override func prepareForReuse() { 27 | super.prepareForReuse() 28 | prepare?(view) 29 | prepare = nil 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/CollectionView/CollectionItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol CollectionItemConfigType { 12 | func register(with collectionView: UICollectionView) 13 | func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell 14 | } 15 | 16 | extension CollectionItemConfigType { 17 | public func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell { 18 | return collectionView.dequeueReusableCell(withReuseIdentifier: UICollectionViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/CollectionView/UICollectionView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollectionView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UICollectionView { 12 | final func registerReusableCell(_ cellType: T.Type) { 13 | register(cellType.self, forCellWithReuseIdentifier: T.reuseIdentifier) 14 | } 15 | 16 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath) -> T { 17 | guard let cell = self.dequeueReusableCell(withReuseIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 18 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 19 | } 20 | return cell 21 | } 22 | } 23 | 24 | extension UICollectionViewCell: Reusable { } 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// A type that identifies a dequeueable object. Used by `FunctionalTableData` to increase performance by reusing objects when it needs to, just like `UITableView` and `UICollectionView`. 12 | public protocol Reusable: class { 13 | /// Unique identifier for the object. 14 | static var reuseIdentifier: String { get } 15 | } 16 | 17 | extension Reusable { 18 | public static var reuseIdentifier: String { 19 | return NSStringFromClass(self) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/TableItemLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemLayout.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemLayout { 12 | static func layoutView(_ view: UIView, inContentView contentView: UIView) 13 | } 14 | 15 | // TableItemLayout 16 | 17 | public typealias EdgeBasedTableItemLayout = CombinedLayout 18 | public typealias LayoutMarginsTableItemLayout = CombinedLayout 19 | 20 | public struct ExplicitLayoutMarginsTableItemLayout: TableItemLayout { 21 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 22 | contentView.preservesSuperviewLayoutMargins = false 23 | view.constrainToFillView(contentView, respectingLayoutMargins: true) 24 | } 25 | } 26 | 27 | public enum EdgeLayout { 28 | public struct Horizontal: TableItemLayout { 29 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 30 | view.constrainToFillViewHorizontally(contentView) 31 | } 32 | } 33 | public struct Vertical: TableItemLayout { 34 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 35 | view.constrainToFillViewVertically(contentView) 36 | } 37 | } 38 | } 39 | public enum MarginsLayout { 40 | public struct Horizontal: TableItemLayout { 41 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 42 | view.constrainToFillViewHorizontally(contentView, respectingLayoutMargins: true) 43 | } 44 | } 45 | public struct Vertical: TableItemLayout { 46 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 47 | view.constrainToFillViewVertically(contentView, respectingLayoutMargins: true) 48 | } 49 | } 50 | } 51 | 52 | public struct CombinedLayout: TableItemLayout { 53 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 54 | Horizontal.layoutView(view, inContentView: contentView) 55 | Vertical.layoutView(view, inContentView: contentView) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/TableSectionHeaderFooter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableSectionHeaderFooter.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: Header specific item config 12 | 13 | @available(*, deprecated: 1.0, message: "Use `TableHeaderFooterConfigType` instead.") 14 | public typealias TableHeaderConfigType = TableHeaderFooterConfigType 15 | 16 | public protocol TableHeaderFooterConfigType: TableItemConfigType { 17 | func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? 18 | var height: CGFloat { get } 19 | } 20 | 21 | public protocol TableHeaderFooterStateType { 22 | var insets: UIEdgeInsets { get } 23 | var height: CGFloat { get } 24 | var topSeparatorHidden: Bool { get } 25 | var bottomSeparatorHidden: Bool { get } 26 | } 27 | 28 | public struct TableSectionHeaderFooter: TableHeaderFooterConfigType { 29 | public typealias ViewUpdater = (_ header: TableHeaderFooter, _ state: S) -> Void 30 | public let state: S? 31 | let updateView: ViewUpdater? 32 | 33 | public init(state: S? = nil, updater: ViewUpdater? = nil) { 34 | self.state = state 35 | self.updateView = updater 36 | } 37 | 38 | public func register(with tableView: UITableView) { 39 | tableView.registerReusableHeaderFooterView(TableHeaderFooter.self) 40 | } 41 | 42 | public func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? { 43 | let header = tableView.dequeueReusableHeaderFooterView(TableHeaderFooter.self) 44 | if let updater = updateView, let state = state { 45 | updater(header, state) 46 | } 47 | return header 48 | } 49 | 50 | public var height: CGFloat { 51 | return state?.height ?? 0 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/TableView/TableItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemConfigType { 12 | func register(with tableView: UITableView) 13 | func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell 14 | } 15 | 16 | extension TableItemConfigType { 17 | public func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell { 18 | return tableView.dequeueReusableCell(withIdentifier: UITableViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/TableView/UITableView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UITableView { 12 | // MARK: Headers 13 | 14 | final func registerReusableHeaderFooterView(_ headerType: T.Type) { 15 | register(headerType.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier) 16 | } 17 | 18 | final func dequeueReusableHeaderFooterView(_ headerType: T.Type = T.self) -> T { 19 | guard let header = self.dequeueReusableHeaderFooterView(withIdentifier: headerType.reuseIdentifier) as? T else { 20 | fatalError("Failed to dequeue a header/footer with identifier \(headerType.reuseIdentifier) matching type \(headerType.self)") 21 | } 22 | return header 23 | } 24 | 25 | // MARK: Cells 26 | 27 | final func registerReusableCell(_ cellType: T.Type) { 28 | register(cellType.self, forCellReuseIdentifier: T.reuseIdentifier) 29 | } 30 | 31 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath?) -> T { 32 | if let indexPath = indexPath { 33 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 34 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 35 | } 36 | return cell 37 | } else { 38 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier) as? T else { 39 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 40 | } 41 | return cell 42 | } 43 | } 44 | } 45 | 46 | extension UITableViewCell: Reusable { } 47 | extension UITableViewHeaderFooterView: Reusable { } 48 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/FTD Original/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extensions.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-07-31. 6 | // Copyright © 2017 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | func typedSuperview() -> T? { 13 | var parent = superview 14 | 15 | while parent != nil { 16 | if let view = parent as? T { 17 | return view 18 | } else { 19 | parent = parent?.superview 20 | } 21 | } 22 | 23 | return nil 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/NeatConstraints/Constrainable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | extension UIView: Constrainable { 27 | 28 | @discardableResult 29 | func prepareForAutolayout() -> Self { 30 | translatesAutoresizingMaskIntoConstraints = false 31 | return self 32 | } 33 | } 34 | 35 | extension UILayoutGuide: Constrainable { 36 | 37 | @discardableResult 38 | func prepareForAutolayout() -> Self { return self } 39 | } 40 | 41 | protocol Constrainable { 42 | 43 | var topAnchor: NSLayoutYAxisAnchor { get } 44 | var bottomAnchor: NSLayoutYAxisAnchor { get } 45 | var leftAnchor: NSLayoutXAxisAnchor { get } 46 | var rightAnchor: NSLayoutXAxisAnchor { get } 47 | var leadingAnchor: NSLayoutXAxisAnchor { get } 48 | var trailingAnchor: NSLayoutXAxisAnchor { get } 49 | 50 | var centerXAnchor: NSLayoutXAxisAnchor { get } 51 | var centerYAnchor: NSLayoutYAxisAnchor { get } 52 | 53 | var widthAnchor: NSLayoutDimension { get } 54 | var heightAnchor: NSLayoutDimension { get } 55 | 56 | @discardableResult 57 | func prepareForAutolayout() -> Self 58 | } 59 | 60 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/NeatConstraints/Constraints+Activation+Priority.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | extension Sequence where Element == NSLayoutConstraint { 27 | 28 | func activate() { 29 | if let constraints = self as? [NSLayoutConstraint] { 30 | NSLayoutConstraint.activate(constraints) 31 | } 32 | } 33 | 34 | func deActivate() { 35 | if let constraints = self as? [NSLayoutConstraint] { 36 | NSLayoutConstraint.deactivate(constraints) 37 | } 38 | } 39 | } 40 | 41 | extension NSLayoutConstraint { 42 | 43 | func with(_ p: UILayoutPriority) -> Self { 44 | priority = p 45 | return self 46 | } 47 | 48 | func set(active: Bool) -> Self { 49 | isActive = active 50 | return self 51 | } 52 | } 53 | 54 | extension UIView { 55 | 56 | func setHugging(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) { 57 | setContentHuggingPriority(priority, for: axis) 58 | } 59 | 60 | func setCompressionResistance(_ priority: UILayoutPriority, for axis: NSLayoutConstraint.Axis) { 61 | setContentCompressionResistancePriority(priority, for: axis) 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/NeatConstraints/NibView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MIT License 3 | // 4 | // Copyright (c) 2018 Paige Sun 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | 24 | import UIKit 25 | 26 | protocol NibView {} 27 | 28 | extension NibView where Self: UIView { 29 | static func instanceFromNib() -> Self? { 30 | let nibName = String(describing: self) 31 | let bundle = Bundle(for: ModelCollectionView.self) 32 | return bundle.loadNibNamed(nibName, owner: self, options: nil)?.first as? Self 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/PowerPanelExtensions/UIColor+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIColor+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-24. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | static var xAxisColor: UIColor { 13 | return #colorLiteral(red: 0.9098039269, green: 0.2054645958, blue: 0.4377822972, alpha: 1) 14 | } 15 | 16 | static var yAxisColor: UIColor { 17 | return #colorLiteral(red: 0.506713325, green: 0.8235294223, blue: 0.195811117, alpha: 1) 18 | } 19 | 20 | static var zAxisColor: UIColor { 21 | return #colorLiteral(red: 0.09368573094, green: 0.5884961087, blue: 0.9686274529, alpha: 1) 22 | } 23 | 24 | static var wAxisColor: UIColor { 25 | return #colorLiteral(red: 0.9568627477, green: 0.8079159167, blue: 0.2590701966, alpha: 1) 26 | } 27 | 28 | static var uiControlColor: UIColor { 29 | return #colorLiteral(red: 0.3789054537, green: 1, blue: 0.9100258617, alpha: 1) 30 | } 31 | 32 | static var panelBackgroundColor: UIColor { 33 | return #colorLiteral(red: 0, green: 0.1417405471, blue: 0.2871974469, alpha: 0.4654668328) 34 | } 35 | } 36 | 37 | public extension UIColor { 38 | public static func randomColor() -> UIColor { 39 | let hue = CGFloat(arc4random() % 100) / 100 40 | let saturation = CGFloat(arc4random() % 100) / 100 41 | let brightness = CGFloat(arc4random() % 100) / 100 42 | 43 | return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 1.0) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/PowerPanelExtensions/UIView+BorderedInputBoxes.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+BorderedInputBoxes.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-03-31. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | static var cornerRadius: CGFloat = 20.0 13 | 14 | func addCornerRadius() { 15 | self.layer.cornerRadius = UIView.cornerRadius 16 | self.layer.masksToBounds = true 17 | } 18 | 19 | func setupPowerPanelTextField(_ textField: UITextField, tintColor: UIColor) { 20 | setupPowerPanelBorder(tintColor: tintColor) 21 | 22 | textField.tintColor = tintColor 23 | textField.font = UIFont.inputSlider 24 | addSubview(textField) 25 | textField.constrainEdges(to: self, insets: UIEdgeInsets(top: 6, left: 6, bottom: 6, right: 6)) 26 | } 27 | 28 | func setupPowerPanelBorder(tintColor: UIColor) { 29 | backgroundColor = .white 30 | layer.borderColor = tintColor.cgColor 31 | layer.borderWidth = 2 32 | layer.cornerRadius = 8 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/2DUtilities/UICollection+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollection+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-25. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol DequeueableCollectionViewCell { 12 | associatedtype CellType 13 | static func register(with collectionView: UICollectionView) 14 | static func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> CellType 15 | } 16 | 17 | extension DequeueableCollectionViewCell where Self: UICollectionViewCell { 18 | static func register(with collectionView: UICollectionView) { 19 | collectionView.register(Self.self, forCellWithReuseIdentifier: Self.reuseId()) 20 | } 21 | 22 | static func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> Self { 23 | return collectionView.dequeueReusableCell(withReuseIdentifier: Self.reuseId(), for: indexPath) as! Self 24 | } 25 | 26 | private static func reuseId() -> String { 27 | return String(describing: self) 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/3DUtilities/GlowEffect/SCNScene+Glow.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SCNScene+Glow.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-30. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import SceneKit 10 | 11 | struct GlowNodes { 12 | static let glowMaterial: SCNMaterial = { 13 | let mat = SCNMaterial() 14 | mat.emission.contents = UIColor.red.withAlphaComponent(0.3) 15 | mat.name = "Glow Material" 16 | return mat 17 | }() 18 | } 19 | 20 | extension SCNNode { 21 | func setGlow(_ shouldGlow: Bool) { 22 | func setGlowMaterial(on node: SCNNode) -> Bool { 23 | if shouldGlow { 24 | if let allMaterials = node.geometry?.materials { 25 | if !allMaterials.contains(GlowNodes.glowMaterial) { 26 | node.geometry?.materials = [GlowNodes.glowMaterial] + allMaterials 27 | return true 28 | } 29 | } 30 | } else { 31 | if let glowindex = node.geometry?.materials.index(of: GlowNodes.glowMaterial) { 32 | node.geometry?.materials.remove(at: glowindex) 33 | return true 34 | } 35 | } 36 | return false 37 | } 38 | 39 | if name == TransformationType.boundingBox.displayName { 40 | return 41 | } 42 | 43 | if !setGlowMaterial(on: self) { 44 | for child in childNodes { 45 | child.setGlow(shouldGlow) 46 | } 47 | } 48 | 49 | // For metal shader 50 | // categoryBitMask = shouldGlow ? 2 : 1 51 | // enumerateHierarchy({ (node, _) in 52 | // node.categoryBitMask = shouldGlow ? 2 : 1 53 | // }) 54 | } 55 | } 56 | 57 | // Initialize Metal Shader 58 | //extension SCNView { 59 | // public func setupGlowTechnique() { 60 | // let bundle = Bundle(for: ModelCollectionView.self) 61 | // if let path = bundle.path(forResource: "NodeTechnique", ofType: "plist") { 62 | // if let dict = NSDictionary(contentsOfFile: path) { 63 | // let dict2 = dict as! [String : AnyObject] 64 | // let technique = SCNTechnique(dictionary:dict2) 65 | // self.technique = technique 66 | // } 67 | // } 68 | // } 69 | //} 70 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Extensions/Font+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Font+Extensions.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-23. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIFont { 12 | static var inputSlider = UIFont.boldSystemFont(ofSize: 14) 13 | static var inputSliderHeader = UIFont.boldSystemFont(ofSize: 16) 14 | static var inputSliderAxisLabel = UIFont.boldSystemFont(ofSize: 18) 15 | static var gameModelLabel = UIFont.boldSystemFont(ofSize: 16) 16 | } 17 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels.h: -------------------------------------------------------------------------------- 1 | // 2 | // ARPowerPanels.h 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for ARPowerPanels. 12 | FOUNDATION_EXPORT double PowerPanelsVersionNumber; 13 | 14 | //! Project version string for ARPowerPanels. 15 | FOUNDATION_EXPORT const unsigned char PowerPanelsVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/Left Menu/MenuItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuItem.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-27. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | struct MenuItem { 12 | let stackItem: MenuStackItem // For the MenuStack on the left with menu buttons 13 | let panelItem: PanelItem 14 | 15 | init(name: String, panelItem: PanelItem) { 16 | self.stackItem = MenuStackItem(name: name) 17 | self.panelItem = panelItem 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/Left Menu/MenuStackView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MenuStack.swift 3 | // RoundedButtonMenus 4 | // 5 | // Created by TSD040 on 2018-03-26. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class MenuStackItem { 12 | let name: String 13 | var isSelected: Bool = false 14 | 15 | init(name: String) { 16 | self.name = name 17 | } 18 | } 19 | 20 | protocol MenuStackDelegate: class { 21 | func menuStack(_ menuStack: MenuStack, didSelectAtIndex index: Int) 22 | } 23 | 24 | class MenuStack: UIScrollView { 25 | 26 | weak var menuStackDelegate: MenuStackDelegate? 27 | 28 | private let stackView = UIStackView() 29 | 30 | init(axis: NSLayoutConstraint.Axis) { 31 | super.init(frame: CGRect.zero) 32 | showsHorizontalScrollIndicator = false 33 | showsVerticalScrollIndicator = false 34 | stackView.spacing = 15 35 | stackView.axis = axis 36 | self.addSubview(stackView) 37 | stackView.constrainEdges(to: self) 38 | } 39 | 40 | required init?(coder aDecoder: NSCoder) { 41 | fatalError("init(coder:) has not been implemented") 42 | } 43 | 44 | func configure(menuItems: [MenuStackItem]) { 45 | for arrangeSubview in stackView.arrangedSubviews { 46 | arrangeSubview.removeFromSuperview() 47 | } 48 | 49 | for (index, menuItem) in menuItems.enumerated() { 50 | let button = RoundedButton() 51 | button.tag = index 52 | button.setTitle(menuItem.name) 53 | button.isSelected = menuItem.isSelected 54 | button.delegate = self 55 | stackView.addArrangedSubview(button) 56 | } 57 | } 58 | } 59 | 60 | extension MenuStack: RoundedButtonDelegate { 61 | func roundedButton(didTap button: RoundedButton) { 62 | menuStackDelegate?.menuStack(self, didSelectAtIndex: button.tag) 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/ModelCollection/ImageCollectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImageCollectionCell.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class ImageCollectionViewCell: UICollectionViewCell { 12 | 13 | let imageView = UIImageView() 14 | 15 | override init(frame: CGRect) { 16 | super.init(frame: frame) 17 | addCornerRadius() 18 | 19 | addSubview(imageView) 20 | imageView.contentMode = .scaleAspectFill 21 | imageView.constrainEdgesHorizontally(to: self) 22 | imageView.constrainTop(to: self) 23 | imageView.constrainBottom(to: self, priority: .defaultHigh) 24 | } 25 | 26 | required init?(coder aDecoder: NSCoder) { 27 | fatalError("init(coder:) has not been implemented") 28 | } 29 | 30 | func config(image: UIImage?) { 31 | imageView.image = image 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/ModelCollection/ModelCollectionView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ModelCollectionView.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol ModelCollectionViewDelegate: class { 12 | func modelCollectionView(_ modelCollectionView: ModelCollectionView, didSelectModel nodeMaker: NodeCreatorType) 13 | } 14 | 15 | class ModelCollectionView: UIView { 16 | 17 | weak var delegate: ModelCollectionViewDelegate? 18 | 19 | private let imageCollectionView: ImageCollectionView 20 | 21 | private let nodeMakers: [NodeCreatorType] 22 | 23 | init(frame: CGRect, nodeMakers: [NodeCreatorType]) { 24 | self.nodeMakers = nodeMakers 25 | 26 | let images = nodeMakers.map { $0.menuImage } 27 | imageCollectionView = ImageCollectionView(images: images, frame: frame) 28 | 29 | super.init(frame: frame) 30 | 31 | let closeButton = UIButton() 32 | let closeButtonImage = ImageAssets.closeWhite.image() 33 | closeButton.setImage(closeButtonImage, for: .normal) 34 | addSubview(closeButton) 35 | closeButton.addTarget(self, action: #selector(closeButtonPressed), for: .touchUpInside) 36 | closeButton.constrainTop(to: self) 37 | closeButton.constrainLeft(to: self) 38 | closeButton.constrainSize(CGSize(width: 40, height: 40)) 39 | 40 | imageCollectionView.imageCollectionDelegate = self 41 | 42 | addSubview(imageCollectionView) 43 | imageCollectionView.constrainTopToBottom(of: closeButton) 44 | imageCollectionView.constrainEdgesHorizontally(to: self) 45 | imageCollectionView.constrainBottom(to: self, priority: .defaultLow) 46 | } 47 | 48 | required init?(coder aDecoder: NSCoder) { 49 | fatalError("init(coder:) has not been implemented") 50 | } 51 | 52 | @objc private func closeButtonPressed() { 53 | removeFromSuperview() 54 | } 55 | } 56 | 57 | extension ModelCollectionView: ImageCollectionViewDelegate { 58 | func imageCollection(didSelectItemAt index: Int) { 59 | delegate?.modelCollectionView(self, didSelectModel: nodeMakers[index]) 60 | removeFromSuperview() 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/Panel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Panel.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-27. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class Panel { 12 | /// A container for the viewToPresent 13 | let view = UIView() 14 | 15 | /// A priority determined by the user. 16 | /// When presenting a panel with a heigher height priority than the other panel, the height constraint is animated. 17 | /// Otherwise, don't animate the height. 18 | var heightPriority: UILayoutPriority! 19 | 20 | /// The left constraint on the view, so the panel can be animated. 21 | var leftConstraint: NSLayoutConstraint! 22 | var heightConstraint: NSLayoutConstraint 23 | weak var middleConstraint: NSLayoutConstraint? 24 | 25 | init(width: CGFloat) { 26 | view.constrainWidth(width) 27 | 28 | // Constrain the height of all presented containers to be a square, with low priority 29 | // Low priority because we want it to be a square if a height cannot be calculated 30 | heightConstraint = view.constrainHeight(width, relation: .equalOrGreater, priority: .defaultLow) 31 | 32 | setupContainer() 33 | } 34 | 35 | /// Constrain a view to the presentingView 36 | /// 37 | /// - Parameters: 38 | /// - viewToPresent: A UIView with an optional height constraint. 39 | /// - heightPriority: Priority of the height constraint. If a 40 | /// - presentingView: The view containing all the panels (i.e. a viewController.view 41 | func constrainToPresenter(viewToPresent: UIView, heightPriority: UILayoutPriority, presentingView: UIView) { 42 | self.heightPriority = heightPriority 43 | 44 | presentingView.addSubview(view) 45 | leftConstraint = view.constrainLeftToRight(of: presentingView) 46 | 47 | view.addSubview(viewToPresent) 48 | // viewToPresent.constrainEdgesHorizontally(to: view, leftInsets: 20, rightInsets: 20) 49 | // viewToPresent.constrainTop(to: view, offset: 10) 50 | // viewToPresent.constrainBottom(to: view, offset: -20, relation: .equalOrGreater, priority: .init(999)) 51 | 52 | let insets = UIEdgeInsets(top: 10, left: 20, bottom: 20, right: 20) 53 | viewToPresent.constrainEdges(to: view, insets: insets) 54 | } 55 | 56 | private func setupContainer() { 57 | view.addCornerRadius() 58 | view.backgroundColor = UIColor.white // A flash of color when a new panel is presented 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/TransformationPanel/NodeNames.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NodeNames.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-09. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | // Default names I give nodes, so that they can be added and removed later. 10 | enum NodeNames: String { 11 | case boundingBox = "Bounding Box" 12 | 13 | case sceneViewWorldOrigin = "SceneView World Origin 🌎" 14 | case worldOrigin = "World Origin" 15 | 16 | case arModeCamera = "AR Camera" 17 | case gameModeCamera = "Game Mode Camera" 18 | 19 | case axis = "Axis" 20 | case localVector = "Parent to Child Vector" 21 | } 22 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/TransformationPanel/PowerPanelCheckmarkInput.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PowerPanelCheckmarkInput.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-03-31. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol PowerPanelCheckmarkInputDelegate: class { 12 | func powerPanelCheckmarkInput(_ checkMarkInput: PowerPanelCheckmarkInput, isCheckedDidChange isChecked: Bool) 13 | } 14 | 15 | class PowerPanelCheckmarkInput: UIStackView { 16 | 17 | var isChecked: Bool { 18 | get { 19 | return button.isSelected 20 | } 21 | set { 22 | button.isSelected = newValue 23 | button.backgroundColor = newValue ? .uiControlColor : .white 24 | } 25 | } 26 | 27 | weak var delegate: PowerPanelCheckmarkInputDelegate? 28 | 29 | private let button = UIButton() 30 | 31 | init(text: String) { 32 | super.init(frame: CGRect.zero) 33 | 34 | self.axis = .horizontal 35 | 36 | let label = UILabel() 37 | label.text = text 38 | label.font = UIFont.inputSliderHeader 39 | label.textColor = .white 40 | addArrangedSubview(label) 41 | 42 | let buttonParent = UIView() 43 | buttonParent.constrainAspectRatio(to: CGSize(width: 1, height: 1)) 44 | addArrangedSubview(buttonParent) 45 | 46 | button.isSelected = isChecked 47 | let checkMarkWhiteImage = ImageAssets.checkmarkWhite.image() 48 | button.setImage(checkMarkWhiteImage, for: .selected) 49 | button.setImage(checkMarkWhiteImage, for: .highlighted) 50 | button.setupPowerPanelBorder(tintColor: .uiControlColor) 51 | buttonParent.addSubview(button) 52 | button.constrainEdges(to: buttonParent, insets: UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)) 53 | 54 | isChecked = false 55 | 56 | button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside) 57 | } 58 | 59 | required init(coder: NSCoder) { 60 | fatalError("init(coder:) has not been implemented") 61 | } 62 | 63 | @objc private func buttonPressed() { 64 | isChecked = !isChecked 65 | button.isSelected = isChecked 66 | delegate?.powerPanelCheckmarkInput(self, isCheckedDidChange: isChecked) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/TransformationPanel/PowerPanelTextField.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PowerPanelTextField.swift 3 | // ARPlanets 4 | // 5 | // Created by TSD040 on 2018-03-30. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol PowerPanelTextFieldDelegate: class { 12 | func powerPanelTextField(didChangeText text: String?) 13 | } 14 | 15 | class PowerPanelTextField: UIView { 16 | var text: String? { 17 | get { 18 | return textField.text 19 | } 20 | set { 21 | textField.text = newValue 22 | } 23 | } 24 | 25 | weak var delegate: PowerPanelTextFieldDelegate? 26 | 27 | private let textField = UITextField() 28 | 29 | init() { 30 | super.init(frame: CGRect.zero) 31 | setupPowerPanelTextField(textField, tintColor: .uiControlColor) 32 | textField.delegate = self 33 | } 34 | 35 | required init?(coder aDecoder: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | } 39 | 40 | extension PowerPanelTextField: UITextFieldDelegate { 41 | func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 42 | let editedString = (text! as NSString).replacingCharacters(in: range, with: string) 43 | delegate?.powerPanelTextField(didChangeText: editedString) 44 | return true 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/TransformationPanel/Slider Input Views/SliderVector3View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SliderVector3View.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-19. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SceneKit 11 | 12 | protocol SliderVector3ViewDelegate: class { 13 | func sliderVector3View(_ sliderVector3View: SliderVector3View, didChangeValues vector: SCNVector3) 14 | } 15 | 16 | // A SliderInputsView with 3 values, x, y, and z. 17 | class SliderVector3View: SliderInputsView { 18 | 19 | var vector = SCNVector3() { 20 | didSet { 21 | setValue(vector.x, atIndex: 0) 22 | setValue(vector.y, atIndex: 1) 23 | setValue(vector.z, atIndex: 2) 24 | } 25 | } 26 | 27 | weak var delegate: SliderVector3ViewDelegate? = nil 28 | 29 | init(minValue: Float = -Float.greatestFiniteMagnitude, 30 | maxValue: Float = Float.greatestFiniteMagnitude) { 31 | super.init(axisLabels: ["X:", " Y:", " Z:"], minValue: minValue, maxValue: maxValue) 32 | viewDelegate = self 33 | } 34 | 35 | required init?(coder aDecoder: NSCoder) { 36 | fatalError("init(coder:) has not been implemented") 37 | } 38 | } 39 | 40 | extension SliderVector3View: SliderInputsViewDelegate { 41 | func sliderInputView(didChange value: Float, at index: Int) { 42 | switch index { 43 | case 0: 44 | vector.x = value 45 | case 1: 46 | vector.y = value 47 | default: 48 | vector.z = value 49 | } 50 | delegate?.sliderVector3View(self, didChangeValues: vector) 51 | } 52 | } 53 | 54 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/PowerPanels/TransformationPanel/Slider Input Views/SliderVector4View.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SliderVector4View.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-23. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SceneKit 11 | 12 | protocol SliderVector4ViewDelegate: class { 13 | func sliderVector4View(_ sliderVector4View: SliderVector4View, didChangeValues vector: SCNVector4) 14 | } 15 | 16 | // A SliderInputsView with 4 values, x, y, z, and w. 17 | class SliderVector4View: SliderInputsView { 18 | 19 | var vector = SCNVector4() { 20 | didSet { 21 | setValue(vector.x, atIndex: 0) 22 | setValue(vector.y, atIndex: 1) 23 | setValue(vector.z, atIndex: 2) 24 | setValue(vector.w, atIndex: 3) 25 | } 26 | } 27 | 28 | weak var delegate: SliderVector4ViewDelegate? = nil 29 | 30 | init(minValue: Float = -Float.greatestFiniteMagnitude, 31 | maxValue: Float = Float.greatestFiniteMagnitude) { 32 | super.init(axisLabels: ["X:", " Y:", " Z:", " W:"], minValue: minValue, maxValue: maxValue) 33 | viewDelegate = self 34 | } 35 | 36 | required init?(coder aDecoder: NSCoder) { 37 | fatalError("init(coder:) has not been implemented") 38 | } 39 | } 40 | 41 | extension SliderVector4View: SliderInputsViewDelegate { 42 | func sliderInputView(didChange value: Float, at index: Int) { 43 | switch index { 44 | case 0: 45 | vector.x = value 46 | case 1: 47 | vector.y = value 48 | case 2: 49 | vector.z = value 50 | default: 51 | vector.w = value 52 | } 53 | delegate?.sliderVector4View(self, didChangeValues: vector) 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Arrow.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Barrel_Clo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Barrel_Clo.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Barrel_Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Barrel_Open.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Box.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Box.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Bullion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Bullion.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Chest_Clos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Chest_Clos.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Chest_Open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Chest_Open.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Coin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Coin.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crown.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_1.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_2.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_3.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Crystal_4.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Emeraid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Emeraid.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Exlir_Of0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Exlir_Of0.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Exlir_Of_.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Exlir_Of_.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Key.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Pick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Pick.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_2.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_And.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_And.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_And0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Rocks_And0.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Ruby.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Shield.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Skull.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Skull.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_1.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_10.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_11.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_12.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_13.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_14.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_15.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_16.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_17.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_18.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_3.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_4.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_5.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_6.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_7.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Stone_8.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Sword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Sword.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Tree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesAdventure/Tree.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/checkmarkWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/checkmarkWhite.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/closeWhite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/closeWhite.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuFox.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuFox.jpeg -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuLowPolyTree.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuLowPolyTree.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuShip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuShip.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuWolf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesMenu/menuWolf.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeBox.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCapsule.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCapsule.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCone.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCylinder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeCylinder.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapePlane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapePlane.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapePyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapePyramid.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeSphere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeSphere.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeTorus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeTorus.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeTube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/ForPlaygroundOnly/imagesShapes/shapeTube.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/camera.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/camera.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/jump_dust.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/jump_dust.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_AO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_AO.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuse.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseB.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseC.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseD.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_diffuseD.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_idle.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_idle.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_jump.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_jump.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_roughness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_roughness.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_specular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_specular.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_spin.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_spin.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_walk.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/max_walk.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/smoke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/fox/smoke.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/ship.scn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/ship.scn -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/texture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/texture.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Body.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Body.jpg -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Eyes_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Eyes_1.jpg -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Eyes_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Eyes_2.jpg -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Fur.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanels/Resources/art.scnassets/wolf/textures/Wolf_Fur.jpg -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanels/View Controllers/GlobalPlayground.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GlobalPlayground.swift 3 | // ARPowerPanels 4 | // 5 | // Created by TSD040 on 2018-04-01. 6 | // Copyright © 2018 Pei Sun. All rights reserved. 7 | // 8 | 9 | // Global Methods used in the playground 10 | 11 | import UIKit 12 | import ARKit 13 | 14 | func detectedPlane(plane: ARPlaneAnchor) { 15 | //#-copy-source(id1) 16 | //#-editable-code Remember to call the playSound(_:) function here! 17 | 18 | //#-end-editable-code 19 | //#-end-copy-source 20 | 21 | //#-hidden-code 22 | 23 | //#-end-hidden-code 24 | } 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "icon-40.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "idiom" : "iphone", 11 | "size" : "20x20", 12 | "scale" : "3x" 13 | }, 14 | { 15 | "size" : "29x29", 16 | "idiom" : "iphone", 17 | "filename" : "icon-29.png", 18 | "scale" : "1x" 19 | }, 20 | { 21 | "size" : "29x29", 22 | "idiom" : "iphone", 23 | "filename" : "icon-29@2x.png", 24 | "scale" : "2x" 25 | }, 26 | { 27 | "size" : "29x29", 28 | "idiom" : "iphone", 29 | "filename" : "icon-29@3x.png", 30 | "scale" : "3x" 31 | }, 32 | { 33 | "size" : "40x40", 34 | "idiom" : "iphone", 35 | "filename" : "icon-40@2x.png", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "size" : "40x40", 40 | "idiom" : "iphone", 41 | "filename" : "icon-40@3x.png", 42 | "scale" : "3x" 43 | }, 44 | { 45 | "size" : "60x60", 46 | "idiom" : "iphone", 47 | "filename" : "icon-60@2x.png", 48 | "scale" : "2x" 49 | }, 50 | { 51 | "size" : "60x60", 52 | "idiom" : "iphone", 53 | "filename" : "icon-60@3x.png", 54 | "scale" : "3x" 55 | }, 56 | { 57 | "idiom" : "ipad", 58 | "size" : "20x20", 59 | "scale" : "1x" 60 | }, 61 | { 62 | "idiom" : "ipad", 63 | "size" : "20x20", 64 | "scale" : "2x" 65 | }, 66 | { 67 | "idiom" : "ipad", 68 | "size" : "29x29", 69 | "scale" : "1x" 70 | }, 71 | { 72 | "idiom" : "ipad", 73 | "size" : "29x29", 74 | "scale" : "2x" 75 | }, 76 | { 77 | "idiom" : "ipad", 78 | "size" : "40x40", 79 | "scale" : "1x" 80 | }, 81 | { 82 | "idiom" : "ipad", 83 | "size" : "40x40", 84 | "scale" : "2x" 85 | }, 86 | { 87 | "size" : "76x76", 88 | "idiom" : "ipad", 89 | "filename" : "icon-76.png", 90 | "scale" : "1x" 91 | }, 92 | { 93 | "size" : "76x76", 94 | "idiom" : "ipad", 95 | "filename" : "icon-76@2x.png", 96 | "scale" : "2x" 97 | }, 98 | { 99 | "size" : "83.5x83.5", 100 | "idiom" : "ipad", 101 | "filename" : "icon-83.5@2x.png", 102 | "scale" : "2x" 103 | }, 104 | { 105 | "idiom" : "ios-marketing", 106 | "size" : "1024x1024", 107 | "scale" : "1x" 108 | } 109 | ], 110 | "info" : { 111 | "version" : 1, 112 | "author" : "xcode" 113 | } 114 | } -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-76.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleDisplayName 8 | ARPowerPanels 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSCameraUsageDescription 26 | This application will use the camera for Augmented Reality. 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | arkit 33 | 34 | UIRequiresFullScreen 35 | 36 | UIStatusBarHidden 37 | 38 | UISupportedInterfaceOrientations 39 | 40 | UIInterfaceOrientationPortrait 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | UISupportedInterfaceOrientations~ipad 45 | 46 | UIInterfaceOrientationLandscapeRight 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/ARPowerPanelsDemo/SceneKitViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SceneKitViewController.swift 3 | // ARPlanets 4 | // 5 | // Created by Paige Sun on 2018-03-18. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import SceneKit 11 | import ARPowerPanels 12 | 13 | class SceneKitViewController: UIViewController { 14 | 15 | var powerPanels: ARPowerPanels 16 | 17 | let scene = SCNScene() 18 | 19 | init() { 20 | powerPanels = ARPowerPanels(scene: scene, panelTypes: [.info, .easyMoves, .sceneGraph]) 21 | super.init(nibName: nil, bundle: nil) 22 | } 23 | 24 | required init?(coder aDecoder: NSCoder) { 25 | fatalError("init(coder:) has not been implemented") 26 | } 27 | 28 | override func viewDidLoad() { 29 | super.viewDidLoad() 30 | powerPanels.selectNode(scene.rootNode) 31 | view.addSubview(powerPanels) 32 | powerPanels.constrainEdges(to: view) 33 | } 34 | 35 | override func viewDidAppear(_ animated: Bool) { 36 | super.viewDidAppear(animated) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Podfile: -------------------------------------------------------------------------------- 1 | # Uncomment the next line to define a global platform for your project 2 | # platform :ios, '9.0' 3 | 4 | target 'ARPowerPanels' do 5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 6 | use_frameworks! 7 | 8 | # Pods for ARPowerPanels 9 | pod 'SwiftyTables' 10 | 11 | end 12 | 13 | target 'ARPowerPanelsDemo' do 14 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks 15 | use_frameworks! 16 | 17 | # Pods for ARPowerPanelsDemo 18 | 19 | end 20 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftyTables (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftyTables 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - SwiftyTables 10 | 11 | SPEC CHECKSUMS: 12 | SwiftyTables: 4e4a70172b26e5383fc859b9d751b7ce59219b57 13 | 14 | PODFILE CHECKSUM: f7507d6f9e67ae288eb535ccf02965b950754de5 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - SwiftyTables (1.0.0) 3 | 4 | DEPENDENCIES: 5 | - SwiftyTables 6 | 7 | SPEC REPOS: 8 | https://github.com/cocoapods/specs.git: 9 | - SwiftyTables 10 | 11 | SPEC CHECKSUMS: 12 | SwiftyTables: 4e4a70172b26e5383fc859b9d751b7ce59219b57 13 | 14 | PODFILE CHECKSUM: f7507d6f9e67ae288eb535ccf02965b950754de5 15 | 16 | COCOAPODS: 1.5.3 17 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Paige Sun 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FTD Helpers/CarouselCell/CarouselItemCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CarouselItemCell.swift 3 | // FunctionalTableDataMyDemo 4 | // 5 | // Created by Pei Sun on 2018-01-09. 6 | // Copyright © 2018 TribalScale. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol CarouselItemCell where Self: UICollectionViewCell { 12 | associatedtype ItemModel: Equatable 13 | static func sizeForItem(model: ItemModel, in collectionView: UICollectionView) -> CGSize 14 | static func scrollDirection() -> UICollectionViewScrollDirection 15 | func configure(model: ItemModel) 16 | } 17 | 18 | public extension CarouselItemCell { 19 | static func reuseId() -> String { 20 | return String(describing: self) 21 | } 22 | } 23 | 24 | /** 25 | Classes conforming to CarouselItemCells can optionally conform to CarouselItemNibView 26 | if there is a cooresponding Nib with the same name 27 | */ 28 | public protocol CarouselItemNibView {} 29 | 30 | public extension CarouselItemNibView { 31 | public static func nibWithClassName() -> UINib { 32 | return UINib(nibName: String(describing: self), bundle: nil) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FTD Helpers/HostCell+StateType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StateType.swift 3 | // FunctionalTableDataMyDemo 4 | // 5 | // Created by Paige Sun on 2017-12-19. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol StateType { 11 | associatedtype View 12 | static func updateView(_ view: View, state: Self?) 13 | } 14 | 15 | public extension HostCell where State: StateType, State.View == View { 16 | public init(key: String, style: CellStyle? = nil, actions: CellActions = CellActions(), state: State) { 17 | self.key = key 18 | self.style = style 19 | self.actions = actions 20 | self.state = state 21 | self.cellUpdater = State.updateView 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FTD Helpers/NibView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NibView.swift 3 | // FunctionalTableDataMyDemo 4 | // 5 | // Created by Paige Sun on 2017-12-19. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol NibView: class {} 11 | 12 | public extension NibView { 13 | public static func instanceFromNib() -> Self? { 14 | let nibName = String(describing: self) 15 | guard Bundle.main.path(forResource: nibName, ofType: "nib") != nil else { 16 | fatalError("No nib named \(nibName).xib exist.") 17 | } 18 | 19 | return Bundle.main.loadNibNamed(nibName, owner: self, options: nil)?.first as? Self 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FTD Helpers/UIView+Helpers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extension.swift 3 | // SimpleTable 4 | // 5 | // Created by Paige Sun on 2017-11-28. 6 | // Copyright © 2017 Paige Sun. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | func pinToSuperView() { 13 | guard let superview = self.superview else { 14 | return 15 | } 16 | 17 | self.translatesAutoresizingMaskIntoConstraints = false 18 | 19 | // if #available(iOS 11.0, *) { 20 | // NSLayoutConstraint.activate([ 21 | // self.topAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.topAnchor), 22 | // self.bottomAnchor.constraint(equalTo: superview.safeAreaLayoutGuide.bottomAnchor), 23 | // self.leftAnchor.constraint(equalTo: superview.leftAnchor), 24 | // self.rightAnchor.constraint(equalTo: superview.rightAnchor) 25 | // ]) 26 | // } else { 27 | NSLayoutConstraint.activate([ 28 | self.topAnchor.constraint(equalTo: superview.topAnchor), 29 | self.bottomAnchor.constraint(equalTo: superview.bottomAnchor), 30 | self.leftAnchor.constraint(equalTo: superview.leftAnchor), 31 | self.rightAnchor.constraint(equalTo: superview.rightAnchor) 32 | ]) 33 | // } 34 | } 35 | } 36 | 37 | extension NSLayoutDimension { 38 | func activateConstraint(equalToConstant: CGFloat, priority: Float) -> NSLayoutConstraint { 39 | let constraint = self.constraint(equalToConstant: equalToConstant) 40 | constraint.priority = UILayoutPriority(rawValue: priority) 41 | constraint.isActive = true 42 | return constraint 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/CollectionView/CollectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionCell.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public class CollectionCell: UICollectionViewCell { 12 | public let view: ViewType 13 | public var prepare: ((_ view: ViewType) -> Void)? 14 | 15 | public override init(frame: CGRect) { 16 | if let nibView = ViewType.self as? NibView.Type, let instance = nibView.instanceFromNib() { 17 | view = instance as! ViewType 18 | } else { 19 | view = ViewType() 20 | } 21 | super.init(frame: frame) 22 | contentView.addSubviewsForAutolayout(view) 23 | Layout.layoutView(view, inContentView: contentView) 24 | } 25 | 26 | required public init?(coder aDecoder: NSCoder) { 27 | fatalError("init(coder:) has not been implemented") 28 | } 29 | 30 | public override func prepareForReuse() { 31 | super.prepareForReuse() 32 | prepare?(view) 33 | prepare = nil 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/CollectionView/CollectionItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CollectionItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol CollectionItemConfigType { 12 | func register(with collectionView: UICollectionView) 13 | func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell 14 | } 15 | 16 | extension CollectionItemConfigType { 17 | public func dequeueCell(from collectionView: UICollectionView, at indexPath: IndexPath) -> UICollectionViewCell { 18 | return collectionView.dequeueReusableCell(withReuseIdentifier: UICollectionViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/CollectionView/UICollectionView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UICollectionView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-09-16. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UICollectionView { 12 | final func registerReusableCell(_ cellType: T.Type) { 13 | register(cellType.self, forCellWithReuseIdentifier: T.reuseIdentifier) 14 | } 15 | 16 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath) -> T { 17 | guard let cell = self.dequeueReusableCell(withReuseIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 18 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 19 | } 20 | return cell 21 | } 22 | } 23 | 24 | extension UICollectionViewCell: Reusable { } 25 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/ObjCExceptionRethrower.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjCExceptionRethrower.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-07-28. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension NSException { 12 | public static func catchAndRethrow(_ block: () -> Void, failure: (_ exception: NSException) -> Void) { 13 | catchAndRethrowException(block, failure) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | /// A type that identifies a dequeueable object. Used by `FunctionalTableData` to increase performance by reusing objects when it needs to, just like `UITableView` and `UICollectionView`. 12 | public protocol Reusable: class { 13 | /// Unique identifier for the object. 14 | static var reuseIdentifier: String { get } 15 | } 16 | 17 | extension Reusable { 18 | public static var reuseIdentifier: String { 19 | return NSStringFromClass(self) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/TableItemLayout.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemLayout.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemLayout { 12 | static func layoutView(_ view: UIView, inContentView contentView: UIView) 13 | } 14 | 15 | // TableItemLayout 16 | 17 | public typealias EdgeBasedTableItemLayout = CombinedLayout 18 | public typealias LayoutMarginsTableItemLayout = CombinedLayout 19 | 20 | public struct ExplicitLayoutMarginsTableItemLayout: TableItemLayout { 21 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 22 | contentView.preservesSuperviewLayoutMargins = false 23 | view.constrainToFillView(contentView, respectingLayoutMargins: true) 24 | } 25 | } 26 | 27 | public enum EdgeLayout { 28 | public struct Horizontal: TableItemLayout { 29 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 30 | view.constrainToFillViewHorizontally(contentView) 31 | } 32 | } 33 | public struct Vertical: TableItemLayout { 34 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 35 | view.constrainToFillViewVertically(contentView) 36 | } 37 | } 38 | } 39 | public enum MarginsLayout { 40 | public struct Horizontal: TableItemLayout { 41 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 42 | view.constrainToFillViewHorizontally(contentView, respectingLayoutMargins: true) 43 | } 44 | } 45 | public struct Vertical: TableItemLayout { 46 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 47 | view.constrainToFillViewVertically(contentView, respectingLayoutMargins: true) 48 | } 49 | } 50 | } 51 | 52 | public struct CombinedLayout: TableItemLayout { 53 | public static func layoutView(_ view: UIView, inContentView contentView: UIView) { 54 | Horizontal.layoutView(view, inContentView: contentView) 55 | Vertical.layoutView(view, inContentView: contentView) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/TableSectionHeaderFooter.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableSectionHeaderFooter.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Geoffrey Foster on 2016-09-10. 6 | // Copyright © 2016 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | // MARK: Header specific item config 12 | 13 | @available(*, deprecated: 1.0, message: "Use `TableHeaderFooterConfigType` instead.") 14 | public typealias TableHeaderConfigType = TableHeaderFooterConfigType 15 | 16 | public protocol TableHeaderFooterConfigType: TableItemConfigType { 17 | func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? 18 | var height: CGFloat { get } 19 | } 20 | 21 | public protocol TableHeaderFooterStateType { 22 | var insets: UIEdgeInsets { get } 23 | var height: CGFloat { get } 24 | var topSeparatorHidden: Bool { get } 25 | var bottomSeparatorHidden: Bool { get } 26 | } 27 | 28 | public struct TableSectionHeaderFooter: TableHeaderFooterConfigType { 29 | public typealias ViewUpdater = (_ header: TableHeaderFooter, _ state: S) -> Void 30 | public let state: S? 31 | let updateView: ViewUpdater? 32 | 33 | public init(state: S? = nil, updater: ViewUpdater? = nil) { 34 | self.state = state 35 | self.updateView = updater 36 | } 37 | 38 | public func register(with tableView: UITableView) { 39 | tableView.registerReusableHeaderFooterView(TableHeaderFooter.self) 40 | } 41 | 42 | public func dequeueHeaderFooter(from tableView: UITableView) -> UITableViewHeaderFooterView? { 43 | let header = tableView.dequeueReusableHeaderFooterView(TableHeaderFooter.self) 44 | if let updater = updateView, let state = state { 45 | updater(header, state) 46 | } 47 | return header 48 | } 49 | 50 | public var height: CGFloat { 51 | return state?.height ?? 0 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/TableView/TableItemConfigType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TableItemConfigType.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol TableItemConfigType { 12 | func register(with tableView: UITableView) 13 | func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell 14 | } 15 | 16 | extension TableItemConfigType { 17 | public func dequeueCell(from tableView: UITableView, at indexPath: IndexPath) -> UITableViewCell { 18 | return tableView.dequeueReusableCell(withIdentifier: UITableViewCell.reuseIdentifier, for: indexPath) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/TableView/UITableView+Reusable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITableView+Reusable.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-10-08. 6 | // Copyright © 2017 Raul Riera. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | public extension UITableView { 12 | // MARK: Headers 13 | 14 | final func registerReusableHeaderFooterView(_ headerType: T.Type) { 15 | register(headerType.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier) 16 | } 17 | 18 | final func dequeueReusableHeaderFooterView(_ headerType: T.Type = T.self) -> T { 19 | guard let header = self.dequeueReusableHeaderFooterView(withIdentifier: headerType.reuseIdentifier) as? T else { 20 | fatalError("Failed to dequeue a header/footer with identifier \(headerType.reuseIdentifier) matching type \(headerType.self)") 21 | } 22 | return header 23 | } 24 | 25 | // MARK: Cells 26 | 27 | final func registerReusableCell(_ cellType: T.Type) { 28 | register(cellType.self, forCellReuseIdentifier: T.reuseIdentifier) 29 | } 30 | 31 | final func dequeueReusableCell(_ cellType: T.Type = T.self, indexPath: IndexPath?) -> T { 32 | if let indexPath = indexPath { 33 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier, for: indexPath) as? T else { 34 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 35 | } 36 | return cell 37 | } else { 38 | guard let cell = self.dequeueReusableCell(withIdentifier: cellType.reuseIdentifier) as? T else { 39 | fatalError("Failed to dequeue a cell with identifier \(cellType.reuseIdentifier) matching type \(cellType.self)") 40 | } 41 | return cell 42 | } 43 | } 44 | } 45 | 46 | extension UITableViewCell: Reusable { } 47 | extension UITableViewHeaderFooterView: Reusable { } 48 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftDeclarativeTables/FunctionalTableData/UIView+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Extensions.swift 3 | // FunctionalTableData 4 | // 5 | // Created by Raul Riera on 2017-07-31. 6 | // Copyright © 2017 Shopify. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | func typedSuperview() -> T? { 13 | var parent = superview 14 | 15 | while parent != nil { 16 | if let view = parent as? T { 17 | return view 18 | } else { 19 | parent = parent?.superview 20 | } 21 | } 22 | 23 | return nil 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/SwiftyTables/SwiftyTablesProject/SwiftyTables/SwiftyTables.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwiftyTables.h 3 | // SwiftyTables 4 | // 5 | // Created by TSD064 on 2018-05-01. 6 | // Copyright © 2018 Paige Sun. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for SwiftyTables. 12 | FOUNDATION_EXPORT double SwiftyTablesVersionNumber; 13 | 14 | //! Project version string for SwiftyTables. 15 | FOUNDATION_EXPORT const unsigned char SwiftyTablesVersionString[]; 16 | 17 | 18 | // In this header, you should import all the public headers of your framework using statements like #import 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | __attribute__((visibility("hidden"))) 22 | static inline void catchAndRethrowException(__attribute__((noescape)) void (^ __nonnull inBlock)(void), __attribute__((noescape)) void (^ __nonnull rethrow)(NSException *)) { 23 | @try { 24 | inBlock(); 25 | } @catch (NSException *exception) { 26 | rethrow(exception); 27 | @throw; 28 | } 29 | } 30 | 31 | NS_ASSUME_NONNULL_END 32 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SwiftyTables 5 | 6 | MIT License 7 | 8 | Copyright (c) 2018 Paige Sun 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | MIT License 18 | 19 | Copyright (c) 2018 Paige Sun 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | SwiftyTables 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ARPowerPanels : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ARPowerPanels 5 | @end 6 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ARPowerPanelsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ARPowerPanelsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables/SwiftyTables.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyTables" 6 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ARPowerPanels { 2 | umbrella header "Pods-ARPowerPanels-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanels/Pods-ARPowerPanels.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks' 4 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables/SwiftyTables.framework/Headers" 5 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyTables" 6 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 7 | PODS_BUILD_DIR = ${BUILD_DIR} 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 10 | PODS_ROOT = ${SRCROOT}/Pods 11 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## SwiftyTables 5 | 6 | MIT License 7 | 8 | Copyright (c) 2018 Paige Sun 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in all 18 | copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 26 | SOFTWARE. 27 | 28 | Generated by CocoaPods - https://cocoapods.org 29 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | MIT License 18 | 19 | Copyright (c) 2018 Paige Sun 20 | 21 | Permission is hereby granted, free of charge, to any person obtaining a copy 22 | of this software and associated documentation files (the "Software"), to deal 23 | in the Software without restriction, including without limitation the rights 24 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 25 | copies of the Software, and to permit persons to whom the Software is 26 | furnished to do so, subject to the following conditions: 27 | 28 | The above copyright notice and this permission notice shall be included in all 29 | copies or substantial portions of the Software. 30 | 31 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 32 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 33 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 34 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 35 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 36 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 37 | SOFTWARE. 38 | 39 | License 40 | MIT 41 | Title 42 | SwiftyTables 43 | Type 44 | PSGroupSpecifier 45 | 46 | 47 | FooterText 48 | Generated by CocoaPods - https://cocoapods.org 49 | Title 50 | 51 | Type 52 | PSGroupSpecifier 53 | 54 | 55 | StringsTable 56 | Acknowledgements 57 | Title 58 | Acknowledgements 59 | 60 | 61 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_ARPowerPanelsDemo : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_ARPowerPanelsDemo 5 | @end 6 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_ARPowerPanelsDemoVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_ARPowerPanelsDemoVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables/SwiftyTables.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyTables" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_ARPowerPanelsDemo { 2 | umbrella header "Pods-ARPowerPanelsDemo-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/Pods-ARPowerPanelsDemo/Pods-ARPowerPanelsDemo.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 5 | OTHER_CFLAGS = $(inherited) -iquote "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables/SwiftyTables.framework/Headers" 6 | OTHER_LDFLAGS = $(inherited) -framework "SwiftyTables" 7 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/SwiftyTables-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SwiftyTables : NSObject 3 | @end 4 | @implementation PodsDummy_SwiftyTables 5 | @end 6 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/SwiftyTables-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/SwiftyTables-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | #import "SwiftyTables.h" 14 | 15 | FOUNDATION_EXPORT double SwiftyTablesVersionNumber; 16 | FOUNDATION_EXPORT const unsigned char SwiftyTablesVersionString[]; 17 | 18 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/SwiftyTables.modulemap: -------------------------------------------------------------------------------- 1 | framework module SwiftyTables { 2 | umbrella header "SwiftyTables-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /ARPowerPanelsFramework/Pods/Target Support Files/SwiftyTables/SwiftyTables.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftyTables 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyTables 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_1_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_1_.PNG -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_2_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_2_.PNG -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_3_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_3_.PNG -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_4_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_4_.PNG -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_5_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_5_.PNG -------------------------------------------------------------------------------- /Screenshots/ARPowerPanels_6_.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/p-sun/ARPowerPanels/5cf46603e34a9818ebcd8c3fec79967ae8a8fe8a/Screenshots/ARPowerPanels_6_.PNG -------------------------------------------------------------------------------- /Tests.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | --------------------------------------------------------------------------------