Skip to content

Commit

Permalink
feat: move render loop to cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
okwasniewski committed Jul 24, 2024
1 parent d5d0bd4 commit 3b3b03c
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 52 deletions.
47 changes: 6 additions & 41 deletions Apps/Playground/visionOS/App.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,45 +16,6 @@ struct ContentStageConfiguration: CompositorLayerConfiguration {
}
}

class Renderer {
let layerRenderer: LayerRenderer
var libNativeBridge: LibNativeBridge

init(_ layerRenderer: LayerRenderer) {
self.layerRenderer = layerRenderer
self.libNativeBridge = LibNativeBridge(layerRenderer)
}

func startRenderLoop() {
let renderThread = Thread {
self.renderLoop()
}
renderThread.name = "Render Thread"
renderThread.start()
}


func renderLoop() {
while true {
if layerRenderer.state == .invalidated {
print("Layer is invalidated")

libNativeBridge.shutdown()
return
} else if layerRenderer.state == .paused {
layerRenderer.waitUntilRunning()
continue
} else {
autoreleasepool {
libNativeBridge.initialize()
libNativeBridge.render()
}
}
}
}
}


@main
struct ExampleApp: App {
@State private var showImmersiveSpace = false
Expand Down Expand Up @@ -92,8 +53,12 @@ struct ExampleApp: App {
}
ImmersiveSpace(id: "ImmersiveSpace") {
CompositorLayer(configuration: ContentStageConfiguration()) { layerRenderer in
let renderer = Renderer(layerRenderer)
renderer.startRenderLoop()
let renderThread = Thread {
var engine = LibNativeBridge(layerRenderer)
engine.renderLoop()
}
renderThread.name = "Render Thread"
renderThread.start()
}
}.immersionStyle(selection: .constant(.full), in: .full)
}
Expand Down
21 changes: 10 additions & 11 deletions Apps/Playground/visionOS/LibNativeBridge.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,22 @@
#include <ARKit/ARKit.h>

class LibNativeBridge {
private:
bool m_initialized = false;
cp_layer_renderer_t m_layerRenderer = NULL;
ar_world_tracking_provider_t world_tracking = NULL;
ar_session_t ar_session = NULL;

public:
LibNativeBridge(cp_layer_renderer_t layerRenderer) : m_layerRenderer(layerRenderer) {
}

~LibNativeBridge() {
shutdown();
}
LibNativeBridge(cp_layer_renderer_t layerRenderer) : m_layerRenderer(layerRenderer) {}
~LibNativeBridge() { shutdown(); }

void runARSession(void);
bool initialize(void);
void shutdown(void);
void renderLoop(void);

private:
bool m_initialized = false;
cp_layer_renderer_t m_layerRenderer = NULL;
ar_world_tracking_provider_t world_tracking = NULL;
ar_session_t ar_session = NULL;

void render(void);
};

Expand Down

0 comments on commit 3b3b03c

Please # to comment.