From 43f5b26a8fad90490bb19e21dff9ac15c2c507db Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Fri, 8 May 2026 14:26:38 -0700 Subject: [PATCH 1/4] [Patch] Added a factor to the tile gen script to use area as input --- docs/API/UsingTheExporter.md | 1 + scripts/export-untold-tiles | 4 + scripts/tilestreamingpartition.py | 146 ++++++++++++++++++++++++++---- 3 files changed, 134 insertions(+), 17 deletions(-) diff --git a/docs/API/UsingTheExporter.md b/docs/API/UsingTheExporter.md index 8afeaac9..a637844b 100644 --- a/docs/API/UsingTheExporter.md +++ b/docs/API/UsingTheExporter.md @@ -91,6 +91,7 @@ Common options: - `--all-meshes`: optional include hidden meshes - `--debug-aabb-only`: optional emit debug AABB payloads instead of geometry - `--quadtree`: optional partition tiles using a quad-tree instead of a uniform grid +- `--scene-profile `: optional streaming radius profile, defaults to `auto`. Radii are always proportional to scene size — no fixed distances to hand-tune. Use `outdoor` for cities, terrain, and large exterior scenes if auto-detection misses. - `--floor-count `: optional number of vertical floors to split each tile into - `--blender `: optional wrapper-level Blender override diff --git a/scripts/export-untold-tiles b/scripts/export-untold-tiles index 45c04e44..22de92e9 100755 --- a/scripts/export-untold-tiles +++ b/scripts/export-untold-tiles @@ -32,6 +32,10 @@ Common tile exporter flags: --quadtree Use floor+quadtree partitioning. Works with raw USD/USDZ (no pre-annotation step needed) — the exporter classifies objects inline. Also honours pre-baked __UT_ metadata when present. + --scene-profile P Streaming radius profile: auto (default), indoor, or outdoor. + Radii are always proportional to scene size — no fixed distances + to tweak. 'auto' infers the profile; use 'outdoor' to force + city/open-world bands if auto-detection misses. --floor-count N Pin the number of floors (inline quadtree mode). Use when auto-detection is wrong due to outlier objects inflating the Z range. --floor-band-height N Pin the per-floor height in metres. Floor count is derived diff --git a/scripts/tilestreamingpartition.py b/scripts/tilestreamingpartition.py index c42c20e4..7011e7ae 100755 --- a/scripts/tilestreamingpartition.py +++ b/scripts/tilestreamingpartition.py @@ -225,21 +225,27 @@ def append_worker_progress(progress_file, event): SWITCH_DISTANCE_OUTER_MARGIN = 0.75 # --- Quadtree / semantic-tier streaming radii ----------------- -# Used when a scene has been pre-annotated with the Untold phase-1+2 Blender -# script. Each semantic tier gets its own streaming and unload radius so the -# engine loads only the geometry appropriate for the current camera distance. -# -# Adjust these to taste for your scene scale: -# ExteriorShell — visible from far away; wide band -# StructuralInterior — walls, ceilings, floors; load when approaching -# RoomContents — furniture, fixtures; load when near a room entrance -# FineProps — small details; load only when very close -TIER_STREAMING_RADII = { - "ExteriorShell": {"streaming": 80.0, "unload": 120.0, "priority": 15}, - "StructuralInterior": {"streaming": 15.0, "unload": 25.0, "priority": 10}, - "RoomContents": {"streaming": 5.0, "unload": 8.0, "priority": 8}, - "FineProps": {"streaming": 2.0, "unload": 4.0, "priority": 5}, +# Fractions of scene_half_diag — converted to world-space metres once at +# export time so radii scale automatically with any scene size. +# indoor — tight bands for room/building interiors +# outdoor — wider bands for cities, open-world, and street scenes +# 'auto' (default) infers the profile from scene footprint and tier distribution. +TIER_STREAMING_FRACTIONS = { + "indoor": { + "ExteriorShell": {"streaming": 0.80, "unload": 1.20, "priority": 15}, + "StructuralInterior": {"streaming": 0.30, "unload": 0.50, "priority": 10}, + "RoomContents": {"streaming": 0.10, "unload": 0.18, "priority": 8}, + "FineProps": {"streaming": 0.03, "unload": 0.06, "priority": 5}, + }, + "outdoor": { + "ExteriorShell": {"streaming": 0.35, "unload": 0.55, "priority": 15}, + "StructuralInterior": {"streaming": 0.25, "unload": 0.40, "priority": 12}, + "RoomContents": {"streaming": 0.10, "unload": 0.18, "priority": 8}, + "FineProps": {"streaming": 0.04, "unload": 0.08, "priority": 5}, + }, } +SCENE_STREAMING_PROFILE = "auto" # auto | indoor | outdoor +_ACTIVE_TIER_RADII: dict = {} # Tiers for which HLOD and LOD variants are generated during quadtree export. # RoomContents (stream=5m) and FineProps (stream=2m) have radii too small for @@ -2442,6 +2448,84 @@ def compute_shared_streaming_radii(scene_half_diag): return r, ur +def infer_streaming_profile(use_quadtree, node_tier_groups, scene_half_diag, base_tile_size): + """Return 'indoor' or 'outdoor' for this export. + + Explicit CLI choice wins. Auto falls back to 'indoor' unless the scene + looks like a large outdoor/city layout: broad footprint, few ExteriorShell + objects, and most quadtree groups classified as StructuralInterior. + """ + requested = (SCENE_STREAMING_PROFILE or "auto").lower() + if requested in TIER_STREAMING_FRACTIONS: + return requested + + if not use_quadtree or not node_tier_groups: + return "indoor" + + tier_counts: dict = {} + for (_, tier), objs in node_tier_groups.items(): + tier_counts[tier] = tier_counts.get(tier, 0) + len(objs) + + total = sum(tier_counts.values()) + if total == 0: + return "indoor" + + exterior_fraction = tier_counts.get("ExteriorShell", 0) / total + structural_fraction = tier_counts.get("StructuralInterior", 0) / total + large_footprint = scene_half_diag >= max(150.0, base_tile_size * 8.0) + + if large_footprint and exterior_fraction < 0.10 and structural_fraction >= 0.65: + return "outdoor" + + return "indoor" + + +def compute_tier_radii(scene_half_diag, profile): + """Convert fraction table for *profile* to world-space metres.""" + fractions = TIER_STREAMING_FRACTIONS.get(profile, TIER_STREAMING_FRACTIONS["indoor"]) + return { + tier: { + "streaming": max(1.0, scene_half_diag * v["streaming"]), + "unload": max(2.0, scene_half_diag * v["unload"]), + "priority": v["priority"], + } + for tier, v in fractions.items() + } + + +def init_tier_radii(scene_half_diag, profile): + global _ACTIVE_TIER_RADII + _ACTIVE_TIER_RADII = compute_tier_radii(scene_half_diag, profile) + + +def tier_streaming_radii(tier): + return _ACTIVE_TIER_RADII.get(tier, {}) + + +def log_streaming_profile(scene_bounds, scene_half_diag, resolved_profile): + """Print a human-readable summary of the resolved tier streaming radii.""" + bx = scene_bounds["max"][0] - scene_bounds["min"][0] + by = scene_bounds["max"][1] - scene_bounds["min"][1] + bz = scene_bounds["max"][2] - scene_bounds["min"][2] + profile_label = resolved_profile + if SCENE_STREAMING_PROFILE == "auto": + profile_label = f"auto → {resolved_profile}" + print( + f"Streaming profile : {profile_label}\n" + f" Scene dimensions : {bx:.1f}m (W) × {by:.1f}m (D) × {bz:.1f}m (H)\n" + f" Footprint half-diag : {scene_half_diag:.1f}m ← multiplier base" + ) + fractions = TIER_STREAMING_FRACTIONS.get(resolved_profile, TIER_STREAMING_FRACTIONS["indoor"]) + for tier, v in fractions.items(): + s = max(1.0, scene_half_diag * v["streaming"]) + u = max(2.0, scene_half_diag * v["unload"]) + print( + f" {tier:25s}: " + f"{v['streaming']:.2f} × {scene_half_diag:.1f}m = {s:7.1f}m stream | " + f"{v['unload']:.2f} × {scene_half_diag:.1f}m = {u:7.1f}m unload" + ) + + # ============================================================ # SECTION 11: MEMORY ESTIMATION # ============================================================ @@ -3618,6 +3702,15 @@ def run(): if SPLIT_SPANNING_OBJECTS else f", {capped_count} spanning→shared bucket") ) + # ------------------------------------------------------------------ + # Resolve streaming profile and build per-tier radius table + # ------------------------------------------------------------------ + resolved_profile = infer_streaming_profile( + use_quadtree, node_tier_groups, scene_half_diag, base_tile + ) + init_tier_radii(scene_half_diag, resolved_profile) + log_streaming_profile(scene_bounds, scene_half_diag, resolved_profile) + # ------------------------------------------------------------------ # Scene name and manifest path # ------------------------------------------------------------------ @@ -3650,6 +3743,11 @@ def run(): "tile_size_mode": "auto" if AUTO_TILE_SIZE else "manual", "tile_size": {"x": tile_size_x, "y": tile_size_y, "z": tile_size_z}, "scene_bounds": {"min": list(sb_usd["min"]), "max": list(sb_usd["max"])}, + "streaming_profile": { + "requested": SCENE_STREAMING_PROFILE, + "resolved": resolved_profile, + "scene_half_diag": round(scene_half_diag, 3), + }, "streaming_defaults": { "streaming_radius": streaming_r, "unload_radius": unload_r, @@ -3707,7 +3805,7 @@ def run(): by_tier.setdefault(tier, 0) by_tier[tier] += len(objs) for tier, count in sorted(by_tier.items()): - radii = TIER_STREAMING_RADII.get(tier, {}) + radii = tier_streaming_radii(tier) print(f" {tier:25s}: {count:5d} objects " f"stream={radii.get('streaming','?')}m " f"unload={radii.get('unload','?')}m") @@ -3720,7 +3818,7 @@ def run(): center = aabb_center(aabb_usd) if aabb_usd else [0,0,0] est_mem = sum(estimate_object_memory_bytes(o, mesh_size_cache) for o in tile_objs) - tier_radii = TIER_STREAMING_RADII.get(tier, {}) + tier_radii = tier_streaming_radii(tier) floor_id = 0 for obj in tile_objs: m = metadata_map.get(obj.name) @@ -3953,7 +4051,7 @@ def run(): for o in tile_objs) # Fetch per-tier streaming radii; fall back to scene defaults. - tier_radii = TIER_STREAMING_RADII.get(tier, {}) + tier_radii = tier_streaming_radii(tier) tile_stream = tier_radii.get("streaming", streaming_r) tile_unload = tier_radii.get("unload", unload_r) tile_priority = tier_radii.get("priority", DEFAULT_STREAMING_PRIORITY) @@ -4360,6 +4458,17 @@ def parse_args(argv): "Otherwise the exporter runs the annotation pass inline — no separate Blender step needed." ), ) + parser.add_argument( + "--scene-profile", + choices=("auto", "indoor", "outdoor"), + default="auto", + help=( + "Streaming radius profile for semantic tiers. " + "'auto' infers the profile from scene size and tier distribution. " + "'outdoor' forces city/open-world bands; 'indoor' forces tight room-scale bands. " + "Radii are always proportional to scene_half_diag — no hardcoded distances." + ), + ) parser.add_argument( "--floor-count", type=int, @@ -4409,6 +4518,7 @@ def apply_cli_overrides(args): global PERIMETER_MODE global PERIMETER_DEPTH global FORCE_QUADTREE + global SCENE_STREAMING_PROFILE global INLINE_FLOOR_COUNT_OVERRIDE global INLINE_FLOOR_BAND_HEIGHT_OVERRIDE @@ -4452,6 +4562,8 @@ def apply_cli_overrides(args): PERIMETER_DEPTH = args.perimeter_depth if getattr(args, "quadtree", False): FORCE_QUADTREE = True + if getattr(args, "scene_profile", None): + SCENE_STREAMING_PROFILE = args.scene_profile if getattr(args, "floor_count", None) is not None: INLINE_FLOOR_COUNT_OVERRIDE = args.floor_count if getattr(args, "floor_band_height", None) is not None: From 6d6f9cd39de70f860100f25f8a02bf7639b9c911 Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Sun, 10 May 2026 08:03:58 -0700 Subject: [PATCH 2/4] [Patch] Fix XR mixed-mode HZB culling behind transparent surfaces --- .../Renderer/RenderInitializer.swift | 14 +++++++++++ .../UntoldEngine/Renderer/RenderPasses.swift | 25 +++++++++++++++++++ .../Renderer/RenderResources.swift | 1 + .../UntoldEngine/Systems/CullingSystem.swift | 14 ++++++++++- .../Systems/RenderingSystem.swift | 19 +++++++++++++- 5 files changed, 71 insertions(+), 2 deletions(-) diff --git a/Sources/UntoldEngine/Renderer/RenderInitializer.swift b/Sources/UntoldEngine/Renderer/RenderInitializer.swift index 5a3ba2bd..be28b690 100644 --- a/Sources/UntoldEngine/Renderer/RenderInitializer.swift +++ b/Sources/UntoldEngine/Renderer/RenderInitializer.swift @@ -469,6 +469,20 @@ func initTextureResources() { storageMode: .private ) + // XR mixed mode needs an opaque-only depth snapshot for HZB so transparent + // glass depth does not occlusion-cull virtual meshes behind the glass. + if renderInfo.isXRStereoMode { + textureResources.hzbSourceDepthMap = createTexture( + device: renderInfo.device, + label: "HZB Source Depth Texture", + pixelFormat: renderInfo.depthPixelFormat, + width: viewportWidth, + height: viewportHeight, + usage: [.shaderRead, .renderTarget], + storageMode: .private + ) + } + // Deferred Depth Texture textureResources.deferredDepthMap = createTexture( device: renderInfo.device, diff --git a/Sources/UntoldEngine/Renderer/RenderPasses.swift b/Sources/UntoldEngine/Renderer/RenderPasses.swift index 3ceeef96..e7ff1cc4 100644 --- a/Sources/UntoldEngine/Renderer/RenderPasses.swift +++ b/Sources/UntoldEngine/Renderer/RenderPasses.swift @@ -312,6 +312,31 @@ public enum RenderPasses { return buildFrustum(from: effectiveLightMatrix) } + public static let copyOpaqueDepthForHZBExecution: RenderPassExecution = { commandBuffer in + guard renderInfo.isXRStereoMode, + renderInfo.immersionStyle == .mixed, + let sourceDepth = textureResources.depthMap, + let hzbSourceDepth = textureResources.hzbSourceDepthMap + else { return } + + let width = min(sourceDepth.width, hzbSourceDepth.width) + let height = min(sourceDepth.height, hzbSourceDepth.height) + guard width > 0, height > 0 else { return } + + guard let blitEncoder = commandBuffer.makeBlitCommandEncoder() else { return } + blitEncoder.label = "Copy Opaque Depth for XR HZB" + blitEncoder.copy( + from: sourceDepth, + sourceSlice: 0, sourceLevel: 0, + sourceOrigin: MTLOrigin(x: 0, y: 0, z: 0), + sourceSize: MTLSize(width: width, height: height, depth: 1), + to: hzbSourceDepth, + destinationSlice: 0, destinationLevel: 0, + destinationOrigin: MTLOrigin(x: 0, y: 0, z: 0) + ) + blitEncoder.endEncoding() + } + private static func shadowCasterEntityIds(for cascadeIdx: Int) -> [EntityID] { guard let frustum = shadowFrustum(for: cascadeIdx) else { return [] } diff --git a/Sources/UntoldEngine/Renderer/RenderResources.swift b/Sources/UntoldEngine/Renderer/RenderResources.swift index 6e19f31d..83d43f1e 100644 --- a/Sources/UntoldEngine/Renderer/RenderResources.swift +++ b/Sources/UntoldEngine/Renderer/RenderResources.swift @@ -157,6 +157,7 @@ public struct TextureResources { public var materialMap: MTLTexture? public var emissiveMap: MTLTexture? public var depthMap: MTLTexture? + public var hzbSourceDepthMap: MTLTexture? public var environmentColorMap: MTLTexture? // deferred diff --git a/Sources/UntoldEngine/Systems/CullingSystem.swift b/Sources/UntoldEngine/Systems/CullingSystem.swift index 643d36ad..ba522d84 100644 --- a/Sources/UntoldEngine/Systems/CullingSystem.swift +++ b/Sources/UntoldEngine/Systems/CullingSystem.swift @@ -342,6 +342,11 @@ func initFrustumCulllingCompute() { public func buildHZBDepthPyramid(_ commandBuffer: MTLCommandBuffer, eyeIndex: Int? = nil) { // Per-eye stereo path for XR + // Current XR stereo rendering builds the shared mono HZB once after both eyes + // are rendered, so mixed-mode opaque-depth snapshotting is handled by the + // mono path below. If this per-eye path is wired up for mixed mode later, it + // needs matching per-eye opaque depth snapshots to avoid glass depth culling + // virtual meshes behind transparent surfaces. if let ei = eyeIndex, renderInfo.isXRStereoMode { guard hzbBuildPyramidPipeline.success, let pipelineState = hzbBuildPyramidPipeline.pipelineState, @@ -387,7 +392,14 @@ public func buildHZBDepthPyramid(_ commandBuffer: MTLCommandBuffer, eyeIndex: In return } - guard let depthTexture = textureResources.depthMap else { + let hzbDepthSource: MTLTexture? + if renderInfo.isXRStereoMode && renderInfo.immersionStyle == .mixed { + hzbDepthSource = textureResources.hzbSourceDepthMap ?? textureResources.depthMap + } else { + hzbDepthSource = textureResources.depthMap + } + + guard let depthTexture = hzbDepthSource else { handleError(.textureMissing, "Depth Texture") renderInfo.hzbIsValid = false textureResources.hzbDebugMipTexture = nil diff --git a/Sources/UntoldEngine/Systems/RenderingSystem.swift b/Sources/UntoldEngine/Systems/RenderingSystem.swift index f91a1837..9521ee74 100644 --- a/Sources/UntoldEngine/Systems/RenderingSystem.swift +++ b/Sources/UntoldEngine/Systems/RenderingSystem.swift @@ -356,6 +356,23 @@ func gBufferPass(graph: inout [String: RenderPass], shadowPass: RenderPass) { id: "batchedModel", dependencies: [modelPass.id], execute: RenderPasses.batchedModelExecution ) graph[batchedModelPass.id] = batchedModelPass + + // HZB is temporal: the depth captured during this frame is consumed by + // next-frame culling. In XR mixed mode, capture opaque depth before the + // transparency pass writes glass depth for compositor edges. + let opaqueDepthAnchorId: String + if renderInfo.isXRStereoMode && renderInfo.immersionStyle == .mixed { + let hzbDepthSourcePass = RenderPass( + id: "hzbDepthSource", + dependencies: [batchedModelPass.id], + execute: RenderPasses.copyOpaqueDepthForHZBExecution + ) + graph[hzbDepthSourcePass.id] = hzbDepthSourcePass + opaqueDepthAnchorId = hzbDepthSourcePass.id + } else { + opaqueDepthAnchorId = batchedModelPass.id + } + // Update SSAO to depend on batched pass let ssaoPass = RenderPass( id: "ssao", @@ -368,7 +385,7 @@ func gBufferPass(graph: inout [String: RenderPass], shadowPass: RenderPass) { // Note: ssaoOptimizedExecution handles all blur/upsample internally // No need for separate ssaoBlur pass in the graph - let lightPass = RenderPass(id: "lightPass", dependencies: [batchedModelPass.id, modelPass.id, shadowPass.id, ssaoPass.id], execute: RenderPasses.lightExecution) + let lightPass = RenderPass(id: "lightPass", dependencies: [opaqueDepthAnchorId, modelPass.id, shadowPass.id, ssaoPass.id], execute: RenderPasses.lightExecution) graph[lightPass.id] = lightPass } From a1c4858f3d979f3b269f0016dd002ebbe205f9bb Mon Sep 17 00:00:00 2001 From: Untold Engine Date: Sun, 10 May 2026 08:06:45 -0700 Subject: [PATCH 3/4] [Patch] Fix HZB false culling near transparent surfaces --- Sources/UntoldEngine/Shaders/HZBCompute.metal | 38 ++++++++---------- .../UntoldEngine/Systems/CullingSystem.swift | 5 ++- .../UntoldEngineKernels-ios.air | Bin 117264 -> 117008 bytes .../UntoldEngineKernels-ios.metallib | Bin 387957 -> 387733 bytes .../UntoldEngineKernels-tvos.air | Bin 117232 -> 116992 bytes .../UntoldEngineKernels-tvos.metallib | Bin 386213 -> 385973 bytes .../UntoldEngineKernels-tvossim.air | Bin 117264 -> 117008 bytes .../UntoldEngineKernels-tvossim.metallib | Bin 388213 -> 387989 bytes .../UntoldEngineKernels-xros.air | Bin 117232 -> 116992 bytes .../UntoldEngineKernels-xros.metallib | Bin 386229 -> 385989 bytes .../UntoldEngineKernels-xrossim.air | Bin 117264 -> 117008 bytes .../UntoldEngineKernels-xrossim.metallib | Bin 388245 -> 388021 bytes .../UntoldEngineKernels.metallib | Bin 385349 -> 385125 bytes 13 files changed, 19 insertions(+), 24 deletions(-) diff --git a/Sources/UntoldEngine/Shaders/HZBCompute.metal b/Sources/UntoldEngine/Shaders/HZBCompute.metal index 6fb83847..39108ecf 100644 --- a/Sources/UntoldEngine/Shaders/HZBCompute.metal +++ b/Sources/UntoldEngine/Shaders/HZBCompute.metal @@ -164,29 +164,23 @@ kernel void hzbCullVisibleEntities( mipLevel = min((uint)floor(log2(rectMaxDim)), mipCount - 1u); } - // 9-sample 3×3 grid across the projected rect. - // 4-corner sampling misses the interior of porous occluders (e.g. a wall - // frame whose solid members sit at the rect edges while the centre is open - // air). By adding the four mid-edge points and the centre we catch that - // empty space: the conservative min/max across all 9 samples then reflects - // the farthest depth anywhere inside the rect, preventing false occlusion. - const float2 uvMid = (uvMin + uvMax) * 0.5; - const float lod = float(mipLevel); - constexpr sampler pointSampler(coord::normalized, address::clamp_to_edge, filter::nearest); - float d0 = hzbDepthPyramid.sample(pointSampler, float2(uvMin.x, uvMin.y), level(lod)).x; // top-left - float d1 = hzbDepthPyramid.sample(pointSampler, float2(uvMid.x, uvMin.y), level(lod)).x; // top-center - float d2 = hzbDepthPyramid.sample(pointSampler, float2(uvMax.x, uvMin.y), level(lod)).x; // top-right - float d3 = hzbDepthPyramid.sample(pointSampler, float2(uvMin.x, uvMid.y), level(lod)).x; // mid-left - float d4 = hzbDepthPyramid.sample(pointSampler, float2(uvMid.x, uvMid.y), level(lod)).x; // center - float d5 = hzbDepthPyramid.sample(pointSampler, float2(uvMax.x, uvMid.y), level(lod)).x; // mid-right - float d6 = hzbDepthPyramid.sample(pointSampler, float2(uvMin.x, uvMax.y), level(lod)).x; // bottom-left - float d7 = hzbDepthPyramid.sample(pointSampler, float2(uvMid.x, uvMax.y), level(lod)).x; // bottom-center - float d8 = hzbDepthPyramid.sample(pointSampler, float2(uvMax.x, uvMax.y), level(lod)).x; // bottom-right - - float hzbDepth = (reverseZ != 0u) - ? min(min(min(d0, d1), min(d2, d3)), min(min(d4, d5), min(d6, min(d7, d8)))) - : max(max(max(d0, d1), max(d2, d3)), max(max(d4, d5), max(d6, max(d7, d8)))); + const float lod = float(mipLevel); + + // Sample a dense grid across the projected rect. Porous occluders such as + // window frames or glass assemblies can leave only part of a candidate + // visible; sparse samples can land entirely on the solid frame and falsely + // cull the object behind it. + float hzbDepth = (reverseZ != 0u) ? 1.0 : 0.0; + for (uint y = 0u; y < 5u; ++y) { + const float ty = float(y) * 0.25; + for (uint x = 0u; x < 5u; ++x) { + const float tx = float(x) * 0.25; + const float2 uv = mix(uvMin, uvMax, float2(tx, ty)); + const float sampleDepth = hzbDepthPyramid.sample(pointSampler, uv, level(lod)).x; + hzbDepth = (reverseZ != 0u) ? min(hzbDepth, sampleDepth) : max(hzbDepth, sampleDepth); + } + } bool isOccluded = (reverseZ != 0u) ? (nearDepth < hzbDepth - occlusionBias) diff --git a/Sources/UntoldEngine/Systems/CullingSystem.swift b/Sources/UntoldEngine/Systems/CullingSystem.swift index ba522d84..6600c333 100644 --- a/Sources/UntoldEngine/Systems/CullingSystem.swift +++ b/Sources/UntoldEngine/Systems/CullingSystem.swift @@ -508,8 +508,9 @@ func executeHZBOcclusionCulling( var mipCount = UInt32(max(0, renderInfo.hzbMipCount)) var reverseZFlag: UInt32 = renderInfo.reverseZEnabled ? 1 : 0 var viewProjectionMatrix = viewProjection - // XR uses a larger bias to tolerate one-frame VP drift from 90 Hz head-tracking. - var occlusionBias: Float = renderInfo.isXRStereoMode ? 0.02 : 1e-4 + // HZB is temporal, so use a conservative bias to tolerate one-frame camera + // and projection drift before declaring an object fully occluded. + var occlusionBias: Float = 0.02 let computeEncoder: MTLComputeCommandEncoder = commandBuffer.makeComputeCommandEncoder()! computeEncoder.label = "HZB Occlusion Culling pass" diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.air index df07c23a29a74f8b83000604bd0bb0e61c106c84..0b1bdcee38ee13e5a10d0a3f30d4970d80b62c96 100644 GIT binary patch delta 15264 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 D{Nm&) delta 15299 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 YKvE<%o##=fSIw`DXcUY2;Uhu(A9lbs6951J diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-ios.metallib index e76341691f6dc44a42123855952169c05c4415c5..09022fd991d849ab4dc8cdb353234bb2b9b1c839 100644 GIT binary patch delta 4652 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 delta 4916 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 NU=y4T^$5)g{}06hphy4! diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.air index b1a096023239f6d7726a80e7b803f92897c5bc74..d7aa351379a607869398888a270a40e19136e667 100644 GIT binary patch delta 15277 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvos.metallib index 300cafb2887fb237d3dc20dc79136a2056a5d271..a0f55022cc285898f6a3587a60b8132548b15366 100644 GIT binary patch delta 4618 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 Q1F&JR@jkB|;OnUW2a?LIj{pDw diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.air index e9ba3b456367505befa72d10e79824c3cb223836..d5fe7ca064fd660aa753b9a26af079cbb6cb5a3a 100644 GIT binary patch delta 15265 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 JwZJIm{{XDr;W_{S delta 15300 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 a^MIs8)pTA!ot`znG@?-~=6@*(;{O1-j4+M> diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-tvossim.metallib index a114b57d730596f54631e1cd170fffa2dc881082..4d3a8b623832ddfe6b1dc8a9cb985874379730d4 100644 GIT binary patch delta 4624 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 M{Iu?@ygKLq0I%3J=>Px# delta 4924 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 TUKlh4G!!(^r%SwIL-PLvG^46V diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.air index 2866d7fae78fb5914af0964d5aa1dcc6f9c1f98d..43df52225bd0607d7c6f345b85b1f14e52a513fe 100644 GIT binary patch delta 15277 zcmb7r30PA{_xC;F5-t!R0fY-gvare`35w!Mg2#xUvgLga<$W*dP zvx8_Ny?w-@S_(h@9naYqEdDr!RG6bOq2}bYA`LRg=Fa@!*5Qlv>iW#E6ke6jO_@PWwI0lb2ei z&eY@hiSivEJ2*LTo6`B!912GyQ_I9kJwD@vYC%wNs$zo^XQtRJt1C+fo>XlX>n9VF z+Nd6PX>h%S?Mva20Mc}PrUn}vm_+JvB`(FPmbtt$PFoSnXGMi!X8dv4iHMBpi^P3Z zOz+$(IiegCb;`cOE0fDRv;2s@9+aB1KJ`;U_UF11fsT?Oy>OYu;sIZ?t zDhFno?^c~o{l#57yqbe!s72h@D1!;7o=2HH2n_L{=!4Xp;+e1Ks80RQZe;X{H_?NL zll~c(Q<6ake7H8pI?qBLVmBc{C67BzZiO(ucc}M*)g%43Bn=^wG?)Bl+Bgy+m?_WCW z^g8Uw>5QtScW!)k`iD={^*aVnK7VG;beV&Kw-`&UIz7+etL<(i^jFT@BoaB&AR^6R z6bDOV^<~B;A~BH#wj&@kRRCyDx;ERfnH`PxTbD39Z5L`8fe77Z zheCwXb|YXk0v@wNu|O#T#v`Dc9V!$7EN(5X&04EFq2NAFa0nIEC7C3}}^|5+Y;A=GT+bks(eIKElP`Ae{Ar?4{ zfNcoqrl-H1=E8|UPz8dH(jUAnb2Q#y=k?>;LhZBb1ZNg%+;`F_#;(ZqST_Q&z#u}A zkAS-fFg6k#1q*CMzykyvL;%GCn-K5_0cQ|U%L1Db@H+x-AwVq(B5JoHpbG)_5ny70 zZ3yT_z%vB2iDnR0Z?8WX;`X8cb%RdnE+Kq+o}8ou4}OyTd^grYeM8APd|cTb0Aiy+?fE6zzL-JDj7B9F0eme>^%F3hB^e@1gIy zV^jSM*Qbdkg$dm4T{#M>*I@3SuYh}kjyN8Ho|1exm|k-{CA8;SR(H`tBNy$W+y!k3 z*?DCX2z`;Zm9r8zTiJg||9qU(wgd!>w6qt(O8k2ZRgLS_Z?*<;o%#fmLUtrmyGUXG z6wdPl)heT>6F-Y&j$$(M}iv|Rg*{G`yd%)bi|3JZ=BnJQ(U9q(y%2* z?~p*~#XSNeyVk-L;n#C(h4q(PcV1>~h-CsL(KXzAHkQl$5tHhEsoYZ1?I#lYq?e&h zTy7_!FOy}BYCK!s#2318i)@^nR|m|Dv(8bu9RJ!Tv>J`ZGG+?doXocg%@i=lCK%-k ze8yba&;p2WaQl^g5+(Or0mLBUud_;S7`5w5V%i|t_T1nJ-cEJ zV)=^-`LHv|dyN+5%36l64>huh?kkE>MPfl{O+FBl_B;EdpA||)nq_Kpi&IG%CW;de^^w~3eJn~|O zNvypV%jjtz#YOL%WYyVn-AV6o{C+~C0v{>QR_#OE+kCkrDb~VqxsI;-Xu{yuYkVt_ z!%J|IZ#Sn+wAaT`u3;Q$uOOyj1x`JuCw)90e>ySi8GY*G*^;bHeCq;L2XeUjuCL`u z%1kS{EL!r3x9G{)W;p=?R^gw=M6+cUCbm4FXMPgo_S|lAC3N8@JG3${BkBDMvW9sv zckN~=9tPYaVx)Kj#@IK=W~|PpQrE+gK3h!uF9zE%W29=aUDFdn2ND~V7eS4}2}Agg zkvf!fqSXrSU3ypLsHAKuPTtnrndNtJ(mk;&M@;pSoH}1j`=G)W*CMJ>AK9vA7pmWg3p3r10DC-T)&FRGK-dX7Fk!m z96qNjJ{zok5olAC4^pT}esy+3= zF}}%a&06(ZgOaKbKnIe(D+hByXBO3ecvR}N_>_$%r+R@dkm!-$l=0219cRtBnJdnI z3?d^b?msn`^QF$BXJ(5<5^%+dkHKfLxQ8@>?QGG==)LEI!Aw`5-vF2CnCf|=&f<4= zS&5VdDC=9f*5xdT?xs&xi`|ZtjI?gM4*L7*)zC?&){Jy7lPYcVkED0i_`A2+Lo)ia znh?;@|EcjCEca}d^UYD}JeRwr<{?zV^STHmNM#P14fi4~xDbK*jlD1hakcY8qT7am zZ>*YfhyL+G9{fR1zBt^iEyd2}(8i0Qa!QmaYg9PFa-)RYre^1AafP;(wZxS-Mf-)oQm?Rj92!6N85JNVAF$# zbX0A?$d)jnO}JVlq;nJ6qy;?PnA;9|CA&fTeWa3T!;VF}EOQf`q_@@jryq2|tx(n} zG~E~cwkGie%0r@?Y5!=Y%Q@==f383i)TOfO#3yXbT%+&TjtaiGcbat{`9_-ak}xm5 zwmFuUWLxH|w9-5*r0zl?*x0_}$xFe<^$AU56IvsEz#JFKxqKV~ZKGdgN1w}%o+q}A z{tNxgEa!hSSvI-SYV9>9I<9Uj80f0Hk&b91zbvi#qfU*(^D0&238xQpJg6e&| zpgQ8E=w=ZR>s&Gz3E_;b4w?{TKd&Dk=nAb|MGdUP5Ss+2kw1#p|AJ5zNebfsJc2w} z5)o@Wk2`T6+N@*Asaxp0Q6i&h-er^!!M1ss4-sZEG27EN_4{cij~v3a)V3m(VUU1o zM8C<=)Y50ZEz(x6;TpJ6U?zT6x0 zvW_nP_oj#|0;{$jUPW{ewh*FKziRlGR6+gnp@Xjc z2gd(7BFs1m87<*M_G>w5{r$`%NHOEfqf%1r757yiU%M`3P{O%tu1# zWj=CVz2bH0Nyz6!={mWa%FPoLE#xI+URiVEY0W#)iI)=ht`ac~@JQ}rp@pL1} z|1V;eA327e@i3Uz-4um_qydXu@G#utwlhiD8-$Aw13fyok87>B3j8Jg>%&kt<0PA1 z&7%Du<+*j*A%|(^(Ij`y=XOra1^SOiaxl@7|4xUFs&)VMpx35qD)%- zY!nLm-+eZkgJPWTpB;dMblzVKRMN!rvG5r^5q)>l`saygD_nanL-~Z~&nqE|{_w?E zbfVsWF&-|^L0!2h4l#C3fH1nHD-jxKua{}4|ALnilpoN(j6=UqzDl5Li z4Z*JZw))&etl5+G|HmMgvh&9L^jGL~sYEU>eA4XrnTO>7D)GC$L)KV{zh(8N%9V6a zuN-vyWgvxh`)2@S9VD%9#Y#8YR*XpnxCb3f6bE8LjLEh92PUhPNm%Wls5nrd?{h#c zX@e$);=md!#b_qj0S2b~XWw+0DGqQKQIz8lFi5`=ch)#?U6gjtRUV_kp~#K`=?MQ@ zm6#+)cn^_ja|8*P7!DUGyGPD(Est!nn@bxPLO9(YFiuX;1s(4Y5E22ObUKbi*1F&8 zE%ED~WR>ExqBrdt3Yn<{h}`Vs+Bcca1o%T4gD8c;6Xps5$L)C7=L|yk_&vURd^fU2 zl&=$PWUe@azk~kDW9C23a1C*P#07kZbWU0@v)k$#l*7mD;orBaI~L6Eu{G$Jb{7bA zzhR&L*v`1QLM-SQg)0n(i%e#JvBed3_p`!y@L&!!GD~cg)ebMti-8kL1&Wat@l7a|XJ)<5OKSr1 zJH2cYe9Sm_z~tBjFSXjqF473`Y|FE+MLL zS{k-S`a0GLq+$+RJ`wdk5xtJJx1~<2rLVt@dCltBbx(>ynMGq9rjvco$ITf9Vqz^X zT#ue?%#(`0WpDu`a|OfXUc+S7Dgkgg{v9r>ZtLotmWjDbO-r)n@A6SrY8M-I=kHH5OV(_=(#^#?wn0MFb%h}sMXK9S>AFKd<`Ouc-IdEpBm`m~J;C9o~& ze5$Klj6Ibru?IPNtfd--c5R?l)>NjBZMEiPHQY5`&GK7`V(Gy07w+8IGGV1{`Bfv$ zC{t{Y-K{JYmZkp{(ZwwM?zD4i_2BRyDT9Mt!-NVp> zAtV;GgjrY+fS*HN$77wN&C}h|D?pK$PNWt)-7VD#k+(PygfWi>!zjN>!(eatQOWNK zcUk+7z@8Z!2qH4^OT0?udd}o}0dv_PvjnQ;lbE%EFa@47b%Bt^yd?%tk=mz#2Y<5R zuk{4KlPu4!tYOnh!hOtG5iA2UQz3%Y=sABeyy4zzA2Y3F-WG!-^qC#@^C}eMOm9Pk z&FeJwgkLk4#2`o1eiuVvQbP*%c20q?@cLwxOl?(ypSR+7T2)TR1zz4fv32u)C<0HE zDwd*USWmpLJU1N_Y?*aNcDF-x^@cY8u6p2bX+!hF~ICPQ;mv)tI+ zWMIxqAw*crX#C10ykXcez;lMHjaW*+4!OUqF>lz29Oi`-R!#2ROQjC69z*B(qLrN} z8`FORIR(_D)Go0y#sr#$6Tasj({aL(*+N+xaybf|+1Pwwcb^RcKV&y=2Em!gSBuB# zdp6`cJXe=$9Hj9srryD~P2-koS}DTF>Cl#p%qyKsju3N>VXv5@!4L=SOlvR*=dXJp zY|-$NkBm|U6?BT^@l6ukT$iw1_l92GP%AFsZsT?=5 zniB)+fgnQue+eS03uLg;0ZIGmFc<=R8R2kP&5Mkktg^Vo%z@z$=3z{Wd1gx>?q|Lp z4x#Q9_9A_cafpLe|BMkBZ5&K;uRCLRY<LBS8$8n8zcL1JKL};$a-zWv0f163JpuJfgRQsgDPR zdr_<1;=IQQMu9(X@rR^5qXX?YwR;^iaujSqi+pYrGKwvXcr+;8BE4<7lpmOtqaiH3 zNoC_l{R^oO}T8sbL7yf;Eu`}R#pStABAyQ$qgIUe=8;z0)5t`P0g}8tjY{J87}zwc0@)plnW|*wkAb;pXIGDb zHK1oA#-e>bfmtvXQejN>iLoHGi?Eny<6)v>4YTOPD zax-%(5pDC@>PLylt3-lFH2kZDNyt=1Z3sa5kak;sZ6(T7G+J%Nmd{a|z;a`mSDiT# zvH+TxE6Fg_>t(Euxe^3C2XtN^M5mqdqYkDw8KkkDzUPSWRM}$ZGTn}(ctr!UmS3Uu zH_c8A3Q_6H@OvC6b|XSaO5ku0IZnK#iZiDGj@=QRM}9zx|NF8LwQK5t-m%62Kna2t`YD8_{vGV z+9)%+*Xif-ICDA;M!79K5yNruG!Dm--jdy7o}{5*>u9z2BzOylPG-v#bn0|6?@WP- z?uPBl$yBrqZR~x8nRz$`hQ!=h#=0H8_pgzON^TC3;x};q$|9>IY(6%RTk^PJcYk6? z7I~ggP6cwtj+JxHWE&;;NqM%3 z4H$J78?F!LI}536b65jUCe~UXVa_1J$S1!x6(W-VGzZ(#S}l!i;$$F&r9#=`$&{@w zlX?uZs7E1e4{x;W76CVeiBo|H+L&1?nCj++uK2z1IZ^COD?ZFw6_BaObMN!pWjqHr zG6+-h8?FlaUl8aD=&NcqT(!~k$2^}Ot`iDA{!J;-jPZ-Vq5QCS7e=ZPA?%3^!`@^x z2@uSTn+9vOiTrDAjs=72!nrZza^iPcYZ;Z@S)vnhx00Qj$`V~5cO%)Rsg!ipt0!=F zmCFVfxCi1?9Dlr!;JPO>L!?_#CZcST>QpDXtKGu|#Kp;0jKb|)t*hJpe z^burnQ;9N=n~w%k$Xm-;T>HOAYPF1{CA%~&B_OhnME#GEHj^FwBe4@3CXmv|_2HAj zWW5`Na;tdYb6=%N;qkU$N?B#?L+7i{<8vdp^NCGL zvLZD%BoBcg)X!tVHN;{BlC_e2$9BWTmiFSd=vwvYqknRGYfTQl6P_iO1n4hd1rLco zT)Q0{Ji1HUT?elue&_H`1Zl_1h;D}hkM3W|PO+p^SuFOL1P(HO@2KK&im!6YByA2e zYsI_vt=E_V6(CXKzoYsAdLLQY9awir2u3&5JRL=Tbr{k^4?z4mScDQ(^ zegoxn@F!)rAkZGCW^y)`JB{7fDcVi6DW7-^@ws5y3H9cE9I+0gbE9}m(xhZctzcPy!JMYtZa>nzz;`ia>%XFTJ<9RRR z%aYK~y~+gM>v&^Q0{S^8Pf$P6olKjLA6TS*$8D}~KISt~o$m4NXznV5Bb=N1& zlsaJFIJ=J#P)*3hw@!d{dWWe*c(gXplyy>IZd zxaQ5KZTg2qCE>civvdx}@Kbgzc_fw9at*=hC3lkrRHujVdsNqAz3qlr0`DzfNpQ={ z7uB3mo3ir`#u~U0o-@|$&b7FdvVvY`S-9(y!y#pPxn5e5TuE%h(M|~rM|w|&pGMv1 z=s#U*>+b0y%Rt?8GIrL^en4`L$0QG=1xn{FVMdz@)D0#%EA$0vOiRX2bxdb=OvJ@} z`kO+GoItE!^p5V`x@@bU9JWr=&(SZn*0m1%<`g18oFfj^J@r`Fg>#YEM*`d- z+vDnfnUc)&+>DM-weLFT9(<~zXm~8fM>Z!w_dYrmVZOH_EWWi^98u3r>hy7Jadxkk zmrdgSxxNAW#tE_I-Tq$f(58^M#m*lK92`UnJ}+vl)c5o9klNv5F8c~(9I|-xc8j~r zZR9mfa!q|x=e?8^en5&(kjqEy%XTX`=IzknT@XECMy00mmpr|Qw|fSUKa+P}IG0~w z-m?Ra?l8Yo;F>LqpDtI-l((+QSMsb9u;Q`%bU5l66yg%c+dYfNpN%L) zW=uPy$vcxxRc2Q%%G<7YD~NVV#}i25N2K^;a`}+uck{1dI>b|@kItPtulQ0~qP#V> zvN)I}G{TNhl^vbRU3xbMMlcto!3POL&Cbt_6EWRt_64|s6RtamV|f8?V&((p&ACvH zT@1rU^Aiu_gMvRd2)=srB~v2tF&Yfy#~ zcKwm_j!nlogZW1~olI>`+c00&GcM+LUbm(}l$j8Z0)S1KFdp7wE@YxK?Kb8=naB-# z!SrOprGfP1)hzgkE6sWulJ$&PqlSF{V45O^v`m!nM&idXbi(P7uil^0XK)ROwU?gy zzMp1IM=TZ(MUIkp(=|&r($im4W;gSFlToS;*HAk4eFG)?E*|&t5%kW=fOF(&^>kcw z4=Tl5VxD;RPvo(c;HUn}#B6%AKh3^WTxm|Xjovx5PFU~TjXJZW(Q9GcCrrHt3n^@LyOKBip1VqE19ZH(_uR|UYycCT4I{nl90G17D**H= z_R?`6Rgs?!fk>iEHaboAGnY_5P! zT($EOlu&XDqp7BFtNcrrLX@mp5N?fdA{&xzVL;**-1RbI8A5un@k~tUvc6jCGKditZpJm%WZWgrCKRYyuIWt-y$qrtiK$(NQtX$Q|Dc)>*W#;e z{q^30nw0OZ-=-Yg?sxYBwP(7u*htiG;q;msd zqJX=I=~<3a^c{?F1zJWOGiC*HgFBdcDOX=Al}^D zB}fOoo{pgIQJM+j^Le_&cxq0qd8c_R;5fFn#^9{77K^y+ft&a`RD0k$oP zxrEwAoq0p$PcFA*%nQx`KB)9l%L44~6c!#sFHF?6iTqRsYszK}vOPI?dG`j2jhy}42rQ_)RcK|;q4sMbe(O25i0I@)I{|)Wd|*~y9hPi zV4IX9X4*9^&RNvPKGoNx8%RARXH9 zGyc?SfiETgWT(CNr^rO)@kE<2MUNTn8k7oJ$JC-nqp3scBx~yIP1PZ_<(RH?{L48N zo$y4jRRFGx$69!R27SI36vB)8glf+)<*9=%r}j-c+4UtG`H|!wm|m@ZSUr6moCXkA z_q+}0e(yIXG9Uc>+mlqmnb-X(b$Jf9hrgXU%N2_skUjS%-eofLAwbZc)qO4N0onaa zR`;Ua=B(~ts(0kWZ!p<_UL)~3z>FgJAmF3YfL`6`Ek|{4rNH}u?~h|Rc6Tvhdg-6B zjhIvt8?%!KF zC%xNBi|uplUB$Na&S6Hn4R&hL?NL~E%vwIWJrc7ex;^UEpb{lZpJ&IQWT_e@OHr!y zx@WNly=KYY9icn=@5Mx2|D}pTg)UWy9j!No4u(R*6!*O^{N6i|Q|b5K z7Y77boy1N5w9A|}M zGxL=JVnECE7~oBxY603_KJB6^o&(C#47_(x#Vp$nli;`N^V@;uxHe7BFp}!OQPx<+ z%rwF`s3CM0NZ2f7Y8eD^_xe`hb?&s}iNx-RX($6Jzweg+uUH@8H}t&%!8|X6IPTG` zS07|`Gx9y~K3rv5_J9l+2KIu#pYG!`#s2B&f-aNHo1e~lBeImlK`3Ia9=;dGJJ^vw zzJK8Ix76O*zY)FGu#YhPhu3#RHDXssk`^ z9iDG@h1_%iejeO$V?jn;$S6VmGxio9CBLs*vmM4KWgJ?8d`m~`%&9YABL`9|MsIO zFq`pof2s&R{Qz>wyp{fx0Zvsw4Ow>6pEAPNXP}kjxB64NVc$p4 zMVemvQ)TecCqVjD`UOyXp}Gp<{qn{IQ2XFf6=e8{-w&YPfm;_L-%qRlJb)^PFD^m3 zpSmM}dKbRF0yTb>yUr`5jc{4?sO(0iA1b|A5PdA|?C(3(L*9paftGzwz774!C0nw=E)k4j zzo9ytz_XMV{58VSKg?2EZ~+>Z9m7&u@L+@s5N;_gcpSn55ROW1-w#WJ3N@fVF~lsT z1`q}oPH;X5yo<=#KO@A>jPFqz-XoH;Xd z=FB-~Ce%LrF52GZf!^DRfR88q-T$J@B@ktnN!OyyWk-UL=%S&Drw%}DyA!Enqju>% z*U#tjlVmA(OZ7>tZ?1$BPG{Ug8s6@8;CVed+Q_5ioGlK?T?dRG2OB7k!_#3& zGUe{m9TT!8N~(pkVHA;63M4rW?!iftOvk%p<20NFTSPKDcYYB63s1d><;4%I)#^Ad zmA{MPqWlAyy1XiPfygjbHiWBamuto3R1u4qOA^&v9QRFDpNbMNvqTUE&hyffBU2Qa zqW&zQacC1ClMe|yZCl}u&e3b353j!lrDVOAbcq=9h<|Y$%40AX)G7EO>!@<2RWkK`>-SG2PtehD!EcAc7qv_%U|LfBWqJ<(w6R*Zz>Y@%53+tt$tqY7yd?PoAV5IWk4aGc z8Ncx3uK!bQ^^&Yw7DpBdbq2i8tB4Q_WEbDL04Cd9+6;D|lYJf{M0|T3P^7rtU{V$tGHeNjKBp{4X zMFf8Y0plJyH)70th$ZretcA>&>vzzAUIr{9%+ z3pF1zdH4kNS3Pqx;$sQHQZhsbJ|VL7JX!nd(F7GHs7_uypA|}hDaZc+L*3_ zpygfwVgTr5x?+G5044)qV!C30asX5S6nz0yLI5}jKqdg?0Bm9a`p!Gk(%uH75|B#_ z@)1;72S60NVg~20$eMRSfVx0KWpz3V;F@lM2`Y z$X|dM0V!pWodEm|KoK+UOF#U00ZOCC z9G&BF%1yVaD3)t)Dlt<#N*_2{gMOlC>*COHx=i;R71BG89rh_rm?y~Lw3o10y`h|r z*mPxSJWrFa-hP@MeS8<%Pv1Bm4SoH2e5MnXAW=&CiEf}vuY1zU6FU$^KR7W5Y3Yax zZ}bVBP%#o(Y^+$J?)fC`P5z2vF6_J2%Z#z<*#lJD>eg`#mVrD;kTg|s-j+5CB%a)S zVAX$M;8*m1e&fwew1#z@?}`iqv#xTw`SlL-Y$cK%3DgIcMnr&8Q9PKNDO6SY<&HDc zXw&3q4N`MXE8oDm@1OVT>)WFEY@o&)nETT`jnlYjx!e>)`nOv+)*|}oCkejIiC*@k zeVpmB7fb-h%Bo69_kEIpM0CQ*H8AvxCj%n#Zrq!BgV8r;J`2Myb03>I6RId*U}bQY z?;-l1ld=7CHk4j+YU10hESvfH0_I1_Nr(CIcmA*WQTQzwYZ(p7;(TSDpBk0Q+;1Y; zoFK5yPpRKx>l7fm_msa^t@vFuLvG4=Pupjv;Ksc{ODcyAeJtIDcIOIuQ|um@0 zh{oU|!jx>P+yqQNsgy3ROxR}?*tML^{Hc16Jia_v*;-_wsdBpTVvHW*`%}E2#vFTG!IJU^jPI% zT{csK(K0XU2F%N&0O#a z9ej2KD3IA_MG?(T*Y#hfunCQ*NUi4+a?<&KL^Pq@Ix(y1!)Jq?FWZb{6@B+?nX4jl zwAfN>rHEd4Zftnz42v|E%TIeUI;2U)881y&><2|6ztK50%FIx?oc`)u{Lp*11r{P{ zZ*xe2%~-b5k>|slLb`>$D6(N4hw7$Ro=@d;4NL2$8_&PBK)6j{S(sA+EUw1%m2|3n zxrLnYeNWQ!QEZchvsPm6b$i#v7AX(;S=Qi6SHN4=(kFEGg&^lwHe=mF>n`k8M|u>K zo=-p#DUwOGmY^Cy3 zP?LZB2*GoZigH%CQpSBmpRS4tQw4I!`x+Y^euzW5#F;WgR3FKzbMXSXGxv3ncDd*c zViIyO^S`F=z{PY9O6wj*_gq{!9|ts88k{Snaz(wH`EzyNmcjfdzz+1xS5iJRTZ5-i z+V-%`{J2)GSv(8F^@T$$rAO(COF=H09X494o&NUHE;VX_gJ~LQR`TALIXrU@g+9&6 zRBmWd?8!Lmsh3FVlfVQr&uCL13aGG|;Zs3%7N%bmF-%*k{wIjT)mo=VSnj`>e^OT4 zB#Nhhtd_YK?-D2}CmZR?q9ZT+_!fpB?oDRsHx#AK{_&#L`XYG-9O~R!I{mVeD=F*C z!CUC&%L@gH$d~gXM-y}E_-8?A6+QQ}CF+Wq60?MNEH!0NTw_VR%*yaj0aj@_mPpO;u@Q;y3oT@}o5YN?_~((FQFAf zhoNYUdEH+pMm32z+br6yElyn|r|SLSn9`Us2uC={sDZP$N=`4o;ybQS^&AO{NzuSj zn?(dV2wxh^ipY)ICx4E-R*HH_9kMy)MD+P9!6=vh_mwT^Iz6*ysqlHhfe$Q1C_j09 z8yALYHe*cm?HZBuk;3toP52YtU9%Ax=@qr($5DZD>rh9!w@6#%IzQ0DLwk@{uC>=I zt+w?d>91>t`N{Y24F2_@oTt(PrCwvJ>?E|?RXeqUR} z=X?6ktJ&x`deyZt&i4~-v=Ci+Ed*uLUtJ@~qdS>XLEuOlb7B4LL7ldigCaw8-?dvv zTYc;EwFqseN8Kn1Dov1E_QAvDoO(ATHZ_ICgY{|_WlaBgV>$|@hu<6%`1iiZ*HKOS z$k+S8M>^r)Avq+oJK^x5b>Ud_j+;YWUM5)Cdbpvw@@5%|zQ2nsvdYbq>5?YOMZTLK z#d#)jUCp(fG5v6V>y+=LH|qUdw7WAuFz@AumGmLKuXDL0#{vmygWfOrtm9?NP>xo@ zP;!%az0xlQJZraxeTJCetNZ3!24_FYkUf>~(5PFY_*1Rxd6Qmd811ULszp{#ZqP>! zLr@LHsb0xJ-PKu5^HBgVC)e9US{4H-?lYAzsdryje~LX~s()TMlwmFB z2kZ8!qMzLPIDogcY=D=oWdpoGzMmJ!124zE%tt(C1SL7gu2)CgUBMbIjr=1$FeJ(z z(r#g<~{6d;8N(fy1L%vipthL~b{I^{bU!PBX=CF0UTe+J(?2+UuK9ld0jq2>4OW znrJ4pl#7eVulwnS>IP6%I#db4X;Ha!~jcPs9b2Hqueg5oOoNN`x zM7R8V5vrnt@16H5$6H^NY(1D)j{D&2!8}RX)`NH}-FZ(mq-W19)1F%`a?_WC>7H9X zd#Z#77;o^DXk>!4AloyA(;iz;+R;#CIM%yh6eoNL;)R4D#$s_P3aj4w(`*D9wz)F`Y3RQ?-*zoj3;O03lY(D> zPr;}O^oD1_d{c86csYZb^XRis*ER=|vfba`JqvJszH4$@y=6*Y(d?f?oQq~y^`DR) z_j9)Ma~mX$uKsz3OWidabK^7G=@%*Zp_6}^hm6&wzqqshZ*v+>D}VDB4D7xBxe~1p zBKB7o|E5N8IPtq`Q96CQYa-f6qZi9;2$jANJN3`gtGN3KL@0gzMa?+ljOD5Fr(v#| z9*Y5S-20$zGJk)t$UOG*&-2G-DLh8ZNGc}BJcS9O=+oW)=vH-OcQ68b{+B;WSPz%c z+h4|j<9_Ak1lGefboa}HsGKf-g^`X9{&Nz#Osn9(iT?P{IPhZH|CE49@BUX664Ld5 zO+r`qnWn(87i(G#i&ANdMz|`;N`5bo6#57m z&1(pD(irPk#}O^=jDbE8%)ZV$smX8PSg3--GxvOp-Dj@mlcUh5Z8ziiud*6S zBt@zZlTjeb{%`}r)=qFVLIW%2y4AX3cm+a_kr5}cP~@n=+M$ntOphHBBMJv_5oOb)m1}NdJC+_U8pe8)kAv)y37Y!z(6EuY=ez92 zgE}5?GYWl7Gc0rYGJlax0fpD{kTBHN?Mw_n9~vlmrbKBJF^=Ku604<#FY(ZD)P;ZG zp$Z$usvMBNi^R=)7tUc+XJ1ZP4*tOb`Lg3~cH+Mr&~4!Bh9mMG(K%z;f*#9hUv4_Y_$Vx(#v66Y)0lhi?K3P0GMN0~WcV1TGpa zVULci$#O$nmaoxq!~NVk`?VtO8r|FJ(nA6WLVdtEVMbi+fht_%N^CUeKS?;&6ZrwJ zOFdB#T8Y)3uwr$GY^r>QKlMbbKwLbApnRmo2Zx|~l!}*mp{b%dD>QC-dH!*Nu$~~k zB1GntoKN*6@&%iC@~SS^ampHl7m^|O(BFCb6t;ku;ao3ik(Tprv|ldJ%JmP6G;YtqFit<$=U+^|Z*$<_Q2=@qBNM3S;IDCiVJxQs4mR-TlcDxf`^+(eq zsHT(F;0**JnAK33X`P48;2r^OO?>(aQ+8h7>b7Z8Fqrhljp~| z3^v8{Tw8~y7ymvKdBHZ~2A~*p7Rv%)FX(Yf01}d{yPRr;(`B90Rl;$L#OwiJ*f(MBLL zPK0LR;X>q&KNO*%&Rw?T@GTJ{(QDi$0==G#9mOcXTc1e0n~~?QZJeo)C@pJu6vv9u z5E26&2)*_PvTXE~5@(6gLXgcmF*+#Nnn*k)e|xfg_KLlR*wl{Ycx@m`b;@hj7B{y@ zi;A1I_?tj9%%6)FAH-t*XyOFoWQ$@PpF>qGc`&~}dzirvjh4_3B3IJVmHwgK_Z2uI5&WO%811P0 zYv_I5b%6^9V8U`wsjgJmP;biX5%4Oe6+@rb!JflO+BT5{48FvhWWjTPo zLeO>_9n}zmgdR-nO&*ouCKLHX08SZ(c%e0ahQI;kq7SeU&)@Kf5y)>Q_aNy1sgpp% z6g#agCPSZtiKC1-E49z1o@r+nhj8>}NkRdu+y^UA5$EOhQ!l=nI%l9l9ixDs;*t@_ z*UA1PAn3>(DCPL_2o#H+;+G@PxDm==UIL%ruUksyBxqu|(Y%I?QgKn<1ig-#%ftXi z5j~Dvg6EG!6Hp!AI}(Xd48AZDjYb>s={x?#H2wtRRP1pcC+xLFi0a=JpvZGv&* zhl7t2=L$S+7T`sr(EBXIulU|5v<5li*f1n_Q7yAwD7-feg^aM<>Y#CB52(Y(C$Ms_ zJcKpRX9aKNqYz1GgW9sLo%qKvH1=)fu`h-u#|_;c7c5I3BPJ3&wED0v>k=DQuqqdg z`t8wMogDrhtp;US+NXqce(QLn^}~rid83ah2_N&y-^323ygH$qxJN2zRyPphelb$A z@%!OuDJsSP2?zdP;61uv_|L3@GoOfh)ad-G#|pkv1r48oAvmkv1o>i z=B&*@^ELisEPC5T5n&@@KjAgwKunGJ@HjLNcHZyf&{gOA$<{SY!=H^u!<aqSb_x; zL3L!}$cc#btx1qyc&m9vZ`;4fau+*xvw35@xQbO1L6M)uITO(m*t-9oh&G{goG=MC zauD7+2_>NkHFcAazl~>u1+i$FU6uFy7rpV4SoCqk|I6Ig{g=6oLu4>LN<34Brh5}n zaKgCnN8A!qhK_3qc;QcFXg5;efT_s0Mj;0-B7RMf6ew&$QLiAMU2Jvh{z%e}A;4yUKDT#>mkp&G?Xi7PcS*XC7H;km**pIL&kDHDry0CBQre!y{`4C0_QkpPUPY2^* z$TzDU4v_1WQBmcY(Z$BgE>VQwh(U=jPDewK4mV9lG0y2HBUz5_#bb!6t0b-1c?NK_ zuSPNht>XA~&Pa_mNeYa`x3l9#rG~KhQj58aFU>~NT#|NWkx4M+MkdB6$98jIx9!G} zbCA!FOJXJvnawSH-mrHdmLeJT8D2IAkufvYbDI6@-D}|@O?=%@gxnZq^|;%2P;=_` ztc8f`W%-=a+u)KFi#eyI={m*_L-;&U_SHG9>ok3EhTZt0C0V z#Ka&5qQxqiFitX)vgSpBuA{B7nxfDqvjOJD4aRd7NC*bWMg^MVoC;Ur9-M_?%*zrI z-&G(|0Y?iN`n%aQY^B`Hx9CBHT%f%*aHa0Ol4#_;xtY1~16~VJJd6^7j^k-WJ#GbG zQ$EC@6{D2QH5L<{n2*EfBCHnI)+^&#yA49_PV%KnUuX#6ZX-KXRH323=$hy35X#*` znpCZYNXUJk>{OK&q5!TRYchXau#UX1>MG0?a(9qjs;WYH05^xs;=Pfyl~U>1h5ZB> zJU4*5l{BiV#Kdi7{H6ii+L5}yC#AWk9+k0BF63^v_B7?cdwQsVkV~qPxDlHB#MI%@rSd9wPi5#4qms*>rJ#DAtrb1hkIAVU6RKBS;~sZW)DOQ;vG|{?75yd~tAFI&4+pxY#D^IH&OD$bk2Uwf zN4(fcN$zd!|2o$xid-*fRkQdjeTv0oWx3sE9#5r9*XQf}wYj_H-kNLycO*BJw@pq~ zCS?uFWufWS3|}iM&89a!p2TiJ&j0V6v{7@TqGaTy z;59>ORf*NlSzW=`NVNv<1is6FEh4FM8x59;Ifv&gK%QtXUa{PxGGAzM@Uu zb8)D~rd+gum6L-dP(iKPT53OOf0uAC&nSQ4>R-%!>yW=Fc~+no7A!89>hP3&+Ww*} zra(4gS4_dSZ2gM8;-uN>6XN)FdjFmbitax>2`)aOyvRHEx#<*ETAR22qp*n-L15KYVYHz zZw0c6uN_<_xoMk0XSc98TxtAAS>H|71wSx6=~+>!!0q+wY<3c$T;@D_e>aIMU=|*shvW6 zVD2n)`CEArnr{Rjd}HhhoHM{mC^nbgUY`0mA`Xq6!5(|F)i~HsYvuv8?T7S%#eub9 z)32{s_l|lt_k?w)$b4*^7*XcQRn}G?%6D5^y>-&T+DLiOrjaglxAK6<*Xjwa`j?V# zt!wm=7_GTZAF^W2`{F)(MOLPHU&I_#>ldwmvZyhre`CCK>$n3O zqc(xr7(00F%*Hr37dD1cSYKAVsZ1el+ms{cbDKtRc_XgU6q*ImYRhiklG|qY9_Q{-B(*ILZbe7B-k@aZxZDJ$vL)S%*#5nRS?87 zzpNX!yaSJ4jLN|=Xk84-mcmaKqq#P2?CK>b*{);e&5k|z>Js$#q)x}>%093e2O`nN zX2rug>o{4~NVNO{AD%m8e=r!W$6ZUoZ=&$hRFnbUwMp6&&lb*BR}165b~qkfcD+)o8xCkU_) za>4T$xKqF#X-K5L*6scAbW2=ir62;#de7$D<^ZR=ud38$!5=mq3`23r9&4~E(g2oDB*e`_RL|TftW|Z^adhDW*TY+5ulE*Hk)2#q@ zR-y5p2Dab51Q|ja1#^ix7~4!yftyu}x2V9WDZ_`M9t1V-sUR$N0K254ivRD+!J2>4 zQ5nZZru3^&DB551Y!yVloZ&G|Q>bO`SG|qGBv;%l@s*}g4K{8NYdgp32C$2U^^z^j zlZwF=tA87oy%s-t8@yEtbJz6eLf4>3|EceDR3NPbk2bEewt>fBepYc9Z(f7K5C`kl zAYW+xIpq8sc5*gY>%&tVYyEqey%y?gv1BdsRd*$2+gEeGkTr@#*RoAEruwM#$>uhR zWK~k2)xK{HjI(%j+T1-2;GJ6@0hX-(x7FI8{0(U(VJZU2G`kF4LGKEb3TTgAq^6f`D`_PRjy+eLpVCLO!gzqxftV z3iGR)PPmvuSxuu3Pq%Q?ron$?p>WiK#p}QckHZt!p>V&>=|-FC_iU=OaNas3bNkF) zS!HkY?zI}ya@0;Z;rw$5`^*2*pcnifba!&vDUI zEZ4<)`F#{GS`RBM#5wEHaJN&D$Yq?Hf$&S0g zDk)o;G7dfrWiger6uxAZ^-@}!`~6|Lk5b}ib48JHf}hB#GYWkaMV5fnX#D#IFc;4* znTK`W0ZUG-n6VN%} ze3S`AcbFpixCJ&vD>E{UOsoE)+;J)WMf(0$YffbTz_j`ow8DAWXa#b@o!KY^gx+-{ z3XIS`EVNDa$iVu7X^Akt-5CC41_p8S#`Y$j{A?_U4nc zr{tU4X>T(39!q<3yJpQ6^edXl^N_lEl;M~nc#_grieq^2Y=udSJYvc`%DnGPWZ7Kp zglr1zj%w->iUK1y^LyKwj3_dM$#g#wcH`q)(Mk7La!!#L0tV(sU4|VsOSVCXGQ6YF z`YJDN1Bdi9mK4~&v3pry4OFFJ)(*5s4VO_N^CCA3;4-RjE~Ic7)yt$10)90w5<ev&)Zebl=d{Kp=zGmln9x7dv@7FF8+oo5qs=JStIlZ51l?3Q*g*|@X*1G z%7c))5p@!_#8=`4kLSVX@4YL(-*Wdpzov308iOGC@}nBA7>a8CR3ii1y>)1yjE`W! zwf#3zdCoaCU*sW@70F%{g{@)r6(jUILOn)njkVUv4rs0ASv7(JREGLrQ@Fk_UZ3G0 zlWoQ43sEH6i60cAMP66jV0(GB3#<8T2vrR}dbosV7NHsFNzH*GM6;aqGgFF5<=+qs zm*6pb(AQAFEkivkXmP z+mP4pH(#S~v))$MRP9H9F&C+o2T(Dq;Vd49VQa?WWf)A9WB33DeR>%;U{o+@l*}nd z)BB%KxZ2)%SC*rPLydQqrPK|JajSpHJOqH(X^oc9P>&W@9E8YlrAlEwC7R}(#ccoC3jQE`qTMQH;6`495P6)(@BpXEoNTVBq7 zoRg#dQX6&^AfEji zlG<2YghKz?MN*re?m|drMW!u( z`%o0RrbD5mOz2DHp+AqKBvO*(OXZ_aKS8TWV!ba_gichVT2j#FOBEx04z-b`_kF3o z=>9omB1OHvR4ICO0YbBq06%IU>Z?Z4K3&uOsQu{DWt8HhJL5+kK!-m^IX-IREkCLp zmEAz)KE~&M)FFg#p;{lw41ek{`mq7E`4G$esgKe9+sNcoy4Ii4p}r;vs#ClCspII= zW)$t)deEP$Kxgit6kp<;KXnp4z5_i zr)K;ez?okGno~2r2XN*ma^}>Gp8|X+;O5kfHw@zDw69M+FyeM7U`A|C%?(}w&M;(7 z&A7|p%$id(J{)jn#OBnD#|^HCIW^;{3MdGL2C0Loxj+l~5Wvl;89xI!vz+F%9}gpl h8-Tk4exv3hyskpL+XIpkTGMtBb$Zs^ZA780{{v_+H;DiM diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xros.metallib index a34d7efdfd9091730b643aee5ecf479430d1274c..c703845a0cf291e1ee5adf77b1727bac90eb823e 100644 GIT binary patch delta 4595 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 delta 4930 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xrossim.air b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xrossim.air index 26ef7b185d65e5825bb96aa9865cf715293ac802..4a2d7c2135549b5bc596dfefcffb4fa7ded2bb46 100644 GIT binary patch delta 15265 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 JwZJIm{{XDr;W_{S delta 15300 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 a^MIs8)pTA!ot`znG@?-~=6@*(;{O1-j4+M> diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xrossim.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels-xrossim.metallib index a8892d1efeb4c64cdd25c6d439e9d00839a064a5..6084df938a0235afd5df5c56f61e31b5a52d71a7 100644 GIT binary patch delta 4602 zcmY*d3se+Wn!bIjy1Tk5pt_q!AqdqpNUNv?CO)#6Pz^*|5ygzhh@vT;5rf)3q68oe!ddE!~YoV|ro!Z&wq5VT3{KU5s%9!DQ46@8Ojg-vfkF zm0n=w)zEib@GEIyrd}=lo4f+{_e%6w1SJ$GN}z8*qG6pzxUP5w3*Q$5GlVtDa>$M% zQ!`{JL8GAs1_f**DqvBPMBTBJAXBY{Hlsufl$6k&DEvc*s6 zcF0#s@K{6*bZ?R18iQJRf!qlFZ%Q;LRV`d4YanQON?(brfn29V!#Ya%pGY3sdL+6z zY8Uh!lc2cHnCJ=^J}Xi2IeVf@AahZo;^Vf+Ak!zQ1xmG0mQW3;8xqYyPCq16Ky(E0Z@vUo)b!giXn% z(A$lm8}=WQ9K_|erSQ=IxkQ!Bo6!HI1jYOKm_R)Y4OhOZv4KNWz7H zGG53@-GSNGkK?PUTd~1&<9Ll>C&peI$D5#_~&a zv6|0+Gx`NBW1CpHD}m8AHDKCivr%!RPs41_3IW@JJ|-C3r@;@=H7tmFy|vU#lZvP} z`#6R&Zm$o@4b?5i((kP*{_TdQU#eRHozGyUw25ua?%9`|q-*3Bvi<)~bzHn-nrfiP zliAJy@9or(cwK^>^Lq3I4((NkXnqce`bq&;_$`F!a3jXg>&FNdtL-4RR+U z4*BG=RN=D^+}3BR0nW()V1RfO$?}eTe&%aH*dPF$Bzd80#i?s2WfYJDV3Q-1*0RDJy^EK7-a)SL~u!(#+$z~Tu%bBB18!^tN^U= zyB`#O{2YM1GFF(uI}L$0QF(F`iM_`lvK0cn3e-+Ee;JV zSG`XJ8NxC4-?I9|f_~z}M})LP+7Fzw} zI-@PuSQIN=zcxNJ8B6G?;?@k^zrQHvVMBJFV-8=XuPbp?|bz!d7 zt1M&g%T6o5ORkNlTLYvv`FU#Eu$?y7u|LC|>dD616xtmiUzBoJvd(&S^hsqMwWyA5 z!>m$R6;Qm&I!`L2Cmnw&Y{2MR}6BqvLs` z8*jD(g@ttn)muP=Bl(hju9D}Jv*{0ulsDyy9c&0j4KY!7i=ysXqK4g34}4Lx$)3T8 zhpf}0JZ9MmEbIMS${5A?*-bau|KDlZG^qH;$zQW4uj-TsnoB(Lbso6Rt*Cz7@CxBp zDrSiiiS3YdrxX(7Zi@Jry!u86%e+XDtqTbcv z#hDc9s#r8|qdnD#Wq%2_Y~XR*5(BuKDD&Q0g;7L#WQe6oTLEsO#uk7J1V`aRo5yKG zf-TE&ZgX)-q5+tw{G4g6iayX^uCOgWC2qV&EC46boVxImd-)4Xjvxp^fAiWKiaSr# zo?a-+VD>ZMIxh1}A;7aHa6|?9Ldy1<1MoVWd5Zzx;<5o`IxXBgv(Rdfn~uN5?T!r= zde6I<`eecp%1n@-&)DTr-)bw9RC0idW-+A2V9%$Z6H2;BZM!+f{G~j=n zXMUJ3#(PnG{$eSisA$*i@R(4lLos3Ozfql2Vxvwf@{$s8sEm54vd6~ z6j(}8k@07?+w@48P_v^Km^g}jFc|B$#m-5^Li8qL1dtb~mY02C^dhx)6`jXj_QP;W z9)E==OXp(|ek(b&$m+bw+y(JwS-jD>?=1VQ92bifP1J;JAerszmDQ?H`vId)I-bZK6 z+e_gQV+6L}=tN~3ZqPUlDw8kV!TMCQi3MbP8XgGd1VKih?WwP`n|79xL!j}gZ~w1- zZ5jQXC*6ojRBvgpqB5{VF^!nh*MNwPSSOMe(1=Jsv6Ze$z{@8c9vm=njb)vt`HmqX z7*CAR?R2jx+;QKvov0ro(vyfW&!$z49No_KN%9V&zE~kwv02JT7YCF4)?TnEm&zP1 zkGhmu$CLz}8XW@3le83wJ&{@UhZ$L_5`)|KcuOF4^O7gQH0 z&ow&FV#XSn(fb+66{LP%B&m3mGSLjqZ{5wP86Gre)nCpiB7$fmfd~@+mBV-bX1;gO zESB6r*4{yl(kj*Sws($0gN=94yfbZluhom3$eYYu$6J@+xR*DwHjk)Mb=%c>>&>o& zELJM{D(5ZYkinmtxgwZTrDEzLg7g8ixc}?~6uZG`3r8n?jkpzz4K-yGIBEz&;qg?S zIg0kAr8~PxF^%lr(!RdeFD#!{FndXH z`N+g#pRMfx&QGYZ`L2`1_40N-_fy%EmNG;RzZ*5o&{^v}6z-hu>*!y#o1gW4*{o@2 z{cYFk0i8$ODDSlI50*VG$Vi^5N_9lq9aeEG4R*ZfNk6Q}Cd#zNG49aw;$qH-i)lLO zo$mU^8y%*z%==LGW%+P~=on$zNc1Yq+lb%Es^M_Ua_}=d;PNGh6#3yed4F_hBl*`o zfhyF)ay;NI*yEo$VtBSnb?nKjbVYv7!?I5Bg^kV>KM&WmGyTow8PwYYTbYJsNjY}g z`Odtl!P}2jc;+dxP#?D@Dg!xWQXda&U2j^JRB88|?{r4g-8M$_W}Zq~*RNYx%v2r! zPvG=sw13R?mHkJNLR(lf|D~RAGd9D0a$xJxd`+BkHB)`O($buZLRigk?}4~Wt81p# z+^*mw4$e45zNY!?e5Zca!Tkf-K39cqP5XfHcelBSv>B(8PAsoKZ;vytu1TnQmx>Vo z)}mtz0|18R>?kU=UUnA!Gh+OxB&9E2pvCruMY}k7nQ*mwQkDk6u=FVnKsB1v5Es7? z#4lZO7LN(Lh&5eTl(<1i2)eD2h<=QQIEyVupxDn5jz?o+p3uL3;x{o*=y#s@Ps|hg zPe|9IF)>f*BwC`lWHc|3z=UBkGKc{a^MpPN=?O@mm?a(k!e*q?NH+^BL$ioi5kke8 qA+&|gDmGTv&fJkLaJ^p%)IqsZcfL_~UWNul149EptvfGwWc(lG;4LBm delta 4931 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 diff --git a/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels.metallib b/Sources/UntoldEngine/UntoldEngineKernels/UntoldEngineKernels.metallib index c55153bc628d59548d7ec94bd57559980fee05fb..aad6b5390ab1f2a64cc4353fe691dd23507b7dc8 100644 GIT binary patch delta 4654 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 delta 4830 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 Date: Sun, 10 May 2026 08:15:47 -0700 Subject: [PATCH 4/4] [Chores] Use comma-separated conditions for XR HZB checks --- Sources/UntoldEngine/Systems/CullingSystem.swift | 2 +- Sources/UntoldEngine/Systems/RenderingSystem.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/UntoldEngine/Systems/CullingSystem.swift b/Sources/UntoldEngine/Systems/CullingSystem.swift index 6600c333..6033dcc7 100644 --- a/Sources/UntoldEngine/Systems/CullingSystem.swift +++ b/Sources/UntoldEngine/Systems/CullingSystem.swift @@ -393,7 +393,7 @@ public func buildHZBDepthPyramid(_ commandBuffer: MTLCommandBuffer, eyeIndex: In } let hzbDepthSource: MTLTexture? - if renderInfo.isXRStereoMode && renderInfo.immersionStyle == .mixed { + if renderInfo.isXRStereoMode, renderInfo.immersionStyle == .mixed { hzbDepthSource = textureResources.hzbSourceDepthMap ?? textureResources.depthMap } else { hzbDepthSource = textureResources.depthMap diff --git a/Sources/UntoldEngine/Systems/RenderingSystem.swift b/Sources/UntoldEngine/Systems/RenderingSystem.swift index 9521ee74..0cec39f0 100644 --- a/Sources/UntoldEngine/Systems/RenderingSystem.swift +++ b/Sources/UntoldEngine/Systems/RenderingSystem.swift @@ -361,7 +361,7 @@ func gBufferPass(graph: inout [String: RenderPass], shadowPass: RenderPass) { // next-frame culling. In XR mixed mode, capture opaque depth before the // transparency pass writes glass depth for compositor edges. let opaqueDepthAnchorId: String - if renderInfo.isXRStereoMode && renderInfo.immersionStyle == .mixed { + if renderInfo.isXRStereoMode, renderInfo.immersionStyle == .mixed { let hzbDepthSourcePass = RenderPass( id: "hzbDepthSource", dependencies: [batchedModelPass.id],