Post

Replies

Boosts

Views

Activity

Reply to Loading a ModelEntity with a MDLMesh
I was hunting for something akin to this path myself, and haven't found any public accessors for RealityKit's entities to be loaded other than the loadModel, which in the examples are specific to USD formats. - https://developer.apple.com/documentation/realitykit/entity/stored_entities/loading_entities_from_a_file I suspect that in order to load your model in RealityKit, you'll first need to explicitly transform your STL-sourced model into USDZ, write it to a file or buffer, and then load it from there with loadModel - https://developer.apple.com/documentation/realitykit/entity/3244091-loadmodel or it's neighboring methods.
Topic: Spatial Computing SubTopic: ARKit Tags:
Feb ’21
Reply to Does Publisher.first complete after sending a value?
First does send a completion when it's triggered, although I suspect for this use case what you want is actually firstWhere, which looks for a specific predicate to trigger on before sending values - where first just takes whatever it gets right off the bat (meaning you had to filter the content earlier in the pipeline). The difference is minimal - when used inline it just looks like a parameter to the first operator, but they're different structs under the covers. While I was working on a my own reference content for Combine, I wrote a bunch of tests that worked all the various operators, so if you're so inclined, you can see what I did there to test the first operator - it's open source.
Topic: App & System Services SubTopic: General Tags:
May ’21
Reply to Detect when @EnvironmentObject variable has been initialised inside property wrapper
I don't think that there's currently a way to explore and examine (programmatically) what is in the environment - so there's no obvious way to verify that the object you're expecting to be in the environment was injected. To deal with this little quirk, the pattern that I've seen used in some code is to have an top-level View that explicitly injects the relevant environment object, often as a an explicit parameter to that view, and then use that as a base point upon which you can assume (safely) that all subviews from here will have the relevant pieces you need.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
May ’21
Reply to Coalescing @Published changes?
The short answer is that changes to a property aren't coalesced. The change notification is only a notification that something changed, and it leaves the getting and determining what's changed to the underlying code. As you've seen, a change notification handler can be called repeatedly, with apparently the same information inside it. When you can do to sort of work around this is make your own publisher from the messages that reacts to the change notification and sends the message down it's own pipeline, and include .removeDuplicates() as an operator on that pipeline, then. subscribe to it in your view with .onReceive to process the updates. This (obviously?) doesn't stop the duplicate notifications, and still triggers a send of the message value each time, but your pipeline with removeDuplicates does the coalescing for you, and you have a publisher that's providing you the specific values you want to work with - the message content.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
May ’21
Reply to Is there an equivalent accessibilityElement API for SwiftUI - specifically when making visualizations using the new Canvas view in SwiftUI
This session is what prompted this question - The canvas is a single element, and I want to have multiple accessibility elements that I'm displaying within it. That may not be (yet?) possible, but I wanted to see if there was any suggestions for a pattern of how to create multiple children and align them with specific in-view-coordinate spaces, which mimics a bit of what you can do within UIKit where you specify a frame location for a child accessibility object.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jun ’21
Reply to How can I create a custom mesh in RealityKit?
With the WWDC21 software updates, I noticed that RealityKit now has some additional methods on MeshResource: generate(from:), generate(from:) replace(with:) (and async oriented variations of these methods) The generate method is used in the example code BuildingAnImmersiveExperienceWithRealityKit which looks like it is now possible to provide the indices, normals, etc to build up a mesh procedurally. These methods don't have any documentation on them, so I'm not 100% certain about the details, but the Swift generated headers for it have some relevant notes that make it appear like these might the the "RealityKit" way to procedurally create meshes. Am I inferring correctly that these methods enable procedural generation with this year's release, or are these methods more focused elsewhere?
Topic: Graphics & Games SubTopic: RealityKit Tags:
Sep ’21
Reply to Demo code not compiling…
In case it helps anyone else, the diffs I had to apply (Xcode 13.1) to compile it: diff --git a/Underwater/Octopus.swift b/Underwater/Octopus.swift index e447a32..7a99708 100644 --- a/Underwater/Octopus.swift +++ b/Underwater/Octopus.swift @@ -82,7 +82,7 @@ struct OctopusSystem: RealityKit.System { let scene = context.scene for octopus in scene.performQuery(OctopusComponent.query) { guard octopus.isEnabled else { continue } - guard var component = octopus.components[OctopusComponent] as? OctopusComponent else { continue } + guard var component = octopus.components[OctopusComponent.self] as? OctopusComponent else { continue } guard component.settings?.octopus.fearsCamera ?? false else { return } switch component.state { case .hiding: diff --git a/Underwater/Scattering.swift b/Underwater/Scattering.swift index 0883bdb..db3aa47 100644 --- a/Underwater/Scattering.swift +++ b/Underwater/Scattering.swift @@ -127,8 +127,8 @@ extension Entity { if let animation = try? AnimationResource.generate(with: FromToByAnimation<Transform>( from: transformWithZeroScale, to: transform, - duration: 1.0, - targetPath: .transform + duration: 1.0 +// targetPath: .transform )) { playAnimation(animation) }
Topic: Graphics & Games SubTopic: General Tags:
Nov ’21
Reply to Unable to build the sample code for WWDC RealityKit 2 session
I just built this for Xcode 13.1 by applying the following diffs (make sure you're building for a device, not the simulator - the code doesn't compile for the simulator, which isn't mentioned in the README - FB9181536): diff --git a/Underwater/Octopus.swift b/Underwater/Octopus.swift index e447a32..7a99708 100644 --- a/Underwater/Octopus.swift +++ b/Underwater/Octopus.swift @@ -82,7 +82,7 @@ struct OctopusSystem: RealityKit.System { let scene = context.scene for octopus in scene.performQuery(OctopusComponent.query) { guard octopus.isEnabled else { continue } - guard var component = octopus.components[OctopusComponent] as? OctopusComponent else { continue } + guard var component = octopus.components[OctopusComponent.self] as? OctopusComponent else { continue } guard component.settings?.octopus.fearsCamera ?? false else { return } switch component.state { case .hiding: diff --git a/Underwater/Scattering.swift b/Underwater/Scattering.swift index 0883bdb..db3aa47 100644 --- a/Underwater/Scattering.swift +++ b/Underwater/Scattering.swift @@ -127,8 +127,8 @@ extension Entity { if let animation = try? AnimationResource.generate(with: FromToByAnimation<Transform>( from: transformWithZeroScale, to: transform, - duration: 1.0, - targetPath: .transform + duration: 1.0 +// targetPath: .transform )) { playAnimation(animation) }
Topic: Graphics & Games SubTopic: General Tags:
Nov ’21
Reply to Is there a way to include snippets from an external file with DocC?
For code snippets in particular, there was a pitch recently in on the Swift Evolution open source forums by Ashley Garland that related to this — the idea being the documentation catalog could contain a specific set of swift snippets, and the compiler (or SwiftPM in this case I think) could/would build those to verify that everything kept working, no warnings, etc.
Nov ’21
Reply to Is there a way to include snippets from an external file with DocC?
The snippets I want to include are more than just code snippets - I wanted to have the same content in multiple locations - akin to an "include this markdown file here" sort of marker, which I can do in other documentation systems to re-use some short content in multiple locations. I submitted this as feedback: FB9779628, and now that DocC is open source, I'll look into the avenue of how I might enable this myself. While I’m writing my documentation, I’d like to reference the same content - which includes a code snippet blocked out using the triple-backtick syntax as well as narrative content in regular markdown - in multiple locations within my docs. Right now I have to copy/paste this bit into multiple areas, but I’d really prefer to have a means to “import/include” a stand-alone markdown file, that isn’t otherwise rendered into the documentation, so that I can keep a single location up to date with my code.
Nov ’21
Reply to What's the pattern to provide organization around properties and methods within a struct or class?
Answering my own question - it's in the documentation, I just missed it earlier. Yes - use the Extension file mechanism, as described in the section Arrange Nested Symbols in Extension Files of the article Adding Structure to your Documentation Pages. I'm presuming that as you get multiple of these, a good practice would be consistent naming based on the symbol to which they're providing the organization. That's my own observation and not advised in the article. The key to not repeating details of the symbol (the overview, etc) is with the following metadata code: @Metadata { @DocumentationExtension(mergeBehavior: append) }
Nov ’21
Reply to I want to experiment with a swift peer-to-peer gaming network that i built myself, but where to begin?
There's https://developer.apple.com/documentation/multipeerconnectivity that works as a baseline, but the API is somewhat awkward to use and can be a bit slow to establish into a full connection. It leverages both Wifi and Bluetooth locally, and once established the connection is pretty decent. I wouldn't be surprised to see this either deprecate or evolve significantly in the next year or two as Actors in swift, and more specifically Distributed Actors, get established and into the base language, and more systems can be built atop them in a pretty reasonable format. In the past there was a GameKit mechanism that supported Peer to Peer networking as well (https://developer.apple.com/documentation/gamekit/gksession) - although it's now deprecated, so it's more for awareness than anything else. GameKit itself appears to have shifted a bit more to internet-friends connectivity, rather than a strict peer to peer model, but it may still be worth investigating depending on your needs: https://developer.apple.com/documentation/gamekit/connecting_players_with_their_friends_in_your_game Beyond that, there's WebSocket support in URLSession these days, and StarScream if that's falling short - but you'd need to host your own HTTP services on some device and come up with an advertising process to let other devices know about it for peer to peer. If you want to go the route of hosting an HTTP service within an iOS app, it's possible with SwiftNIO - has been for a couple years now, with a decent article talking about it at https://diamantidis.github.io/2019/10/27/swift-nio-server-in-an-ios-app - and perhaps most interestingly, the article references a couple other libraries that let you do the same. Hopefully some research down that path provides interesting food for thought.
Topic: Programming Languages SubTopic: Swift Tags:
Feb ’22
Reply to Question about formatting of Measurement<...> items
The full playground content in case anyone else comes exploring: import Foundation //var time1 = Measurement<UnitDuration>(value: 1.23, unit: .seconds) var time2 = Measurement<UnitDuration>(value: 6.54, unit: .milliseconds) //var time3 = Measurement<UnitDuration>(value: 9.01, unit: .microseconds) time2.converted(to: .picoseconds) let times = [1,10,100,1000,10103,2354,83674,182549].map { Measurement<UnitDuration>(value: $0, unit: .microseconds) } //print("\(time1), \(time2), \(time3)") //print(time1.formatted()) //print(time2.formatted()) //print(time3.formatted()) //for t in times { //    print(t.formatted()) //} // Static method 'list(type:width:)' requires the types 'Measurement<UnitDuration>' and 'String' be equivalent // print(times.formatted(.list(type: .and, width: .standard))) let f = MeasurementFormatter() print("unitStyle: .short, unitOptions: .naturalScale") f.unitOptions = .naturalScale f.unitStyle = .short for t in times {     print(f.string(from: t)) } print("unitStyle: .medium, unitOptions: .naturalScale") f.unitOptions = .naturalScale f.unitStyle = .medium for t in times {     print(f.string(from: t)) } print("unitStyle: .long, unitOptions: .naturalScale") f.unitOptions = .naturalScale f.unitStyle = .long for t in times {     print(f.string(from: t)) } print("unitStyle: .short, unitOptions: .providedUnit") f.unitOptions = .providedUnit f.unitStyle = .short for t in times {     print(f.string(from: t)) } print("unitStyle: .medium, unitOptions: .providedUnit") f.unitOptions = .providedUnit f.unitStyle = .medium for t in times {     print(f.string(from: t)) } print("unitStyle: .long, unitOptions: .providedUnit") f.unitOptions = .providedUnit f.unitStyle = .long for t in times {     print(f.string(from: t)) }
Topic: App & System Services SubTopic: General Tags:
Mar ’22