Posts

Post not yet marked as solved
1 Replies
180 Views
Trying to find some answers on why billboarding isn't working when attaching to an entity that is a child of an anchor. I'm trying to billboard an attachment so that it remains pointed at the user wherever they're viewing the content from. For example, showing some context information over dynamic 3d model on the table top. Not baked into a Reality Composer pro scene. I pulled the component and system used in the various Apple example projects (Diorama) that have the billboarding system. Playing around with the system and component I can add a simple model entity to the scene, tag it with the component and it works perfectly, all the time. As the camera moves it tracks it perfectly. Even when nested under other empty entities or off center or oddly rotated. Great! Then I wanted to apply this to an attachment that is shown from a model entity that is anchored to a horizontal plane and all of the sudden it doesn't work at all. I create the anchor: let anchor = AnchorEntity(.plane(.horizontal, classification: .table, minimumBounds: [0.01, 0.01])) if let lookAtText = attachments.entity(for: "LookAtMe") { lookAtText.position = [0,0.5,0] lookAtText.components.set(BillboardComponent()) lookAtText.name = "Look At Me" anchor.addChild(lookAtText) } content.add(anchor) The attachment shows correctly above the anchor, as expected, and does rotate some, just totally wrong or stops, It does not billboard correctly, or even remotely correctly. if I switch the anchor.addChild to be a content.add it isn't in the correct place, but billboarding works. I don't understand why adding it as a child to the anchor entity suddenly breaks completely unrelated systems. Am I doing something wrong or is this some sort of privacy issue? I can't find any documentation that using the look at api from an anchored entity is somehow forbidden.
Posted Last updated
.
Post not yet marked as solved
2 Replies
464 Views
Recently we introduced a macro to our workspace. Builds fine inside Xcode, as well as builds fine using xcodebuild. Seemed like everything was working perfectly until we went to export localizations. If we attempt to do it from Xcode itself it will fail as it attempts to build macOS (which is a totally different issue) We have this process automated though so it is being built via command line: This is the exact prompt we're running xcodebuild -exportLocalizations -localizationPath ../output -workspace <workspace>.xcworkspace -exportLanguage en -sdk iphoneos This will do the normal Xcode package/build graph resolution and generation and begin building. Eventually when it hits a use case of the macro it will fail. In each case when it fails it will have something like this: <unknown>:0: warning: compiler plugin not loaded: '<output-path>/<our-macro-package>; failed to initialize <path-to-usage>.swift:29:35: error: external macro implementation type '<our-macro-package>.<our-macro>' could not be found for macro '<our-macro>()' If I go to that output path I can see the macro package executable there. If I look in the build command for the file I can something that looks like this: ... -load-plugin-executable <output-path>/<our-macro-package>\#<our-macro-package> ... If attempt to build, without the -exportLocalizations flag, it works and builds just fine. I'm not sure what's happening here. Has anyone seen this? Macros+export localizations?
Posted Last updated
.
Post not yet marked as solved
1 Replies
351 Views
Recently upgraded to the Ventura 13.4 beta (22F5037d) and I'm noticing that when my computer sleeps for a while (overnight, a couple hours) the ethernet connection drops from gigabit to 100baseT. When I wake up the computer it doesn't upgrade its connection back to gigabit. If I unplug/replug the cable it will autodetect gigabit. If I manually change the network connection to 1000baseT it will also negotiate and work. deactivating and reactivating the service will also get it back to gigabit. Swapping the cable made no difference. Using the power adapter vs the docks power didn't also didn't make a difference. Once the computer is on gigabit it will remain there while the computer is being used (9+ hours) it only downgrades once the computer goes to sleep. Mac is connected via thunderbolt to a cal digit TS4 dock which is then connected to a ubiquiti switch, not sure if that makes a difference (hopefully not!). Anyone else seeing this?
Posted Last updated
.
Post not yet marked as solved
2 Replies
1.5k Views
Using Swift 5.7 we're trying to use protocols for testing and mocking in our SwiftUI App. With any and some we're able to hold a heterogeneous list of protocols with self constraints which works perfectly. What we're running into now is that we can't undox the any Protocol into a concrete type for the view. Here's a basic example: protocol ItemProtocol: ObservableObject {     var id: String { get } } struct ListSection {     var id: Int     let title: String     let items: [any ItemProtocol] } protocol ViewModelProtocol: ObservableObject {     var sections: [ListSection] { get } } struct MyView<T: ViewModelProtocol>: View {   @ObservedObject     var viewModel: T     init(viewModel: T) {         self.viewModel = viewModel     }     var body: some View {         List(viewModel.sections, id: \.id) { section in             Section {                 ForEach(section.items, id: \.id) { item in                     RowView(item: item)                     // create view for some ItemProtocol                     Text("Hello Item")                 }             } header: {                 Text(section.title)             }         }     } } struct RowView<T: ItemProtocol>: View {     @ObservedObject     var item: T     init(item: T) {         self.item = item     }     var body: some View {         Text("Row View")     } } This will result in an error: Type 'any ItemProtocol' cannot conform to 'ItemProtocol' I had hoped that the any ItemProtocol would be unboxed to it's concrete type and a concrete type of View would be created.
Posted Last updated
.
Post not yet marked as solved
1 Replies
2.7k Views
`UICollectionView` documentation is sparse at best. `performBatchUpdates`is a complete enigma. I have been trying to get all 4 (move, add, delete, reload) operations working correctly in the update space. I have some hope that Apple has correctly implemented the handling but I wish they would explain what on earth they are doing.Here is what I'm trying to get to work. I have two arrays with similar items in various orders and animate the changes. Simple right!? Here are the arrays: po newItems.map({ $0.representedID }) ▿ 3 elements - 0 : "5ccbdfd08d9b423a9bb78310ffe7e92b" - 1 : "9130a12b035543099f30a6cd9c6b6081" - 2 : "e0d1a52ed9f3440b859d47db4f4709f4" po previous.map({ $0.representedID }) ▿ 4 elements - 0 : "9130a12b035543099f30a6cd9c6b6081" - 1 : "458b0523c4104a4bbcb420dc01aeb143" - 2 : "e0d1a52ed9f3440b859d47db4f4709f4" - 3 : "5ccbdfd08d9b423a9bb78310ffe7e92b"You can see we lose one item between previous and new items and the rest shift around a bit.I have some logic to calculate the differences and process that in the perform batch updates which are below: Changes for section:0 Removing :[1] Moving from:0 to 1 Moving from:3 to 0 reloading :[2]This makes sense to make the previous turn into the new we remove 1, move item in 0 to 1, move item in 3 to zero and simply reload index 2.This crashes every time here: *** Assertion failure in -[UICollectionView _endItemAnimationsWithInvalidationContext:tentativelyForReordering:animator:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3683.300.2/UICollectionView.m:5744 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to perform an insert and a move to the same index path (&lt;NSIndexPath: 0xc000000000200016&gt; {length = 2, path = 0 - 1})'Where is this magic insert coming from? Any ideas the algorithm they are using performing these changes?Here is the sequence of the batch changes: collectionView.performBatchUpdates({ model.applyChanges(changes) print("Changes for:\(section)") if !changes.removeIndexes.isEmpty { print("Removing :\([Int](changes.removeIndexes))") self.collectionView.deleteItems(at: changes.removeIndexes.map({ IndexPath(row: $0, section: section)})) } for (from, to) in zip(changes.moveFrom, changes.moveTo).sorted(by: { $0.0 &lt; $1.0 }) { print("Moving from:\(from) to \(to)") self.collectionView.moveItem(at: IndexPath(row: from, section: section), to: IndexPath(row: to, section: section)) } if !changes.addIndexes.isEmpty { print("adding :\([Int](changes.addIndexes))") self.collectionView.insertItems(at: changes.addIndexes.map({ IndexPath(row: $0, section: section)})) } if !changes.reloadIndexes.isEmpty { print("reloading :\([Int](changes.reloadIndexes))") self.collectionView.reloadItems(at: changes.reloadIndexes.map({ IndexPath(row: $0, section: section)})) } }, completion: { _ in print("Done updating:\(section)") self.updateEmptyState() })
Posted Last updated
.