├── CHANGELOG.md
├── README.md
├── Verdure Viewer
├── Verdure Viewer
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Verdure_ViewerApp.swift
│ ├── Verdure_Viewer.entitlements
│ ├── Extensions
│ │ └── Footprint.swift
│ ├── Views
│ │ └── AppView.swift
│ └── View Models
│ │ └── AppViewModel.swift
└── Verdure Viewer.xcodeproj
│ ├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ ├── IDEWorkspaceChecks.plist
│ │ └── swiftpm
│ │ └── Package.resolved
│ └── project.pbxproj
├── Sources
└── Verdure
│ └── Verdure.swift
├── Package.resolved
├── Package.swift
├── .gitignore
└── LICENSE.md
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Verdure
2 |
3 | A description of this package.
4 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Sources/Verdure/Verdure.swift:
--------------------------------------------------------------------------------
1 | public struct Verdure {
2 | public private(set) var text = "Hello, World!"
3 |
4 | public init() {
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "euclid",
5 | "kind" : "remoteSourceControl",
6 | "location" : "git@github.com:nicklockwood/Euclid.git",
7 | "state" : {
8 | "branch" : "main",
9 | "revision" : "00a39468d274a3081966ed115ef5f18cd28b43ff"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Verdure_ViewerApp.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Verdure_ViewerApp.swift
3 | //
4 | // Created by Zack Brown on 04/09/2023.
5 | //
6 |
7 | import SwiftUI
8 |
9 | @main
10 | struct Verdure_ViewerApp: App {
11 |
12 | var body: some Scene {
13 |
14 | WindowGroup {
15 |
16 | AppView()
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Verdure_Viewer.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "pins" : [
3 | {
4 | "identity" : "euclid",
5 | "kind" : "remoteSourceControl",
6 | "location" : "git@github.com:nicklockwood/Euclid.git",
7 | "state" : {
8 | "branch" : "main",
9 | "revision" : "00a39468d274a3081966ed115ef5f18cd28b43ff"
10 | }
11 | }
12 | ],
13 | "version" : 2
14 | }
15 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Extensions/Footprint.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Footprint.swift
3 | //
4 | // Created by Zack Brown on 06/09/2023.
5 | //
6 |
7 | import Bivouac
8 | import Euclid
9 |
10 | extension Grid.Footprint {
11 |
12 | var center: Vector {
13 |
14 | var vector = Vector.zero
15 |
16 | for coordinate in coordinates {
17 |
18 | vector += coordinate.convert(to: .tile)
19 | }
20 |
21 | return vector / Double(coordinates.count)
22 | }
23 | }
24 |
25 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version: 5.7
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "Verdure",
8 | platforms: [.macOS(.v11),
9 | .iOS(.v13)],
10 | products: [
11 | .library(
12 | name: "Verdure",
13 | targets: ["Verdure"]),
14 | ],
15 | dependencies: [
16 | .package(url: "git@github.com:nicklockwood/Euclid.git", branch: "main"),
17 | .package(path: "../Bivouac"),
18 | ],
19 | targets: [
20 | .target(
21 | name: "Verdure",
22 | dependencies: ["Bivouac", "Euclid"]),
23 | ]
24 | )
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | .DS_Store
6 |
7 | ## User settings
8 | xcuserdata/
9 |
10 | ## Obj-C/Swift specific
11 | *.hmap
12 |
13 | ## App packaging
14 | *.ipa
15 | *.dSYM.zip
16 | *.dSYM
17 |
18 | ## Playgrounds
19 | timeline.xctimeline
20 | playground.xcworkspace
21 |
22 | # Swift Package Manager
23 | #
24 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
25 | # Packages/
26 | # Package.pins
27 | # Package.resolved
28 | # *.xcodeproj
29 | #
30 | # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
31 | # hence it is not needed unless you have added a package configuration file to your project
32 | .swiftpm
33 |
34 | .build/
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 Zack Brown
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.
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "1x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "2x",
16 | "size" : "16x16"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "1x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "2x",
26 | "size" : "32x32"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "1x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "2x",
36 | "size" : "128x128"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "1x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "2x",
46 | "size" : "256x256"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "1x",
51 | "size" : "512x512"
52 | },
53 | {
54 | "idiom" : "mac",
55 | "scale" : "2x",
56 | "size" : "512x512"
57 | }
58 | ],
59 | "info" : {
60 | "author" : "xcode",
61 | "version" : 1
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/Views/AppView.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppView.swift
3 | //
4 | // Created by Zack Brown on 04/09/2023.
5 | //
6 |
7 | import Bivouac
8 | import SceneKit
9 | import SwiftUI
10 |
11 | struct AppView: View {
12 |
13 | @ObservedObject private var viewModel = AppViewModel()
14 |
15 | var body: some View {
16 |
17 | #if os(iOS)
18 | NavigationStack {
19 |
20 | sceneView
21 | }
22 | #else
23 | sceneView
24 | #endif
25 | }
26 |
27 | var sceneView: some View {
28 |
29 | SceneView(scene: viewModel.scene,
30 | pointOfView: viewModel.scene.camera.pov,
31 | options: [.allowsCameraControl,
32 | .autoenablesDefaultLighting])
33 | .toolbar {
34 |
35 | ToolbarItemGroup {
36 |
37 | toolbar
38 | }
39 | }
40 | }
41 |
42 | @ViewBuilder
43 | var toolbar: some View {
44 |
45 | Picker("Foliage Type",
46 | selection: $viewModel.foliageType) {
47 |
48 | ForEach(FoliageType.allCases, id: \.self) { foliageType in
49 |
50 | Text(foliageType.id.capitalized)
51 | .id(foliageType)
52 | }
53 | }
54 |
55 | Picker("Area",
56 | selection: $viewModel.area) {
57 |
58 | ForEach(Grid.Footprint.Area.allCases, id: \.self) { area in
59 |
60 | Text(area.id.capitalized)
61 | .id(area)
62 | }
63 | }
64 | }
65 | }
66 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer/View Models/AppViewModel.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppViewModel.swift
3 | //
4 | // Created by Zack Brown on 04/09/2023.
5 | //
6 |
7 | import Bivouac
8 | import Euclid
9 | import Foundation
10 | import SceneKit
11 |
12 | class AppViewModel: ObservableObject {
13 |
14 | enum Constant {
15 |
16 | static let cameraY = 1.5
17 | static let cameraZ = 1.5
18 | }
19 |
20 | @Published var foliageType: FoliageType = .bamboo {
21 |
22 | didSet {
23 |
24 | guard oldValue != foliageType else { return }
25 |
26 | updateScene()
27 | }
28 | }
29 |
30 | @Published var area: Grid.Footprint.Area = .rhombus {
31 |
32 | didSet {
33 |
34 | guard oldValue != area else { return }
35 |
36 | updateScene()
37 | }
38 | }
39 |
40 | let scene = Scene()
41 |
42 | private var footprint: Grid.Footprint { .init(origin: .zero,
43 | area: area) }
44 |
45 | init() {
46 |
47 | updateScene()
48 | }
49 | }
50 |
51 | extension AppViewModel {
52 |
53 | private func createNode(with mesh: Mesh?) -> SCNNode? {
54 |
55 | guard let mesh else { return nil }
56 |
57 | let node = SCNNode()
58 | let wireframe = SCNNode()
59 | let material = SCNMaterial()
60 |
61 | node.geometry = SCNGeometry(mesh)
62 | node.geometry?.firstMaterial = material
63 |
64 | wireframe.geometry = SCNGeometry(wireframe: mesh)
65 |
66 | node.addChildNode(wireframe)
67 |
68 | return node
69 | }
70 |
71 | private func updateScene() {
72 |
73 | scene.clear()
74 |
75 | updateSurface()
76 |
77 | let size = 0.2
78 |
79 | let box = SCNBox(width: size,
80 | height: size,
81 | length: size,
82 | chamferRadius: 0)
83 |
84 | guard let node = createNode(with: Mesh(box)) else { return }
85 |
86 | let position = footprint.center
87 |
88 | scene.camera.position = SCNVector3(position)
89 |
90 | node.position = SCNVector3(position.x, position.y + (size / 2.0), position.z)
91 | node.geometry?.firstMaterial?.diffuse.contents = NSColor.systemPink
92 |
93 | scene.rootNode.addChildNode(node)
94 | }
95 |
96 | private func updateSurface() {
97 |
98 | var polygons: [Euclid.Polygon] = []
99 |
100 | for coordinate in footprint.coordinates {
101 |
102 | let triangle = Grid.Triangle(coordinate)
103 |
104 | let vertices = triangle.vertices(for: .tile).map { Vertex($0, .up) }
105 |
106 | guard let polygon = Polygon(vertices) else { continue }
107 |
108 | polygons.append(polygon)
109 | }
110 |
111 | let mesh = Mesh(polygons)
112 |
113 | guard let node = createNode(with: mesh) else { return }
114 |
115 | scene.rootNode.addChildNode(node)
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/Verdure Viewer/Verdure Viewer.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 18568EA22AA5E84A00D9A4FA /* Verdure in Frameworks */ = {isa = PBXBuildFile; productRef = 18568EA12AA5E84A00D9A4FA /* Verdure */; };
11 | 188F49BD2AA897FA00DCB819 /* Footprint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 188F49BC2AA897FA00DCB819 /* Footprint.swift */; };
12 | 18B60AD62AA5E45A00686F5B /* Verdure_ViewerApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B60AD52AA5E45A00686F5B /* Verdure_ViewerApp.swift */; };
13 | 18B60AD82AA5E45A00686F5B /* AppView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B60AD72AA5E45A00686F5B /* AppView.swift */; };
14 | 18B60ADA2AA5E45B00686F5B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 18B60AD92AA5E45B00686F5B /* Assets.xcassets */; };
15 | 18B60AE72AA5E73200686F5B /* AppViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B60AE62AA5E73200686F5B /* AppViewModel.swift */; };
16 | /* End PBXBuildFile section */
17 |
18 | /* Begin PBXFileReference section */
19 | 188F49BC2AA897FA00DCB819 /* Footprint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Footprint.swift; sourceTree = ""; };
20 | 18B60AD22AA5E45A00686F5B /* Verdure Viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Verdure Viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; };
21 | 18B60AD52AA5E45A00686F5B /* Verdure_ViewerApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Verdure_ViewerApp.swift; sourceTree = ""; };
22 | 18B60AD72AA5E45A00686F5B /* AppView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppView.swift; sourceTree = ""; };
23 | 18B60AD92AA5E45B00686F5B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
24 | 18B60ADB2AA5E45B00686F5B /* Verdure_Viewer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Verdure_Viewer.entitlements; sourceTree = ""; };
25 | 18B60AE62AA5E73200686F5B /* AppViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppViewModel.swift; sourceTree = ""; };
26 | 18B60AE92AA5E79B00686F5B /* Verdure */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = Verdure; path = ..; sourceTree = ""; };
27 | /* End PBXFileReference section */
28 |
29 | /* Begin PBXFrameworksBuildPhase section */
30 | 18B60ACF2AA5E45A00686F5B /* Frameworks */ = {
31 | isa = PBXFrameworksBuildPhase;
32 | buildActionMask = 2147483647;
33 | files = (
34 | 18568EA22AA5E84A00D9A4FA /* Verdure in Frameworks */,
35 | );
36 | runOnlyForDeploymentPostprocessing = 0;
37 | };
38 | /* End PBXFrameworksBuildPhase section */
39 |
40 | /* Begin PBXGroup section */
41 | 18568EA02AA5E84A00D9A4FA /* Frameworks */ = {
42 | isa = PBXGroup;
43 | children = (
44 | );
45 | name = Frameworks;
46 | sourceTree = "";
47 | };
48 | 188F49BB2AA897EB00DCB819 /* Extensions */ = {
49 | isa = PBXGroup;
50 | children = (
51 | 188F49BC2AA897FA00DCB819 /* Footprint.swift */,
52 | );
53 | path = Extensions;
54 | sourceTree = "";
55 | };
56 | 18B60AC92AA5E45A00686F5B = {
57 | isa = PBXGroup;
58 | children = (
59 | 18B60AE82AA5E79B00686F5B /* Packages */,
60 | 18B60AD42AA5E45A00686F5B /* Verdure Viewer */,
61 | 18B60AD32AA5E45A00686F5B /* Products */,
62 | 18568EA02AA5E84A00D9A4FA /* Frameworks */,
63 | );
64 | sourceTree = "";
65 | };
66 | 18B60AD32AA5E45A00686F5B /* Products */ = {
67 | isa = PBXGroup;
68 | children = (
69 | 18B60AD22AA5E45A00686F5B /* Verdure Viewer.app */,
70 | );
71 | name = Products;
72 | sourceTree = "";
73 | };
74 | 18B60AD42AA5E45A00686F5B /* Verdure Viewer */ = {
75 | isa = PBXGroup;
76 | children = (
77 | 188F49BB2AA897EB00DCB819 /* Extensions */,
78 | 18B60AE52AA5E51200686F5B /* View Models */,
79 | 18B60AE42AA5E50C00686F5B /* Views */,
80 | 18B60AD52AA5E45A00686F5B /* Verdure_ViewerApp.swift */,
81 | 18B60AD92AA5E45B00686F5B /* Assets.xcassets */,
82 | 18B60ADB2AA5E45B00686F5B /* Verdure_Viewer.entitlements */,
83 | );
84 | path = "Verdure Viewer";
85 | sourceTree = "";
86 | };
87 | 18B60AE42AA5E50C00686F5B /* Views */ = {
88 | isa = PBXGroup;
89 | children = (
90 | 18B60AD72AA5E45A00686F5B /* AppView.swift */,
91 | );
92 | path = Views;
93 | sourceTree = "";
94 | };
95 | 18B60AE52AA5E51200686F5B /* View Models */ = {
96 | isa = PBXGroup;
97 | children = (
98 | 18B60AE62AA5E73200686F5B /* AppViewModel.swift */,
99 | );
100 | path = "View Models";
101 | sourceTree = "";
102 | };
103 | 18B60AE82AA5E79B00686F5B /* Packages */ = {
104 | isa = PBXGroup;
105 | children = (
106 | 18B60AE92AA5E79B00686F5B /* Verdure */,
107 | );
108 | name = Packages;
109 | sourceTree = "";
110 | };
111 | /* End PBXGroup section */
112 |
113 | /* Begin PBXNativeTarget section */
114 | 18B60AD12AA5E45A00686F5B /* Verdure Viewer */ = {
115 | isa = PBXNativeTarget;
116 | buildConfigurationList = 18B60AE12AA5E45B00686F5B /* Build configuration list for PBXNativeTarget "Verdure Viewer" */;
117 | buildPhases = (
118 | 18B60ACE2AA5E45A00686F5B /* Sources */,
119 | 18B60ACF2AA5E45A00686F5B /* Frameworks */,
120 | 18B60AD02AA5E45A00686F5B /* Resources */,
121 | );
122 | buildRules = (
123 | );
124 | dependencies = (
125 | );
126 | name = "Verdure Viewer";
127 | packageProductDependencies = (
128 | 18568EA12AA5E84A00D9A4FA /* Verdure */,
129 | );
130 | productName = "Verdure Viewer";
131 | productReference = 18B60AD22AA5E45A00686F5B /* Verdure Viewer.app */;
132 | productType = "com.apple.product-type.application";
133 | };
134 | /* End PBXNativeTarget section */
135 |
136 | /* Begin PBXProject section */
137 | 18B60ACA2AA5E45A00686F5B /* Project object */ = {
138 | isa = PBXProject;
139 | attributes = {
140 | BuildIndependentTargetsInParallel = 1;
141 | LastSwiftUpdateCheck = 1420;
142 | LastUpgradeCheck = 1420;
143 | TargetAttributes = {
144 | 18B60AD12AA5E45A00686F5B = {
145 | CreatedOnToolsVersion = 14.2;
146 | };
147 | };
148 | };
149 | buildConfigurationList = 18B60ACD2AA5E45A00686F5B /* Build configuration list for PBXProject "Verdure Viewer" */;
150 | compatibilityVersion = "Xcode 14.0";
151 | developmentRegion = en;
152 | hasScannedForEncodings = 0;
153 | knownRegions = (
154 | en,
155 | Base,
156 | );
157 | mainGroup = 18B60AC92AA5E45A00686F5B;
158 | productRefGroup = 18B60AD32AA5E45A00686F5B /* Products */;
159 | projectDirPath = "";
160 | projectRoot = "";
161 | targets = (
162 | 18B60AD12AA5E45A00686F5B /* Verdure Viewer */,
163 | );
164 | };
165 | /* End PBXProject section */
166 |
167 | /* Begin PBXResourcesBuildPhase section */
168 | 18B60AD02AA5E45A00686F5B /* Resources */ = {
169 | isa = PBXResourcesBuildPhase;
170 | buildActionMask = 2147483647;
171 | files = (
172 | 18B60ADA2AA5E45B00686F5B /* Assets.xcassets in Resources */,
173 | );
174 | runOnlyForDeploymentPostprocessing = 0;
175 | };
176 | /* End PBXResourcesBuildPhase section */
177 |
178 | /* Begin PBXSourcesBuildPhase section */
179 | 18B60ACE2AA5E45A00686F5B /* Sources */ = {
180 | isa = PBXSourcesBuildPhase;
181 | buildActionMask = 2147483647;
182 | files = (
183 | 18B60AD82AA5E45A00686F5B /* AppView.swift in Sources */,
184 | 18B60AD62AA5E45A00686F5B /* Verdure_ViewerApp.swift in Sources */,
185 | 18B60AE72AA5E73200686F5B /* AppViewModel.swift in Sources */,
186 | 188F49BD2AA897FA00DCB819 /* Footprint.swift in Sources */,
187 | );
188 | runOnlyForDeploymentPostprocessing = 0;
189 | };
190 | /* End PBXSourcesBuildPhase section */
191 |
192 | /* Begin XCBuildConfiguration section */
193 | 18B60ADF2AA5E45B00686F5B /* Debug */ = {
194 | isa = XCBuildConfiguration;
195 | buildSettings = {
196 | ALWAYS_SEARCH_USER_PATHS = NO;
197 | CLANG_ANALYZER_NONNULL = YES;
198 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
199 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
200 | CLANG_ENABLE_MODULES = YES;
201 | CLANG_ENABLE_OBJC_ARC = YES;
202 | CLANG_ENABLE_OBJC_WEAK = YES;
203 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
204 | CLANG_WARN_BOOL_CONVERSION = YES;
205 | CLANG_WARN_COMMA = YES;
206 | CLANG_WARN_CONSTANT_CONVERSION = YES;
207 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
208 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
209 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
210 | CLANG_WARN_EMPTY_BODY = YES;
211 | CLANG_WARN_ENUM_CONVERSION = YES;
212 | CLANG_WARN_INFINITE_RECURSION = YES;
213 | CLANG_WARN_INT_CONVERSION = YES;
214 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
215 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
216 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
217 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
218 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
219 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
220 | CLANG_WARN_STRICT_PROTOTYPES = YES;
221 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
222 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
223 | CLANG_WARN_UNREACHABLE_CODE = YES;
224 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
225 | COPY_PHASE_STRIP = NO;
226 | DEBUG_INFORMATION_FORMAT = dwarf;
227 | ENABLE_STRICT_OBJC_MSGSEND = YES;
228 | ENABLE_TESTABILITY = YES;
229 | GCC_C_LANGUAGE_STANDARD = gnu11;
230 | GCC_DYNAMIC_NO_PIC = NO;
231 | GCC_NO_COMMON_BLOCKS = YES;
232 | GCC_OPTIMIZATION_LEVEL = 0;
233 | GCC_PREPROCESSOR_DEFINITIONS = (
234 | "DEBUG=1",
235 | "$(inherited)",
236 | );
237 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
238 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
239 | GCC_WARN_UNDECLARED_SELECTOR = YES;
240 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
241 | GCC_WARN_UNUSED_FUNCTION = YES;
242 | GCC_WARN_UNUSED_VARIABLE = YES;
243 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
244 | MTL_FAST_MATH = YES;
245 | ONLY_ACTIVE_ARCH = YES;
246 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
247 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
248 | };
249 | name = Debug;
250 | };
251 | 18B60AE02AA5E45B00686F5B /* Release */ = {
252 | isa = XCBuildConfiguration;
253 | buildSettings = {
254 | ALWAYS_SEARCH_USER_PATHS = NO;
255 | CLANG_ANALYZER_NONNULL = YES;
256 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
257 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
258 | CLANG_ENABLE_MODULES = YES;
259 | CLANG_ENABLE_OBJC_ARC = YES;
260 | CLANG_ENABLE_OBJC_WEAK = YES;
261 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
262 | CLANG_WARN_BOOL_CONVERSION = YES;
263 | CLANG_WARN_COMMA = YES;
264 | CLANG_WARN_CONSTANT_CONVERSION = YES;
265 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
266 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
267 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
268 | CLANG_WARN_EMPTY_BODY = YES;
269 | CLANG_WARN_ENUM_CONVERSION = YES;
270 | CLANG_WARN_INFINITE_RECURSION = YES;
271 | CLANG_WARN_INT_CONVERSION = YES;
272 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
273 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
274 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
275 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
276 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
277 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
278 | CLANG_WARN_STRICT_PROTOTYPES = YES;
279 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
280 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
281 | CLANG_WARN_UNREACHABLE_CODE = YES;
282 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
283 | COPY_PHASE_STRIP = NO;
284 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
285 | ENABLE_NS_ASSERTIONS = NO;
286 | ENABLE_STRICT_OBJC_MSGSEND = YES;
287 | GCC_C_LANGUAGE_STANDARD = gnu11;
288 | GCC_NO_COMMON_BLOCKS = YES;
289 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
290 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
291 | GCC_WARN_UNDECLARED_SELECTOR = YES;
292 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
293 | GCC_WARN_UNUSED_FUNCTION = YES;
294 | GCC_WARN_UNUSED_VARIABLE = YES;
295 | MTL_ENABLE_DEBUG_INFO = NO;
296 | MTL_FAST_MATH = YES;
297 | SWIFT_COMPILATION_MODE = wholemodule;
298 | SWIFT_OPTIMIZATION_LEVEL = "-O";
299 | };
300 | name = Release;
301 | };
302 | 18B60AE22AA5E45B00686F5B /* Debug */ = {
303 | isa = XCBuildConfiguration;
304 | buildSettings = {
305 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
306 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
307 | CODE_SIGN_ENTITLEMENTS = "Verdure Viewer/Verdure_Viewer.entitlements";
308 | CODE_SIGN_STYLE = Automatic;
309 | CURRENT_PROJECT_VERSION = 1;
310 | ENABLE_PREVIEWS = YES;
311 | GENERATE_INFOPLIST_FILE = YES;
312 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
313 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
314 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
315 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
316 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
317 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
318 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
319 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
320 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
321 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
322 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
323 | IPHONEOS_DEPLOYMENT_TARGET = 16.2;
324 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
325 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
326 | MACOSX_DEPLOYMENT_TARGET = 12.6;
327 | MARKETING_VERSION = 1.0;
328 | PRODUCT_BUNDLE_IDENTIFIER = "com.verdure.Verdure-Viewer";
329 | PRODUCT_NAME = "$(TARGET_NAME)";
330 | SDKROOT = auto;
331 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
332 | SWIFT_EMIT_LOC_STRINGS = YES;
333 | SWIFT_VERSION = 5.0;
334 | TARGETED_DEVICE_FAMILY = "1,2";
335 | };
336 | name = Debug;
337 | };
338 | 18B60AE32AA5E45B00686F5B /* Release */ = {
339 | isa = XCBuildConfiguration;
340 | buildSettings = {
341 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
342 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
343 | CODE_SIGN_ENTITLEMENTS = "Verdure Viewer/Verdure_Viewer.entitlements";
344 | CODE_SIGN_STYLE = Automatic;
345 | CURRENT_PROJECT_VERSION = 1;
346 | ENABLE_PREVIEWS = YES;
347 | GENERATE_INFOPLIST_FILE = YES;
348 | INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.developer-tools";
349 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
350 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
351 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
352 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
353 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
354 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
355 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
356 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
357 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
358 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
359 | IPHONEOS_DEPLOYMENT_TARGET = 16.2;
360 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
361 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
362 | MACOSX_DEPLOYMENT_TARGET = 12.6;
363 | MARKETING_VERSION = 1.0;
364 | PRODUCT_BUNDLE_IDENTIFIER = "com.verdure.Verdure-Viewer";
365 | PRODUCT_NAME = "$(TARGET_NAME)";
366 | SDKROOT = auto;
367 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
368 | SWIFT_EMIT_LOC_STRINGS = YES;
369 | SWIFT_VERSION = 5.0;
370 | TARGETED_DEVICE_FAMILY = "1,2";
371 | };
372 | name = Release;
373 | };
374 | /* End XCBuildConfiguration section */
375 |
376 | /* Begin XCConfigurationList section */
377 | 18B60ACD2AA5E45A00686F5B /* Build configuration list for PBXProject "Verdure Viewer" */ = {
378 | isa = XCConfigurationList;
379 | buildConfigurations = (
380 | 18B60ADF2AA5E45B00686F5B /* Debug */,
381 | 18B60AE02AA5E45B00686F5B /* Release */,
382 | );
383 | defaultConfigurationIsVisible = 0;
384 | defaultConfigurationName = Release;
385 | };
386 | 18B60AE12AA5E45B00686F5B /* Build configuration list for PBXNativeTarget "Verdure Viewer" */ = {
387 | isa = XCConfigurationList;
388 | buildConfigurations = (
389 | 18B60AE22AA5E45B00686F5B /* Debug */,
390 | 18B60AE32AA5E45B00686F5B /* Release */,
391 | );
392 | defaultConfigurationIsVisible = 0;
393 | defaultConfigurationName = Release;
394 | };
395 | /* End XCConfigurationList section */
396 |
397 | /* Begin XCSwiftPackageProductDependency section */
398 | 18568EA12AA5E84A00D9A4FA /* Verdure */ = {
399 | isa = XCSwiftPackageProductDependency;
400 | productName = Verdure;
401 | };
402 | /* End XCSwiftPackageProductDependency section */
403 | };
404 | rootObject = 18B60ACA2AA5E45A00686F5B /* Project object */;
405 | }
406 |
--------------------------------------------------------------------------------