From 2f98c1007a34e8ff1202c2af5aaefd78cbb320ea Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 14 Jun 2024 15:28:41 +0200 Subject: [PATCH] VM arkit --- .../ArkitDoushiQi.xcodeproj/project.pbxproj | 34 +++- .../ArkitDoushiQi/ArKit/ArKitView.swift | 124 +----------- .../ArKit/ArKitViewRepresentable.swift | 8 +- .../ArkitDoushiQi/ArKit/ContentArkit.swift | 36 ++++ .../ArkitDoushiQi/ArKit/UIViewArKit.swift | 73 ------- .../ArkitDoushiQi/ArKit/VMArkit.swift | 185 ++++++++++++++++++ .../ArkitDoushiQi/ArkitDoushiQiApp.swift | 2 +- ArkitDoushiQi/ArkitDoushiQi/Info.plist | 5 +- 8 files changed, 256 insertions(+), 211 deletions(-) create mode 100644 ArkitDoushiQi/ArkitDoushiQi/ArKit/ContentArkit.swift delete mode 100644 ArkitDoushiQi/ArkitDoushiQi/ArKit/UIViewArKit.swift create mode 100644 ArkitDoushiQi/ArkitDoushiQi/ArKit/VMArkit.swift diff --git a/ArkitDoushiQi/ArkitDoushiQi.xcodeproj/project.pbxproj b/ArkitDoushiQi/ArkitDoushiQi.xcodeproj/project.pbxproj index b70f1e4..df7d269 100644 --- a/ArkitDoushiQi/ArkitDoushiQi.xcodeproj/project.pbxproj +++ b/ArkitDoushiQi/ArkitDoushiQi.xcodeproj/project.pbxproj @@ -7,9 +7,10 @@ objects = { /* Begin PBXBuildFile section */ + 8268B4A42C1C640000D195CC /* VMArkit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8268B4A32C1C640000D195CC /* VMArkit.swift */; }; 82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBD2C19762C009711A5 /* ArKitView.swift */; }; 82740EC02C197A48009711A5 /* ArKitViewRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */; }; - 82740EC22C197C1A009711A5 /* UIViewArKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EC12C197C1A009711A5 /* UIViewArKit.swift */; }; + 82740EC22C197C1A009711A5 /* ContentArkit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82740EC12C197C1A009711A5 /* ContentArkit.swift */; }; 82CCA5442C1C2B6400AFF485 /* board.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5432C1C2B6400AFF485 /* board.usdz */; }; 82CCA5462C1C2B8E00AFF485 /* CatPiece.usdz in Resources */ = {isa = PBXBuildFile; fileRef = 82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */; }; 82CE59E92C045D1100ADEE24 /* GameScene.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82CE59E82C045D1100ADEE24 /* GameScene.swift */; }; @@ -63,9 +64,10 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + 8268B4A32C1C640000D195CC /* VMArkit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VMArkit.swift; sourceTree = ""; }; 82740EBD2C19762C009711A5 /* ArKitView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitView.swift; sourceTree = ""; }; 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArKitViewRepresentable.swift; sourceTree = ""; }; - 82740EC12C197C1A009711A5 /* UIViewArKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewArKit.swift; sourceTree = ""; }; + 82740EC12C197C1A009711A5 /* ContentArkit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentArkit.swift; sourceTree = ""; }; 82CCA53C2C1C255E00AFF485 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 82CCA5432C1C2B6400AFF485 /* board.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; path = board.usdz; sourceTree = ""; }; 82CCA5452C1C2B8E00AFF485 /* CatPiece.usdz */ = {isa = PBXFileReference; lastKnownFileType = file.usdz; name = CatPiece.usdz; path = Object/CatPiece.usdz; sourceTree = SOURCE_ROOT; }; @@ -144,7 +146,8 @@ children = ( 82740EBD2C19762C009711A5 /* ArKitView.swift */, 82740EBF2C197A48009711A5 /* ArKitViewRepresentable.swift */, - 82740EC12C197C1A009711A5 /* UIViewArKit.swift */, + 82740EC12C197C1A009711A5 /* ContentArkit.swift */, + 8268B4A32C1C640000D195CC /* VMArkit.swift */, ); path = ArKit; sourceTree = ""; @@ -488,7 +491,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 82740EC22C197C1A009711A5 /* UIViewArKit.swift in Sources */, + 82740EC22C197C1A009711A5 /* ContentArkit.swift in Sources */, C2F015112C09D3C3000F7221 /* AI.swift in Sources */, C2F0152A2C09D420000F7221 /* Stub.swift in Sources */, C2F015252C09D3E7000F7221 /* ItemCollectionParty.swift in Sources */, @@ -507,6 +510,7 @@ C2F015262C09D3E7000F7221 /* ProfileEdit.swift in Sources */, C205A2B72BF373360097BD93 /* ArkitDoushiQiApp.swift in Sources */, 82740EBE2C19762C009711A5 /* ArKitView.swift in Sources */, + 8268B4A42C1C640000D195CC /* VMArkit.swift in Sources */, C2F015232C09D3E7000F7221 /* EditTextComponent.swift in Sources */, C2F015222C09D3E7000F7221 /* PhotoButtonComponent.swift in Sources */, C2F015092C09D366000F7221 /* LanguageSettings.swift in Sources */, @@ -688,12 +692,17 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DRCMU7YM68; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ArkitDoushiQi/Info.plist; + INFOPLIST_KEY_NSCameraUsageDescription = "Donne la cam "; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -704,8 +713,10 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = UCA.WtaTennis; + PRODUCT_BUNDLE_IDENTIFIER = fr.uca.iut.enzo; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = tpiOS_2023; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -717,12 +728,17 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; + CODE_SIGN_IDENTITY = "Apple Development"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Manual; CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_ASSET_PATHS = "\"ArkitDoushiQi/Views\""; + DEVELOPMENT_TEAM = ""; + "DEVELOPMENT_TEAM[sdk=iphoneos*]" = DRCMU7YM68; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = ArkitDoushiQi/Info.plist; + INFOPLIST_KEY_NSCameraUsageDescription = "Donne la cam "; INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; INFOPLIST_KEY_UILaunchScreen_Generation = YES; @@ -733,8 +749,10 @@ "@executable_path/Frameworks", ); MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = UCA.WtaTennis; + PRODUCT_BUNDLE_IDENTIFIER = fr.uca.iut.enzo; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = tpiOS_2023; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitView.swift b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitView.swift index 4a28b7f..9d44fd4 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitView.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitView.swift @@ -13,16 +13,7 @@ import UIKit class ArKitView : ARView { - static let offset = CGPoint(x: -400, y: -300 ) - static let direction = CGVector(dx: 100, dy: 100) - - var game:Game - - var pieces: [Owner : [ Animal : Entity?]] - required init(frame frameRect: CGRect) { - pieces = [.noOne:[.cat:nil]] - game = try! Game(withRules: ClassicRules(), andPlayer1: HumanPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!) super.init(frame: frameRect) } @@ -30,48 +21,12 @@ class ArKitView : ARView { fatalError("init(coder:) not implemented") } - convenience init(_ game:Game) { + convenience init() { self.init(frame: UIScreen.main.bounds) - self.game = game - let anchor = defineAnchors() - addBoard(anchor: anchor) - generatePieces(anchor:anchor) - - self.game.addBoardChangedListener { board in self.boardChange() } - self.game.addPieceRemovedListener { _,_,piece in self.removePiece(piece: piece) } - self.game.addInvalidMoveCallbacksListener { board,move,player,bool in self.invalidMove(board: board, move: move, player:player, bool:bool)} + applyConfiguration() } - // ------ Listener -------- // - func boardChange() { - print("Board change !") - displayBoard(board: game.board) - } - func removePiece(piece:Piece){ - print("Remove piece") - - if let entity = pieces[piece.owner]![piece.animal] { - if let x = entity { - x.removeFromParent() - } - } - } - func invalidMove(board:Board,move:Move,player:Player,bool:Bool) { - - if (bool){ // Valid - print("Move valid de \(player.id)") - print("Move : \(move.description)") - } - else { // Invalid - print("Move invalid de \(player.id)") - print("Move : \(move.description)") - displayBoard(board: game.board) - } - print("------------") - } - // ------------------------ // - func applyConfiguration() { let configuration = ARWorldTrackingConfiguration() session.run(configuration) @@ -83,81 +38,6 @@ class ArKitView : ARView { return anchor } - func addBoard(anchor:AnchorEntity){ - let board = try? Entity.load(named: "board") - if let board { - anchor.addChild(board) - } - } - - // -- Crée les pieces - func generatePieces(anchor:AnchorEntity) { - // Position - X,Y,Z - for c in pieces.flatMap({ animal,values in return values }) - { - var entity:Entity? - switch c.self.key { - case .cat : - entity = try? Entity.load(named: "CatPiece") - case .elephant : - entity = try? Entity.load(named: "CatPiece") - case .dog : - entity = try? Entity.load(named: "CatPiece") - case .leopard : - entity = try? Entity.load(named: "CatPiece") - case .lion : - entity = try? Entity.load(named: "CatPiece") - case .rat : - entity = try? Entity.load(named: "CatPiece") - case .tiger : - entity = try? Entity.load(named: "CatPiece") - case .wolf : - entity = try? Entity.load(named: "CatPiece") - - default: - fatalError("Animal non compris") - } - - if let entityNotNull = entity { - anchor.addChild(entityNotNull) - entityNotNull.position = SIMD3(0,0,10) - entityNotNull.generateCollisionShapes(recursive:true) - - /* - self.installGestures([.all], for: entityNotNull as! Entity & HasCollision).forEach { gestureRecognizer in - gestureRecognizer.addTarget(self, action: #selector(handleGesture(_:)))}*/ - print("Piece \(c.self.key) a été crée !") - } - else { - print("La pièce \(c.self.key) n'a pas été crée !") - } - } - - } - - // -- Affiche les pieces à la bonne positions - func displayBoard(board:Board) { - for ligne in 0.. SIMD3 { - return SIMD3(Float(ArKitView.offset.x + ArKitView.direction.dx * pos.x),Float(ArKitView.offset.y + ArKitView.direction.dy * pos.y),10) - } - func converWorldPosIntoPosModele(pos:SIMD3) -> CGPoint { - let posX = Int(round((pos.x - (-400)) / 100)) - let posY = Int(round((pos.y - (-300)) / 100)) - return CGPoint(x: posX, y: posY) - } - - // -- Pour les mouvement -- // var initialTransform: Transform = Transform() diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitViewRepresentable.swift b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitViewRepresentable.swift index ac84ec6..5bb5814 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitViewRepresentable.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ArKitViewRepresentable.swift @@ -11,14 +11,10 @@ import DouShouQiModel struct ArKitViewRepresentable : UIViewRepresentable { - private let game:Game - - init(_ game: Game){ - self.game = game - } + init(){} func makeUIView(context: Context) -> ArKitView { - return ArKitView(self.game) + return ArKitView() } func updateUIView(_ uiView: UIViewType, context: Context) { } diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArKit/ContentArkit.swift b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ContentArkit.swift new file mode 100644 index 0000000..643d018 --- /dev/null +++ b/ArkitDoushiQi/ArkitDoushiQi/ArKit/ContentArkit.swift @@ -0,0 +1,36 @@ +// +// UIViewArKit.swift +// ArkitDoushiQi +// +// Created by Enzo JOLYS on 12/06/2024. +// + +import SwiftUI +import DouShouQiModel + +struct ContentArkit: View { + + var vm:VMArkit = VMArkit(try! Game(withRules: ClassicRules(), andPlayer1: RandomPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!)) + + var body: some View { + VStack { + Text("toto") + /* + vm.view + .ignoresSafeArea() + .navigationBarBackButtonHidden(true) + .task { + try! await vm.game.start() + }*/ + ArKitViewRepresentable() + } + } + +} + + +struct UIViewArKit_Previews: PreviewProvider { + static var previews: some View { + ContentArkit() + } +} diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArKit/UIViewArKit.swift b/ArkitDoushiQi/ArkitDoushiQi/ArKit/UIViewArKit.swift deleted file mode 100644 index 212bd38..0000000 --- a/ArkitDoushiQi/ArkitDoushiQi/ArKit/UIViewArKit.swift +++ /dev/null @@ -1,73 +0,0 @@ -// -// UIViewArKit.swift -// ArkitDoushiQi -// -// Created by Enzo JOLYS on 12/06/2024. -// - -import SwiftUI -import DouShouQiModel - -struct UIViewArKit: View { - - var game:Game = try! Game(withRules: ClassicRules(), andPlayer1: HumanPlayer(withName: "Bot1", andId: .player1)!, andPlayer2: RandomPlayer(withName: "Bot2", andId: .player2)!) - - - @State var msg:String = "Msg" - - var body: some View { - VStack { - Text(msg) - ArKitViewRepresentable(game) - .ignoresSafeArea() - .navigationBarBackButtonHidden(true) - .task { - game.addGameStartedListener { board in startGame()} - game.addGameOverListener { board, result, player in gameOver() } - game.addGameChangedListener { game in gameChange() } - - game.addMoveChosenCallbacksListener { board, move, player in moveChose(board: board, move: move, player: player) } - - game.addPieceRemovedListener { _,_,piece in removePiece(piece: piece) } - - game.addPlayerNotifiedListener { board, player in - print("Player notif : \(player.id) à toi de jouer ") - msg = "Player notif : \(player.id) à toi de jouer !" - - if (player is IAPlayer ){ - try! await player.chooseMove(in: board, with: game.rules) - } - } - - //try! await game.start() - } - } - } - - // ------ Listener -------- // - - func startGame() { print("Start game !") - msg = "Start !!" - } - func gameOver() { print("Game over !") - msg = "Game over !!" - } - func gameChange() { print("Game change !") } - - func moveChose(board:Board,move:Move,player:Player) { - } - - func removePiece(piece:Piece){ - msg = "Piece manger !!" - } - - - // ------------------------- // -} - - -struct UIViewArKit_Previews: PreviewProvider { - static var previews: some View { - UIViewArKit() - } -} diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArKit/VMArkit.swift b/ArkitDoushiQi/ArkitDoushiQi/ArKit/VMArkit.swift new file mode 100644 index 0000000..ca0e812 --- /dev/null +++ b/ArkitDoushiQi/ArkitDoushiQi/ArKit/VMArkit.swift @@ -0,0 +1,185 @@ +// +// VMArkit.swift +// ArkitDoushiQi +// +// Created by Enzo JOLYS on 14/06/2024. +// + +import Foundation +import DouShouQiModel +import ARKit +import RealityKit +import UIKit + +struct VMArkit { + + static let offset = CGPoint(x: -400, y: -300 ) + static let direction = CGVector(dx: 100, dy: 100) + + var msg:String = "" + + var game:Game + + var view:ArKitViewRepresentable = ArKitViewRepresentable() + + var pieces: [Owner : [ Animal : Entity?]] = [.player1: [.cat:nil, + .elephant:nil, + .dog:nil, + .leopard:nil, + .lion:nil, + .rat:nil, + .tiger:nil, + .wolf:nil], + .player2: [.cat:nil, + .elephant:nil, + .dog:nil, + .leopard:nil, + .lion:nil, + .rat:nil, + .tiger:nil, + .wolf:nil]] + + init(_ game:Game){ + self.game = game + + defineListeners() + } + + func addBoard(anchor:AnchorEntity){ + let board = try? Entity.load(named: "board") + if let board { + anchor.addChild(board) + } + } + + // -- Crée les pieces + func generatePieces(anchor:AnchorEntity) { + // Position - X,Y,Z + for c in pieces.flatMap({ animal,values in return values }) + { + var entity:Entity? + switch c.self.key { + case .cat : + entity = try? Entity.load(named: "CatPiece") + case .elephant : + entity = try? Entity.load(named: "CatPiece") + case .dog : + entity = try? Entity.load(named: "CatPiece") + case .leopard : + entity = try? Entity.load(named: "CatPiece") + case .lion : + entity = try? Entity.load(named: "CatPiece") + case .rat : + entity = try? Entity.load(named: "CatPiece") + case .tiger : + entity = try? Entity.load(named: "CatPiece") + case .wolf : + entity = try? Entity.load(named: "CatPiece") + + default: + fatalError("Animal non compris") + } + + if let entityNotNull = entity { + anchor.addChild(entityNotNull) + entityNotNull.position = SIMD3(0,0,10) + entityNotNull.generateCollisionShapes(recursive:true) + + /* + self.installGestures([.all], for: entityNotNull as! Entity & HasCollision).forEach { gestureRecognizer in + gestureRecognizer.addTarget(self, action: #selector(handleGesture(_:)))}*/ + print("Piece \(c.self.key) a été crée !") + } + else { + print("La pièce \(c.self.key) n'a pas été crée !") + } + } + + } + + + // -- Affiche les pieces à la bonne positions + func displayBoard(board:Board) { + for ligne in 0.. Element vide ") + } + } + } + } + } + } + + func convertPosModeleIntoWorldPos(pos:CGPoint) -> SIMD3 { + return SIMD3(Float(VMArkit.offset.x + VMArkit.direction.dx * pos.x),Float(VMArkit.offset.y + VMArkit.direction.dy * pos.y),10) + } + func converWorldPosIntoPosModele(pos:SIMD3) -> CGPoint { + let posX = Int(round((CGFloat(pos.x) - (VMArkit.offset.x)) / VMArkit.direction.dx)) + let posY = Int(round((CGFloat(pos.y) - (VMArkit.offset.y)) / VMArkit.direction.dy)) + return CGPoint(x: posX, y: posY) + } + + + // ------ Listener -------- // + func defineListeners(){ + self.game.addGameStartedListener { board in startGame()} + self.game.addGameOverListener { board, result, player in gameOver()} + self.game.addGameChangedListener { game in gameChange() } + self.game.addBoardChangedListener { board in boardChange() } + self.game.addMoveChosenCallbacksListener { board, move, player in moveChose(board: board, move: move, player: player) } + self.game.addInvalidMoveCallbacksListener { board,move,player,bool in invalidMove(board: board, move: move, player:player, bool:bool)} + self.game.addPieceRemovedListener { _,_,piece in removePiece(piece: piece) } + + self.game.addPlayerNotifiedListener { board, player in + print("Player notif : \(player.id) à toi de jouer ") + //msg = "Player notif : \(player.id) à toi de jouer !" + if (player is IAPlayer ){ + try! await player.chooseMove(in: board, with: game.rules) + }} + } + + func startGame() { print("Start game !") + //self.msg = "Start !!" + } + func gameOver() { print("Game over !") + //msg = "Game over !!" + } + func gameChange() { print("Game change !") } + func boardChange() { + print("Board change !") + self.displayBoard(board: self.game.board) + } + + func moveChose(board:Board,move:Move,player:Player) { + } + + func invalidMove(board:Board,move:Move,player:Player,bool:Bool) { + if (bool){ // Valid + print("Move valid de \(player.id)") + print("Move : \(move.description)") + } + else { // Invalid + print("Move invalid de \(player.id)") + print("Move : \(move.description)") + self.displayBoard(board: self.game.board) + } + print("------------") + } + + func removePiece(piece:Piece){ + print("Remove piece") + if let entity = pieces[piece.owner]![piece.animal] { + if let x = entity { + x.removeFromParent() + } + } + } + + // ------------------------- // +} diff --git a/ArkitDoushiQi/ArkitDoushiQi/ArkitDoushiQiApp.swift b/ArkitDoushiQi/ArkitDoushiQi/ArkitDoushiQiApp.swift index 42e9e62..1235f56 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/ArkitDoushiQiApp.swift +++ b/ArkitDoushiQi/ArkitDoushiQi/ArkitDoushiQiApp.swift @@ -29,7 +29,7 @@ struct ArkitDoushiQiApp: App { ) .environmentObject(languageSettings) .preferredColorScheme(isDarkMode ? .dark : .light)*/ - UIViewArKit() + ContentArkit() } } } diff --git a/ArkitDoushiQi/ArkitDoushiQi/Info.plist b/ArkitDoushiQi/ArkitDoushiQi/Info.plist index 0c67376..07cd449 100644 --- a/ArkitDoushiQi/ArkitDoushiQi/Info.plist +++ b/ArkitDoushiQi/ArkitDoushiQi/Info.plist @@ -1,5 +1,8 @@ - + + NSCameraPortraitEffectEnabled + +