mirror of
https://github.com/rive-app/rive-ios.git
synced 2026-01-18 17:11:28 +01:00
Macos take2
draft because i need to get a todo list together. Adds macos as a target for our ios runtime! Also adds a macos target for our example (which is a different app completely, very minimalistic right now). <img width="331" alt="CleanShot 2023-05-17 at 20 32 45@2x" src="https://github.com/rive-app/rive/assets/1216025/7a6cadce-9763-41a3-b1a0-6d067dfc3eca"> macos, macos rosetta, macos (designed for ipad), and ios all co existing in peace, from the same runtime project  todo: - [x] update build scripts to build supporting macos (gotta do this) - [x] run formatter - [x] test out builds in forked version of ios? (gotta do this) - [ ] one more stab at catalyst? (i think we can try that later...) - [ ] do we need a more comprehensive example setup for macos (I think we can do this later & try to pull zach's examples in) - [ ] I think we should restructure the ios project, but i think we can do that after this as well (i just think the folder structure/project structure can do with some work, now that we add macos (and should make room for tvos as well) - [x] probably got tests to fix - [ ] there's probably a bunch of looking at errors in the debugger and figuring those out, but i would hope that we can deploy with some warnings here too. catalyst problem: we get this error: and the problem is basically that we can target a specific library for macos, but we need one for macos and one for macos catalyst. they share the same architecture, so i dont think we can lipo them into one file... we could change the compiled binaries before creating the frameworks I guess though? .. maybe something to try.. `/Users/maxwelltalbot/development/rive/rive/packages/runtime_ios/dependencies/debug/librive_skia_renderer_macos.a(cg_factory.o), building for Mac Catalyst, but linking in object file built for macOS, file '/Users/maxwelltalbot/development/rive/rive/packages/runtime_ios/dependencies/debug/librive_skia_renderer_macos.a' for architecture arm64` basically Diffs= a9f8a1c5d Macos take2 (#5258)
This commit is contained in:
2
.github/workflows/Package.swift.template
vendored
2
.github/workflows/Package.swift.template
vendored
@@ -3,7 +3,7 @@ import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "RiveRuntime",
|
||||
platforms: [.iOS("14.0")],
|
||||
platforms: [.iOS("14.0"), .macOS("13.1")],
|
||||
products: [
|
||||
.library(
|
||||
name: "RiveRuntime",
|
||||
|
||||
@@ -27,11 +27,12 @@ Pod::Spec.new do |spec|
|
||||
LICENSE
|
||||
}
|
||||
spec.authors = { "Luigi Rosso" => "luigi@rive.app" }
|
||||
spec.platform = :ios, '14.0'
|
||||
spec.ios.deployment_target = '14.0'
|
||||
spec.osx.deployment_target = '13.1'
|
||||
spec.swift_version = '5.0'
|
||||
spec.source = {
|
||||
:http => "https://github.com/rive-app/rive-ios/releases/download/$RELEASE_VERSION/RiveRuntime.xcframework.zip",
|
||||
}
|
||||
spec.ios.vendored_frameworks = 'RiveRuntime.xcframework'
|
||||
spec.osx.vendored_frameworks = 'RiveRuntime.xcframework'
|
||||
end
|
||||
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
@@ -112,19 +112,13 @@ jobs:
|
||||
RiveRuntime.xcodeproj/project.pbxproj
|
||||
Source/Info.plist
|
||||
Tests/Info.plist
|
||||
- id: build_iphoneos
|
||||
name: Build release iphoneos framework
|
||||
run: sh ./scripts/build_framework.sh -t iphoneos -c Release
|
||||
- id: build_iphonesimulator
|
||||
name: Build release iphonesimulator framework
|
||||
run: sh ./scripts/build_framework.sh -t iphonesimulator -c Release
|
||||
- id: merge_frameworks
|
||||
if: steps.build_iphoneos.conclusion == 'success' && steps.build_iphonesimulator.conclusion == 'success'
|
||||
name: Merge created frameworks
|
||||
run: sh ./scripts/merge_frameworks.sh -c Release
|
||||
- id: build_frameworks
|
||||
name: Build frameworks
|
||||
run: sh ./scripts/build_framework.sh -c Release
|
||||
- id: zip
|
||||
name: Zip the framework
|
||||
run: zip -r RiveRuntime.xcframework.zip RiveRuntime.xcframework
|
||||
# --symlinks is critical here to retain the structure of a macos framework.
|
||||
run: zip --symlinks -r RiveRuntime.xcframework.zip RiveRuntime.xcframework
|
||||
working-directory: ./archive
|
||||
- id: get_checksum
|
||||
name: Add the checksum of the zip file into our environment
|
||||
|
||||
@@ -1 +1 @@
|
||||
f2ecb824beea0dadfe7077accacb5cd246cac669
|
||||
a9f8a1c5d351a72b4537a6b8a27962d130f0a97c
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"colors" : [
|
||||
{
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "16x16"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "16x16"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "32x32"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "32x32"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "128x128"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "128x128"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "256x256"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "256x256"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "1x",
|
||||
"size" : "512x512"
|
||||
},
|
||||
{
|
||||
"idiom" : "mac",
|
||||
"scale" : "2x",
|
||||
"size" : "512x512"
|
||||
}
|
||||
],
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
25
Example-iOS/Example (macOS)/ContentView.swift
Normal file
25
Example-iOS/Example (macOS)/ContentView.swift
Normal file
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// ContentView.swift
|
||||
// Example (macOS)
|
||||
//
|
||||
// Created by Maxwell Talbot on 17/05/2023.
|
||||
// Copyright © 2023 Rive. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
import RiveRuntime
|
||||
|
||||
struct ContentView: View {
|
||||
var body: some View {
|
||||
VStack {
|
||||
RiveViewModel(fileName: "magic_8-ball_v2").view()
|
||||
}
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
|
||||
struct ContentView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
ContentView()
|
||||
}
|
||||
}
|
||||
10
Example-iOS/Example (macOS)/Example__macOS_.entitlements
Normal file
10
Example-iOS/Example (macOS)/Example__macOS_.entitlements
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>com.apple.security.app-sandbox</key>
|
||||
<true/>
|
||||
<key>com.apple.security.files.user-selected.read-only</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
18
Example-iOS/Example (macOS)/Example__macOS_App.swift
Normal file
18
Example-iOS/Example (macOS)/Example__macOS_App.swift
Normal file
@@ -0,0 +1,18 @@
|
||||
//
|
||||
// Example__macOS_App.swift
|
||||
// Example (macOS)
|
||||
//
|
||||
// Created by Maxwell Talbot on 17/05/2023.
|
||||
// Copyright © 2023 Rive. All rights reserved.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
@main
|
||||
struct Example__macOS_App: App {
|
||||
var body: some Scene {
|
||||
WindowGroup {
|
||||
ContentView()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"info" : {
|
||||
"author" : "xcode",
|
||||
"version" : 1
|
||||
}
|
||||
}
|
||||
@@ -43,6 +43,56 @@
|
||||
04D5B06C266A460C004ACA5B /* nothing.riv in Resources */ = {isa = PBXBuildFile; fileRef = 04D5B069266A460C004ACA5B /* nothing.riv */; };
|
||||
04DB5937266A348C0020A7E8 /* RiveRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04A8F6BD26452E10002C909A /* RiveRuntime.framework */; };
|
||||
04DB5938266A348C0020A7E8 /* RiveRuntime.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 04A8F6BD26452E10002C909A /* RiveRuntime.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
04E51C362A151A1E0075E473 /* Example__macOS_App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E51C352A151A1E0075E473 /* Example__macOS_App.swift */; };
|
||||
04E51C382A151A1E0075E473 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E51C372A151A1E0075E473 /* ContentView.swift */; };
|
||||
04E51C3A2A151A1F0075E473 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E51C392A151A1F0075E473 /* Assets.xcassets */; };
|
||||
04E51C3D2A151A1F0075E473 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E51C3C2A151A1F0075E473 /* Preview Assets.xcassets */; };
|
||||
04E51C422A151B3C0075E473 /* RiveRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04A8F6BD26452E10002C909A /* RiveRuntime.framework */; };
|
||||
04E51C432A151B3C0075E473 /* RiveRuntime.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 04A8F6BD26452E10002C909A /* RiveRuntime.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
04E51C452A151C230075E473 /* halloween.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3C074F1284161E400E8EB33 /* halloween.riv */; };
|
||||
04E51C462A151C230075E473 /* testanimation.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3C074A7283FC75800E8EB33 /* testanimation.riv */; };
|
||||
04E51C472A151C230075E473 /* teststatemachine.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3C074AA283FC75900E8EB33 /* teststatemachine.riv */; };
|
||||
04E51C482A151C230075E473 /* bullet_man_game.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3E2B5872833ECB500A8651B /* bullet_man_game.riv */; };
|
||||
04E51C492A151C230075E473 /* hero_editor.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3745FCB282AE2320087F4AF /* hero_editor.riv */; };
|
||||
04E51C4A2A151C230075E473 /* watch_v1.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3E383472837E6B00029D65E /* watch_v1.riv */; };
|
||||
04E51C4B2A151C230075E473 /* leg_day_events_example.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3ECAC29281837B300A81123 /* leg_day_events_example.riv */; };
|
||||
04E51C4C2A151C230075E473 /* play_button_event_example.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3ECAC28281837B300A81123 /* play_button_event_example.riv */; };
|
||||
04E51C4D2A151C230075E473 /* switch_event_example.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3ECAC2A281837B300A81123 /* switch_event_example.riv */; };
|
||||
04E51C4E2A151C230075E473 /* magic_8-ball_v2.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3ECAC222817BE1100A81123 /* magic_8-ball_v2.riv */; };
|
||||
04E51C4F2A151C230075E473 /* light_switch.riv in Resources */ = {isa = PBXBuildFile; fileRef = 27108F2C282C96E700A99D81 /* light_switch.riv */; };
|
||||
04E51C502A151C230075E473 /* riveslider.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3D187F628075B6C008B739A /* riveslider.riv */; };
|
||||
04E51C512A151C230075E473 /* rbutton.riv in Resources */ = {isa = PBXBuildFile; fileRef = C324DB5E280740FB0060589F /* rbutton.riv */; };
|
||||
04E51C522A151C230075E473 /* constrained.riv in Resources */ = {isa = PBXBuildFile; fileRef = 0450445E26B3F71E007B25CA /* constrained.riv */; };
|
||||
04E51C532A151C230075E473 /* nothing.riv in Resources */ = {isa = PBXBuildFile; fileRef = 04D5B069266A460C004ACA5B /* nothing.riv */; };
|
||||
04E51C542A151C230075E473 /* artboard_animations.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D42644447500E7DBB2 /* artboard_animations.riv */; };
|
||||
04E51C552A151C230075E473 /* basketball.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CF2644447500E7DBB2 /* basketball.riv */; };
|
||||
04E51C562A151C230075E473 /* clean_icon_set.riv in Resources */ = {isa = PBXBuildFile; fileRef = 048002882729AA4400F7132B /* clean_icon_set.riv */; };
|
||||
04E51C572A151C230075E473 /* clipping.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D92644447500E7DBB2 /* clipping.riv */; };
|
||||
04E51C582A151C230075E473 /* explorer.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D32644447500E7DBB2 /* explorer.riv */; };
|
||||
04E51C592A151C230075E473 /* f22.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D02644447500E7DBB2 /* f22.riv */; };
|
||||
04E51C5A2A151C230075E473 /* flux_capacitor.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D12644447500E7DBB2 /* flux_capacitor.riv */; };
|
||||
04E51C5B2A151C230075E473 /* juice_v7.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9CE8265263B90E000F98DDB /* juice_v7.riv */; };
|
||||
04E51C5C2A151C230075E473 /* life_bar.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9D3DE67264F49F4001BA265 /* life_bar.riv */; };
|
||||
04E51C5D2A151C230075E473 /* prop_example.riv in Resources */ = {isa = PBXBuildFile; fileRef = E5A7874B27E1158E0056F24B /* prop_example.riv */; };
|
||||
04E51C5E2A151C230075E473 /* two_bone_ik.riv in Resources */ = {isa = PBXBuildFile; fileRef = 04F1C80826A8442300CEE6BE /* two_bone_ik.riv */; };
|
||||
04E51C5F2A151C230075E473 /* energy_bar_example.riv in Resources */ = {isa = PBXBuildFile; fileRef = E5A7874727E115170056F24B /* energy_bar_example.riv */; };
|
||||
04E51C602A151C230075E473 /* liquid.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9D3DE5A264F3B51001BA265 /* liquid.riv */; };
|
||||
04E51C612A151C230075E473 /* loopy.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D62644447500E7DBB2 /* loopy.riv */; };
|
||||
04E51C622A151C230075E473 /* mascot.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CD2644447400E7DBB2 /* mascot.riv */; };
|
||||
04E51C632A151C230075E473 /* neostream.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D22644447500E7DBB2 /* neostream.riv */; };
|
||||
04E51C642A151C230075E473 /* off_road_car_blog.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D72644447500E7DBB2 /* off_road_car_blog.riv */; };
|
||||
04E51C652A151C230075E473 /* progress.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CE2644447500E7DBB2 /* progress.riv */; };
|
||||
04E51C662A151C230075E473 /* pull.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CA2644447400E7DBB2 /* pull.riv */; };
|
||||
04E51C672A151C230075E473 /* rope.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CC2644447400E7DBB2 /* rope.riv */; };
|
||||
04E51C682A151C230075E473 /* skills.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D82644447500E7DBB2 /* skills.riv */; };
|
||||
04E51C692A151C230075E473 /* switch.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9E040A8264DFCFD009ABC7C /* switch.riv */; };
|
||||
04E51C6A2A151C230075E473 /* trailblaze.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88D52644447500E7DBB2 /* trailblaze.riv */; };
|
||||
04E51C6B2A151C230075E473 /* ui_swipe_left_to_delete.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88CB2644447400E7DBB2 /* ui_swipe_left_to_delete.riv */; };
|
||||
04E51C6C2A151C230075E473 /* vader.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88DA2644447500E7DBB2 /* vader.riv */; };
|
||||
04E51C6D2A151C230075E473 /* wacky.riv in Resources */ = {isa = PBXBuildFile; fileRef = 042C88C92644447400E7DBB2 /* wacky.riv */; };
|
||||
04E51C6E2A151C230075E473 /* truck.riv in Resources */ = {isa = PBXBuildFile; fileRef = C3D187F8280770EA008B739A /* truck.riv */; };
|
||||
04E51C6F2A151C230075E473 /* truck_v7.riv in Resources */ = {isa = PBXBuildFile; fileRef = C9BD3925263B5FC700696C37 /* truck_v7.riv */; };
|
||||
04E51C702A151C230075E473 /* blendmodes.riv in Resources */ = {isa = PBXBuildFile; fileRef = 046AFA6E2673AF04004ED497 /* blendmodes.riv */; };
|
||||
04F1C80B26A8442300CEE6BE /* two_bone_ik.riv in Resources */ = {isa = PBXBuildFile; fileRef = 04F1C80826A8442300CEE6BE /* two_bone_ik.riv */; };
|
||||
27108F2F282C96E700A99D81 /* light_switch.riv in Resources */ = {isa = PBXBuildFile; fileRef = 27108F2C282C96E700A99D81 /* light_switch.riv */; };
|
||||
C324DB5628071EB80060589F /* RiveSwitch.swift in Sources */ = {isa = PBXBuildFile; fileRef = C324DB5528071EB80060589F /* RiveSwitch.swift */; };
|
||||
@@ -101,6 +151,17 @@
|
||||
/* End PBXContainerItemProxy section */
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
04E51C442A151B3C0075E473 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 10;
|
||||
files = (
|
||||
04E51C432A151B3C0075E473 /* RiveRuntime.framework in Embed Frameworks */,
|
||||
);
|
||||
name = "Embed Frameworks";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C9C7420224FC53CF00EF9516 /* Embed Frameworks */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -150,6 +211,12 @@
|
||||
04A8F6AB26452A91002C909A /* RiveRuntime.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RiveRuntime.xcodeproj; path = ../RiveRuntime.xcodeproj; sourceTree = "<group>"; };
|
||||
04C4C83D2646FE410047E614 /* StateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StateMachine.swift; sourceTree = "<group>"; };
|
||||
04D5B069266A460C004ACA5B /* nothing.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = nothing.riv; sourceTree = "<group>"; };
|
||||
04E51C332A151A1E0075E473 /* Example (macOS).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example (macOS).app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
04E51C352A151A1E0075E473 /* Example__macOS_App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Example__macOS_App.swift; sourceTree = "<group>"; };
|
||||
04E51C372A151A1E0075E473 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||
04E51C392A151A1F0075E473 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
04E51C3C2A151A1F0075E473 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
|
||||
04E51C3E2A151A1F0075E473 /* Example__macOS_.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Example__macOS_.entitlements; sourceTree = "<group>"; };
|
||||
04F1C80826A8442300CEE6BE /* two_bone_ik.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = two_bone_ik.riv; sourceTree = "<group>"; };
|
||||
27108F2C282C96E700A99D81 /* light_switch.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = light_switch.riv; sourceTree = "<group>"; };
|
||||
C324DB5528071EB80060589F /* RiveSwitch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RiveSwitch.swift; sourceTree = "<group>"; };
|
||||
@@ -176,7 +243,7 @@
|
||||
C3ECAC2A281837B300A81123 /* switch_event_example.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = switch_event_example.riv; sourceTree = "<group>"; };
|
||||
C3ECAC2E281840A300A81123 /* ClockViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClockViewModel.swift; sourceTree = "<group>"; };
|
||||
C9BD3925263B5FC700696C37 /* truck_v7.riv */ = {isa = PBXFileReference; lastKnownFileType = file; path = truck_v7.riv; sourceTree = "<group>"; };
|
||||
C9C73E9424FC471E00EF9516 /* RiveExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RiveExample.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C9C73E9424FC471E00EF9516 /* Example (iOS).app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example (iOS).app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
C9C73E9724FC471E00EF9516 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||
C9C73E9924FC471E00EF9516 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; };
|
||||
C9C73E9D24FC471E00EF9516 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
@@ -201,6 +268,14 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
04E51C302A151A1E0075E473 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
04E51C422A151B3C0075E473 /* RiveRuntime.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@@ -235,6 +310,26 @@
|
||||
path = lib;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
04E51C342A151A1E0075E473 /* Example (macOS) */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
04E51C352A151A1E0075E473 /* Example__macOS_App.swift */,
|
||||
04E51C372A151A1E0075E473 /* ContentView.swift */,
|
||||
04E51C392A151A1F0075E473 /* Assets.xcassets */,
|
||||
04E51C3E2A151A1F0075E473 /* Example__macOS_.entitlements */,
|
||||
04E51C3B2A151A1F0075E473 /* Preview Content */,
|
||||
);
|
||||
path = "Example (macOS)";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
04E51C3B2A151A1F0075E473 /* Preview Content */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
04E51C3C2A151A1F0075E473 /* Preview Assets.xcassets */,
|
||||
);
|
||||
path = "Preview Content";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
C3ECAC322818608B00A81123 /* Examples */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -329,6 +424,7 @@
|
||||
children = (
|
||||
C9696B0E24FC6FD10041502A /* Assets */,
|
||||
C9C73E9624FC471E00EF9516 /* Source */,
|
||||
04E51C342A151A1E0075E473 /* Example (macOS) */,
|
||||
C9C73E9524FC471E00EF9516 /* Products */,
|
||||
C9C741FF24FC53CF00EF9516 /* Frameworks */,
|
||||
);
|
||||
@@ -337,7 +433,8 @@
|
||||
C9C73E9524FC471E00EF9516 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
C9C73E9424FC471E00EF9516 /* RiveExample.app */,
|
||||
C9C73E9424FC471E00EF9516 /* Example (iOS).app */,
|
||||
04E51C332A151A1E0075E473 /* Example (macOS).app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
@@ -377,9 +474,27 @@
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
C9C73E9324FC471E00EF9516 /* RiveExample */ = {
|
||||
04E51C322A151A1E0075E473 /* Example (macOS) */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "RiveExample" */;
|
||||
buildConfigurationList = 04E51C3F2A151A1F0075E473 /* Build configuration list for PBXNativeTarget "Example (macOS)" */;
|
||||
buildPhases = (
|
||||
04E51C2F2A151A1E0075E473 /* Sources */,
|
||||
04E51C302A151A1E0075E473 /* Frameworks */,
|
||||
04E51C312A151A1E0075E473 /* Resources */,
|
||||
04E51C442A151B3C0075E473 /* Embed Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "Example (macOS)";
|
||||
productName = "Example (macOS)";
|
||||
productReference = 04E51C332A151A1E0075E473 /* Example (macOS).app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
C9C73E9324FC471E00EF9516 /* Example (iOS) */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "Example (iOS)" */;
|
||||
buildPhases = (
|
||||
04A8F6C026452E27002C909A /* Frameworks */,
|
||||
C9C73E9024FC471E00EF9516 /* Sources */,
|
||||
@@ -390,9 +505,9 @@
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = RiveExample;
|
||||
name = "Example (iOS)";
|
||||
productName = RiveExample;
|
||||
productReference = C9C73E9424FC471E00EF9516 /* RiveExample.app */;
|
||||
productReference = C9C73E9424FC471E00EF9516 /* Example (iOS).app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
@@ -401,10 +516,13 @@
|
||||
C9C73E8C24FC471E00EF9516 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 1160;
|
||||
LastSwiftUpdateCheck = 1420;
|
||||
LastUpgradeCheck = 1310;
|
||||
ORGANIZATIONNAME = Rive;
|
||||
TargetAttributes = {
|
||||
04E51C322A151A1E0075E473 = {
|
||||
CreatedOnToolsVersion = 14.2;
|
||||
};
|
||||
C9C73E9324FC471E00EF9516 = {
|
||||
CreatedOnToolsVersion = 11.6;
|
||||
};
|
||||
@@ -429,7 +547,8 @@
|
||||
);
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
C9C73E9324FC471E00EF9516 /* RiveExample */,
|
||||
C9C73E9324FC471E00EF9516 /* Example (iOS) */,
|
||||
04E51C322A151A1E0075E473 /* Example (macOS) */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
@@ -452,6 +571,59 @@
|
||||
/* End PBXReferenceProxy section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
04E51C312A151A1E0075E473 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
04E51C452A151C230075E473 /* halloween.riv in Resources */,
|
||||
04E51C462A151C230075E473 /* testanimation.riv in Resources */,
|
||||
04E51C472A151C230075E473 /* teststatemachine.riv in Resources */,
|
||||
04E51C482A151C230075E473 /* bullet_man_game.riv in Resources */,
|
||||
04E51C492A151C230075E473 /* hero_editor.riv in Resources */,
|
||||
04E51C4A2A151C230075E473 /* watch_v1.riv in Resources */,
|
||||
04E51C4B2A151C230075E473 /* leg_day_events_example.riv in Resources */,
|
||||
04E51C4C2A151C230075E473 /* play_button_event_example.riv in Resources */,
|
||||
04E51C4D2A151C230075E473 /* switch_event_example.riv in Resources */,
|
||||
04E51C4E2A151C230075E473 /* magic_8-ball_v2.riv in Resources */,
|
||||
04E51C4F2A151C230075E473 /* light_switch.riv in Resources */,
|
||||
04E51C502A151C230075E473 /* riveslider.riv in Resources */,
|
||||
04E51C512A151C230075E473 /* rbutton.riv in Resources */,
|
||||
04E51C522A151C230075E473 /* constrained.riv in Resources */,
|
||||
04E51C532A151C230075E473 /* nothing.riv in Resources */,
|
||||
04E51C542A151C230075E473 /* artboard_animations.riv in Resources */,
|
||||
04E51C552A151C230075E473 /* basketball.riv in Resources */,
|
||||
04E51C562A151C230075E473 /* clean_icon_set.riv in Resources */,
|
||||
04E51C572A151C230075E473 /* clipping.riv in Resources */,
|
||||
04E51C582A151C230075E473 /* explorer.riv in Resources */,
|
||||
04E51C592A151C230075E473 /* f22.riv in Resources */,
|
||||
04E51C5A2A151C230075E473 /* flux_capacitor.riv in Resources */,
|
||||
04E51C5B2A151C230075E473 /* juice_v7.riv in Resources */,
|
||||
04E51C5C2A151C230075E473 /* life_bar.riv in Resources */,
|
||||
04E51C5D2A151C230075E473 /* prop_example.riv in Resources */,
|
||||
04E51C5E2A151C230075E473 /* two_bone_ik.riv in Resources */,
|
||||
04E51C5F2A151C230075E473 /* energy_bar_example.riv in Resources */,
|
||||
04E51C602A151C230075E473 /* liquid.riv in Resources */,
|
||||
04E51C612A151C230075E473 /* loopy.riv in Resources */,
|
||||
04E51C622A151C230075E473 /* mascot.riv in Resources */,
|
||||
04E51C632A151C230075E473 /* neostream.riv in Resources */,
|
||||
04E51C642A151C230075E473 /* off_road_car_blog.riv in Resources */,
|
||||
04E51C652A151C230075E473 /* progress.riv in Resources */,
|
||||
04E51C662A151C230075E473 /* pull.riv in Resources */,
|
||||
04E51C672A151C230075E473 /* rope.riv in Resources */,
|
||||
04E51C682A151C230075E473 /* skills.riv in Resources */,
|
||||
04E51C692A151C230075E473 /* switch.riv in Resources */,
|
||||
04E51C6A2A151C230075E473 /* trailblaze.riv in Resources */,
|
||||
04E51C6B2A151C230075E473 /* ui_swipe_left_to_delete.riv in Resources */,
|
||||
04E51C6C2A151C230075E473 /* vader.riv in Resources */,
|
||||
04E51C6D2A151C230075E473 /* wacky.riv in Resources */,
|
||||
04E51C6E2A151C230075E473 /* truck.riv in Resources */,
|
||||
04E51C6F2A151C230075E473 /* truck_v7.riv in Resources */,
|
||||
04E51C702A151C230075E473 /* blendmodes.riv in Resources */,
|
||||
04E51C3D2A151A1F0075E473 /* Preview Assets.xcassets in Resources */,
|
||||
04E51C3A2A151A1F0075E473 /* Assets.xcassets in Resources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C9C73E9224FC471E00EF9516 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -509,6 +681,15 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
04E51C2F2A151A1E0075E473 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
04E51C382A151A1E0075E473 /* ContentView.swift in Sources */,
|
||||
04E51C362A151A1E0075E473 /* Example__macOS_App.swift in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
C9C73E9024FC471E00EF9516 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@@ -544,6 +725,66 @@
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
04E51C402A151A1F0075E473 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CODE_SIGN_ENTITLEMENTS = "Example (macOS)/Example__macOS_.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"Example (macOS)/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = NJ3JMFUNS9;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Rive. All rights reserved.";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.1;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "rive.app.Example--macOS-";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
04E51C412A151A1F0075E473 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
CODE_SIGN_ENTITLEMENTS = "Example (macOS)/Example__macOS_.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEVELOPMENT_ASSET_PATHS = "\"Example (macOS)/Preview Content\"";
|
||||
DEVELOPMENT_TEAM = NJ3JMFUNS9;
|
||||
ENABLE_HARDENED_RUNTIME = YES;
|
||||
ENABLE_PREVIEWS = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2023 Rive. All rights reserved.";
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 13.1;
|
||||
MARKETING_VERSION = 1.0;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "rive.app.Example--macOS-";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
C9C73EBC24FC471E00EF9516 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
@@ -705,6 +946,15 @@
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
04E51C3F2A151A1F0075E473 /* Build configuration list for PBXNativeTarget "Example (macOS)" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
04E51C402A151A1F0075E473 /* Debug */,
|
||||
04E51C412A151A1F0075E473 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
C9C73E8F24FC471E00EF9516 /* Build configuration list for PBXProject "RiveExample" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
@@ -714,7 +964,7 @@
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "RiveExample" */ = {
|
||||
C9C73EBE24FC471E00EF9516 /* Build configuration list for PBXNativeTarget "Example (iOS)" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
C9C73EBF24FC471E00EF9516 /* Debug */,
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "C9C73E9324FC471E00EF9516"
|
||||
BuildableName = "RiveExample.app"
|
||||
BlueprintName = "RiveExample"
|
||||
BuildableName = "Example (iOS).app"
|
||||
BlueprintName = "Example (iOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
@@ -45,8 +45,8 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "C9C73E9324FC471E00EF9516"
|
||||
BuildableName = "RiveExample.app"
|
||||
BlueprintName = "RiveExample"
|
||||
BuildableName = "Example (iOS).app"
|
||||
BlueprintName = "Example (iOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
@@ -62,8 +62,8 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "C9C73E9324FC471E00EF9516"
|
||||
BuildableName = "RiveExample.app"
|
||||
BlueprintName = "RiveExample"
|
||||
BuildableName = "Example (iOS).app"
|
||||
BlueprintName = "Example (iOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
@@ -0,0 +1,78 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1420"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
buildImplicitDependencies = "YES">
|
||||
<BuildActionEntries>
|
||||
<BuildActionEntry
|
||||
buildForTesting = "YES"
|
||||
buildForRunning = "YES"
|
||||
buildForProfiling = "YES"
|
||||
buildForArchiving = "YES"
|
||||
buildForAnalyzing = "YES">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "04E51C322A151A1E0075E473"
|
||||
BuildableName = "Example (macOS).app"
|
||||
BlueprintName = "Example (macOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildActionEntry>
|
||||
</BuildActionEntries>
|
||||
</BuildAction>
|
||||
<TestAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
||||
<Testables>
|
||||
</Testables>
|
||||
</TestAction>
|
||||
<LaunchAction
|
||||
buildConfiguration = "Debug"
|
||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||
launchStyle = "0"
|
||||
useCustomWorkingDirectory = "NO"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
debugServiceExtension = "internal"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "04E51C322A151A1E0075E473"
|
||||
BuildableName = "Example (macOS).app"
|
||||
BlueprintName = "Example (macOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</LaunchAction>
|
||||
<ProfileAction
|
||||
buildConfiguration = "Release"
|
||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||
savedToolIdentifier = ""
|
||||
useCustomWorkingDirectory = "NO"
|
||||
debugDocumentVersioning = "YES">
|
||||
<BuildableProductRunnable
|
||||
runnableDebuggingMode = "0">
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "04E51C322A151A1E0075E473"
|
||||
BuildableName = "Example (macOS).app"
|
||||
BlueprintName = "Example (macOS)"
|
||||
ReferencedContainer = "container:RiveExample.xcodeproj">
|
||||
</BuildableReference>
|
||||
</BuildableProductRunnable>
|
||||
</ProfileAction>
|
||||
<AnalyzeAction
|
||||
buildConfiguration = "Debug">
|
||||
</AnalyzeAction>
|
||||
<ArchiveAction
|
||||
buildConfiguration = "Release"
|
||||
revealArchiveInOrganizer = "YES">
|
||||
</ArchiveAction>
|
||||
</Scheme>
|
||||
@@ -3,7 +3,7 @@
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 50;
|
||||
objectVersion = 52;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
@@ -56,7 +56,7 @@
|
||||
C38BB5F4287629C20039E385 /* defaultstatemachine.riv in Resources */ = {isa = PBXBuildFile; fileRef = C38BB5F3287629C20039E385 /* defaultstatemachine.riv */; };
|
||||
C38BB5F628762B720039E385 /* RiveStateMachineTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = C38BB5F528762B720039E385 /* RiveStateMachineTest.swift */; };
|
||||
C3E2B580282F242400A8651B /* RiveStateMachineInstance+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3E2B57F282F242400A8651B /* RiveStateMachineInstance+Extensions.swift */; };
|
||||
C9161A81263CBCBC007749A1 /* RiveRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9C73ED124FC478800EF9516 /* RiveRuntime.framework */; };
|
||||
C9161A81263CBCBC007749A1 /* RiveRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9C73ED124FC478800EF9516 /* RiveRuntime.framework */; platformFilter = ios; };
|
||||
C9601F2B250C25930032AA07 /* RiveRenderer.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9601F2A250C25930032AA07 /* RiveRenderer.mm */; };
|
||||
C9C73EE024FC478900EF9516 /* RiveRuntimeTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9C73EDF24FC478900EF9516 /* RiveRuntimeTests.mm */; };
|
||||
C9C73EE224FC478900EF9516 /* RiveRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = C9C73ED424FC478800EF9516 /* RiveRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||
@@ -464,6 +464,7 @@
|
||||
/* Begin PBXTargetDependency section */
|
||||
C9C73EDD24FC478900EF9516 /* PBXTargetDependency */ = {
|
||||
isa = PBXTargetDependency;
|
||||
platformFilter = ios;
|
||||
target = C9C73ED024FC478800EF9516 /* RiveRuntime */;
|
||||
targetProxy = C9C73EDC24FC478900EF9516 /* PBXContainerItemProxy */;
|
||||
};
|
||||
@@ -474,6 +475,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
@@ -503,6 +505,8 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
@@ -529,7 +533,7 @@
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
VERSION_INFO_PREFIX = "";
|
||||
};
|
||||
@@ -539,6 +543,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
@@ -568,6 +573,8 @@
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
@@ -587,7 +594,7 @@
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
SDKROOT = iphoneos;
|
||||
SUPPORTED_PLATFORMS = "iphonesimulator iphoneos";
|
||||
SUPPORTED_PLATFORMS = "macosx iphonesimulator iphoneos";
|
||||
SWIFT_COMPILATION_MODE = wholemodule;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
VERSIONING_SYSTEM = "apple-generic";
|
||||
@@ -603,9 +610,9 @@
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = NJ3JMFUNS9;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
@@ -647,26 +654,36 @@
|
||||
"-lrive_sim",
|
||||
"-lrive_skia_renderer_sim",
|
||||
);
|
||||
"OTHER_LDFLAGS[sdk=macosx*]" = (
|
||||
"-lskia_macos",
|
||||
"-lrive_macos",
|
||||
"-lrive_skia_renderer_macos",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntime;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TARGETED_DEVICE_FAMILY = "1,2,6";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
C9C73EE724FC478900EF9516 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
|
||||
BITCODE_GENERATION_MODE = bitcode;
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "c++17";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
CODE_SIGN_STYLE = Manual;
|
||||
DEFINES_MODULE = YES;
|
||||
DEVELOPMENT_TEAM = NJ3JMFUNS9;
|
||||
DEVELOPMENT_TEAM = "";
|
||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||
DYLIB_CURRENT_VERSION = 1;
|
||||
DYLIB_INSTALL_NAME_BASE = "@rpath";
|
||||
@@ -710,12 +727,21 @@
|
||||
"-lrive_sim",
|
||||
"-lrive_skia_renderer_sim",
|
||||
);
|
||||
"OTHER_LDFLAGS[sdk=macosx*]" = (
|
||||
"-lskia_macos",
|
||||
"-lrive_macos",
|
||||
"-lrive_skia_renderer_macos",
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntime;
|
||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
TARGETED_DEVICE_FAMILY = "1,2,6";
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -734,6 +760,9 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntimeTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
@@ -755,6 +784,9 @@
|
||||
);
|
||||
PRODUCT_BUNDLE_IDENTIFIER = rive.app.ios.runtime.RiveRuntimeTests;
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
|
||||
SUPPORTS_MACCATALYST = NO;
|
||||
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
|
||||
@@ -2,7 +2,12 @@
|
||||
|
||||
#import <Metal/Metal.h>
|
||||
#import <MetalKit/MetalKit.h>
|
||||
|
||||
#if __has_include(<UIKit/UIKit.h>)
|
||||
#import <UIKit/UIKit.h>
|
||||
#else
|
||||
#import <AppKit/AppKit.h>
|
||||
#endif
|
||||
|
||||
#include "include/core/SkCanvas.h"
|
||||
#include "include/core/SkSurface.h"
|
||||
@@ -205,10 +210,12 @@ sk_sp<SkSurface> SkMtkViewToSurface(MTKView* mtkView, GrDirectContext* grContext
|
||||
return;
|
||||
}
|
||||
auto canvas = surface->getCanvas();
|
||||
|
||||
rive::SkiaRenderer renderer(canvas);
|
||||
_renderer = &renderer;
|
||||
canvas->clear(SkColor((0x00000000)));
|
||||
_renderer->save();
|
||||
|
||||
[self drawRive:rect size:size];
|
||||
_renderer->restore();
|
||||
|
||||
|
||||
@@ -12,13 +12,13 @@ import Foundation
|
||||
open class RiveView: RiveRendererView {
|
||||
// MARK: Configuration
|
||||
internal weak var riveModel: RiveModel?
|
||||
internal var fit: RiveFit = .contain { didSet { setNeedsDisplay() } }
|
||||
internal var alignment: RiveAlignment = .center { didSet { setNeedsDisplay() } }
|
||||
internal var fit: RiveFit = .contain { didSet { needsDisplay() } }
|
||||
internal var alignment: RiveAlignment = .center { didSet { needsDisplay() } }
|
||||
|
||||
// MARK: Render Loop
|
||||
internal private(set) var isPlaying: Bool = false
|
||||
private var lastTime: CFTimeInterval = 0
|
||||
private var displayLinkProxy: CADisplayLinkProxy?
|
||||
private var displayLinkProxy: DisplayLinkProxy?
|
||||
private var eventQueue = EventQueue()
|
||||
|
||||
// MARK: Delegates
|
||||
@@ -46,12 +46,25 @@ open class RiveView: RiveRendererView {
|
||||
super.init(coder: aDecoder)
|
||||
}
|
||||
|
||||
private func needsDisplay() {
|
||||
#if os(iOS)
|
||||
setNeedsDisplay()
|
||||
#else
|
||||
needsDisplay=true
|
||||
#endif
|
||||
}
|
||||
|
||||
/// This resets the view with the new model. Useful when the `RiveView` was initialized without one.
|
||||
open func setModel(_ model: RiveModel, autoPlay: Bool = true) throws {
|
||||
stopTimer()
|
||||
isPlaying = false
|
||||
riveModel = model
|
||||
isOpaque = false
|
||||
#if os(iOS)
|
||||
isOpaque = false
|
||||
#else
|
||||
layer?.isOpaque=false
|
||||
#endif
|
||||
|
||||
|
||||
if autoPlay {
|
||||
play()
|
||||
@@ -103,8 +116,9 @@ open class RiveView: RiveRendererView {
|
||||
// MARK: - Render Loop
|
||||
|
||||
private func startTimer() {
|
||||
|
||||
if displayLinkProxy == nil {
|
||||
displayLinkProxy = CADisplayLinkProxy(
|
||||
displayLinkProxy = DisplayLinkProxy(
|
||||
handle: { [weak self] in
|
||||
self?.tick()
|
||||
},
|
||||
@@ -112,9 +126,11 @@ open class RiveView: RiveRendererView {
|
||||
forMode: .common
|
||||
)
|
||||
}
|
||||
if displayLinkProxy?.displayLink?.isPaused == true {
|
||||
displayLinkProxy?.displayLink?.isPaused = false
|
||||
}
|
||||
#if os(iOS)
|
||||
if displayLinkProxy?.displayLink?.isPaused == true {
|
||||
displayLinkProxy?.displayLink?.isPaused = false
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private func stopTimer() {
|
||||
@@ -124,17 +140,22 @@ open class RiveView: RiveRendererView {
|
||||
fpsCounter?.stopped()
|
||||
}
|
||||
|
||||
private func timestamp() -> Double {
|
||||
return Date().timeIntervalSince1970
|
||||
}
|
||||
|
||||
|
||||
/// Start a redraw:
|
||||
/// - determine the elapsed time
|
||||
/// - advance the artbaord, which will invalidate the display.
|
||||
/// - if the artboard has come to a stop, stop.
|
||||
@objc fileprivate func tick() {
|
||||
guard let displayLink = displayLinkProxy?.displayLink else {
|
||||
guard displayLinkProxy?.displayLink != nil else {
|
||||
stopTimer()
|
||||
return
|
||||
}
|
||||
|
||||
let timestamp = displayLink.timestamp
|
||||
let timestamp = timestamp()
|
||||
// last time needs to be set on the first tick
|
||||
if lastTime == 0 {
|
||||
lastTime = timestamp
|
||||
@@ -142,6 +163,14 @@ open class RiveView: RiveRendererView {
|
||||
|
||||
// Calculate the time elapsed between ticks
|
||||
let elapsedTime = timestamp - lastTime
|
||||
|
||||
#if os(iOS)
|
||||
fpsCounter?.didDrawFrame(timestamp: timestamp)
|
||||
#else
|
||||
fpsCounter?.elapsed(time: elapsedTime)
|
||||
#endif
|
||||
|
||||
|
||||
lastTime = timestamp
|
||||
advance(delta: elapsedTime)
|
||||
if !isPlaying {
|
||||
@@ -182,7 +211,7 @@ open class RiveView: RiveRendererView {
|
||||
playerDelegate?.player(didAdvanceby: delta, riveModel: riveModel)
|
||||
|
||||
// Trigger a redraw
|
||||
setNeedsDisplay()
|
||||
needsDisplay()
|
||||
}
|
||||
|
||||
/// This is called in the middle of drawRect
|
||||
@@ -194,67 +223,141 @@ open class RiveView: RiveRendererView {
|
||||
align(with: newFrame, contentRect: artboard.bounds(), alignment: alignment, fit: fit)
|
||||
draw(with: artboard)
|
||||
|
||||
if let displayLink = displayLinkProxy?.displayLink {
|
||||
fpsCounter?.didDrawFrame(timestamp:displayLink.timestamp)
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - UIResponder
|
||||
|
||||
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchBegan) {
|
||||
$0.touchBegan(atLocation: $1)
|
||||
#if os(iOS)
|
||||
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchBegan) {
|
||||
$0.touchBegan(atLocation: $1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
open override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchMoved) {
|
||||
$0.touchMoved(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchEnded) {
|
||||
$0.touchEnded(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchCancelled) {
|
||||
$0.touchCancelled(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
/// Sends incoming touch event to all playing `RiveStateMachineInstance`'s
|
||||
/// - Parameters:
|
||||
/// - touch: The `CGPoint` where the touch occurred in `RiveView` coordinate space
|
||||
/// - delegateAction: The delegate callback that should be triggered by this touch event
|
||||
/// - stateMachineAction: Param1: A playing `RiveStateMachineInstance`, Param2: `CGPoint`
|
||||
/// location where touch occurred in `artboard` coordinate space
|
||||
private func handleTouch(
|
||||
_ touch: UITouch,
|
||||
delegate delegateAction: ((RiveArtboard?, CGPoint)->Void)?,
|
||||
stateMachineAction: (RiveStateMachineInstance, CGPoint)->Void
|
||||
) {
|
||||
guard let artboard = riveModel?.artboard else { return }
|
||||
guard let stateMachine = riveModel?.stateMachine else { return }
|
||||
let location = touch.location(in: self)
|
||||
|
||||
let artboardLocation = artboardLocation(
|
||||
fromTouchLocation: location,
|
||||
inArtboard: artboard.bounds(),
|
||||
fit: fit,
|
||||
alignment: alignment
|
||||
)
|
||||
open override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchMoved) {
|
||||
$0.touchMoved(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
stateMachineAction(stateMachine, artboardLocation)
|
||||
play()
|
||||
open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchEnded) {
|
||||
$0.touchEnded(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
// We send back the touch location in UIView coordinates because
|
||||
// users cannot query or manually control the coordinates of elements
|
||||
// in the Artboard. So that information would be of no use.
|
||||
delegateAction?(artboard, location)
|
||||
}
|
||||
open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
|
||||
handleTouch(touches.first!, delegate: stateMachineDelegate?.touchCancelled) {
|
||||
$0.touchCancelled(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
/// Sends incoming touch event to all playing `RiveStateMachineInstance`'s
|
||||
/// - Parameters:
|
||||
/// - touch: The `CGPoint` where the touch occurred in `RiveView` coordinate space
|
||||
/// - delegateAction: The delegate callback that should be triggered by this touch event
|
||||
/// - stateMachineAction: Param1: A playing `RiveStateMachineInstance`, Param2: `CGPoint`
|
||||
/// location where touch occurred in `artboard` coordinate space
|
||||
private func handleTouch(
|
||||
_ touch: UITouch,
|
||||
delegate delegateAction: ((RiveArtboard?, CGPoint)->Void)?,
|
||||
stateMachineAction: (RiveStateMachineInstance, CGPoint)->Void
|
||||
) {
|
||||
guard let artboard = riveModel?.artboard else { return }
|
||||
guard let stateMachine = riveModel?.stateMachine else { return }
|
||||
let location = touch.location(in: self)
|
||||
|
||||
let artboardLocation = artboardLocation(
|
||||
fromTouchLocation: location,
|
||||
inArtboard: artboard.bounds(),
|
||||
fit: fit,
|
||||
alignment: alignment
|
||||
)
|
||||
|
||||
stateMachineAction(stateMachine, artboardLocation)
|
||||
play()
|
||||
|
||||
// We send back the touch location in UIView coordinates because
|
||||
// users cannot query or manually control the coordinates of elements
|
||||
// in the Artboard. So that information would be of no use.
|
||||
delegateAction?(artboard, location)
|
||||
}
|
||||
#else
|
||||
open override func mouseDown(with event: NSEvent) {
|
||||
handleTouch(event, delegate: stateMachineDelegate?.touchBegan) {
|
||||
$0.touchBegan(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func mouseMoved(with event: NSEvent) {
|
||||
handleTouch(event, delegate: stateMachineDelegate?.touchMoved) {
|
||||
$0.touchMoved(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func mouseDragged(with event: NSEvent) {
|
||||
handleTouch(event, delegate: stateMachineDelegate?.touchMoved) {
|
||||
$0.touchMoved(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func mouseUp(with event: NSEvent) {
|
||||
handleTouch(event, delegate: stateMachineDelegate?.touchEnded) {
|
||||
$0.touchEnded(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func mouseExited(with event: NSEvent) {
|
||||
handleTouch(event, delegate: stateMachineDelegate?.touchCancelled) {
|
||||
$0.touchCancelled(atLocation: $1)
|
||||
}
|
||||
}
|
||||
|
||||
open override func updateTrackingAreas() {
|
||||
addTrackingArea(
|
||||
NSTrackingArea(
|
||||
rect: self.bounds,
|
||||
options: [.mouseEnteredAndExited, .mouseMoved, .activeInKeyWindow],
|
||||
owner: self,
|
||||
userInfo: nil
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
/// Sends incoming touch event to all playing `RiveStateMachineInstance`'s
|
||||
/// - Parameters:
|
||||
/// - touch: The `CGPoint` where the touch occurred in `RiveView` coordinate space
|
||||
/// - delegateAction: The delegate callback that should be triggered by this touch event
|
||||
/// - stateMachineAction: Param1: A playing `RiveStateMachineInstance`, Param2: `CGPoint`
|
||||
/// location where touch occurred in `artboard` coordinate space
|
||||
private func handleTouch(
|
||||
_ event: NSEvent,
|
||||
delegate delegateAction: ((RiveArtboard?, CGPoint)->Void)?,
|
||||
stateMachineAction: (RiveStateMachineInstance, CGPoint)->Void
|
||||
) {
|
||||
guard let artboard = riveModel?.artboard else { return }
|
||||
guard let stateMachine = riveModel?.stateMachine else { return }
|
||||
let location = convert(event.locationInWindow, from: nil)
|
||||
|
||||
// This is conforms the point to UIView coordinates which the
|
||||
// RiveRendererView expects in its artboardLocation method
|
||||
let locationFlippedY = CGPoint(x: location.x, y: frame.height - location.y)
|
||||
|
||||
let artboardLocation = artboardLocation(
|
||||
fromTouchLocation: locationFlippedY,
|
||||
inArtboard: artboard.bounds(),
|
||||
fit: fit,
|
||||
alignment: alignment
|
||||
)
|
||||
|
||||
stateMachineAction(stateMachine, artboardLocation)
|
||||
play()
|
||||
|
||||
// We send back the touch location in NSView coordinates because
|
||||
// users cannot query or manually control the coordinates of elements
|
||||
// in the Artboard. So that information would be of no use.
|
||||
delegateAction?(artboard, location)
|
||||
}
|
||||
#endif
|
||||
|
||||
// MARK: - Debug
|
||||
|
||||
@@ -294,30 +397,59 @@ public protocol RivePlayerDelegate: AnyObject {
|
||||
func player(didAdvanceby seconds: Double, riveModel: RiveModel?)
|
||||
}
|
||||
|
||||
class CADisplayLinkProxy {
|
||||
var displayLink: CADisplayLink?
|
||||
var handle: (() -> Void)?
|
||||
private var runloop: RunLoop
|
||||
private var mode: RunLoop.Mode
|
||||
#if os(iOS)
|
||||
fileprivate class DisplayLinkProxy {
|
||||
var displayLink: CADisplayLink?
|
||||
var handle: (() -> Void)?
|
||||
private var runloop: RunLoop
|
||||
private var mode: RunLoop.Mode
|
||||
|
||||
init(handle: (() -> Void)?, to runloop: RunLoop, forMode mode: RunLoop.Mode) {
|
||||
self.handle = handle
|
||||
self.runloop = runloop
|
||||
self.mode = mode
|
||||
displayLink = CADisplayLink(target: self, selector: #selector(updateHandle))
|
||||
displayLink?.add(to: runloop, forMode: mode)
|
||||
}
|
||||
init(handle: (() -> Void)?, to runloop: RunLoop, forMode mode: RunLoop.Mode) {
|
||||
self.handle = handle
|
||||
self.runloop = runloop
|
||||
self.mode = mode
|
||||
displayLink = CADisplayLink(target: self, selector: #selector(updateHandle))
|
||||
displayLink?.add(to: runloop, forMode: mode)
|
||||
}
|
||||
|
||||
@objc func updateHandle() {
|
||||
handle?()
|
||||
}
|
||||
@objc func updateHandle() {
|
||||
handle?()
|
||||
}
|
||||
|
||||
func invalidate() {
|
||||
displayLink?.remove(from: runloop, forMode: mode)
|
||||
displayLink?.invalidate()
|
||||
displayLink = nil
|
||||
func invalidate() {
|
||||
displayLink?.remove(from: runloop, forMode: mode)
|
||||
displayLink?.invalidate()
|
||||
displayLink = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
fileprivate class DisplayLinkProxy {
|
||||
var displayLink: CVDisplayLink?
|
||||
|
||||
init?(handle: (() -> Void)!, to runloop: RunLoop, forMode mode: RunLoop.Mode) {
|
||||
//ignore runloop/formode
|
||||
let error = CVDisplayLinkCreateWithActiveCGDisplays(&displayLink)
|
||||
if error != kCVReturnSuccess { return nil }
|
||||
|
||||
CVDisplayLinkSetOutputHandler(displayLink!) { dl, ts, tsDisplay, _, _ in
|
||||
DispatchQueue.main.async {
|
||||
handle()
|
||||
}
|
||||
return kCVReturnSuccess
|
||||
}
|
||||
|
||||
CVDisplayLinkStart(displayLink!)
|
||||
}
|
||||
|
||||
func invalidate() {
|
||||
|
||||
if let displayLink = displayLink {
|
||||
CVDisplayLinkStop(displayLink)
|
||||
self.displayLink = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/// Tracks a queue of events that haven't been fired yet. We do this so that we're not calling delegates and modifying state
|
||||
/// while a view is updating (e.g. being initialized, as we autoplay and fire play events during the view's init otherwise
|
||||
|
||||
@@ -408,38 +408,75 @@ open class RiveViewModel: NSObject, ObservableObject, RiveFileDelegate, RiveStat
|
||||
open func player(didAdvanceby seconds: Double, riveModel: RiveModel?) { }
|
||||
}
|
||||
|
||||
/// This makes a SwiftUI digestable view from an `RiveViewModel` and its `RiveView`
|
||||
public struct RiveViewRepresentable: UIViewRepresentable {
|
||||
let viewModel: RiveViewModel
|
||||
|
||||
public init(viewModel: RiveViewModel) {
|
||||
self.viewModel = viewModel
|
||||
}
|
||||
|
||||
/// Constructs the view
|
||||
public func makeUIView(context: Context) -> RiveView {
|
||||
return viewModel.createRiveView()
|
||||
}
|
||||
|
||||
public func updateUIView(_ view: RiveView, context: UIViewRepresentableContext<RiveViewRepresentable>) {
|
||||
viewModel.update(view: view)
|
||||
}
|
||||
|
||||
public static func dismantleUIView(_ view: RiveView, coordinator: Coordinator) {
|
||||
view.stop()
|
||||
coordinator.viewModel.deregisterView()
|
||||
}
|
||||
|
||||
/// Constructs a coordinator for managing updating state
|
||||
public func makeCoordinator() -> Coordinator {
|
||||
return Coordinator(viewModel: viewModel)
|
||||
}
|
||||
|
||||
public class Coordinator: NSObject {
|
||||
public var viewModel: RiveViewModel
|
||||
|
||||
init(viewModel: RiveViewModel) {
|
||||
#if os(iOS)
|
||||
/// This makes a SwiftUI digestable view from an `RiveViewModel` and its `RiveView`
|
||||
public struct RiveViewRepresentable: UIViewRepresentable {
|
||||
let viewModel: RiveViewModel
|
||||
|
||||
public init(viewModel: RiveViewModel) {
|
||||
self.viewModel = viewModel
|
||||
}
|
||||
|
||||
/// Constructs the view
|
||||
public func makeUIView(context: Context) -> RiveView {
|
||||
return viewModel.createRiveView()
|
||||
}
|
||||
|
||||
public func updateUIView(_ view: RiveView, context: UIViewRepresentableContext<RiveViewRepresentable>) {
|
||||
viewModel.update(view: view)
|
||||
}
|
||||
|
||||
public static func dismantleUIView(_ view: RiveView, coordinator: Coordinator) {
|
||||
view.stop()
|
||||
coordinator.viewModel.deregisterView()
|
||||
}
|
||||
|
||||
/// Constructs a coordinator for managing updating state
|
||||
public func makeCoordinator() -> Coordinator {
|
||||
return Coordinator(viewModel: viewModel)
|
||||
}
|
||||
|
||||
public class Coordinator: NSObject {
|
||||
public var viewModel: RiveViewModel
|
||||
|
||||
init(viewModel: RiveViewModel) {
|
||||
self.viewModel = viewModel
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
public struct RiveViewRepresentable: NSViewRepresentable {
|
||||
let viewModel: RiveViewModel
|
||||
|
||||
public init(viewModel: RiveViewModel) {
|
||||
self.viewModel = viewModel
|
||||
}
|
||||
|
||||
/// Constructs the view
|
||||
public func makeNSView(context: Context) -> RiveView {
|
||||
return viewModel.createRiveView()
|
||||
}
|
||||
|
||||
public func updateNSView(_ view: RiveView, context: NSViewRepresentableContext<RiveViewRepresentable>) {
|
||||
viewModel.update(view: view)
|
||||
}
|
||||
|
||||
public static func dismantleNSView(_ view: RiveView, coordinator: Coordinator) {
|
||||
view.stop()
|
||||
coordinator.viewModel.deregisterView()
|
||||
}
|
||||
|
||||
/// Constructs a coordinator for managing updating state
|
||||
public func makeCoordinator() -> Coordinator {
|
||||
return Coordinator(viewModel: viewModel)
|
||||
}
|
||||
|
||||
public class Coordinator: NSObject {
|
||||
public var viewModel: RiveViewModel
|
||||
|
||||
init(viewModel: RiveViewModel) {
|
||||
self.viewModel = viewModel
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
// Copyright © 2022 Rive. All rights reserved.
|
||||
//
|
||||
|
||||
#if canImport(UIKit)
|
||||
import UIKit
|
||||
|
||||
class FPSCounterView: UILabel {
|
||||
@@ -51,3 +52,49 @@ class FPSCounterView: UILabel {
|
||||
text = "Stopped"
|
||||
}
|
||||
}
|
||||
#else
|
||||
import AppKit
|
||||
|
||||
class FPSCounterView: NSTextField {
|
||||
private let fpsFormatter = NumberFormatter()
|
||||
private let updateInterval: Double = 0.5
|
||||
private var timeSinceUpdate: Double = 0
|
||||
|
||||
internal convenience init() {
|
||||
self.init(frame: CGRect(x: 1, y: 1, width: 70, height: 15))
|
||||
isBezeled = false
|
||||
isEditable = false
|
||||
isSelectable = false
|
||||
|
||||
backgroundColor = .darkGray
|
||||
textColor = .white
|
||||
alignment = .center
|
||||
font = NSFont.systemFont(ofSize: 11, weight: .regular)
|
||||
alphaValue = 0.75
|
||||
|
||||
//clipsToBounds = true
|
||||
//layer?.cornerRadius = 5
|
||||
stringValue = "..."
|
||||
|
||||
fpsFormatter.minimumFractionDigits = 2
|
||||
fpsFormatter.maximumFractionDigits = 2
|
||||
fpsFormatter.roundingMode = .down
|
||||
}
|
||||
|
||||
internal func elapsed(time elapsedTime: Double) {
|
||||
if elapsedTime != 0 {
|
||||
timeSinceUpdate += elapsedTime
|
||||
|
||||
if timeSinceUpdate >= updateInterval {
|
||||
timeSinceUpdate = 0
|
||||
stringValue = fpsFormatter.string(from: NSNumber(value: 1 / elapsedTime))! + "fps"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal func stopped() {
|
||||
stringValue = "Stopped"
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -54,26 +54,42 @@ build_renderer_sim() {
|
||||
cp -r $RIVE_RUNTIME_DIR/include $DEV_SCRIPT_DIR/../dependencies/includes/rive
|
||||
}
|
||||
|
||||
build_renderer_macosx() {
|
||||
# NOTE: we do not currently use debug, so lets not build debug
|
||||
pushd $RIVE_RUNTIME_DIR/skia/renderer
|
||||
./build.sh -p macosx clean
|
||||
./build.sh -p macosx $1
|
||||
popd
|
||||
cp -r $RIVE_RUNTIME_DIR/build/macosx/bin/$1/librive.a $DEV_SCRIPT_DIR/../dependencies/$1/librive_macos.a
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/renderer/build/macosx/bin/$1/librive_skia_renderer.a $DEV_SCRIPT_DIR/../dependencies/$1/librive_skia_renderer_macos.a
|
||||
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/renderer/include $DEV_SCRIPT_DIR/../dependencies/includes/renderer
|
||||
cp -r $RIVE_RUNTIME_DIR/include $DEV_SCRIPT_DIR/../dependencies/includes/rive
|
||||
}
|
||||
|
||||
|
||||
finalize_skia() {
|
||||
# COMBINE SKIA
|
||||
# make fat library, note that the ios64 library is already fat with arm64 and arm64e so we don't specify arch there.
|
||||
|
||||
pwd
|
||||
pushd $RIVE_RUNTIME_DIR/skia/dependencies/skia
|
||||
xcrun -sdk iphoneos lipo -create -arch armv7 out/arm/libskia.a out/arm64/libskia.a -output out/libskia_ios.a
|
||||
xcrun -sdk iphoneos lipo -create -arch x86_64 out/x64/libskia.a -arch i386 out/x86/libskia.a out/iossim_arm64/libskia.a -output out/libskia_ios_sim.a
|
||||
xcrun -sdk macosx lipo -create -arch x86_64 out/macosx/x64/libskia.a -arch arm64 out/macosx/arm64/libskia.a -output out/macosx/libskia_macos.a
|
||||
xcrun -sdk iphoneos lipo -create -arch armv7 out/ios/arm/libskia.a out/ios/arm64/libskia.a -output out/ios/libskia_ios.a
|
||||
xcrun -sdk iphoneos lipo -create -arch x86_64 out/ios/x64/libskia.a -arch i386 out/ios/x86/libskia.a out/ios/iossim_arm64/libskia.a -output out/ios/libskia_ios_sim.a
|
||||
popd
|
||||
|
||||
# copy skia outputs from ld'in skia!
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/out/libskia_ios.a $DEV_SCRIPT_DIR/../dependencies
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/out/libskia_ios_sim.a $DEV_SCRIPT_DIR/../dependencies
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/out/ios/libskia_ios.a $DEV_SCRIPT_DIR/../dependencies
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/out/ios/libskia_ios_sim.a $DEV_SCRIPT_DIR/../dependencies
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/out/macosx/libskia_macos.a $DEV_SCRIPT_DIR/../dependencies
|
||||
# note we purposefully put the skia include folder into dependencies/includes/skia, skia includes headers from include/core/name.h
|
||||
cp -r $RIVE_RUNTIME_DIR/skia/dependencies/skia/include $DEV_SCRIPT_DIR/../dependencies/includes/skia
|
||||
}
|
||||
|
||||
|
||||
usage () {
|
||||
echo "USAGE: $0 <all|ios|ios_sim> <debug|release>"
|
||||
echo "USAGE: $0 <all|ios|ios_sim|macosx> <debug|release>"
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -90,6 +106,24 @@ case $1 in
|
||||
build_renderer release
|
||||
build_renderer_sim debug
|
||||
build_renderer_sim release
|
||||
build_renderer_macosx debug
|
||||
build_renderer_macosx release
|
||||
;;
|
||||
macosx)
|
||||
if (( $# < 2 ))
|
||||
then
|
||||
usage
|
||||
fi
|
||||
case $2 in
|
||||
release | debug)
|
||||
make_dependency_directories
|
||||
finalize_skia
|
||||
build_renderer_macosx $2
|
||||
;;
|
||||
*)
|
||||
usage
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
ios)
|
||||
if (( $# < 2 ))
|
||||
|
||||
@@ -9,5 +9,7 @@ $DEV_SCRIPT_DIR/build.skia.sh -a x64
|
||||
$DEV_SCRIPT_DIR/build.skia.sh -a arm
|
||||
$DEV_SCRIPT_DIR/build.skia.sh -a arm64
|
||||
$DEV_SCRIPT_DIR/build.skia.sh -a iossim_arm64
|
||||
$DEV_SCRIPT_DIR/build.skia.macos.sh -a arm64
|
||||
$DEV_SCRIPT_DIR/build.skia.macos.sh -a x64
|
||||
|
||||
$DEV_SCRIPT_DIR/build.rive.sh $@
|
||||
47
scripts/build.skia.macos.sh
Executable file
47
scripts/build.skia.macos.sh
Executable file
@@ -0,0 +1,47 @@
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
|
||||
ARCH_X64=x64
|
||||
ARCH_ARM64=arm64
|
||||
|
||||
usage() {
|
||||
printf "Usage: %s -a arch\n" "$0"
|
||||
printf "\t-a Specify an architecture (i.e. '%s', '%s')\n" $ARCH_X64 $ARCH_ARM64
|
||||
exit 1 # Exit script after printing help
|
||||
}
|
||||
|
||||
while getopts "a:cd" opt; do
|
||||
case "$opt" in
|
||||
a) ARCH_NAME="$OPTARG" ;;
|
||||
\?) usage ;; # Print usage in case parameter is non-existent
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -z "$ARCH_NAME" ]; then
|
||||
echo "No architecture specified"
|
||||
usage
|
||||
fi
|
||||
|
||||
path=`readlink -f "${BASH_SOURCE:-$0}"`
|
||||
DEV_SCRIPT_DIR=`dirname $path`
|
||||
|
||||
export SKIA_REPO="https://github.com/rive-app/skia"
|
||||
export SKIA_BRANCH="rive"
|
||||
export COMPILE_TARGET="macos_$EXPECTED_NDK_VERSION_$ARCH_NAME"
|
||||
export CACHE_NAME="rive_skia_macos"
|
||||
export MAKE_SKIA_FILE="make_skia_macos.sh"
|
||||
export SKIA_DIR_NAME="skia"
|
||||
# we can have multiple at the same time...
|
||||
export ARCHIVE_CONTENTS_NAME="archive_contents_macos_$ARCH_NAME"
|
||||
|
||||
if [ -d "$DEV_SCRIPT_DIR/../submodules/rive-cpp" ];
|
||||
then
|
||||
export RIVE_RUNTIME_DIR="$DEV_SCRIPT_DIR/../submodules/rive-cpp"
|
||||
else
|
||||
export RIVE_RUNTIME_DIR="$DEV_SCRIPT_DIR/../../runtime"
|
||||
fi
|
||||
|
||||
# Build skia
|
||||
pushd "$RIVE_RUNTIME_DIR"/skia/dependencies
|
||||
./make_skia_macos.sh $ARCH_NAME
|
||||
popd
|
||||
@@ -35,7 +35,7 @@ export CACHE_NAME="rive_skia_ios"
|
||||
export MAKE_SKIA_FILE="make_skia_ios.sh"
|
||||
export SKIA_DIR_NAME="skia"
|
||||
# we can have multiple at the same time...
|
||||
export ARCHIVE_CONTENTS_NAME="archive_contents_$ARCH_NAME"
|
||||
export ARCHIVE_CONTENTS_NAME="archive_contents_ios_$ARCH_NAME"
|
||||
|
||||
if [ -d "$DEV_SCRIPT_DIR/../submodules/rive-cpp" ];
|
||||
then
|
||||
|
||||
@@ -8,25 +8,54 @@ function usage() {
|
||||
echo -e "${RED}👉 $1${CLEAR}\n";
|
||||
fi
|
||||
echo "Usage: $0 [-t target] [-c configuration]"
|
||||
echo " -t, --target Target (iphoneos / iphonesimulator)"
|
||||
echo " -c, --configuration Configuration (Debug / Release)"
|
||||
echo ""
|
||||
echo "Example: $0 --target iphoneos --configuration Debug"
|
||||
echo "Example: $0 --configuration Debug"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# parse params
|
||||
while [[ "$#" > 0 ]]; do case $1 in
|
||||
-t|--target) TARGET="$2"; shift;shift;;
|
||||
-c|--configuration) CONFIGURATION="$2";shift;shift;;
|
||||
*) usage "Unknown parameter passed: $1"; shift; shift;;
|
||||
esac; done
|
||||
|
||||
# verify params
|
||||
if [ -z "$TARGET" ]; then usage "Target is not set"; fi;
|
||||
if [ -z "$CONFIGURATION" ]; then usage "Configuration is not set."; fi;
|
||||
|
||||
echo -e "Build Rive Framework"
|
||||
echo -e "Configuration -> ${CONFIGURATION}, target -> ${TARGET}"
|
||||
echo -e "Configuration -> ${CONFIGURATION}"
|
||||
|
||||
xcodebuild -project RiveRuntime.xcodeproj -scheme RiveRuntime -sdk ${TARGET} -derivedDataPath archive -configuration ${CONFIGURATION} | xcpretty
|
||||
xcodebuild archive \
|
||||
-configuration ${CONFIGURATION} \
|
||||
-project RiveRuntime.xcodeproj \
|
||||
-scheme RiveRuntime \
|
||||
-destination generic/platform=iOS \
|
||||
-archivePath ".build/archives/RiveRuntime_iOS" \
|
||||
SKIP_INSTALL=NO \
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||||
|
||||
xcodebuild archive \
|
||||
-configuration ${CONFIGURATION} \
|
||||
-project RiveRuntime.xcodeproj \
|
||||
-scheme RiveRuntime \
|
||||
-destination "generic/platform=iOS Simulator" \
|
||||
-archivePath ".build/archives/RiveRuntime_iOS_Simulator" \
|
||||
SKIP_INSTALL=NO \
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||||
|
||||
xcodebuild archive \
|
||||
-configuration ${CONFIGURATION} \
|
||||
-project RiveRuntime.xcodeproj \
|
||||
-scheme RiveRuntime \
|
||||
-destination generic/platform=macOS \
|
||||
-archivePath ".build/archives/RiveRuntime_macOS" \
|
||||
SKIP_INSTALL=NO \
|
||||
BUILD_LIBRARY_FOR_DISTRIBUTION=YES
|
||||
|
||||
xcodebuild \
|
||||
-create-xcframework \
|
||||
-framework .build/archives/RiveRuntime_iOS.xcarchive/Products/Library/Frameworks/RiveRuntime.framework \
|
||||
-framework .build/archives/RiveRuntime_iOS_Simulator.xcarchive/Products/Library/Frameworks/RiveRuntime.framework \
|
||||
-framework .build/archives/RiveRuntime_macOS.xcarchive/Products/Library/Frameworks/RiveRuntime.framework \
|
||||
-output archive/RiveRuntime.xcframework
|
||||
@@ -1,30 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
BASEDIR=$(pwd)
|
||||
|
||||
CLEAR='\033[0m'
|
||||
RED='\033[0;31m'
|
||||
|
||||
function usage() {
|
||||
if [ -n "$1" ]; then
|
||||
echo -e "${RED}👉 $1${CLEAR}\n";
|
||||
fi
|
||||
echo "Usage: $0 [-c configuration]"
|
||||
echo " -c, --configuration Configuration (Debug / Release)"
|
||||
echo ""
|
||||
echo "Example: $0 --target iphoneos --configuration Debug"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# parse params
|
||||
while [[ "$#" > 0 ]]; do case $1 in
|
||||
-c|--configuration) CONFIGURATION="$2";shift;shift;;
|
||||
*) usage "Unknown parameter passed: $1"; shift; shift;;
|
||||
esac; done
|
||||
|
||||
echo -e "Merge Rive Frameworks"
|
||||
xcodebuild \
|
||||
-create-xcframework \
|
||||
-framework "${BASEDIR}/archive/Build/Products/${CONFIGURATION}-iphoneos/RiveRuntime.framework" \
|
||||
-framework "${BASEDIR}/archive/Build/Products/${CONFIGURATION}-iphonesimulator/RiveRuntime.framework" \
|
||||
-output "${BASEDIR}/archive/RiveRuntime.xcframework" | xcpretty
|
||||
Submodule submodules/rive-cpp updated: 2121cdcbc1...73fac9a837
Reference in New Issue
Block a user