From f2bffedc78f714896d92c15a0ce2edd9616fb5dc Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Tue, 6 Oct 2026 23:46:34 -0700 Subject: [PATCH] Remove hardcoded AWS/CloudFront streaming URLs from demos and tests Drop the remote-scene streaming options from ShowcaseDemo and LargeSceneStreamingDemo that pointed at public CloudFront manifests, and disable RemoteStreamFlyThroughTests until a replacement manifest host is available. --- .github/workflows/ci-build-test.yml | 14 ----- .../LargeSceneStreamingDemo/AppDelegate.swift | 8 +-- .../LargeSceneStreamingDemo/GameScene.swift | 29 +---------- .../Demos/LargeSceneStreamingDemo/README.md | 3 +- Sources/Demos/ShowcaseDemo/DemoHUD.swift | 51 ------------------- Sources/Demos/ShowcaseDemo/DemoState.swift | 39 -------------- .../RemoteStreamFlyThroughTests.swift | 12 +++-- 7 files changed, 14 insertions(+), 142 deletions(-) diff --git a/.github/workflows/ci-build-test.yml b/.github/workflows/ci-build-test.yml index 0bb85f3ba..f49426673 100644 --- a/.github/workflows/ci-build-test.yml +++ b/.github/workflows/ci-build-test.yml @@ -104,20 +104,6 @@ jobs: --skip 'UntoldEngineRenderTests.RemoteStreamFlyThroughTests' \ --skip 'UntoldEngineRenderTests.PerformanceTests' - # ✅ Run remote streaming PSNR in isolation. - # The flythrough test mutates streaming budgets and waits on remote tile - # residency; running it inside the broad parallel sweep can capture an - # unsettled waypoint frame even when the same test is deterministic alone. - - name: Run remote stream flythrough PSNR - timeout-minutes: 20 - env: - CI: true - UNTOLD_PSNR_THRESHOLD: "33.5" - UNTOLD_PYTHON: "python3" - run: | - command -v "${UNTOLD_PYTHON}" >/dev/null 2>&1 || { echo "python not found"; exit 1; } - swift test -v --disable-swift-testing --filter 'UntoldEngineRenderTests.RemoteStreamFlyThroughTests/testRemoteStreamFlythrough_psnr' - # ✅ Run performance benchmarks as CI gates, isolated from the parallel renderer suite. # These numbers are intentionally configurable because GitHub-hosted macOS runners # are shared machines. They still fail the build on meaningful regressions, while diff --git a/Sources/Demos/LargeSceneStreamingDemo/AppDelegate.swift b/Sources/Demos/LargeSceneStreamingDemo/AppDelegate.swift index c1412c659..d369ab43a 100644 --- a/Sources/Demos/LargeSceneStreamingDemo/AppDelegate.swift +++ b/Sources/Demos/LargeSceneStreamingDemo/AppDelegate.swift @@ -22,7 +22,7 @@ @MainActor @Observable final class LargeSceneStreamingState { - var status = "Loading default remote scene..." + var status = "Loading offline reference field..." var customManifestURL = "" var isLoading = false var tileBoundsEnabled = true @@ -47,7 +47,7 @@ setupWindow() setupRendererAndScene() presentSceneView() - gameScene.loadPreset(.dungeon) + gameScene.loadFallbackField() } func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool { @@ -99,7 +99,6 @@ renderer: renderer, state: state, actions: .init( - loadPreset: { [weak self] preset in self?.gameScene.loadPreset(preset) }, loadCustomURL: { [weak self] url in self?.gameScene.loadManifest(url: url, label: "Custom Manifest") }, loadFallbackField: { [weak self] in self?.gameScene.loadFallbackField() }, setTileBounds: { [weak self] enabled in self?.gameScene.setTileBoundsDebug(enabled) }, @@ -116,7 +115,6 @@ } private struct LargeSceneStreamingActions { - let loadPreset: (GameScene.RemoteScenePreset) -> Void let loadCustomURL: (URL) -> Void let loadFallbackField: () -> Void let setTileBounds: (Bool) -> Void @@ -155,8 +153,6 @@ } HStack { - Button("Dungeon") { actions.loadPreset(.dungeon) } - Button("City") { actions.loadPreset(.city) } Button("Field") { actions.loadFallbackField() } } diff --git a/Sources/Demos/LargeSceneStreamingDemo/GameScene.swift b/Sources/Demos/LargeSceneStreamingDemo/GameScene.swift index 7836198c3..9d52e90f2 100644 --- a/Sources/Demos/LargeSceneStreamingDemo/GameScene.swift +++ b/Sources/Demos/LargeSceneStreamingDemo/GameScene.swift @@ -21,28 +21,8 @@ import UntoldEngine final class GameScene: @unchecked Sendable { - enum RemoteScenePreset: String, CaseIterable { - case dungeon = "Dungeon" - case city = "City" - - var manifestURL: URL { - switch self { - case .dungeon: - URL(string: "https://d8pyi1c08k1w.cloudfront.net/dungeon3/dungeon3.json")! - case .city: - URL(string: "https://d8pyi1c08k1w.cloudfront.net/city/city.json")! - } - } - - var cameraEye: simd_float3 { - switch self { - case .dungeon: simd_float3(0.0, 4.0, 18.0) - case .city: simd_float3(0.0, 18.35, 73.56) - } - } - } - private enum Constants { + static let defaultCameraEye = simd_float3(0.0, 4.0, 18.0) static let cameraMoveSpeed: Float = 9.0 static let cameraInputDeltaTime: Float = 1.0 / 60.0 static let orbitTargetOffset: Float = 25.0 @@ -64,11 +44,6 @@ setSceneReady(false) } - func loadPreset(_ preset: RemoteScenePreset) { - placeCamera(eye: preset.cameraEye) - loadManifest(url: preset.manifestURL, label: preset.rawValue) - } - func loadManifest(url: URL, label: String) { clearLoadedContent() setSceneReady(false) @@ -206,7 +181,7 @@ } private func createCamera() { - makeDemoCamera(name: "Streaming Camera", eye: RemoteScenePreset.dungeon.cameraEye, orbitOffset: Constants.orbitTargetOffset) + makeDemoCamera(name: "Streaming Camera", eye: Constants.defaultCameraEye, orbitOffset: Constants.orbitTargetOffset) } private func createLight() { diff --git a/Sources/Demos/LargeSceneStreamingDemo/README.md b/Sources/Demos/LargeSceneStreamingDemo/README.md index eb7136a45..ee4798985 100644 --- a/Sources/Demos/LargeSceneStreamingDemo/README.md +++ b/Sources/Demos/LargeSceneStreamingDemo/README.md @@ -17,8 +17,7 @@ What it demonstrates: - tile bounds, LOD debug, and texture tier debug overlays - live engine stats for streaming, batching, draw calls, and memory -The default remote scenes reuse the same public manifests as `ShowcaseDemo`. The -`Field` button loads a procedural offline reference field so the executable still +The `Field` button loads a procedural offline reference field so the executable runs without network access, but that mode is not tile streaming. To test your own exported world, paste a full `https://.../scene.json` or diff --git a/Sources/Demos/ShowcaseDemo/DemoHUD.swift b/Sources/Demos/ShowcaseDemo/DemoHUD.swift index 50eee9468..699fce2c2 100644 --- a/Sources/Demos/ShowcaseDemo/DemoHUD.swift +++ b/Sources/Demos/ShowcaseDemo/DemoHUD.swift @@ -186,26 +186,6 @@ resolutionMenu } - HStack(alignment: .center, spacing: 8) { - Picker("Remote Scene", selection: $state.selectedRemoteSceneID) { - ForEach(state.remoteScenes) { scene in - Text(scene.title).tag(scene.id) - } - } - .pickerStyle(.menu) - .frame(maxWidth: .infinity, alignment: .leading) - .disabled(state.isLoading || state.remoteScenes.isEmpty) - Button("Load", action: loadSelectedRemoteScene) - .buttonStyle(.borderedProminent) - .tint(.blue) - .disabled(state.isLoading || state.selectedRemoteScene?.manifestURL == nil) - if state.isLoading { - ProgressView() - .scaleEffect(0.6) - .frame(width: 16, height: 16) - } - } - HStack(alignment: .center, spacing: 8) { Text("Local Scene") .foregroundStyle(.secondary) @@ -495,30 +475,6 @@ .disabled(!enabled) } - private func loadSelectedRemoteScene() { - guard let scene = state.selectedRemoteScene, - let manifestURL = scene.manifestURL, - let onLoadTiledScene = state.onLoadTiledScene - else { return } - - state.batchingEnabled = false - state.streamingEnabled = false - state.isLoading = true - - let sceneID = scene.id - onLoadTiledScene(sceneID, manifestURL) { success in - Task { @MainActor in - state.isLoading = false - state.hasLoadedEntity = success - state.streamingEnabled = success - if success { - state.selectedPostFXPreset = Self.postFXPreset(for: sceneID) - state.applySelectedPostFXPreset() - } - } - } - } - private func openLocalAssetPicker() { localImportMode = .asset showFilePicker = true @@ -590,13 +546,6 @@ } } - private static func postFXPreset(for sceneID: String) -> DemoState.PostFXPreset { - switch sceneID { - case "f1car", "airplane", "porsche964": .cinematic - default: .neutral - } - } - private func finishLocalImport(url: URL, accessing: Bool, success: Bool, streamingEnabled: Bool) { state.isLoading = false state.hasLoadedEntity = success diff --git a/Sources/Demos/ShowcaseDemo/DemoState.swift b/Sources/Demos/ShowcaseDemo/DemoState.swift index 381a04170..920c6aaa4 100644 --- a/Sources/Demos/ShowcaseDemo/DemoState.swift +++ b/Sources/Demos/ShowcaseDemo/DemoState.swift @@ -23,7 +23,6 @@ private enum Defaults { static let streamingRadius: Double = 200.0 static let unloadRadius: Double = 350.0 - static let selectedRemoteSceneID = "dungeon" } enum PostFXPreset: String, CaseIterable, Identifiable { @@ -70,48 +69,10 @@ @ObservationIgnored private var isApplyingPostFXPreset = false - struct RemoteSceneOption: Identifiable, Hashable { - let id: String - let title: String - let manifestURL: URL? - } - // MARK: - File Loading var hasLoadedEntity: Bool = false var isLoading: Bool = false - let remoteScenes: [RemoteSceneOption] = [ - .init( - id: "dungeon", - title: "Game Dungeon", - manifestURL: URL(string: "https://d8pyi1c08k1w.cloudfront.net/dungeon3/dungeon3.json")! - ), - .init( - id: "city", - title: "Cartoon City", - manifestURL: URL(string: "https://d8pyi1c08k1w.cloudfront.net/city/city.json")! - ), - .init( - id: "f1car", - title: "Formula 1", - manifestURL: URL(string: "https://d8pyi1c08k1w.cloudfront.net/F1Car/F1Car.json")! - ), - .init( - id: "airplane", - title: "Skyhawk", - manifestURL: URL(string: "https://d8pyi1c08k1w.cloudfront.net/Shyhawk_stream/Skyhawks.json")! - ), - .init( - id: "porsche964", - title: "Porsche 964", - manifestURL: URL(string: "https://d8pyi1c08k1w.cloudfront.net/Porsche964-stream/Porsche964-stream.json")! - ), - ] - var selectedRemoteSceneID: String = Defaults.selectedRemoteSceneID - - var selectedRemoteScene: RemoteSceneOption? { - remoteScenes.first { $0.id == selectedRemoteSceneID } - } var localSceneAuthoredEnabled: Bool = false diff --git a/Tests/UntoldEngineRenderTests/RemoteStreamFlyThroughTests.swift b/Tests/UntoldEngineRenderTests/RemoteStreamFlyThroughTests.swift index 1902b9ff8..b4880ab45 100644 --- a/Tests/UntoldEngineRenderTests/RemoteStreamFlyThroughTests.swift +++ b/Tests/UntoldEngineRenderTests/RemoteStreamFlyThroughTests.swift @@ -55,7 +55,7 @@ final class RemoteStreamFlyThroughTests: BaseRenderSetup { /// Remote (or local file://) URL of your tile manifest. /// Override at runtime with the UNTOLD_STREAM_MANIFEST_URL env var. - private let manifestURLString = "https://d8pyi1c08k1w.cloudfront.net/city/city.json" + private let manifestURLString = "https://cdn.example.com/dungeon/dungeon.json" /// Waypoints the camera visits. At each stop a screenshot is taken. /// Adjust positions and look-at targets to match your dungeon layout. @@ -147,7 +147,10 @@ final class RemoteStreamFlyThroughTests: BaseRenderSetup { // ------------------------------------------------------------------------- - func testGenerateFlythroughReferenceImages() async throws { + // Disabled: no remote manifest URL is configured (the AWS/CloudFront URL + // used previously was removed). Re-enable by restoring `test` as the + // method-name prefix once a replacement manifest host is available. + func disabled_testGenerateFlythroughReferenceImages() async throws { guard ProcessInfo.processInfo.environment["UNTOLD_REGENERATE_REFERENCES"] == "1" else { throw XCTSkip("Reference generation is opt-in. Set UNTOLD_REGENERATE_REFERENCES=1 to run.") } @@ -178,7 +181,10 @@ final class RemoteStreamFlyThroughTests: BaseRenderSetup { // ------------------------------------------------------------------------- - func testRemoteStreamFlythrough_psnr() async throws { + // Disabled: no remote manifest URL is configured (the AWS/CloudFront URL + // used previously was removed). Re-enable by restoring `test` as the + // method-name prefix once a replacement manifest host is available. + func disabled_testRemoteStreamFlythrough_psnr() async throws { let sceneRoot = try await loadRemoteScene() await hydrateFlythroughRoute(sceneRoot: sceneRoot)