Sample CodevisionOSReviewed 2026-07-21View on Apple Developer

Displaying a stereoscopic image

At a glance

Item Summary
Purpose Build a stereoscopic image by applying textures to the left and right eye in a shader graph material.
App architecture EntryPoint composes WindowGroup around MainView; view-local SwiftUI state owns interaction while RealityView manages the entity graph.
Main patterns SwiftUI scene composition, SwiftUI–RealityKit bridge
Project style Code-light sample with 4 scanned Swift file(s) and 160 Swift line(s); resources and generated assets are excluded from those counts.

Project structure

Source bundle/
└── Stereo-Image/
    ├── App/
    │   └── EntryPoint.swift  # EntryPoint
    ├── Views/
    │   ├── MainView.swift  # MainView
    │   └── StereoImage.swift  # StereoImage
    └── Creator/
        └── StereoImageCreator.swift  # StereoImageCreator

Structure observations

  • The runtime boundary is WindowGroup; the pruned tree lists only files that explain lifecycle, state, or framework integration.
  • App code is compact; any explicit model, provider, or entity owner is still shown below rather than collapsed into view-local state.

Overall architecture

Reference code

Stereo-Image/App/EntryPoint.swift:11 — the app or executable entry declares the outer scene lifecycle.

struct EntryPoint: App {
    var body: some Scene {
        WindowGroup {
            MainView()
        }
    }
}

The diagram is a responsibility flow, not a claim that every adjacent node directly calls the next. It keeps scene ownership, shared state, RealityKit content, and framework-provider work at separate levels.

Ownership and state

Ownership evidence

Stereo-Image/Views/MainView.swift:10 — representative stored state or the nearest verified lifecycle anchor.

struct MainView: View {
    var body: some View {
        StereoImage()
    }
}
Owner Object or state Relationship Mutation authority
EntryPoint / MainView Framework-managed scene/view state No separate long-lived owner is declared SwiftUI/RealityKit lifecycle closures perform updates

Ownership here is deliberately narrow: @Environment and weak references are shared links, initialized @State or stored services are lifecycle ownership, and a RealityView content closure owns additions to its entity graph without making the SwiftUI view a reference-type owner.

Class and protocol design

Type Responsibility Depends on or conforms to
EntryPoint (Stereo-Image/App/EntryPoint.swift:11) Declares app scenes and top-level dependency lifetime. App
MainView (Stereo-Image/Views/MainView.swift:10) Presents UI and forwards gestures or lifecycle events. View

The source defines no local substitution protocol in the reviewed boundary. Its protocol use is framework-facing (App, View, RealityKit/ARKit protocols, or platform adapters), so this document does not label the whole app protocol-oriented.

Access control

Symbol Access Verified effect Likely rationale
@MainActor private func applyTextureToEntity(box: ModelEntity, material... (Stereo-Image/Creator/StereoImageCreator.swift:13) private Use is restricted to the declaration and same-file extensions permitted by Swift. Inference: Hide implementation details and lifecycle-sensitive state.
@MainActor public func createImageEntity() async -> ModelEntity? { (Stereo-Image/Creator/StereoImageCreator.swift:48) public The declaration is available to importing modules, subject to its containing type’s visibility. Inference: Satisfy a cross-target or framework-facing surface without implying subclassability.

No reviewed declaration uses fileprivate, private(set), open; unmodified Swift declarations are internal.

Reference code

Stereo-Image/Creator/StereoImageCreator.swift:13 — representative visibility boundary.

    @MainActor private func applyTextureToEntity(box: ModelEntity, material: inout ShaderGraphMaterial) async {
        // ...
    }

Logic ownership and placement

Logic Owning type or file Placement rationale
Scene declaration and dependency lifetime EntryPoint The App/entry boundary determines window, volume, and immersive-space lifetime.
Presentation, attachments, and gestures MainView SwiftUI view code forwards user intent and RealityView lifecycle events.

Design patterns

Pattern Source evidence Purpose or tradeoff
SwiftUI scene composition Stereo-Image/App/EntryPoint.swift:11 Keeps windows, volumes, and immersive-space lifecycle visible at the app boundary.
SwiftUI–RealityKit bridge Stereo-Image/Views/StereoImage.swift:25 Builds and updates a RealityKit entity graph from SwiftUI lifecycle closures.

Naming conventions

  • Role suffixes are evidence, not decoration: View: MainView.
  • Protocols: no app-defined protocol in the reviewed source.
  • Commands use verb-led methods: applyTextureToEntity, createImageEntity.
  • Files generally match their primary type; Views, Models, Managers, Providers, Components, Systems, and Packages folders describe architectural roles where present.

Architecture takeaways

  • Treat EntryPoint as the owner of scene declarations, not as the owner of every RealityKit entity created later.
  • Keep view-local interaction in SwiftUI, but move provider sessions, playback resources, shared game state, or transport state into a stable owner when their lifetime exceeds one render pass.
  • The compact source does not justify adding repository, coordinator, or protocol layers beyond the model, provider, or view boundary the sample actually declares.

Source map

Source file Relevant symbols
Stereo-Image/App/EntryPoint.swift:11 EntryPoint
Stereo-Image/Views/MainView.swift:10 MainView
Stereo-Image/Creator/StereoImageCreator.swift:11 StereoImageCreator
Stereo-Image/Views/StereoImage.swift:12 StereoImage